From 38dcbf05d4514b7d2498ec69f3b4a762c22f09be Mon Sep 17 00:00:00 2001 From: Mustafa-249 Date: Wed, 23 Jul 2025 14:53:01 +0300 Subject: [PATCH 01/18] Delete tests directory --- tests/__init__.py | 0 tests/test_0deterministic.py | 60 ------ tests/test_a2c.py | 26 --- tests/test_a2c_conv.py | 40 ---- tests/test_action_scaling.py | 45 ---- tests/test_action_space.py | 60 ------ tests/test_atari.py | 99 --------- tests/test_auto_vec_detection.py | 64 ------ tests/test_callbacks.py | 128 ------------ tests/test_common.py | 32 --- tests/test_continuous.py | 172 ---------------- tests/test_custom_policy.py | 147 -------------- tests/test_deepq.py | 26 --- tests/test_distri.py | 68 ------- tests/test_envs.py | 149 -------------- tests/test_gail.py | 170 ---------------- tests/test_her.py | 119 ----------- tests/test_identity.py | 136 ------------- tests/test_load_parameters.py | 136 ------------- tests/test_log_prob.py | 22 -- tests/test_logger.py | 52 ----- tests/test_lstm_policy.py | 132 ------------ tests/test_math_util.py | 81 -------- tests/test_monitor.py | 87 -------- tests/test_mpi_adam.py | 24 --- tests/test_multiple_learn.py | 61 ------ tests/test_no_mpi.py | 21 -- tests/test_ppo2.py | 47 ----- tests/test_replay_buffer.py | 72 ------- tests/test_save.py | 209 ------------------- tests/test_schedules.py | 58 ------ tests/test_segment_tree.py | 194 ------------------ tests/test_tensorboard.py | 51 ----- tests/test_tf_util.py | 61 ------ tests/test_utils.py | 79 ------- tests/test_vec_check_nan.py | 71 ------- tests/test_vec_envs.py | 339 ------------------------------- tests/test_vec_normalize.py | 194 ------------------ 38 files changed, 3532 deletions(-) delete mode 100644 tests/__init__.py delete mode 100644 tests/test_0deterministic.py delete mode 100644 tests/test_a2c.py delete mode 100644 tests/test_a2c_conv.py delete mode 100644 tests/test_action_scaling.py delete mode 100644 tests/test_action_space.py delete mode 100644 tests/test_atari.py delete mode 100644 tests/test_auto_vec_detection.py delete mode 100644 tests/test_callbacks.py delete mode 100644 tests/test_common.py delete mode 100644 tests/test_continuous.py delete mode 100644 tests/test_custom_policy.py delete mode 100644 tests/test_deepq.py delete mode 100644 tests/test_distri.py delete mode 100644 tests/test_envs.py delete mode 100644 tests/test_gail.py delete mode 100644 tests/test_her.py delete mode 100644 tests/test_identity.py delete mode 100644 tests/test_load_parameters.py delete mode 100644 tests/test_log_prob.py delete mode 100644 tests/test_logger.py delete mode 100644 tests/test_lstm_policy.py delete mode 100644 tests/test_math_util.py delete mode 100644 tests/test_monitor.py delete mode 100644 tests/test_mpi_adam.py delete mode 100644 tests/test_multiple_learn.py delete mode 100644 tests/test_no_mpi.py delete mode 100644 tests/test_ppo2.py delete mode 100644 tests/test_replay_buffer.py delete mode 100644 tests/test_save.py delete mode 100644 tests/test_schedules.py delete mode 100644 tests/test_segment_tree.py delete mode 100644 tests/test_tensorboard.py delete mode 100644 tests/test_tf_util.py delete mode 100644 tests/test_utils.py delete mode 100644 tests/test_vec_check_nan.py delete mode 100644 tests/test_vec_envs.py delete mode 100644 tests/test_vec_normalize.py diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/test_0deterministic.py b/tests/test_0deterministic.py deleted file mode 100644 index 3e87cf54..00000000 --- a/tests/test_0deterministic.py +++ /dev/null @@ -1,60 +0,0 @@ -import pytest -import numpy as np - -from stable_baselines import A2C, ACER, ACKTR, DQN, DDPG, PPO1, PPO2, SAC, TRPO, TD3 -from stable_baselines.common.noise import NormalActionNoise - -N_STEPS_TRAINING = 300 -SEED = 0 - - -# Weird stuff: TD3 would fail if another algorithm is tested before -# with n_cpu_tf_sess > 1 -@pytest.mark.xfail(reason="TD3 deterministic randomly fail when run with others...", strict=False) -def test_deterministic_td3(): - results = [[], []] - rewards = [[], []] - kwargs = {'n_cpu_tf_sess': 1} - env_id = 'Pendulum-v0' - kwargs.update({'action_noise': NormalActionNoise(0.0, 0.1)}) - - for i in range(2): - model = TD3('MlpPolicy', env_id, seed=SEED, **kwargs) - model.learn(N_STEPS_TRAINING) - env = model.get_env() - obs = env.reset() - for _ in range(20): - action, _ = model.predict(obs, deterministic=True) - obs, reward, _, _ = env.step(action) - results[i].append(action) - rewards[i].append(reward) - # without the extended tolerance, test fails for unknown reasons on Github... - assert np.allclose(results[0], results[1], rtol=1e-2), results - assert np.allclose(rewards[0], rewards[1], rtol=1e-2), rewards - - -@pytest.mark.parametrize("algo", [A2C, ACKTR, ACER, DDPG, DQN, PPO1, PPO2, SAC, TRPO]) -def test_deterministic_training_common(algo): - results = [[], []] - rewards = [[], []] - kwargs = {'n_cpu_tf_sess': 1} - if algo in [DDPG, TD3, SAC]: - env_id = 'Pendulum-v0' - kwargs.update({'action_noise': NormalActionNoise(0.0, 0.1)}) - else: - env_id = 'CartPole-v1' - if algo == DQN: - kwargs.update({'learning_starts': 100}) - - for i in range(2): - model = algo('MlpPolicy', env_id, seed=SEED, **kwargs) - model.learn(N_STEPS_TRAINING) - env = model.get_env() - obs = env.reset() - for _ in range(20): - action, _ = model.predict(obs, deterministic=False) - obs, reward, _, _ = env.step(action) - results[i].append(action) - rewards[i].append(reward) - assert sum(results[0]) == sum(results[1]), results - assert sum(rewards[0]) == sum(rewards[1]), rewards diff --git a/tests/test_a2c.py b/tests/test_a2c.py deleted file mode 100644 index c2f1f09c..00000000 --- a/tests/test_a2c.py +++ /dev/null @@ -1,26 +0,0 @@ -import os - -import pytest -import gym - -from stable_baselines import A2C -from stable_baselines.common import make_vec_env -from stable_baselines.common.vec_env import DummyVecEnv - - -def test_a2c_update_n_batch_on_load(tmp_path): - env = make_vec_env("CartPole-v1", n_envs=2) - model = A2C("MlpPolicy", env, n_steps=10) - - model.learn(total_timesteps=100) - model.save(os.path.join(str(tmp_path), "a2c_cartpole.zip")) - - del model - - model = A2C.load(os.path.join(str(tmp_path), "a2c_cartpole.zip")) - test_env = DummyVecEnv([lambda: gym.make("CartPole-v1")]) - - model.set_env(test_env) - assert model.n_batch == 10 - model.learn(100) - os.remove(os.path.join(str(tmp_path), "a2c_cartpole.zip")) diff --git a/tests/test_a2c_conv.py b/tests/test_a2c_conv.py deleted file mode 100644 index 59de1e04..00000000 --- a/tests/test_a2c_conv.py +++ /dev/null @@ -1,40 +0,0 @@ -import gym -import numpy as np -import tensorflow as tf - -from stable_baselines.common.tf_layers import conv -from stable_baselines.common.input import observation_input - - -ENV_ID = 'BreakoutNoFrameskip-v4' -SEED = 3 - - -def test_conv_kernel(): - """Test convolution kernel with various input formats.""" - filter_size_1 = 4 # The size of squared filter for the first layer - filter_size_2 = (3, 5) # The size of non-squared filter for the second layer - target_shape_1 = [2, 52, 40, 32] # The desired shape of the first layer - target_shape_2 = [2, 13, 9, 32] # The desired shape of the second layer - kwargs = {} - n_envs = 1 - n_steps = 2 - n_batch = n_envs * n_steps - scale = False - env = gym.make(ENV_ID) - ob_space = env.observation_space - - with tf.Graph().as_default(): - _, scaled_images = observation_input(ob_space, n_batch, scale=scale) - activ = tf.nn.relu - layer_1 = activ(conv(scaled_images, 'c1', n_filters=32, filter_size=filter_size_1, - stride=4, init_scale=np.sqrt(2), **kwargs)) - layer_2 = activ(conv(layer_1, 'c2', n_filters=32, filter_size=filter_size_2, - stride=4, init_scale=np.sqrt(2), **kwargs)) - assert layer_1.shape == target_shape_1, \ - "The shape of layer based on the squared kernel matrix is not correct. " \ - "The current shape is {} and the desired shape is {}".format(layer_1.shape, target_shape_1) - assert layer_2.shape == target_shape_2, \ - "The shape of layer based on the non-squared kernel matrix is not correct. " \ - "The current shape is {} and the desired shape is {}".format(layer_2.shape, target_shape_2) - env.close() diff --git a/tests/test_action_scaling.py b/tests/test_action_scaling.py deleted file mode 100644 index 5d6ca20f..00000000 --- a/tests/test_action_scaling.py +++ /dev/null @@ -1,45 +0,0 @@ -import pytest -import numpy as np - -from stable_baselines import DDPG, TD3, SAC -from stable_baselines.common.identity_env import IdentityEnvBox - -ROLLOUT_STEPS = 100 - -MODEL_LIST = [ - (DDPG, dict(nb_train_steps=0, nb_rollout_steps=ROLLOUT_STEPS)), - (TD3, dict(train_freq=ROLLOUT_STEPS + 1, learning_starts=0)), - (SAC, dict(train_freq=ROLLOUT_STEPS + 1, learning_starts=0)), - (TD3, dict(train_freq=ROLLOUT_STEPS + 1, learning_starts=ROLLOUT_STEPS)), - (SAC, dict(train_freq=ROLLOUT_STEPS + 1, learning_starts=ROLLOUT_STEPS)) -] - - -@pytest.mark.parametrize("model_class, model_kwargs", MODEL_LIST) -def test_buffer_actions_scaling(model_class, model_kwargs): - """ - Test if actions are scaled to tanh co-domain before being put in a buffer - for algorithms that use tanh-squashing, i.e., DDPG, TD3, SAC - - :param model_class: (BaseRLModel) A RL Model - :param model_kwargs: (dict) Dictionary containing named arguments to the given algorithm - """ - - # check random and inferred actions as they possibly have different flows - for random_coeff in [0.0, 1.0]: - - env = IdentityEnvBox(-2000, 1000) - - model = model_class("MlpPolicy", env, seed=1, random_exploration=random_coeff, **model_kwargs) - model.learn(total_timesteps=ROLLOUT_STEPS) - - assert hasattr(model, 'replay_buffer') - - buffer = model.replay_buffer - - assert buffer.can_sample(ROLLOUT_STEPS) - - _, actions, _, _, _ = buffer.sample(ROLLOUT_STEPS) - - assert not np.any(actions > np.ones_like(actions)) - assert not np.any(actions < -np.ones_like(actions)) diff --git a/tests/test_action_space.py b/tests/test_action_space.py deleted file mode 100644 index eefe0dab..00000000 --- a/tests/test_action_space.py +++ /dev/null @@ -1,60 +0,0 @@ -import pytest -import numpy as np - -from stable_baselines import A2C, PPO1, PPO2, TRPO -from stable_baselines.common.identity_env import IdentityEnvMultiBinary, IdentityEnvMultiDiscrete -from stable_baselines.common.vec_env import DummyVecEnv -from stable_baselines.common.evaluation import evaluate_policy - -MODEL_LIST = [ - A2C, - PPO1, - PPO2, - TRPO -] - - -@pytest.mark.slow -@pytest.mark.parametrize("model_class", MODEL_LIST) -def test_identity_multidiscrete(model_class): - """ - Test if the algorithm (with a given policy) - can learn an identity transformation (i.e. return observation as an action) - with a multidiscrete action space - - :param model_class: (BaseRLModel) A RL Model - """ - env = DummyVecEnv([lambda: IdentityEnvMultiDiscrete(10)]) - - model = model_class("MlpPolicy", env) - model.learn(total_timesteps=1000) - evaluate_policy(model, env, n_eval_episodes=5) - obs = env.reset() - - assert np.array(model.action_probability(obs)).shape == (2, 1, 10), \ - "Error: action_probability not returning correct shape" - assert np.prod(model.action_probability(obs, actions=env.action_space.sample()).shape) == 1, \ - "Error: not scalar probability" - - -@pytest.mark.slow -@pytest.mark.parametrize("model_class", MODEL_LIST) -def test_identity_multibinary(model_class): - """ - Test if the algorithm (with a given policy) - can learn an identity transformation (i.e. return observation as an action) - with a multibinary action space - - :param model_class: (BaseRLModel) A RL Model - """ - env = DummyVecEnv([lambda: IdentityEnvMultiBinary(10)]) - - model = model_class("MlpPolicy", env) - model.learn(total_timesteps=1000) - evaluate_policy(model, env, n_eval_episodes=5) - obs = env.reset() - - assert model.action_probability(obs).shape == (1, 10), \ - "Error: action_probability not returning correct shape" - assert np.prod(model.action_probability(obs, actions=env.action_space.sample()).shape) == 1, \ - "Error: not scalar probability" diff --git a/tests/test_atari.py b/tests/test_atari.py deleted file mode 100644 index fa1b11a1..00000000 --- a/tests/test_atari.py +++ /dev/null @@ -1,99 +0,0 @@ -import pytest - -from stable_baselines import bench, logger -from stable_baselines.deepq import DQN, wrap_atari_dqn, CnnPolicy -from stable_baselines.common import set_global_seeds -from stable_baselines.common.atari_wrappers import make_atari -import stable_baselines.a2c.run_atari as a2c_atari -import stable_baselines.acer.run_atari as acer_atari -import stable_baselines.acktr.run_atari as acktr_atari -import stable_baselines.ppo1.run_atari as ppo1_atari -import stable_baselines.ppo2.run_atari as ppo2_atari -import stable_baselines.trpo_mpi.run_atari as trpo_atari - - -ENV_ID = 'BreakoutNoFrameskip-v4' -SEED = 3 -NUM_TIMESTEPS = 300 -NUM_CPU = 2 - - -@pytest.mark.slow -@pytest.mark.parametrize("policy", ['cnn', 'lstm', 'lnlstm']) -def test_a2c(policy): - """ - test A2C on atari - - :param policy: (str) the policy to test for A2C - """ - a2c_atari.train(env_id=ENV_ID, num_timesteps=NUM_TIMESTEPS, seed=SEED, - policy=policy, lr_schedule='constant', num_env=NUM_CPU) - - -@pytest.mark.slow -@pytest.mark.parametrize("policy", ['cnn', 'lstm']) -def test_acer(policy): - """ - test ACER on atari - - :param policy: (str) the policy to test for ACER - """ - acer_atari.train(env_id=ENV_ID, num_timesteps=NUM_TIMESTEPS, seed=SEED, - policy=policy, lr_schedule='constant', num_cpu=NUM_CPU) - - -@pytest.mark.slow -def test_acktr(): - """ - test ACKTR on atari - """ - acktr_atari.train(env_id=ENV_ID, num_timesteps=NUM_TIMESTEPS, seed=SEED, num_cpu=NUM_CPU) - - -@pytest.mark.slow -def test_deepq(): - """ - test DeepQ on atari - """ - logger.configure() - set_global_seeds(SEED) - env = make_atari(ENV_ID) - env = bench.Monitor(env, logger.get_dir()) - env = wrap_atari_dqn(env) - - model = DQN(env=env, policy=CnnPolicy, learning_rate=1e-4, buffer_size=10000, exploration_fraction=0.1, - exploration_final_eps=0.01, train_freq=4, learning_starts=100, target_network_update_freq=100, - gamma=0.99, prioritized_replay=True, prioritized_replay_alpha=0.6) - model.learn(total_timesteps=NUM_TIMESTEPS) - - env.close() - del model, env - - -@pytest.mark.slow -def test_ppo1(): - """ - test PPO1 on atari - """ - ppo1_atari.train(env_id=ENV_ID, num_timesteps=NUM_TIMESTEPS, seed=SEED) - - -@pytest.mark.slow -@pytest.mark.parametrize("policy", ['cnn', 'lstm', 'lnlstm', 'mlp']) -def test_ppo2(policy): - """ - test PPO2 on atari - - :param policy: (str) the policy to test for PPO2 - """ - ppo2_atari.train(env_id=ENV_ID, num_timesteps=NUM_TIMESTEPS, - seed=SEED, policy=policy, n_envs=NUM_CPU, - nminibatches=NUM_CPU, n_steps=16) - - -@pytest.mark.slow -def test_trpo(): - """ - test TRPO on atari - """ - trpo_atari.train(env_id=ENV_ID, num_timesteps=NUM_TIMESTEPS, seed=SEED) diff --git a/tests/test_auto_vec_detection.py b/tests/test_auto_vec_detection.py deleted file mode 100644 index 1796657f..00000000 --- a/tests/test_auto_vec_detection.py +++ /dev/null @@ -1,64 +0,0 @@ -import pytest -import numpy as np - -from stable_baselines import A2C, ACER, ACKTR, DDPG, DQN, PPO1, PPO2, SAC, TRPO, TD3 -from stable_baselines.common.vec_env import DummyVecEnv -from stable_baselines.common.identity_env import IdentityEnv, IdentityEnvBox, IdentityEnvMultiBinary, \ - IdentityEnvMultiDiscrete -from stable_baselines.common.evaluation import evaluate_policy - - -def check_shape(make_env, model_class, shape_1, shape_2): - model = model_class(policy="MlpPolicy", env=DummyVecEnv([make_env])) - - env0 = make_env() - env1 = DummyVecEnv([make_env]) - - for env, expected_shape in [(env0, shape_1), (env1, shape_2)]: - def callback(locals_, _globals): - assert np.array(locals_['action']).shape == expected_shape - evaluate_policy(model, env, n_eval_episodes=5, callback=callback) - - -@pytest.mark.slow -@pytest.mark.parametrize("model_class", [A2C, ACER, ACKTR, DQN, PPO1, PPO2, TRPO]) -def test_identity(model_class): - """ - test the Disrete environment vectorisation detection - - :param model_class: (BaseRLModel) the RL model - """ - check_shape(lambda: IdentityEnv(dim=10), model_class, (), (1,)) - - -@pytest.mark.slow -@pytest.mark.parametrize("model_class", [A2C, DDPG, PPO1, PPO2, SAC, TRPO, TD3]) -def test_identity_box(model_class): - """ - test the Box environment vectorisation detection - - :param model_class: (BaseRLModel) the RL model - """ - check_shape(lambda: IdentityEnvBox(eps=0.5), model_class, (1,), (1, 1)) - - -@pytest.mark.slow -@pytest.mark.parametrize("model_class", [A2C, PPO1, PPO2, TRPO]) -def test_identity_multi_binary(model_class): - """ - test the MultiBinary environment vectorisation detection - - :param model_class: (BaseRLModel) the RL model - """ - check_shape(lambda: IdentityEnvMultiBinary(dim=10), model_class, (10,), (1, 10)) - - -@pytest.mark.slow -@pytest.mark.parametrize("model_class", [A2C, PPO1, PPO2, TRPO]) -def test_identity_multi_discrete(model_class): - """ - test the MultiDiscrete environment vectorisation detection - - :param model_class: (BaseRLModel) the RL model - """ - check_shape(lambda: IdentityEnvMultiDiscrete(dim=10), model_class, (2,), (1, 2)) diff --git a/tests/test_callbacks.py b/tests/test_callbacks.py deleted file mode 100644 index debaacaa..00000000 --- a/tests/test_callbacks.py +++ /dev/null @@ -1,128 +0,0 @@ -import os -import shutil - -import pytest - -from stable_baselines import A2C, ACKTR, ACER, DQN, DDPG, PPO1, PPO2, SAC, TD3, TRPO -from stable_baselines.common import make_vec_env -from stable_baselines.common.callbacks import (CallbackList, CheckpointCallback, EvalCallback, - EveryNTimesteps, StopTrainingOnRewardThreshold, BaseCallback) - - -LOG_FOLDER = './logs/callbacks/' - - -class CustomCallback(BaseCallback): - """ - Callback to check that every method was called once at least - """ - def __init__(self): - super(CustomCallback, self).__init__() - self.calls = { - 'training_start': False, - 'rollout_start': False, - 'step': False, - 'rollout_end': False, - 'training_end': False, - } - - def _on_training_start(self): - self.calls['training_start'] = True - - def _on_rollout_start(self): - self.calls['rollout_start'] = True - - def _on_step(self): - self.calls['step'] = True - return True - - def _on_rollout_end(self): - self.calls['rollout_end'] = True - - def _on_training_end(self): - self.calls['training_end'] = True - - def validate(self, allowed_failures): - for allowed_failure in allowed_failures: - self.calls[allowed_failure] = True - assert all(self.calls.values()) - - -@pytest.mark.parametrize("model_class", [A2C, ACER, ACKTR, DQN, DDPG, PPO1, PPO2, SAC, TD3, TRPO]) -def test_callbacks(model_class): - - env_id = 'Pendulum-v0' - if model_class in [ACER, DQN]: - env_id = 'CartPole-v1' - - allowed_failures = [] - # Number of training timesteps is too short - # otherwise, the training would take too long, or would require - # custom parameter per algorithm - if model_class in [PPO1, DQN, TRPO]: - allowed_failures = ['rollout_end'] - - # Create RL model - model = model_class('MlpPolicy', env_id) - - checkpoint_callback = CheckpointCallback(save_freq=500, save_path=LOG_FOLDER) - - # For testing: use the same training env - eval_env = model.get_env() - # Stop training if the performance is good enough - callback_on_best = StopTrainingOnRewardThreshold(reward_threshold=-1200, verbose=1) - - eval_callback = EvalCallback(eval_env, callback_on_new_best=callback_on_best, - best_model_save_path=LOG_FOLDER, - log_path=LOG_FOLDER, eval_freq=100) - - # Equivalent to the `checkpoint_callback` - # but here in an event-driven manner - checkpoint_on_event = CheckpointCallback(save_freq=1, save_path=LOG_FOLDER, - name_prefix='event') - event_callback = EveryNTimesteps(n_steps=500, callback=checkpoint_on_event) - - callback = CallbackList([checkpoint_callback, eval_callback, event_callback]) - - model.learn(500, callback=callback) - model.learn(200, callback=None) - custom_callback = CustomCallback() - model.learn(200, callback=custom_callback) - # Check that every called were executed - custom_callback.validate(allowed_failures=allowed_failures) - # Transform callback into a callback list automatically - custom_callback = CustomCallback() - model.learn(500, callback=[checkpoint_callback, eval_callback, custom_callback]) - # Check that every called were executed - custom_callback.validate(allowed_failures=allowed_failures) - - # Automatic wrapping, old way of doing callbacks - model.learn(200, callback=lambda _locals, _globals: True) - - # Cleanup - if os.path.exists(LOG_FOLDER): - shutil.rmtree(LOG_FOLDER) - - -def test_recurrent_eval_callback(): - env_id = 'Pendulum-v0' - - # Create envs - env = make_vec_env(env_id, n_envs=4) - eval_env = make_vec_env(env_id, n_envs=1) - - # Create RL model - model = PPO2('MlpLstmPolicy', env) - - # Stop training if the performance is good enough - callback_on_best = StopTrainingOnRewardThreshold(reward_threshold=-1200, verbose=1) - - eval_callback = EvalCallback(eval_env, callback_on_new_best=callback_on_best, - best_model_save_path=LOG_FOLDER, - log_path=LOG_FOLDER, eval_freq=100) - - model.learn(300, callback=eval_callback) - - # Cleanup - if os.path.exists(LOG_FOLDER): - shutil.rmtree(LOG_FOLDER) diff --git a/tests/test_common.py b/tests/test_common.py deleted file mode 100644 index 7a8ce446..00000000 --- a/tests/test_common.py +++ /dev/null @@ -1,32 +0,0 @@ -from contextlib import contextmanager -import sys - - -def _assert_eq(left, right): - assert left == right, '{} != {}'.format(left, right) - - -def _assert_neq(left, right): - assert left != right, '{} == {}'.format(left, right) - - -@contextmanager -def _maybe_disable_mpi(mpi_disabled): - """A context that can temporarily remove the mpi4py import. - - Useful for testing whether non-MPI algorithms work as intended when - mpi4py isn't installed. - - Args: - disable_mpi (bool): If True, then this context temporarily removes - the mpi4py import from `sys.modules` - """ - if mpi_disabled and "mpi4py" in sys.modules: - temp = sys.modules["mpi4py"] - try: - sys.modules["mpi4py"] = None - yield - finally: - sys.modules["mpi4py"] = temp - else: - yield diff --git a/tests/test_continuous.py b/tests/test_continuous.py deleted file mode 100644 index 307e6adb..00000000 --- a/tests/test_continuous.py +++ /dev/null @@ -1,172 +0,0 @@ -import subprocess -import os - -import gym -import pytest -import numpy as np - -from stable_baselines import A2C, ACKTR, SAC, DDPG, PPO1, PPO2, TRPO, TD3 -# TODO: add support for continuous actions -# from stable_baselines.acer import ACER -from stable_baselines.common.vec_env import DummyVecEnv -from stable_baselines.common.identity_env import IdentityEnvBox -from stable_baselines.ddpg import AdaptiveParamNoiseSpec, NormalActionNoise -from stable_baselines.common.evaluation import evaluate_policy -from tests.test_common import _assert_eq - - -N_EVAL_EPISODES = 20 -NUM_TIMESTEPS = 300 - -MODEL_LIST = [ - A2C, - # ACER, - ACKTR, - DDPG, - PPO1, - PPO2, - SAC, - TD3, - TRPO -] - - -@pytest.mark.slow -@pytest.mark.parametrize("model_class", MODEL_LIST) -def test_model_manipulation(request, model_class): - """ - Test if the algorithm can be loaded and saved without any issues, the environment switching - works and that the action prediction works - - :param model_class: (BaseRLModel) A model - """ - model_fname = None - try: - env = DummyVecEnv([lambda: IdentityEnvBox(eps=0.5)]) - - # create and train - model = model_class(policy="MlpPolicy", env=env, seed=0) - model.learn(total_timesteps=NUM_TIMESTEPS) - - env.reset() - observations = np.concatenate([env.step([env.action_space.sample()])[0] for _ in range(10)], axis=0) - selected_actions, _ = model.predict(observations, deterministic=True) - - # saving - model_fname = './test_model_{}.zip'.format(request.node.name) - model.save(model_fname) - - del model, env - - # loading - model = model_class.load(model_fname) - - # check if model still selects the same actions - new_selected_actions, _ = model.predict(observations, deterministic=True) - assert np.allclose(selected_actions, new_selected_actions, 1e-4) - - # changing environment (note: this can be done at loading) - env = DummyVecEnv([lambda: IdentityEnvBox(eps=0.5)]) - model.set_env(env) - - obs = env.reset() - with pytest.warns(None) as record: - act_prob = model.action_probability(obs) - - if model_class in [DDPG, SAC, TD3]: - # check that only one warning was raised - assert len(record) == 1, "No warning was raised for {}".format(model_class) - assert act_prob is None, "Error: action_probability should be None for {}".format(model_class) - else: - assert act_prob[0].shape == (1, 1) and act_prob[1].shape == (1, 1), \ - "Error: action_probability not returning correct shape" - - # test action probability for given (obs, action) pair - # must return zero and raise a warning or raise an exception if not defined - env = model.get_env() - obs = env.reset() - observations = np.array([obs for _ in range(10)]) - observations = np.squeeze(observations) - observations = observations.reshape((-1, 1)) - actions = np.array([env.action_space.sample() for _ in range(10)]) - - if model_class in [DDPG, SAC, TD3]: - with pytest.raises(ValueError): - model.action_probability(observations, actions=actions) - else: - actions_probas = model.action_probability(observations, actions=actions) - assert actions_probas.shape == (len(actions), 1), actions_probas.shape - assert np.all(actions_probas >= 0), actions_probas - actions_logprobas = model.action_probability(observations, actions=actions, logp=True) - assert np.allclose(actions_probas, np.exp(actions_logprobas)), (actions_probas, actions_logprobas) - - # learn post loading - model.learn(total_timesteps=100) - - # predict new values - evaluate_policy(model, env, n_eval_episodes=N_EVAL_EPISODES) - - # Free memory - del model, env - - finally: - if model_fname is not None and os.path.exists(model_fname): - os.remove(model_fname) - - -def test_ddpg(): - args = ['--env-id', 'Pendulum-v0', '--num-timesteps', 300, '--noise-type', 'ou_0.01'] - args = list(map(str, args)) - return_code = subprocess.call(['python', '-m', 'stable_baselines.ddpg.main'] + args) - _assert_eq(return_code, 0) - - -def test_ddpg_eval_env(): - """ - Additional test to check that everything is working when passing - an eval env. - """ - eval_env = gym.make("Pendulum-v0") - model = DDPG("MlpPolicy", "Pendulum-v0", nb_rollout_steps=5, - nb_train_steps=2, nb_eval_steps=10, - eval_env=eval_env, verbose=0) - model.learn(NUM_TIMESTEPS) - - -def test_ddpg_normalization(): - """ - Test that observations and returns normalizations are properly saved and loaded. - """ - param_noise = AdaptiveParamNoiseSpec(initial_stddev=0.05, desired_action_stddev=0.05) - model = DDPG('MlpPolicy', 'Pendulum-v0', memory_limit=50000, normalize_observations=True, - normalize_returns=True, nb_rollout_steps=128, nb_train_steps=1, - batch_size=64, param_noise=param_noise) - model.learn(NUM_TIMESTEPS) - obs_rms_params = model.sess.run(model.obs_rms_params) - ret_rms_params = model.sess.run(model.ret_rms_params) - model.save('./test_ddpg.zip') - - loaded_model = DDPG.load('./test_ddpg.zip') - obs_rms_params_2 = loaded_model.sess.run(loaded_model.obs_rms_params) - ret_rms_params_2 = loaded_model.sess.run(loaded_model.ret_rms_params) - - for param, param_loaded in zip(obs_rms_params + ret_rms_params, - obs_rms_params_2 + ret_rms_params_2): - assert np.allclose(param, param_loaded) - - del model, loaded_model - - if os.path.exists("./test_ddpg.zip"): - os.remove("./test_ddpg.zip") - - -def test_ddpg_popart(): - """ - Test DDPG with pop-art normalization - """ - n_actions = 1 - action_noise = NormalActionNoise(mean=np.zeros(n_actions), sigma=0.1 * np.ones(n_actions)) - model = DDPG('MlpPolicy', 'Pendulum-v0', memory_limit=50000, normalize_observations=True, - normalize_returns=True, nb_rollout_steps=128, nb_train_steps=1, - batch_size=64, action_noise=action_noise, enable_popart=True) - model.learn(NUM_TIMESTEPS) diff --git a/tests/test_custom_policy.py b/tests/test_custom_policy.py deleted file mode 100644 index 725d88ff..00000000 --- a/tests/test_custom_policy.py +++ /dev/null @@ -1,147 +0,0 @@ -import os - -import gym -import pytest -import tensorflow as tf - -from stable_baselines import A2C, ACER, ACKTR, DQN, PPO1, PPO2, TRPO, SAC, DDPG -from stable_baselines.common.policies import FeedForwardPolicy -from stable_baselines.common.vec_env import DummyVecEnv -from stable_baselines.deepq.policies import FeedForwardPolicy as DQNPolicy -from stable_baselines.ddpg.policies import FeedForwardPolicy as DDPGPolicy -from stable_baselines.sac.policies import FeedForwardPolicy as SACPolicy - -N_TRIALS = 100 - - -class CustomCommonPolicy(FeedForwardPolicy): - def __init__(self, *args, **kwargs): - # Default value - if 'net_arch' not in kwargs: - kwargs['net_arch'] = [8, dict(vf=[8, 8], pi=[8, 8])] - super(CustomCommonPolicy, self).__init__(*args, **kwargs, - feature_extraction="mlp") - - -class CustomDQNPolicy(DQNPolicy): - def __init__(self, *args, **kwargs): - # Default value - if 'layers' not in kwargs: - kwargs['layers'] = [8, 8] - super(CustomDQNPolicy, self).__init__(*args, **kwargs, - feature_extraction="mlp") - - -class CustomDDPGPolicy(DDPGPolicy): - def __init__(self, *args, **kwargs): - # Default value - if 'layers' not in kwargs: - kwargs['layers'] = [8, 8] - super(CustomDDPGPolicy, self).__init__(*args, **kwargs, - feature_extraction="mlp") - - -class CustomSACPolicy(SACPolicy): - def __init__(self, *args, **kwargs): - # Default value - if 'layers' not in kwargs: - kwargs['layers'] = [8, 8] - super(CustomSACPolicy, self).__init__(*args, **kwargs, - feature_extraction="mlp") - - -# MODEL_CLASS, POLICY_CLASS, POLICY_KWARGS -MODEL_DICT = { - 'a2c': (A2C, CustomCommonPolicy, dict(act_fun=tf.nn.relu, net_arch=[12, dict(vf=[16], pi=[8])])), - 'acer': (ACER, CustomCommonPolicy, dict(act_fun=tf.nn.relu)), - 'acktr': (ACKTR, CustomCommonPolicy, dict(act_fun=tf.nn.relu)), - 'dqn': (DQN, CustomDQNPolicy, dict(layers=[4, 4], dueling=False)), - 'ddpg': (DDPG, CustomDDPGPolicy, dict(layers=[16, 16], layer_norm=False)), - 'ppo1': (PPO1, CustomCommonPolicy, dict(act_fun=tf.nn.relu, net_arch=[8, 4])), - 'ppo2': (PPO2, CustomCommonPolicy, dict(act_fun=tf.nn.relu, net_arch=[4, 4])), - 'sac': (SAC, CustomSACPolicy, dict(layers=[16, 16])), - 'trpo': (TRPO, CustomCommonPolicy, dict(act_fun=tf.nn.relu)), -} - - -@pytest.mark.parametrize("model_name", MODEL_DICT.keys()) -def test_custom_policy(request, model_name): - """ - Test if the algorithm (with a custom policy) can be loaded and saved without any issues. - :param model_name: (str) A RL model - """ - - try: - model_class, policy, _ = MODEL_DICT[model_name] - env = 'MountainCarContinuous-v0' if model_name in ['ddpg', 'sac'] else 'CartPole-v1' - - # create and train - model = model_class(policy, env) - model.learn(total_timesteps=100) - - env = model.get_env() - # predict and measure the acc reward - obs = env.reset() - for _ in range(N_TRIALS): - action, _ = model.predict(obs) - # Test action probability method - if model_name not in ['ddpg', 'sac']: - model.action_probability(obs) - obs, _, _, _ = env.step(action) - # saving - model_fname = './test_model_{}.zip'.format(request.node.name) - model.save(model_fname) - del model, env - # loading - _ = model_class.load(model_fname, policy=policy) - - finally: - if os.path.exists(model_fname): - os.remove(model_fname) - - -@pytest.mark.parametrize("model_name", MODEL_DICT.keys()) -def test_custom_policy_kwargs(request, model_name): - """ - Test if the algorithm (with a custom policy) can be loaded and saved without any issues. - :param model_name: (str) A RL model - """ - - model_fname = './test_model_{}.zip'.format(request.node.name) - - try: - model_class, policy, policy_kwargs = MODEL_DICT[model_name] - env = 'MountainCarContinuous-v0' if model_name in ['ddpg', 'sac'] else 'CartPole-v1' - - # Should raise an error when a wrong keyword is passed - with pytest.raises(ValueError): - model_class(policy, env, policy_kwargs=dict(this_throws_error='maybe')) - - # create and train - model = model_class(policy, env, policy_kwargs=policy_kwargs) - model.learn(total_timesteps=100) - - model.save(model_fname) - del model - - # loading - - env = DummyVecEnv([lambda: gym.make(env)]) - - # Load with specifying policy_kwargs - model = model_class.load(model_fname, policy=policy, env=env, policy_kwargs=policy_kwargs) - model.learn(total_timesteps=100) - del model - - # Load without specifying policy_kwargs - model = model_class.load(model_fname, policy=policy, env=env) - model.learn(total_timesteps=100) - del model - - # Load with different wrong policy_kwargs - with pytest.raises(ValueError): - _ = model_class.load(model_fname, policy=policy, env=env, policy_kwargs=dict(wrong="kwargs")) - - finally: - if os.path.exists(model_fname): - os.remove(model_fname) diff --git a/tests/test_deepq.py b/tests/test_deepq.py deleted file mode 100644 index 421dc5ad..00000000 --- a/tests/test_deepq.py +++ /dev/null @@ -1,26 +0,0 @@ -from stable_baselines.deepq.experiments.train_cartpole import main as train_cartpole -from stable_baselines.deepq.experiments.enjoy_cartpole import main as enjoy_cartpole -from stable_baselines.deepq.experiments.train_mountaincar import main as train_mountaincar -from stable_baselines.deepq.experiments.enjoy_mountaincar import main as enjoy_mountaincar - - -class DummyObject(object): - """ - Dummy object to create fake Parsed Arguments object - """ - pass - - -args = DummyObject() -args.no_render = True -args.max_timesteps = 200 - - -def test_cartpole(): - train_cartpole(args) - enjoy_cartpole(args) - - -def test_mountaincar(): - train_mountaincar(args) - enjoy_mountaincar(args) diff --git a/tests/test_distri.py b/tests/test_distri.py deleted file mode 100644 index d3be3626..00000000 --- a/tests/test_distri.py +++ /dev/null @@ -1,68 +0,0 @@ -import numpy as np -import tensorflow as tf - -import stable_baselines.common.tf_util as tf_util -from stable_baselines.common.distributions import DiagGaussianProbabilityDistributionType,\ - CategoricalProbabilityDistributionType, \ - MultiCategoricalProbabilityDistributionType, BernoulliProbabilityDistributionType - - -@tf_util.in_session -def test_probtypes(): - """ - test probability distribution types - """ - np.random.seed(0) - - pdparam_diag_gauss = np.array([-.2, .3, .4, -.5, .1, -.5, .1, 0.8]) - diag_gauss = DiagGaussianProbabilityDistributionType(pdparam_diag_gauss.size // 2) - validate_probtype(diag_gauss, pdparam_diag_gauss) - - pdparam_categorical = np.array([-.2, .3, .5]) - categorical = CategoricalProbabilityDistributionType(pdparam_categorical.size) - validate_probtype(categorical, pdparam_categorical) - - nvec = np.array([1, 2, 3]) - pdparam_multicategorical = np.array([-.2, .3, .5, .1, 1, -.1]) - multicategorical = MultiCategoricalProbabilityDistributionType(nvec) - validate_probtype(multicategorical, pdparam_multicategorical) - - pdparam_bernoulli = np.array([-.2, .3, .5]) - bernoulli = BernoulliProbabilityDistributionType(pdparam_bernoulli.size) - validate_probtype(bernoulli, pdparam_bernoulli) - - -def validate_probtype(probtype, pdparam): - """ - validate probability distribution types - - :param probtype: (ProbabilityDistributionType) the type to validate - :param pdparam: ([float]) the flat probabilities to test - """ - number_samples = 100000 - # Check to see if mean negative log likelihood == differential entropy - mval = np.repeat(pdparam[None, :], number_samples, axis=0) - mval_ph = probtype.param_placeholder([number_samples]) - xval_ph = probtype.sample_placeholder([number_samples]) - proba_distribution = probtype.proba_distribution_from_flat(mval_ph) - calcloglik = tf_util.function([xval_ph, mval_ph], proba_distribution.logp(xval_ph)) - calcent = tf_util.function([mval_ph], proba_distribution.entropy()) - xval = tf.get_default_session().run(proba_distribution.sample(), feed_dict={mval_ph: mval}) - logliks = calcloglik(xval, mval) - entval_ll = - logliks.mean() - entval_ll_stderr = logliks.std() / np.sqrt(number_samples) - entval = calcent(mval).mean() - assert np.abs(entval - entval_ll) < 3 * entval_ll_stderr # within 3 sigmas - - # Check to see if kldiv[p,q] = - ent[p] - E_p[log q] - mval2_ph = probtype.param_placeholder([number_samples]) - pd2 = probtype.proba_distribution_from_flat(mval2_ph) - tmp = pdparam + np.random.randn(pdparam.size) * 0.1 - mval2 = np.repeat(tmp[None, :], number_samples, axis=0) - calckl = tf_util.function([mval_ph, mval2_ph], proba_distribution.kl(pd2)) - klval = calckl(mval, mval2).mean() - logliks = calcloglik(xval, mval2) - klval_ll = - entval - logliks.mean() - klval_ll_stderr = logliks.std() / np.sqrt(number_samples) - assert np.abs(klval - klval_ll) < 3 * klval_ll_stderr # within 3 sigmas - print('ok on', probtype, pdparam) diff --git a/tests/test_envs.py b/tests/test_envs.py deleted file mode 100644 index d436f180..00000000 --- a/tests/test_envs.py +++ /dev/null @@ -1,149 +0,0 @@ -import pytest -import gym -from gym import spaces -import numpy as np - -from stable_baselines.common.env_checker import check_env -from stable_baselines.common.bit_flipping_env import BitFlippingEnv -from stable_baselines.common.identity_env import (IdentityEnv, IdentityEnvBox, - IdentityEnvMultiBinary, IdentityEnvMultiDiscrete,) - -ENV_CLASSES = [BitFlippingEnv, IdentityEnv, IdentityEnvBox, IdentityEnvMultiBinary, - IdentityEnvMultiDiscrete] - - -@pytest.mark.parametrize("env_id", ['CartPole-v0', 'Pendulum-v0', 'BreakoutNoFrameskip-v4']) -def test_env(env_id): - """ - Check that environmnent integrated in Gym pass the test. - - :param env_id: (str) - """ - env = gym.make(env_id) - with pytest.warns(None) as record: - check_env(env) - - # Pendulum-v0 will produce a warning because the action space is - # in [-2, 2] and not [-1, 1] - if env_id == 'Pendulum-v0': - assert len(record) == 1 - else: - # The other environments must pass without warning - assert len(record) == 0 - - -@pytest.mark.parametrize("env_class", ENV_CLASSES) -def test_custom_envs(env_class): - env = env_class() - check_env(env) - - -def test_high_dimension_action_space(): - """ - Test for continuous action space - with more than one action. - """ - env = gym.make('Pendulum-v0') - # Patch the action space - env.action_space = spaces.Box(low=-1, high=1, shape=(20,), dtype=np.float32) - # Patch to avoid error - def patched_step(_action): - return env.observation_space.sample(), 0.0, False, {} - env.step = patched_step - check_env(env) - - -@pytest.mark.parametrize("new_obs_space", [ - # Small image - spaces.Box(low=0, high=255, shape=(32, 32, 3), dtype=np.uint8), - # Range not in [0, 255] - spaces.Box(low=0, high=1, shape=(64, 64, 3), dtype=np.uint8), - # Wrong dtype - spaces.Box(low=0, high=255, shape=(64, 64, 3), dtype=np.float32), - # Not an image, it should be a 1D vector - spaces.Box(low=-1, high=1, shape=(64, 3), dtype=np.float32), - # Tuple space is not supported by SB - spaces.Tuple([spaces.Discrete(5), spaces.Discrete(10)]), - # Dict space is not supported by SB when env is not a GoalEnv - spaces.Dict({"position": spaces.Discrete(5)}), -]) -def test_non_default_spaces(new_obs_space): - env = gym.make('BreakoutNoFrameskip-v4') - env.observation_space = new_obs_space - # Patch methods to avoid errors - env.reset = new_obs_space.sample - - def patched_step(_action): - return new_obs_space.sample(), 0.0, False, {} - - env.step = patched_step - with pytest.warns(UserWarning): - check_env(env) - - -def check_reset_assert_error(env, new_reset_return): - """ - Helper to check that the error is caught. - :param env: (gym.Env) - :param new_reset_return: (Any) - """ - - def wrong_reset(): - return new_reset_return - - # Patch the reset method with a wrong one - env.reset = wrong_reset - with pytest.raises(AssertionError): - check_env(env) - - -def test_common_failures_reset(): - """ - Test that common failure cases of the `reset_method` are caught - """ - env = IdentityEnvBox() - # Return an observation that does not match the observation_space - check_reset_assert_error(env, np.ones((3,))) - # The observation is not a numpy array - check_reset_assert_error(env, 1) - - # Return not only the observation - check_reset_assert_error(env, (env.observation_space.sample(), False)) - - -def check_step_assert_error(env, new_step_return=()): - """ - Helper to check that the error is caught. - :param env: (gym.Env) - :param new_step_return: (tuple) - """ - - def wrong_step(_action): - return new_step_return - - # Patch the step method with a wrong one - env.step = wrong_step - with pytest.raises(AssertionError): - check_env(env) - - -def test_common_failures_step(): - """ - Test that common failure cases of the `step` method are caught - """ - env = IdentityEnvBox() - - # Wrong shape for the observation - check_step_assert_error(env, (np.ones((4,)), 1.0, False, {})) - # Obs is not a numpy array - check_step_assert_error(env, (1, 1.0, False, {})) - - # Return a wrong reward - check_step_assert_error(env, (env.observation_space.sample(), np.ones(1), False, {})) - - # Info dict is not returned - check_step_assert_error(env, (env.observation_space.sample(), 0.0, False)) - - # Done is not a boolean - check_step_assert_error(env, (env.observation_space.sample(), 0.0, 3.0, {})) - check_step_assert_error(env, (env.observation_space.sample(), 0.0, 1, {})) diff --git a/tests/test_gail.py b/tests/test_gail.py deleted file mode 100644 index 803cb8b7..00000000 --- a/tests/test_gail.py +++ /dev/null @@ -1,170 +0,0 @@ -import os -import shutil - -import gym -import numpy as np -import pytest - -from stable_baselines import (A2C, ACER, ACKTR, GAIL, DDPG, DQN, PPO1, PPO2, - TD3, TRPO, SAC) -from stable_baselines.common.cmd_util import make_atari_env -from stable_baselines.common.vec_env import VecFrameStack, DummyVecEnv -from stable_baselines.common.evaluation import evaluate_policy -from stable_baselines.common.callbacks import CheckpointCallback -from stable_baselines.gail import ExpertDataset, generate_expert_traj - - -EXPERT_PATH_PENDULUM = "stable_baselines/gail/dataset/expert_pendulum.npz" -EXPERT_PATH_DISCRETE = "stable_baselines/gail/dataset/expert_cartpole.npz" - - -@pytest.mark.parametrize("expert_env", [('Pendulum-v0', EXPERT_PATH_PENDULUM, True), - ('CartPole-v1', EXPERT_PATH_DISCRETE, False)]) -def test_gail(tmp_path, expert_env): - env_id, expert_path, load_from_memory = expert_env - env = gym.make(env_id) - - traj_data = None - if load_from_memory: - traj_data = np.load(expert_path) - expert_path = None - dataset = ExpertDataset(traj_data=traj_data, expert_path=expert_path, traj_limitation=10, - sequential_preprocessing=True) - - # Note: train for 1M steps to have a working policy - model = GAIL('MlpPolicy', env, adversary_entcoeff=0.0, lam=0.92, max_kl=0.001, - expert_dataset=dataset, hidden_size_adversary=64, verbose=0) - - model.learn(300) - model.save(str(tmp_path / "GAIL-{}".format(env_id))) - model = model.load(str(tmp_path / "GAIL-{}".format(env_id)), env=env) - model.learn(300) - - evaluate_policy(model, env, n_eval_episodes=5) - del dataset, model - - -@pytest.mark.parametrize("generate_env", [ - (SAC, 'MlpPolicy', 'Pendulum-v0', 1, 10), - (DQN, 'MlpPolicy', 'CartPole-v1', 1, 10), - (A2C, 'MlpLstmPolicy', 'Pendulum-v0', 1, 10), - (A2C, 'MlpLstmPolicy', 'CartPole-v1', 1, 10), - (A2C, 'CnnPolicy', 'BreakoutNoFrameskip-v4', 8, 1), - ]) -def test_generate(tmp_path, generate_env): - model, policy, env_name, n_env, n_episodes = generate_env - - if n_env > 1: - env = make_atari_env(env_name, num_env=n_env, seed=0) - model = model(policy, env, verbose=0) - else: - model = model(policy, env_name, verbose=0) - - dataset = generate_expert_traj(model, str(tmp_path / 'expert'), n_timesteps=300, n_episodes=n_episodes, - image_folder=str(tmp_path / 'test_recorded_images')) - - assert set(dataset.keys()).issuperset(['actions', 'obs', 'rewards', 'episode_returns', 'episode_starts']) - assert sum(dataset['episode_starts']) == n_episodes - assert len(dataset['episode_returns']) == n_episodes - n_timesteps = len(dataset['episode_starts']) - for key, val in dataset.items(): - if key != 'episode_returns': - assert val.shape[0] == n_timesteps, "inconsistent number of timesteps at '{}'".format(key) - - dataset_loaded = np.load(str(tmp_path / 'expert.npz'), allow_pickle=True) - assert dataset.keys() == dataset_loaded.keys() - for key in dataset.keys(): - assert (dataset[key] == dataset_loaded[key]).all(), "different data at '{}'".format(key) - # Cleanup folder - if os.path.isdir(str(tmp_path / 'test_recorded_images')): - shutil.rmtree(str(tmp_path / 'test_recorded_images')) - - -def test_generate_callable(tmp_path): - """ - Test generating expert trajectories with a callable. - """ - env = gym.make("CartPole-v1") - # Here the expert is a random agent - def dummy_expert(_obs): - return env.action_space.sample() - generate_expert_traj(dummy_expert, tmp_path / 'dummy_expert_cartpole', env, n_timesteps=0, n_episodes=10) - -def test_pretrain_twice(tmp_path): - """ - Test pretraining twice in the same execution. - """ - dataset = ExpertDataset(expert_path=EXPERT_PATH_PENDULUM, traj_limitation=10, - sequential_preprocessing=True, verbose=0) - model = PPO2("MlpPolicy", "Pendulum-v0") - model.pretrain(dataset, n_epochs=5) - model.pretrain(dataset, n_epochs=5) - del dataset, model - -@pytest.mark.xfail(reason="Not Enough Memory", strict=False) -def test_pretrain_images(tmp_path): - env = make_atari_env("PongNoFrameskip-v4", num_env=1, seed=0) - env = VecFrameStack(env, n_stack=3) - model = PPO2('CnnPolicy', env) - generate_expert_traj(model, str(tmp_path / 'expert_pong'), n_timesteps=0, n_episodes=1, - image_folder=str(tmp_path / 'pretrain_recorded_images')) - - expert_path = str(tmp_path / 'expert_pong.npz') - dataset = ExpertDataset(expert_path=expert_path, traj_limitation=1, batch_size=32, - sequential_preprocessing=True) - model.pretrain(dataset, n_epochs=2) - - shutil.rmtree(str(tmp_path / 'pretrain_recorded_images')) - env.close() - del dataset, model, env - - -def test_gail_callback(tmp_path): - dataset = ExpertDataset(expert_path=EXPERT_PATH_PENDULUM, traj_limitation=10, - sequential_preprocessing=True, verbose=0) - model = GAIL("MlpPolicy", "Pendulum-v0", dataset) - checkpoint_callback = CheckpointCallback(save_freq=150, save_path=str(tmp_path / 'logs/gail/'), name_prefix='gail') - model.learn(total_timesteps=301, callback=checkpoint_callback) - shutil.rmtree(str(tmp_path / 'logs/gail/')) - del dataset, model - - -@pytest.mark.parametrize("model_class", [A2C, ACKTR, GAIL, DDPG, PPO1, PPO2, SAC, TD3, TRPO]) -def test_behavior_cloning_box(tmp_path, model_class): - """ - Behavior cloning with continuous actions. - """ - dataset = ExpertDataset(expert_path=EXPERT_PATH_PENDULUM, traj_limitation=10, - sequential_preprocessing=True, verbose=0) - model = model_class("MlpPolicy", "Pendulum-v0") - model.pretrain(dataset, n_epochs=5) - model.save(str(tmp_path / "test-pretrain")) - del dataset, model - - -@pytest.mark.parametrize("model_class", [A2C, ACER, ACKTR, DQN, GAIL, PPO1, PPO2, TRPO]) -def test_behavior_cloning_discrete(tmp_path, model_class): - dataset = ExpertDataset(expert_path=EXPERT_PATH_DISCRETE, traj_limitation=10, - sequential_preprocessing=True, verbose=0) - model = model_class("MlpPolicy", "CartPole-v1") - model.pretrain(dataset, n_epochs=5) - model.save(str(tmp_path / "test-pretrain")) - del dataset, model - - -def test_dataset_param_validation(): - with pytest.raises(ValueError): - ExpertDataset() - - traj_data = np.load(EXPERT_PATH_PENDULUM) - with pytest.raises(ValueError): - ExpertDataset(traj_data=traj_data, expert_path=EXPERT_PATH_PENDULUM) - - -def test_generate_vec_env_non_image_observation(): - env = DummyVecEnv([lambda: gym.make('CartPole-v1')] * 2) - - model = PPO2('MlpPolicy', env) - model.learn(total_timesteps=300) - - generate_expert_traj(model, save_path='.', n_timesteps=0, n_episodes=5) diff --git a/tests/test_her.py b/tests/test_her.py deleted file mode 100644 index 127a799f..00000000 --- a/tests/test_her.py +++ /dev/null @@ -1,119 +0,0 @@ -import os - -import pytest - -from stable_baselines import HER, DQN, SAC, DDPG, TD3 -from stable_baselines.her import GoalSelectionStrategy, HERGoalEnvWrapper -from stable_baselines.her.replay_buffer import KEY_TO_GOAL_STRATEGY -from stable_baselines.common.bit_flipping_env import BitFlippingEnv -from stable_baselines.common.vec_env import DummyVecEnv, VecNormalize - -N_BITS = 10 - - -def model_predict(model, env, n_steps, additional_check=None): - """ - Test helper - :param model: (rl model) - :param env: (gym.Env) - :param n_steps: (int) - :param additional_check: (callable) - """ - obs = env.reset() - for _ in range(n_steps): - action, _ = model.predict(obs) - obs, reward, done, _ = env.step(action) - - if additional_check is not None: - additional_check(obs, action, reward, done) - - if done: - obs = env.reset() - - -@pytest.mark.parametrize('goal_selection_strategy', list(GoalSelectionStrategy)) -@pytest.mark.parametrize('model_class', [DQN, SAC, DDPG, TD3]) -@pytest.mark.parametrize('discrete_obs_space', [False, True]) -def test_her(model_class, goal_selection_strategy, discrete_obs_space): - env = BitFlippingEnv(N_BITS, continuous=model_class in [DDPG, SAC, TD3], - max_steps=N_BITS, discrete_obs_space=discrete_obs_space) - - # Take random actions 10% of the time - kwargs = {'random_exploration': 0.1} if model_class in [DDPG, SAC, TD3] else {} - model = HER('MlpPolicy', env, model_class, n_sampled_goal=4, goal_selection_strategy=goal_selection_strategy, - verbose=0, **kwargs) - model.learn(150) - - -@pytest.mark.parametrize('model_class', [DDPG, SAC, DQN, TD3]) -def test_long_episode(model_class): - """ - Check that the model does not break when the replay buffer is still empty - after the first rollout (because the episode is not over). - """ - # n_bits > nb_rollout_steps - n_bits = 10 - env = BitFlippingEnv(n_bits, continuous=model_class in [DDPG, SAC, TD3], - max_steps=n_bits) - kwargs = {} - if model_class == DDPG: - kwargs['nb_rollout_steps'] = 9 # < n_bits - elif model_class in [DQN, SAC, TD3]: - kwargs['batch_size'] = 8 # < n_bits - kwargs['learning_starts'] = 0 - - model = HER('MlpPolicy', env, model_class, n_sampled_goal=4, goal_selection_strategy='future', - verbose=0, **kwargs) - model.learn(100) - - -@pytest.mark.parametrize('goal_selection_strategy', [list(KEY_TO_GOAL_STRATEGY.keys())[0]]) -@pytest.mark.parametrize('model_class', [DQN, SAC, DDPG, TD3]) -def test_model_manipulation(model_class, goal_selection_strategy): - env = BitFlippingEnv(N_BITS, continuous=model_class in [DDPG, SAC, TD3], max_steps=N_BITS) - env = DummyVecEnv([lambda: env]) - - model = HER('MlpPolicy', env, model_class, n_sampled_goal=3, goal_selection_strategy=goal_selection_strategy, - verbose=0) - model.learn(150) - - model_predict(model, env, n_steps=20, additional_check=None) - - model.save('./test_her.zip') - del model - - # NOTE: HER does not support VecEnvWrapper yet - with pytest.raises(AssertionError): - model = HER.load('./test_her.zip', env=VecNormalize(env)) - - model = HER.load('./test_her.zip') - - # Check that the model raises an error when the env - # is not wrapped (or no env passed to the model) - with pytest.raises(ValueError): - model.predict(env.reset()) - - env_ = BitFlippingEnv(N_BITS, continuous=model_class in [DDPG, SAC, TD3], max_steps=N_BITS) - env_ = HERGoalEnvWrapper(env_) - - model_predict(model, env_, n_steps=20, additional_check=None) - - model.set_env(env) - model.learn(150) - - model_predict(model, env_, n_steps=20, additional_check=None) - - assert model.n_sampled_goal == 3 - - del model - - env = BitFlippingEnv(N_BITS, continuous=model_class in [DDPG, SAC, TD3], max_steps=N_BITS) - model = HER.load('./test_her', env=env) - model.learn(150) - - model_predict(model, env_, n_steps=20, additional_check=None) - - assert model.n_sampled_goal == 3 - - if os.path.isfile('./test_her.zip'): - os.remove('./test_her.zip') diff --git a/tests/test_identity.py b/tests/test_identity.py deleted file mode 100644 index 0ee44cc3..00000000 --- a/tests/test_identity.py +++ /dev/null @@ -1,136 +0,0 @@ -import pytest -import numpy as np - -from stable_baselines import A2C, ACER, ACKTR, DQN, DDPG, SAC, PPO1, PPO2, TD3, TRPO -from stable_baselines.ddpg import NormalActionNoise -from stable_baselines.common.identity_env import IdentityEnv, IdentityEnvBox -from stable_baselines.common.vec_env import DummyVecEnv -from stable_baselines.common.evaluation import evaluate_policy - - -# Hyperparameters for learning identity for each RL model -LEARN_FUNC_DICT = { - "a2c": lambda e: A2C( - policy="MlpPolicy", - learning_rate=1e-3, - n_steps=4, - gamma=0.4, - ent_coef=0.0, - env=e, - seed=0, - ).learn(total_timesteps=4000), - "acer": lambda e: ACER( - policy="MlpPolicy", - env=e, - seed=0, - n_steps=4, - replay_ratio=1, - ent_coef=0.0, - ).learn(total_timesteps=4000), - "acktr": lambda e: ACKTR( - policy="MlpPolicy", env=e, seed=0, learning_rate=5e-4, ent_coef=0.0, n_steps=4 - ).learn(total_timesteps=4000), - "dqn": lambda e: DQN( - policy="MlpPolicy", - batch_size=32, - gamma=0.1, - learning_starts=0, - exploration_final_eps=0.05, - exploration_fraction=0.1, - env=e, - seed=0, - ).learn(total_timesteps=4000), - "ppo1": lambda e: PPO1( - policy="MlpPolicy", - env=e, - seed=0, - lam=0.5, - entcoeff=0.0, - optim_batchsize=16, - gamma=0.4, - optim_stepsize=1e-3, - ).learn(total_timesteps=3000), - "ppo2": lambda e: PPO2( - policy="MlpPolicy", - env=e, - seed=0, - learning_rate=1.5e-3, - lam=0.8, - ent_coef=0.0, - gamma=0.4, - ).learn(total_timesteps=3000), - "trpo": lambda e: TRPO( - policy="MlpPolicy", - env=e, - gamma=0.4, - seed=0, - max_kl=0.05, - lam=0.7, - timesteps_per_batch=256, - ).learn(total_timesteps=4000), -} - - -@pytest.mark.slow -@pytest.mark.parametrize( - "model_name", ["a2c", "acer", "acktr", "dqn", "ppo1", "ppo2", "trpo"] -) -def test_identity_discrete(model_name): - """ - Test if the algorithm (with a given policy) - can learn an identity transformation (i.e. return observation as an action) - - :param model_name: (str) Name of the RL model - """ - env = DummyVecEnv([lambda: IdentityEnv(10)]) - - model = LEARN_FUNC_DICT[model_name](env) - evaluate_policy(model, env, n_eval_episodes=20, reward_threshold=90) - - obs = env.reset() - assert model.action_probability(obs).shape == ( - 1, - 10, - ), "Error: action_probability not returning correct shape" - action = env.action_space.sample() - action_prob = model.action_probability(obs, actions=action) - assert np.prod(action_prob.shape) == 1, "Error: not scalar probability" - action_logprob = model.action_probability(obs, actions=action, logp=True) - assert np.allclose(action_prob, np.exp(action_logprob)), ( - action_prob, - action_logprob, - ) - - # Free memory - del model, env - - -@pytest.mark.slow -@pytest.mark.parametrize("model_class", [DDPG, TD3, SAC]) -def test_identity_continuous(model_class): - """ - Test if the algorithm (with a given policy) - can learn an identity transformation (i.e. return observation as an action) - """ - env = DummyVecEnv([lambda: IdentityEnvBox(eps=0.5)]) - - n_steps = {SAC: 700, TD3: 500, DDPG: 2000}[model_class] - - kwargs = dict(seed=0, gamma=0.95, buffer_size=1e5) - if model_class in [DDPG, TD3]: - n_actions = 1 - action_noise = NormalActionNoise( - mean=np.zeros(n_actions), sigma=0.05 * np.ones(n_actions) - ) - kwargs["action_noise"] = action_noise - - if model_class == DDPG: - kwargs["actor_lr"] = 1e-3 - kwargs["batch_size"] = 100 - - model = model_class("MlpPolicy", env, **kwargs) - model.learn(total_timesteps=n_steps) - - evaluate_policy(model, env, n_eval_episodes=20, reward_threshold=90) - # Free memory - del model, env diff --git a/tests/test_load_parameters.py b/tests/test_load_parameters.py deleted file mode 100644 index f1f5c7b1..00000000 --- a/tests/test_load_parameters.py +++ /dev/null @@ -1,136 +0,0 @@ -import os -from io import BytesIO - -import pytest -import numpy as np - -from stable_baselines import A2C, ACER, ACKTR, DQN, PPO1, PPO2, TRPO -from stable_baselines.common.identity_env import IdentityEnv -from stable_baselines.common.vec_env import DummyVecEnv - -MODEL_LIST = [ - A2C, - ACER, - ACKTR, - DQN, - PPO1, - PPO2, - TRPO, -] - - -@pytest.mark.parametrize("model_class", MODEL_LIST) -def test_load_parameters(request, model_class): - """ - Test if ``load_parameters`` loads given parameters correctly (the model actually changes) - and that the backwards compatability with a list of params works - - :param model_class: (BaseRLModel) A RL model - """ - env = DummyVecEnv([lambda: IdentityEnv(10)]) - - # create model - model = model_class(policy="MlpPolicy", env=env) - - # test action probability for given (obs, action) pair - env = model.get_env() - obs = env.reset() - observations = np.array([obs for _ in range(10)]) - observations = np.squeeze(observations) - - actions = np.array([env.action_space.sample() for _ in range(10)]) - original_actions_probas = model.action_probability(observations, actions=actions) - - # Get dictionary of current parameters - params = model.get_parameters() - # Modify all parameters to be random values - random_params = dict((param_name, np.random.random(size=param.shape)) for param_name, param in params.items()) - # Update model parameters with the new zeroed values - model.load_parameters(random_params) - # Get new action probas - new_actions_probas = model.action_probability(observations, actions=actions) - - # Check that at least some action probabilities are different now - assert not np.any(np.isclose(original_actions_probas, new_actions_probas)), "Action probabilities did not change " \ - "after changing model parameters." - # Also check that new parameters are there (they should be random_params) - new_params = model.get_parameters() - comparisons = [np.all(np.isclose(new_params[key], random_params[key])) for key in random_params.keys()] - assert all(comparisons), "Parameters of model are not the same as provided ones." - - # Now test the backwards compatibility with params being a list instead of a dict. - # Get the ordering of parameters. - tf_param_list = model.get_parameter_list() - # Make random parameters negative to make sure the results should be different from - # previous random values - random_param_list = [-np.random.random(size=tf_param.shape) for tf_param in tf_param_list] - model.load_parameters(random_param_list) - - # Compare results against the previous load - new_actions_probas_list = model.action_probability(observations, actions=actions) - assert not np.any(np.isclose(new_actions_probas, new_actions_probas_list)), "Action probabilities did not " \ - "change after changing model " \ - "parameters (list)." - - # Test file/file-like object loading for load_parameters. - # Save whatever is stored in model now, assign random parameters, - # load parameters from file with load_parameters and check if original probabilities - # are restored - original_actions_probas = model.action_probability(observations, actions=actions) - model_fname = './test_model_{}.zip'.format(request.node.name) - - try: - # Save model to a file and file-like buffer - # (partly copy/paste from test_save) - model.save(model_fname) - b_io = BytesIO() - model.save(b_io) - model_bytes = b_io.getvalue() - b_io.close() - - random_params = dict((param_name, np.random.random(size=param.shape)) for param_name, param in params.items()) - model.load_parameters(random_params) - # Previous tests confirm that load_parameters works, - # so just right into testing loading from file - model.load_parameters(model_fname) - new_actions_probas = model.action_probability(observations, actions=actions) - assert np.all(np.isclose(original_actions_probas, new_actions_probas)), "Action probabilities changed " \ - "after load_parameters from a file." - # Reset with random parameters again - model.load_parameters(random_params) - # Now load from file-like (copy/paste from test_save) - b_io = BytesIO(model_bytes) - model.load_parameters(b_io) - b_io.close() - new_actions_probas = model.action_probability(observations, actions=actions) - assert np.all(np.isclose(original_actions_probas, new_actions_probas)), "Action probabilities changed after" \ - "load_parameters from a file-like." - finally: - if os.path.exists(model_fname): - os.remove(model_fname) - - # Test `exact_match` functionality of load_parameters - original_actions_probas = model.action_probability(observations, actions=actions) - # Create dictionary with one variable name missing - truncated_random_params = dict((param_name, np.random.random(size=param.shape)) - for param_name, param in params.items()) - # Remove some element - _ = truncated_random_params.pop(list(truncated_random_params.keys())[0]) - # With exact_match=True, this should be an expection - with pytest.raises(RuntimeError): - model.load_parameters(truncated_random_params, exact_match=True) - # Make sure we did not update model regardless - new_actions_probas = model.action_probability(observations, actions=actions) - assert np.all(np.isclose(original_actions_probas, new_actions_probas)), "Action probabilities changed " \ - "after load_parameters raised " \ - "RunTimeError (exact_match=True)." - - # With False, this should be fine - model.load_parameters(truncated_random_params, exact_match=False) - # Also check that results changed, again - new_actions_probas = model.action_probability(observations, actions=actions) - assert not np.any(np.isclose(original_actions_probas, new_actions_probas)), "Action probabilities did not " \ - "change after changing model " \ - "parameters (exact_match=False)." - - del model, env diff --git a/tests/test_log_prob.py b/tests/test_log_prob.py deleted file mode 100644 index 3fbaf90b..00000000 --- a/tests/test_log_prob.py +++ /dev/null @@ -1,22 +0,0 @@ -import pytest -import numpy as np - -from stable_baselines import A2C, ACKTR, PPO1, PPO2, TRPO -from stable_baselines.common.identity_env import IdentityEnvBox - - -class Helper: - @staticmethod - def proba_vals(obs, state, mask): - # Return fixed mean, std - return np.array([-0.4]), np.array([[0.1]]) - - -@pytest.mark.parametrize("model_class", [A2C, ACKTR, PPO1, PPO2, TRPO]) -def test_log_prob_calcuation(model_class): - model = model_class("MlpPolicy", IdentityEnvBox()) - # Fixed mean/std - model.proba_step = Helper.proba_vals - # Check that the log probability is the one expected for the given mean/std - logprob = model.action_probability(observation=np.array([[0.5], [0.5]]), actions=0.2, logp=True) - assert np.allclose(logprob, np.array([-16.616353440210627])), "Calculation failed for {}".format(model_class) diff --git a/tests/test_logger.py b/tests/test_logger.py deleted file mode 100644 index 3b9ab569..00000000 --- a/tests/test_logger.py +++ /dev/null @@ -1,52 +0,0 @@ -import pytest -import numpy as np - -from stable_baselines.logger import make_output_format, read_tb, read_csv, read_json, _demo -from .test_common import _maybe_disable_mpi - - -KEY_VALUES = { - "test": 1, - "b": -3.14, - "8": 9.9, - "l": [1, 2], - "a": np.array([1, 2, 3]), - "f": np.array(1), - "g": np.array([[[1]]]), -} -LOG_DIR = '/tmp/openai_baselines/' - - -def test_main(): - """ - Dry-run python -m stable_baselines.logger - """ - _demo() - - -@pytest.mark.parametrize('_format', ['tensorboard', 'stdout', 'log', 'json', 'csv']) -@pytest.mark.parametrize('mpi_disabled', [False, True]) -def test_make_output(_format, mpi_disabled): - """ - test make output - - :param _format: (str) output format - """ - with _maybe_disable_mpi(mpi_disabled): - writer = make_output_format(_format, LOG_DIR) - writer.writekvs(KEY_VALUES) - if _format == 'tensorboard': - read_tb(LOG_DIR) - elif _format == "csv": - read_csv(LOG_DIR + 'progress.csv') - elif _format == 'json': - read_json(LOG_DIR + 'progress.json') - writer.close() - - -def test_make_output_fail(): - """ - test value error on logger - """ - with pytest.raises(ValueError): - make_output_format('dummy_format', LOG_DIR) diff --git a/tests/test_lstm_policy.py b/tests/test_lstm_policy.py deleted file mode 100644 index 1f9e15f3..00000000 --- a/tests/test_lstm_policy.py +++ /dev/null @@ -1,132 +0,0 @@ -import os - -from gym.envs.classic_control import CartPoleEnv -from gym.wrappers.time_limit import TimeLimit -from gym import spaces -import numpy as np -import pytest - -from stable_baselines import A2C, ACER, ACKTR, PPO2, bench -from stable_baselines.common.policies import MlpLstmPolicy, LstmPolicy -from stable_baselines.common.vec_env import SubprocVecEnv -from stable_baselines.common.vec_env.vec_normalize import VecNormalize -from stable_baselines.common.math_util import safe_mean -from stable_baselines.common.evaluation import evaluate_policy - - -class CustomLSTMPolicy1(LstmPolicy): - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, n_lstm=128, reuse=False, **_kwargs): - super().__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, n_lstm, reuse, net_arch=[8, 'lstm', 8], - layer_norm=False, feature_extraction="mlp", **_kwargs) - - -class CustomLSTMPolicy2(LstmPolicy): - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, n_lstm=64, reuse=False, **_kwargs): - super().__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, n_lstm, reuse, - net_arch=['lstm', 8], layer_norm=True, feature_extraction="mlp", **_kwargs) - - -class CustomLSTMPolicy3(LstmPolicy): - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, n_lstm=64, reuse=False, **_kwargs): - super().__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, n_lstm, reuse, - net_arch=[8, 'lstm'], layer_norm=False, feature_extraction="mlp", **_kwargs) - - -class CustomLSTMPolicy4(LstmPolicy): - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, n_lstm=64, reuse=False, **_kwargs): - super().__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, n_lstm, reuse, - net_arch=[8, 'lstm', dict(vf=[5, 10], pi=[10])], - layer_norm=True, feature_extraction="mlp", **_kwargs) - - -class CartPoleNoVelEnv(CartPoleEnv): - """Variant of CartPoleEnv with velocity information removed. This task requires memory to solve.""" - - def __init__(self): - super(CartPoleNoVelEnv, self).__init__() - high = np.array([ - self.x_threshold * 2, - self.theta_threshold_radians * 2, - ]) - self.observation_space = spaces.Box(-high, high, dtype=np.float32) - - @staticmethod - def _pos_obs(full_obs): - xpos, _xvel, thetapos, _thetavel = full_obs - return xpos, thetapos - - def reset(self): - full_obs = super().reset() - return CartPoleNoVelEnv._pos_obs(full_obs) - - def step(self, action): - full_obs, rew, done, info = super().step(action) - return CartPoleNoVelEnv._pos_obs(full_obs), rew, done, info - - -N_TRIALS = 100 -NUM_ENVS = 16 -NUM_EPISODES_FOR_SCORE = 10 - -MODELS = [A2C, ACER, ACKTR, PPO2] -LSTM_POLICIES = [MlpLstmPolicy, CustomLSTMPolicy1, CustomLSTMPolicy2, CustomLSTMPolicy3, CustomLSTMPolicy4] - - -@pytest.mark.parametrize("model_class", MODELS) -@pytest.mark.parametrize("policy", LSTM_POLICIES) -def test_lstm_policy(request, model_class, policy): - model_fname = './test_model_{}.zip'.format(request.node.name) - - try: - # create and train - if model_class == PPO2: - model = model_class(policy, 'CartPole-v1', nminibatches=1, n_steps=4) - else: - model = model_class(policy, 'CartPole-v1', n_steps=4) - model.learn(total_timesteps=15) - - env = model.get_env() - evaluate_policy(model, env, n_eval_episodes=10) - # saving - model.save(model_fname) - del model, env - # loading - _ = model_class.load(model_fname, policy=policy) - - finally: - if os.path.exists(model_fname): - os.remove(model_fname) - - -@pytest.mark.expensive -def test_lstm_train(): - """Test that LSTM models are able to achieve >=150 (out of 500) reward on CartPoleNoVelEnv. - - This environment requires memory to perform well in.""" - def make_env(i): - env = CartPoleNoVelEnv() - env = TimeLimit(env, max_episode_steps=500) - env = bench.Monitor(env, None, allow_early_resets=True) - env.seed(i) - return env - - env = SubprocVecEnv([lambda: make_env(i) for i in range(NUM_ENVS)]) - env = VecNormalize(env) - model = PPO2(MlpLstmPolicy, env, n_steps=128, nminibatches=NUM_ENVS, lam=0.95, gamma=0.99, - noptepochs=10, ent_coef=0.0, learning_rate=3e-4, cliprange=0.2, verbose=1) - - eprewmeans = [] - def reward_callback(local, _): - nonlocal eprewmeans - eprewmeans.append(safe_mean([ep_info['r'] for ep_info in local['ep_info_buf']])) - - model.learn(total_timesteps=100000, callback=reward_callback) - - # Maximum episode reward is 500. - # In CartPole-v1, a non-recurrent policy can easily get >= 450. - # In CartPoleNoVelEnv, a non-recurrent policy doesn't get more than ~50. - # LSTM policies can reach above 400, but it varies a lot between runs; consistently get >=150. - # See PR #244 for more detailed benchmarks. - - average_reward = sum(eprewmeans[-NUM_EPISODES_FOR_SCORE:]) / NUM_EPISODES_FOR_SCORE - assert average_reward >= 150, "Mean reward below 150; per-episode rewards {}".format(average_reward) diff --git a/tests/test_math_util.py b/tests/test_math_util.py deleted file mode 100644 index 584ba98d..00000000 --- a/tests/test_math_util.py +++ /dev/null @@ -1,81 +0,0 @@ -import tensorflow as tf -import numpy as np -from gym.spaces.box import Box - -from stable_baselines.common.math_util import discount_with_boundaries, scale_action, unscale_action - - -def test_discount_with_boundaries(): - """ - test the discount_with_boundaries function - """ - gamma = 0.9 - rewards = np.array([1.0, 2.0, 3.0, 4.0], 'float32') - episode_starts = [1.0, 0.0, 0.0, 1.0] - discounted_rewards = discount_with_boundaries(rewards, episode_starts, gamma) - assert np.allclose(discounted_rewards, [1 + gamma * 2 + gamma ** 2 * 3, 2 + gamma * 3, 3, 4]) - return - - -def test_scaling_action(): - """ - test scaling of scalar, 1d and 2d vectors of finite non-NaN real numbers to and from tanh co-domain (per component) - """ - test_ranges = [(-1, 1), (-10, 10), (-10, 5), (-10, 0), (-10, -5), (0, 10), (5, 10)] - - # scalars - for (range_low, range_high) in test_ranges: - check_scaled_actions_from_range(range_low, range_high, scalar=True) - - # 1d vectors: wrapped scalars - for test_range in test_ranges: - check_scaled_actions_from_range(*test_range) - - # 2d vectors: all combinations of ranges above - for (r1_low, r1_high) in test_ranges: - for (r2_low, r2_high) in test_ranges: - check_scaled_actions_from_range(np.array([r1_low, r2_low], dtype=np.float), - np.array([r1_high, r2_high], dtype=np.float)) - - -def check_scaled_actions_from_range(low, high, scalar=False): - """ - helper method which creates dummy action space spanning between respective components of low and high - and then checks scaling to and from tanh co-domain for low, middle and high value from that action space - :param low: (np.ndarray), (int) or (float) - :param high: (np.ndarray), (int) or (float) - :param scalar: (bool) Whether consider scalar range or wrap it into 1d vector - """ - - if scalar and (isinstance(low, float) or isinstance(low, int)): - ones = 1. - action_space = Box(low, high, shape=(1,)) - else: - low = np.atleast_1d(low) - high = np.atleast_1d(high) - ones = np.ones_like(low) - action_space = Box(low, high) - - mid = 0.5 * (low + high) - - expected_mapping = [(low, -ones), (mid, 0. * ones), (high, ones)] - - for (not_scaled, scaled) in expected_mapping: - assert np.allclose(scale_action(action_space, not_scaled), scaled) - assert np.allclose(unscale_action(action_space, scaled), not_scaled) - - -def test_batch_shape_invariant_to_scaling(): - """ - test that scaling deals well with batches as tensors and numpy matrices in terms of shape - """ - action_space = Box(np.array([-10., -5., -1.]), np.array([10., 3., 2.])) - - tensor = tf.constant(1., shape=[2, 3]) - matrix = np.ones((2, 3)) - - assert scale_action(action_space, tensor).shape == (2, 3) - assert scale_action(action_space, matrix).shape == (2, 3) - - assert unscale_action(action_space, tensor).shape == (2, 3) - assert unscale_action(action_space, matrix).shape == (2, 3) diff --git a/tests/test_monitor.py b/tests/test_monitor.py deleted file mode 100644 index f69561b4..00000000 --- a/tests/test_monitor.py +++ /dev/null @@ -1,87 +0,0 @@ -import uuid -import json -import os - -import pandas -import gym - -from stable_baselines.bench import Monitor -from stable_baselines.bench.monitor import get_monitor_files, load_results - - -def test_monitor(): - """ - test the monitor wrapper - """ - env = gym.make("CartPole-v1") - env.seed(0) - mon_file = "/tmp/stable_baselines-test-{}.monitor.csv".format(uuid.uuid4()) - menv = Monitor(env, mon_file) - menv.reset() - for _ in range(1000): - _, _, done, _ = menv.step(0) - if done: - menv.reset() - - file_handler = open(mon_file, 'rt') - - firstline = file_handler.readline() - assert firstline.startswith('#') - metadata = json.loads(firstline[1:]) - assert metadata['env_id'] == "CartPole-v1" - assert set(metadata.keys()) == {'env_id', 't_start'}, "Incorrect keys in monitor metadata" - - last_logline = pandas.read_csv(file_handler, index_col=None) - assert set(last_logline.keys()) == {'l', 't', 'r'}, "Incorrect keys in monitor logline" - file_handler.close() - os.remove(mon_file) - - -def test_monitor_load_results(tmp_path): - """ - test load_results on log files produced by the monitor wrapper - """ - tmp_path = str(tmp_path) - env1 = gym.make("CartPole-v1") - env1.seed(0) - monitor_file1 = os.path.join(tmp_path, "stable_baselines-test-{}.monitor.csv".format(uuid.uuid4())) - monitor_env1 = Monitor(env1, monitor_file1) - - monitor_files = get_monitor_files(tmp_path) - assert len(monitor_files) == 1 - assert monitor_file1 in monitor_files - - monitor_env1.reset() - episode_count1 = 0 - for _ in range(1000): - _, _, done, _ = monitor_env1.step(monitor_env1.action_space.sample()) - if done: - episode_count1 += 1 - monitor_env1.reset() - - results_size1 = len(load_results(os.path.join(tmp_path)).index) - assert results_size1 == episode_count1 - - env2 = gym.make("CartPole-v1") - env2.seed(0) - monitor_file2 = os.path.join(tmp_path, "stable_baselines-test-{}.monitor.csv".format(uuid.uuid4())) - monitor_env2 = Monitor(env2, monitor_file2) - monitor_files = get_monitor_files(tmp_path) - assert len(monitor_files) == 2 - assert monitor_file1 in monitor_files - assert monitor_file2 in monitor_files - - monitor_env2.reset() - episode_count2 = 0 - for _ in range(1000): - _, _, done, _ = monitor_env2.step(monitor_env2.action_space.sample()) - if done: - episode_count2 += 1 - monitor_env2.reset() - - results_size2 = len(load_results(os.path.join(tmp_path)).index) - - assert results_size2 == (results_size1 + episode_count2) - - os.remove(monitor_file1) - os.remove(monitor_file2) diff --git a/tests/test_mpi_adam.py b/tests/test_mpi_adam.py deleted file mode 100644 index f7484ac7..00000000 --- a/tests/test_mpi_adam.py +++ /dev/null @@ -1,24 +0,0 @@ -import subprocess - -import pytest - -from .test_common import _assert_eq - - -def test_mpi_adam(): - """Test RunningMeanStd object for MPI""" - # Test will be run in CI before pytest is run - pytest.skip() - return_code = subprocess.call(['mpirun', '--allow-run-as-root', '-np', '2', - 'python', '-m', 'stable_baselines.common.mpi_adam']) - _assert_eq(return_code, 0) - - -def test_mpi_adam_ppo1(): - """Running test for ppo1""" - # Test will be run in CI before pytest is run - pytest.skip() - return_code = subprocess.call(['mpirun', '--allow-run-as-root', '-np', '2', - 'python', '-m', - 'stable_baselines.ppo1.experiments.train_cartpole']) - _assert_eq(return_code, 0) diff --git a/tests/test_multiple_learn.py b/tests/test_multiple_learn.py deleted file mode 100644 index e4bed8db..00000000 --- a/tests/test_multiple_learn.py +++ /dev/null @@ -1,61 +0,0 @@ -import pytest - -from stable_baselines import A2C, ACER, ACKTR, PPO2 -from stable_baselines.common.identity_env import IdentityEnv, IdentityEnvBox -from stable_baselines.common.vec_env import DummyVecEnv - -# TODO: Fix multiple-learn on commented-out models (Issue #619). -MODEL_LIST = [ - A2C, - ACER, - ACKTR, - PPO2, - - # MPI-based models, which use traj_segment_generator instead of Runner. - # - # PPO1, - # TRPO, - - # Off-policy models, which don't use Runner but reset every .learn() anyways. - # - # DDPG, - # SAC, - # TD3, -] - - -@pytest.mark.parametrize("model_class", MODEL_LIST) -def test_model_multiple_learn_no_reset(model_class): - """Check that when we call learn multiple times, we don't unnecessarily - reset the environment. - """ - if model_class is ACER: - def make_env(): - return IdentityEnv(ep_length=1e10, dim=2) - else: - def make_env(): - return IdentityEnvBox(ep_length=1e10) - env = make_env() - venv = DummyVecEnv([lambda: env]) - model = model_class(policy="MlpPolicy", env=venv) - _check_reset_count(model, env) - - # Try again following a `set_env`. - env = make_env() - venv = DummyVecEnv([lambda: env]) - assert env.num_resets == 0 - - model.set_env(venv) - _check_reset_count(model, env) - - -def _check_reset_count(model, env: IdentityEnv): - assert env.num_resets == 0 - _prev_runner = None - for _ in range(2): - model.learn(total_timesteps=300) - # Lazy constructor for Runner fires upon the first call to learn. - assert env.num_resets == 1 - if _prev_runner is not None: - assert _prev_runner is model.runner, "Runner shouldn't change" - _prev_runner = model.runner diff --git a/tests/test_no_mpi.py b/tests/test_no_mpi.py deleted file mode 100644 index 09755ff2..00000000 --- a/tests/test_no_mpi.py +++ /dev/null @@ -1,21 +0,0 @@ -import sys - -from .test_common import _maybe_disable_mpi - - -def test_no_mpi_no_crash(): - with _maybe_disable_mpi(True): - # Temporarily delete previously imported stable baselines - old_modules = {} - sb_modules = [name for name in sys.modules.keys() - if name.startswith('stable_baselines')] - for name in sb_modules: - old_modules[name] = sys.modules.pop(name) - - # Re-import (with mpi disabled) - import stable_baselines - del stable_baselines # appease Codacy - - # Restore old version of stable baselines (with MPI imported) - for name, mod in old_modules.items(): - sys.modules[name] = mod diff --git a/tests/test_ppo2.py b/tests/test_ppo2.py deleted file mode 100644 index ced0dc52..00000000 --- a/tests/test_ppo2.py +++ /dev/null @@ -1,47 +0,0 @@ -import os - -import pytest -import gym - -from stable_baselines import PPO2 -from stable_baselines.common import make_vec_env -from stable_baselines.common.vec_env import DummyVecEnv - - -@pytest.mark.parametrize("cliprange", [0.2, lambda x: 0.1 * x]) -@pytest.mark.parametrize("cliprange_vf", [None, 0.2, lambda x: 0.3 * x, -1.0]) -def test_clipping(tmp_path, cliprange, cliprange_vf): - """Test the different clipping (policy and vf)""" - model = PPO2( - "MlpPolicy", - "CartPole-v1", - cliprange=cliprange, - cliprange_vf=cliprange_vf, - noptepochs=2, - n_steps=64, - ).learn(100) - save_path = os.path.join(str(tmp_path), "ppo2_clip.zip") - model.save(save_path) - env = model.get_env() - model = PPO2.load(save_path, env=env) - model.learn(100) - - if os.path.exists(save_path): - os.remove(save_path) - - -def test_ppo2_update_n_batch_on_load(tmp_path): - env = make_vec_env("CartPole-v1", n_envs=2) - model = PPO2("MlpPolicy", env, n_steps=10, nminibatches=1) - save_path = os.path.join(str(tmp_path), "ppo2_cartpole.zip") - - model.learn(total_timesteps=100) - model.save(save_path) - - del model - - model = PPO2.load(save_path) - test_env = DummyVecEnv([lambda: gym.make("CartPole-v1")]) - - model.set_env(test_env) - model.learn(total_timesteps=100) diff --git a/tests/test_replay_buffer.py b/tests/test_replay_buffer.py deleted file mode 100644 index 996fcecc..00000000 --- a/tests/test_replay_buffer.py +++ /dev/null @@ -1,72 +0,0 @@ -import numpy as np - -from stable_baselines.common.buffers import ReplayBuffer, PrioritizedReplayBuffer - - -def test_extend_uniform(): - nvals = 16 - states = [np.random.rand(2, 2) for _ in range(nvals)] - actions = [np.random.rand(2) for _ in range(nvals)] - rewards = [np.random.rand() for _ in range(nvals)] - newstate = [np.random.rand(2, 2) for _ in range(nvals)] - done = [np.random.randint(0, 2) for _ in range(nvals)] - - size = 32 - baseline = ReplayBuffer(size) - ext = ReplayBuffer(size) - for data in zip(states, actions, rewards, newstate, done): - baseline.add(*data) - - states, actions, rewards, newstates, done = map( - np.array, [states, actions, rewards, newstate, done]) - - ext.extend(states, actions, rewards, newstates, done) - assert len(baseline) == len(ext) - - # Check buffers have same values - for i in range(nvals): - for j in range(5): - condition = (baseline.storage[i][j] == ext.storage[i][j]) - if isinstance(condition, np.ndarray): - # for obs, obs_t1 - assert np.all(condition) - else: - # for done, reward action - assert condition - - -def test_extend_prioritized(): - nvals = 16 - states = [np.random.rand(2, 2) for _ in range(nvals)] - actions = [np.random.rand(2) for _ in range(nvals)] - rewards = [np.random.rand() for _ in range(nvals)] - newstate = [np.random.rand(2, 2) for _ in range(nvals)] - done = [np.random.randint(0, 2) for _ in range(nvals)] - - size = 32 - alpha = 0.99 - baseline = PrioritizedReplayBuffer(size, alpha) - ext = PrioritizedReplayBuffer(size, alpha) - for data in zip(states, actions, rewards, newstate, done): - baseline.add(*data) - - states, actions, rewards, newstates, done = map( - np.array, [states, actions, rewards, newstate, done]) - - ext.extend(states, actions, rewards, newstates, done) - assert len(baseline) == len(ext) - - # Check buffers have same values - for i in range(nvals): - for j in range(5): - condition = (baseline.storage[i][j] == ext.storage[i][j]) - if isinstance(condition, np.ndarray): - # for obs, obs_t1 - assert np.all(condition) - else: - # for done, reward action - assert condition - - # assert priorities - assert (baseline._it_min._value == ext._it_min._value).all() - assert (baseline._it_sum._value == ext._it_sum._value).all() diff --git a/tests/test_save.py b/tests/test_save.py deleted file mode 100644 index 2a87a36c..00000000 --- a/tests/test_save.py +++ /dev/null @@ -1,209 +0,0 @@ -import os -from io import BytesIO -import json -import zipfile - -import pytest -import numpy as np - -from stable_baselines import A2C, ACER, ACKTR, DQN, PPO1, PPO2, TRPO -from stable_baselines.common.identity_env import IdentityEnv -from stable_baselines.common.vec_env import DummyVecEnv -from stable_baselines.common.evaluation import evaluate_policy -from stable_baselines.common.policies import MlpPolicy, FeedForwardPolicy - -N_EVAL_EPISODES = 5 - -MODEL_LIST = [ - A2C, - ACER, - ACKTR, - DQN, - PPO1, - PPO2, - TRPO, -] - -STORE_METHODS = [ - "path", - "file-like" -] - -STORE_FORMAT = [ - "zip", - "cloudpickle" -] - - -@pytest.mark.slow -@pytest.mark.parametrize("model_class", MODEL_LIST) -@pytest.mark.parametrize("storage_method", STORE_METHODS) -@pytest.mark.parametrize("store_format", STORE_FORMAT) -def test_model_manipulation(request, model_class, storage_method, store_format): - """ - Test if the algorithm (with a given policy) can be loaded and saved without any issues, the environment switching - works and that the action prediction works - - :param model_class: (BaseRLModel) A RL model - :param storage_method: (str) Should file be saved to a file ("path") or to a buffer - ("file-like") - :param store_format: (str) Save format, either "zip" or "cloudpickle". - """ - - # Use postfix ".model" so we can remove the file later - model_fname = './test_model_{}.model'.format(request.node.name) - store_as_cloudpickle = store_format == "cloudpickle" - - kwargs = dict(seed=0, gamma=0.4) - if model_class in [DQN]: - kwargs["learning_starts"] = 0 - kwargs["exploration_final_eps"] = 0.05 - - if model_class == PPO1: - kwargs["entcoeff"] = 0.0 - kwargs["optim_batchsize"] = 4 - kwargs["timesteps_per_actorbatch"] = 4 - - if model_class in [A2C, ACKTR, PPO2]: - kwargs["n_steps"] = 4 - kwargs["ent_coef"] = 0.0 - - if model_class in [TRPO]: - kwargs["timesteps_per_batch"] = 4 - - try: - env = DummyVecEnv([lambda: IdentityEnv(10)]) - - # create and train - model = model_class(policy="MlpPolicy", env=env, **kwargs) - model.learn(total_timesteps=15) - - env.envs[0].action_space.seed(0) - mean_reward, _ = evaluate_policy(model, env, deterministic=True, - n_eval_episodes=N_EVAL_EPISODES) - - # test action probability for given (obs, action) pair - env = model.get_env() - obs = env.reset() - observations = np.array([env.step([env.action_space.sample()])[0] for _ in range(10)]) - observations = np.squeeze(observations) - selected_actions, _ = model.predict(observations, deterministic=True) - - actions = np.array([env.action_space.sample() for _ in range(10)]) - actions_probas = model.action_probability(observations, actions=actions) - assert actions_probas.shape == (len(actions), 1), actions_probas.shape - assert actions_probas.min() >= 0, actions_probas.min() - assert actions_probas.max() <= 1, actions_probas.max() - - # saving - if storage_method == "path": # saving to a path - model.save(model_fname, cloudpickle=store_as_cloudpickle) - else: # saving to a file-like object (BytesIO in this case) - b_io = BytesIO() - model.save(b_io, cloudpickle=store_as_cloudpickle) - model_bytes = b_io.getvalue() - b_io.close() - - del model, env - - # loading - if storage_method == "path": # loading from path - model = model_class.load(model_fname) - else: - b_io = BytesIO(model_bytes) # loading from file-like object (BytesIO in this case) - model = model_class.load(b_io) - b_io.close() - - # changing environment (note: this can be done at loading) - env = DummyVecEnv([lambda: IdentityEnv(10)]) - model.set_env(env) - - # check if model still selects the same actions - new_selected_actions, _ = model.predict(observations, deterministic=True) - assert np.allclose(selected_actions, new_selected_actions, 1e-4) - - # learn post loading - model.learn(total_timesteps=15) - - # predict new values - evaluate_policy(model, env, n_eval_episodes=N_EVAL_EPISODES) - - del model, env - - finally: - if os.path.exists(model_fname): - os.remove(model_fname) - - -class CustomMlpPolicy(FeedForwardPolicy): - """A dummy "custom" policy to test out custom_objects""" - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse=False, **_kwargs): - super(CustomMlpPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, - n_batch, reuse, feature_extraction="mlp", - **_kwargs) - - -@pytest.mark.parametrize("model_class", MODEL_LIST) -def test_save_custom_objects(request, model_class): - """ - Test feeding custom_objects in model.load(...) function - """ - # Skip DQN (not an actor-critic policy) - if model_class == DQN: - return - - model_fname = './test_model_{}.zip'.format(request.node.name) - - try: - env = DummyVecEnv([lambda: IdentityEnv(10)]) - - # Create and save model with default MLP policy - model = model_class(policy=MlpPolicy, env=env) - model.save(model_fname) - - del model, env - - # Corrupt "policy" serialization in the file - data_file = zipfile.ZipFile(model_fname, "r") - # Load all data (can't just update one file in the archive) - parameter_list = data_file.read("parameter_list") - parameters = data_file.read("parameters") - class_data = json.loads(data_file.read("data").decode()) - data_file.close() - - # Corrupt serialization of the "policy" - class_data["policy"][":serialized:"] = ( - "Adding this should break serialization" + - class_data["policy"][":serialized:"] - ) - - # And dump everything back to the model file - data_file = zipfile.ZipFile(model_fname, "w") - data_file.writestr("data", json.dumps(class_data)) - data_file.writestr("parameter_list", parameter_list) - data_file.writestr("parameters", parameters) - data_file.close() - - # Try loading the model. This should - # result in an error - with pytest.raises(RuntimeError): - model = model_class.load(model_fname) - - # Load model with custom objects ("custom" MlpPolicy) - # and it should work fine. - # Note: We could load model with just vanilla - # MlpPolicy, too. - model = model_class.load( - model_fname, - custom_objects={ - "policy": CustomMlpPolicy - } - ) - - # Make sure we loaded custom MLP policy - assert model.policy == CustomMlpPolicy - del model - - finally: - if os.path.exists(model_fname): - os.remove(model_fname) diff --git a/tests/test_schedules.py b/tests/test_schedules.py deleted file mode 100644 index 433a6e79..00000000 --- a/tests/test_schedules.py +++ /dev/null @@ -1,58 +0,0 @@ -import numpy as np - -from stable_baselines.common.schedules import ConstantSchedule, PiecewiseSchedule, LinearSchedule - - -def test_piecewise_schedule(): - """ - test PiecewiseSchedule - """ - piecewise_sched = PiecewiseSchedule([(-5, 100), (5, 200), (10, 50), (100, 50), (200, -50)], - outside_value=500) - - assert np.isclose(piecewise_sched.value(-10), 500) - assert np.isclose(piecewise_sched.value(0), 150) - assert np.isclose(piecewise_sched.value(5), 200) - assert np.isclose(piecewise_sched.value(9), 80) - assert np.isclose(piecewise_sched.value(50), 50) - assert np.isclose(piecewise_sched.value(80), 50) - assert np.isclose(piecewise_sched.value(150), 0) - assert np.isclose(piecewise_sched.value(175), -25) - assert np.isclose(piecewise_sched.value(201), 500) - assert np.isclose(piecewise_sched.value(500), 500) - - assert np.isclose(piecewise_sched.value(200 - 1e-10), -50) - - -def test_constant_schedule(): - """ - test ConstantSchedule - """ - constant_sched = ConstantSchedule(5) - for i in range(-100, 100): - assert np.isclose(constant_sched.value(i), 5) - - -def test_linear_schedule(): - """ - test LinearSchedule - """ - linear_sched = LinearSchedule(schedule_timesteps=100, initial_p=0.2, final_p=0.8) - assert np.isclose(linear_sched.value(50), 0.5) - assert np.isclose(linear_sched.value(0), 0.2) - assert np.isclose(linear_sched.value(100), 0.8) - - linear_sched = LinearSchedule(schedule_timesteps=100, initial_p=0.8, final_p=0.2) - assert np.isclose(linear_sched.value(50), 0.5) - assert np.isclose(linear_sched.value(0), 0.8) - assert np.isclose(linear_sched.value(100), 0.2) - - linear_sched = LinearSchedule(schedule_timesteps=100, initial_p=-0.6, final_p=0.2) - assert np.isclose(linear_sched.value(50), -0.2) - assert np.isclose(linear_sched.value(0), -0.6) - assert np.isclose(linear_sched.value(100), 0.2) - - linear_sched = LinearSchedule(schedule_timesteps=100, initial_p=0.2, final_p=-0.6) - assert np.isclose(linear_sched.value(50), -0.2) - assert np.isclose(linear_sched.value(0), 0.2) - assert np.isclose(linear_sched.value(100), -0.6) diff --git a/tests/test_segment_tree.py b/tests/test_segment_tree.py deleted file mode 100644 index db0c5bc8..00000000 --- a/tests/test_segment_tree.py +++ /dev/null @@ -1,194 +0,0 @@ -import numpy as np - -from stable_baselines.common.segment_tree import SumSegmentTree, MinSegmentTree - - -def test_tree_set(): - """ - test Segment Tree data structure - """ - tree = SumSegmentTree(4) - - tree[np.array([2, 3])] = [1.0, 3.0] - - assert np.isclose(tree.sum(), 4.0) - assert np.isclose(tree.sum(0, 2), 0.0) - assert np.isclose(tree.sum(0, 3), 1.0) - assert np.isclose(tree.sum(2, 3), 1.0) - assert np.isclose(tree.sum(2, -1), 1.0) - assert np.isclose(tree.sum(2, 4), 4.0) - - tree = SumSegmentTree(4) - tree[2] = 1.0 - tree[3] = 3.0 - - assert np.isclose(tree.sum(), 4.0) - assert np.isclose(tree.sum(0, 2), 0.0) - assert np.isclose(tree.sum(0, 3), 1.0) - assert np.isclose(tree.sum(2, 3), 1.0) - assert np.isclose(tree.sum(2, -1), 1.0) - assert np.isclose(tree.sum(2, 4), 4.0) - - -def test_tree_set_overlap(): - """ - test Segment Tree data structure - """ - tree = SumSegmentTree(4) - - tree[np.array([2])] = 1.0 - tree[np.array([2])] = 3.0 - - assert np.isclose(tree.sum(), 3.0) - assert np.isclose(tree.sum(2, 3), 3.0) - assert np.isclose(tree.sum(2, -1), 3.0) - assert np.isclose(tree.sum(2, 4), 3.0) - assert np.isclose(tree.sum(1, 2), 0.0) - - tree = SumSegmentTree(4) - - tree[2] = 1.0 - tree[2] = 3.0 - - assert np.isclose(tree.sum(), 3.0) - assert np.isclose(tree.sum(2, 3), 3.0) - assert np.isclose(tree.sum(2, -1), 3.0) - assert np.isclose(tree.sum(2, 4), 3.0) - assert np.isclose(tree.sum(1, 2), 0.0) - - -def test_prefixsum_idx(): - """ - test Segment Tree data structure - """ - tree = SumSegmentTree(4) - - tree[2] = 1.0 - tree[3] = 3.0 - - assert tree.find_prefixsum_idx(0.0) == 2 - assert tree.find_prefixsum_idx(0.5) == 2 - assert tree.find_prefixsum_idx(0.99) == 2 - assert tree.find_prefixsum_idx(1.01) == 3 - assert tree.find_prefixsum_idx(3.00) == 3 - assert tree.find_prefixsum_idx(4.00) == 3 - assert np.all(tree.find_prefixsum_idx([0.0, 0.5, 0.99, 1.01, 3.00, 4.00]) == [2, 2, 2, 3, 3, 3]) - - tree = SumSegmentTree(4) - - tree[np.array([2, 3])] = [1.0, 3.0] - - assert tree.find_prefixsum_idx(0.0) == 2 - assert tree.find_prefixsum_idx(0.5) == 2 - assert tree.find_prefixsum_idx(0.99) == 2 - assert tree.find_prefixsum_idx(1.01) == 3 - assert tree.find_prefixsum_idx(3.00) == 3 - assert tree.find_prefixsum_idx(4.00) == 3 - assert np.all(tree.find_prefixsum_idx([0.0, 0.5, 0.99, 1.01, 3.00, 4.00]) == [2, 2, 2, 3, 3, 3]) - - -def test_prefixsum_idx2(): - """ - test Segment Tree data structure - """ - tree = SumSegmentTree(4) - - tree[np.array([0, 1, 2, 3])] = [0.5, 1.0, 1.0, 3.0] - - assert tree.find_prefixsum_idx(0.00) == 0 - assert tree.find_prefixsum_idx(0.55) == 1 - assert tree.find_prefixsum_idx(0.99) == 1 - assert tree.find_prefixsum_idx(1.51) == 2 - assert tree.find_prefixsum_idx(3.00) == 3 - assert tree.find_prefixsum_idx(5.50) == 3 - - tree = SumSegmentTree(4) - - tree[0] = 0.5 - tree[1] = 1.0 - tree[2] = 1.0 - tree[3] = 3.0 - - assert tree.find_prefixsum_idx(0.00) == 0 - assert tree.find_prefixsum_idx(0.55) == 1 - assert tree.find_prefixsum_idx(0.99) == 1 - assert tree.find_prefixsum_idx(1.51) == 2 - assert tree.find_prefixsum_idx(3.00) == 3 - assert tree.find_prefixsum_idx(5.50) == 3 - - -def test_max_interval_tree(): - """ - test Segment Tree data structure - """ - tree = MinSegmentTree(4) - - tree[0] = 1.0 - tree[2] = 0.5 - tree[3] = 3.0 - - assert np.isclose(tree.min(), 0.5) - assert np.isclose(tree.min(0, 2), 1.0) - assert np.isclose(tree.min(0, 3), 0.5) - assert np.isclose(tree.min(0, -1), 0.5) - assert np.isclose(tree.min(2, 4), 0.5) - assert np.isclose(tree.min(3, 4), 3.0) - - tree[2] = 0.7 - - assert np.isclose(tree.min(), 0.7) - assert np.isclose(tree.min(0, 2), 1.0) - assert np.isclose(tree.min(0, 3), 0.7) - assert np.isclose(tree.min(0, -1), 0.7) - assert np.isclose(tree.min(2, 4), 0.7) - assert np.isclose(tree.min(3, 4), 3.0) - - tree[2] = 4.0 - - assert np.isclose(tree.min(), 1.0) - assert np.isclose(tree.min(0, 2), 1.0) - assert np.isclose(tree.min(0, 3), 1.0) - assert np.isclose(tree.min(0, -1), 1.0) - assert np.isclose(tree.min(2, 4), 3.0) - assert np.isclose(tree.min(2, 3), 4.0) - assert np.isclose(tree.min(2, -1), 4.0) - assert np.isclose(tree.min(3, 4), 3.0) - - tree = MinSegmentTree(4) - - tree[np.array([0, 2, 3])] = [1.0, 0.5, 3.0] - - assert np.isclose(tree.min(), 0.5) - assert np.isclose(tree.min(0, 2), 1.0) - assert np.isclose(tree.min(0, 3), 0.5) - assert np.isclose(tree.min(0, -1), 0.5) - assert np.isclose(tree.min(2, 4), 0.5) - assert np.isclose(tree.min(3, 4), 3.0) - - tree[np.array([2])] = 0.7 - - assert np.isclose(tree.min(), 0.7) - assert np.isclose(tree.min(0, 2), 1.0) - assert np.isclose(tree.min(0, 3), 0.7) - assert np.isclose(tree.min(0, -1), 0.7) - assert np.isclose(tree.min(2, 4), 0.7) - assert np.isclose(tree.min(3, 4), 3.0) - - tree[np.array([2])] = 4.0 - - assert np.isclose(tree.min(), 1.0) - assert np.isclose(tree.min(0, 2), 1.0) - assert np.isclose(tree.min(0, 3), 1.0) - assert np.isclose(tree.min(0, -1), 1.0) - assert np.isclose(tree.min(2, 4), 3.0) - assert np.isclose(tree.min(2, 3), 4.0) - assert np.isclose(tree.min(2, -1), 4.0) - assert np.isclose(tree.min(3, 4), 3.0) - - -if __name__ == '__main__': - test_tree_set() - test_tree_set_overlap() - test_prefixsum_idx() - test_prefixsum_idx2() - test_max_interval_tree() diff --git a/tests/test_tensorboard.py b/tests/test_tensorboard.py deleted file mode 100644 index ef6d7a91..00000000 --- a/tests/test_tensorboard.py +++ /dev/null @@ -1,51 +0,0 @@ -import os -import shutil - -import pytest - -from stable_baselines import A2C, ACER, ACKTR, DQN, DDPG, PPO1, PPO2, SAC, TD3, TRPO - -TENSORBOARD_DIR = '/tmp/tb_dir/' - -if os.path.isdir(TENSORBOARD_DIR): - shutil.rmtree(TENSORBOARD_DIR) - -MODEL_DICT = { - 'a2c': (A2C, 'CartPole-v1'), - 'acer': (ACER, 'CartPole-v1'), - 'acktr': (ACKTR, 'CartPole-v1'), - 'dqn': (DQN, 'CartPole-v1'), - 'ddpg': (DDPG, 'Pendulum-v0'), - 'ppo1': (PPO1, 'CartPole-v1'), - 'ppo2': (PPO2, 'CartPole-v1'), - 'sac': (SAC, 'Pendulum-v0'), - 'td3': (TD3, 'Pendulum-v0'), - 'trpo': (TRPO, 'CartPole-v1'), -} - -N_STEPS = 300 - - -@pytest.mark.parametrize("model_name", MODEL_DICT.keys()) -def test_tensorboard(model_name): - logname = model_name.upper() - algo, env_id = MODEL_DICT[model_name] - model = algo('MlpPolicy', env_id, verbose=1, tensorboard_log=TENSORBOARD_DIR) - model.learn(N_STEPS) - model.learn(N_STEPS, reset_num_timesteps=False) - - assert os.path.isdir(TENSORBOARD_DIR + logname + "_1") - assert not os.path.isdir(TENSORBOARD_DIR + logname + "_2") - - -@pytest.mark.parametrize("model_name", MODEL_DICT.keys()) -def test_multiple_runs(model_name): - logname = "tb_multiple_runs_" + model_name - algo, env_id = MODEL_DICT[model_name] - model = algo('MlpPolicy', env_id, verbose=1, tensorboard_log=TENSORBOARD_DIR) - model.learn(N_STEPS, tb_log_name=logname) - model.learn(N_STEPS, tb_log_name=logname) - - assert os.path.isdir(TENSORBOARD_DIR + logname + "_1") - # Check that the log dir name increments correctly - assert os.path.isdir(TENSORBOARD_DIR + logname + "_2") diff --git a/tests/test_tf_util.py b/tests/test_tf_util.py deleted file mode 100644 index d71374da..00000000 --- a/tests/test_tf_util.py +++ /dev/null @@ -1,61 +0,0 @@ -# tests for tf_util -import numpy as np -import tensorflow as tf - -from stable_baselines.common.tf_util import function, initialize, single_threaded_session, is_image - - -def test_function(): - """ - test the function function in tf_util - """ - with tf.Graph().as_default(): - x_ph = tf.placeholder(tf.int32, (), name="x") - y_ph = tf.placeholder(tf.int32, (), name="y") - z_ph = 3 * x_ph + 2 * y_ph - linear_fn = function([x_ph, y_ph], z_ph, givens={y_ph: 0}) - - with single_threaded_session(): - initialize() - - assert linear_fn(2) == 6 - assert linear_fn(2, 2) == 10 - - -def test_multikwargs(): - """ - test the function function in tf_util - """ - with tf.Graph().as_default(): - x_ph = tf.placeholder(tf.int32, (), name="x") - with tf.variable_scope("other"): - x2_ph = tf.placeholder(tf.int32, (), name="x") - z_ph = 3 * x_ph + 2 * x2_ph - - linear_fn = function([x_ph, x2_ph], z_ph, givens={x2_ph: 0}) - with single_threaded_session(): - initialize() - assert linear_fn(2) == 6 - assert linear_fn(2, 2) == 10 - - -def test_image_detection(): - rgb = (32, 64, 3) - gray = (43, 23, 1) - rgbd = (12, 32, 4) - invalid_1 = (32, 12) - invalid_2 = (12, 32, 6) - - # TF checks - for shape in (rgb, gray, rgbd): - assert is_image(tf.placeholder(tf.uint8, shape=shape)) - - for shape in (invalid_1, invalid_2): - assert not is_image(tf.placeholder(tf.uint8, shape=shape)) - - # Numpy checks - for shape in (rgb, gray, rgbd): - assert is_image(np.ones(shape)) - - for shape in (invalid_1, invalid_2): - assert not is_image(np.ones(shape)) diff --git a/tests/test_utils.py b/tests/test_utils.py deleted file mode 100644 index d83f2d4a..00000000 --- a/tests/test_utils.py +++ /dev/null @@ -1,79 +0,0 @@ -import os -import shutil - -import pytest -import gym - -from stable_baselines import A2C -from stable_baselines.bench.monitor import Monitor -from stable_baselines.common.evaluation import evaluate_policy -from stable_baselines.common.cmd_util import make_vec_env -from stable_baselines.common.vec_env import DummyVecEnv, SubprocVecEnv - - -@pytest.mark.parametrize("env_id", ['CartPole-v1', lambda: gym.make('CartPole-v1')]) -@pytest.mark.parametrize("n_envs", [1, 2]) -@pytest.mark.parametrize("vec_env_cls", [None, SubprocVecEnv]) -@pytest.mark.parametrize("wrapper_class", [None, gym.wrappers.TimeLimit]) -def test_make_vec_env(env_id, n_envs, vec_env_cls, wrapper_class): - env = make_vec_env(env_id, n_envs, vec_env_cls=vec_env_cls, - wrapper_class=wrapper_class, monitor_dir=None, seed=0) - - assert env.num_envs == n_envs - - if vec_env_cls is None: - assert isinstance(env, DummyVecEnv) - if wrapper_class is not None: - assert isinstance(env.envs[0], wrapper_class) - else: - assert isinstance(env.envs[0], Monitor) - else: - assert isinstance(env, SubprocVecEnv) - # Kill subprocesses - env.close() - - -def test_custom_vec_env(): - """ - Stand alone test for a special case (passing a custom VecEnv class) to avoid doubling the number of tests. - """ - monitor_dir = 'logs/test_make_vec_env/' - env = make_vec_env('CartPole-v1', n_envs=1, - monitor_dir=monitor_dir, seed=0, - vec_env_cls=SubprocVecEnv, vec_env_kwargs={'start_method': None}) - - assert env.num_envs == 1 - assert isinstance(env, SubprocVecEnv) - assert os.path.isdir('logs/test_make_vec_env/') - # Kill subprocess - env.close() - # Cleanup folder - shutil.rmtree(monitor_dir) - - # This should fail because DummyVecEnv does not have any keyword argument - with pytest.raises(TypeError): - make_vec_env('CartPole-v1', n_envs=1, vec_env_kwargs={'dummy': False}) - - -def test_evaluate_policy(): - model = A2C('MlpPolicy', 'Pendulum-v0', seed=0) - n_steps_per_episode, n_eval_episodes = 200, 2 - model.n_callback_calls = 0 - - def dummy_callback(locals_, _globals): - locals_['model'].n_callback_calls += 1 - - _, episode_lengths = evaluate_policy(model, model.get_env(), n_eval_episodes, deterministic=True, - render=False, callback=dummy_callback, reward_threshold=None, - return_episode_rewards=True) - - n_steps = sum(episode_lengths) - assert n_steps == n_steps_per_episode * n_eval_episodes - assert n_steps == model.n_callback_calls - - # Reaching a mean reward of zero is impossible with the Pendulum env - with pytest.raises(AssertionError): - evaluate_policy(model, model.get_env(), n_eval_episodes, reward_threshold=0.0) - - episode_rewards, _ = evaluate_policy(model, model.get_env(), n_eval_episodes, return_episode_rewards=True) - assert len(episode_rewards) == n_eval_episodes diff --git a/tests/test_vec_check_nan.py b/tests/test_vec_check_nan.py deleted file mode 100644 index 93b2cf4d..00000000 --- a/tests/test_vec_check_nan.py +++ /dev/null @@ -1,71 +0,0 @@ -import gym -from gym import spaces -import numpy as np - -from stable_baselines.common.vec_env import DummyVecEnv, VecCheckNan - - -class NanAndInfEnv(gym.Env): - """Custom Environment that raised NaNs and Infs""" - metadata = {'render.modes': ['human']} - - def __init__(self): - super(NanAndInfEnv, self).__init__() - self.action_space = spaces.Box(low=-np.inf, high=np.inf, shape=(1,), dtype=np.float64) - self.observation_space = spaces.Box(low=-np.inf, high=np.inf, shape=(1,), dtype=np.float64) - - @staticmethod - def step(action): - if np.all(np.array(action) > 0): - obs = float('NaN') - elif np.all(np.array(action) < 0): - obs = float('inf') - else: - obs = 0 - return [obs], 0.0, False, {} - - @staticmethod - def reset(): - return [0.0] - - def render(self, mode='human', close=False): - pass - - -def test_check_nan(): - """Test VecCheckNan Object""" - - env = DummyVecEnv([NanAndInfEnv]) - env = VecCheckNan(env, raise_exception=True) - - env.step([[0]]) - - try: - env.step([[float('NaN')]]) - except ValueError: - pass - else: - assert False - - try: - env.step([[float('inf')]]) - except ValueError: - pass - else: - assert False - - try: - env.step([[-1]]) - except ValueError: - pass - else: - assert False - - try: - env.step([[1]]) - except ValueError: - pass - else: - assert False - - env.step(np.array([[0, 1], [0, 1]])) diff --git a/tests/test_vec_envs.py b/tests/test_vec_envs.py deleted file mode 100644 index 99442467..00000000 --- a/tests/test_vec_envs.py +++ /dev/null @@ -1,339 +0,0 @@ -import collections -import functools -import itertools -import multiprocessing - -import pytest -import gym -import numpy as np - -from stable_baselines.common.vec_env import DummyVecEnv, SubprocVecEnv, VecNormalize, VecFrameStack - -N_ENVS = 3 -VEC_ENV_CLASSES = [DummyVecEnv, SubprocVecEnv] -VEC_ENV_WRAPPERS = [None, VecNormalize, VecFrameStack] - - -class CustomGymEnv(gym.Env): - def __init__(self, space): - """ - Custom gym environment for testing purposes - """ - self.action_space = space - self.observation_space = space - self.current_step = 0 - self.ep_length = 4 - - def reset(self): - self.current_step = 0 - self._choose_next_state() - return self.state - - def step(self, action): - reward = 1 - self._choose_next_state() - self.current_step += 1 - done = self.current_step >= self.ep_length - return self.state, reward, done, {} - - def _choose_next_state(self): - self.state = self.observation_space.sample() - - def render(self, mode='human'): - if mode == 'rgb_array': - return np.zeros((4, 4, 3)) - - def seed(self, seed=None): - pass - - @staticmethod - def custom_method(dim_0=1, dim_1=1): - """ - Dummy method to test call to custom method - from VecEnv - - :param dim_0: (int) - :param dim_1: (int) - :return: (np.ndarray) - """ - return np.ones((dim_0, dim_1)) - - -@pytest.mark.parametrize('vec_env_class', VEC_ENV_CLASSES) -@pytest.mark.parametrize('vec_env_wrapper', VEC_ENV_WRAPPERS) -def test_vecenv_custom_calls(vec_env_class, vec_env_wrapper): - """Test access to methods/attributes of vectorized environments""" - def make_env(): - return CustomGymEnv(gym.spaces.Box(low=np.zeros(2), high=np.ones(2))) - vec_env = vec_env_class([make_env for _ in range(N_ENVS)]) - - if vec_env_wrapper is not None: - if vec_env_wrapper == VecFrameStack: - vec_env = vec_env_wrapper(vec_env, n_stack=2) - else: - vec_env = vec_env_wrapper(vec_env) - - # Test seed method - vec_env.seed(0) - # Test render method call - # vec_env.render() # we need a X server to test the "human" mode - vec_env.render(mode='rgb_array') - - env_method_results = vec_env.env_method('custom_method', 1, indices=None, dim_1=2) - setattr_results = [] - # Set current_step to an arbitrary value - for env_idx in range(N_ENVS): - setattr_results.append(vec_env.set_attr('current_step', env_idx, indices=env_idx)) - # Retrieve the value for each environment - getattr_results = vec_env.get_attr('current_step') - - assert len(env_method_results) == N_ENVS - assert len(setattr_results) == N_ENVS - assert len(getattr_results) == N_ENVS - - for env_idx in range(N_ENVS): - assert (env_method_results[env_idx] == np.ones((1, 2))).all() - assert setattr_results[env_idx] is None - assert getattr_results[env_idx] == env_idx - - # Call env_method on a subset of the VecEnv - env_method_subset = vec_env.env_method('custom_method', 1, indices=[0, 2], dim_1=3) - assert (env_method_subset[0] == np.ones((1, 3))).all() - assert (env_method_subset[1] == np.ones((1, 3))).all() - assert len(env_method_subset) == 2 - - # Test to change value for all the environments - setattr_result = vec_env.set_attr('current_step', 42, indices=None) - getattr_result = vec_env.get_attr('current_step') - assert setattr_result is None - assert getattr_result == [42 for _ in range(N_ENVS)] - - # Additional tests for setattr that does not affect all the environments - vec_env.reset() - setattr_result = vec_env.set_attr('current_step', 12, indices=[0, 1]) - getattr_result = vec_env.get_attr('current_step') - getattr_result_subset = vec_env.get_attr('current_step', indices=[0, 1]) - assert setattr_result is None - assert getattr_result == [12 for _ in range(2)] + [0 for _ in range(N_ENVS - 2)] - assert getattr_result_subset == [12, 12] - assert vec_env.get_attr('current_step', indices=[0, 2]) == [12, 0] - - vec_env.reset() - # Change value only for first and last environment - setattr_result = vec_env.set_attr('current_step', 12, indices=[0, -1]) - getattr_result = vec_env.get_attr('current_step') - assert setattr_result is None - assert getattr_result == [12] + [0 for _ in range(N_ENVS - 2)] + [12] - assert vec_env.get_attr('current_step', indices=[-1]) == [12] - - vec_env.close() - - -class StepEnv(gym.Env): - def __init__(self, max_steps): - """Gym environment for testing that terminal observation is inserted - correctly.""" - self.action_space = gym.spaces.Discrete(2) - self.observation_space = gym.spaces.Box(np.array([0]), np.array([999]), - dtype='int') - self.max_steps = max_steps - self.current_step = 0 - - def reset(self): - self.current_step = 0 - return np.array([self.current_step], dtype='int') - - def step(self, action): - prev_step = self.current_step - self.current_step += 1 - done = self.current_step >= self.max_steps - return np.array([prev_step], dtype='int'), 0.0, done, {} - - -@pytest.mark.parametrize('vec_env_class', VEC_ENV_CLASSES) -@pytest.mark.parametrize('vec_env_wrapper', VEC_ENV_WRAPPERS) -def test_vecenv_terminal_obs(vec_env_class, vec_env_wrapper): - """Test that 'terminal_observation' gets added to info dict upon - termination.""" - step_nums = [i + 5 for i in range(N_ENVS)] - vec_env = vec_env_class([functools.partial(StepEnv, n) for n in step_nums]) - - if vec_env_wrapper is not None: - if vec_env_wrapper == VecFrameStack: - vec_env = vec_env_wrapper(vec_env, n_stack=2) - else: - vec_env = vec_env_wrapper(vec_env) - - zero_acts = np.zeros((N_ENVS,), dtype='int') - prev_obs_b = vec_env.reset() - for step_num in range(1, max(step_nums) + 1): - obs_b, _, done_b, info_b = vec_env.step(zero_acts) - assert len(obs_b) == N_ENVS - assert len(done_b) == N_ENVS - assert len(info_b) == N_ENVS - env_iter = zip(prev_obs_b, obs_b, done_b, info_b, step_nums) - for prev_obs, obs, done, info, final_step_num in env_iter: - assert done == (step_num == final_step_num) - if not done: - assert 'terminal_observation' not in info - else: - terminal_obs = info['terminal_observation'] - - # do some rough ordering checks that should work for all - # wrappers, including VecNormalize - assert np.all(prev_obs < terminal_obs) - assert np.all(obs < prev_obs) - - if not isinstance(vec_env, VecNormalize): - # more precise tests that we can't do with VecNormalize - # (which changes observation values) - assert np.all(prev_obs + 1 == terminal_obs) - assert np.all(obs == 0) - - prev_obs_b = obs_b - - vec_env.close() - - -SPACES = collections.OrderedDict([ - ('discrete', gym.spaces.Discrete(2)), - ('multidiscrete', gym.spaces.MultiDiscrete([2, 3])), - ('multibinary', gym.spaces.MultiBinary(3)), - ('continuous', gym.spaces.Box(low=np.zeros(2), high=np.ones(2))), -]) - - -def check_vecenv_spaces(vec_env_class, space, obs_assert): - """Helper method to check observation spaces in vectorized environments.""" - def make_env(): - return CustomGymEnv(space) - - vec_env = vec_env_class([make_env for _ in range(N_ENVS)]) - obs = vec_env.reset() - obs_assert(obs) - - dones = [False] * N_ENVS - while not any(dones): - actions = [vec_env.action_space.sample() for _ in range(N_ENVS)] - obs, _rews, dones, _infos = vec_env.step(actions) - obs_assert(obs) - vec_env.close() - - -def check_vecenv_obs(obs, space): - """Helper method to check observations from multiple environments each belong to - the appropriate observation space.""" - assert obs.shape[0] == N_ENVS - for value in obs: - assert space.contains(value) - - -@pytest.mark.parametrize('vec_env_class,space', itertools.product(VEC_ENV_CLASSES, SPACES.values())) -def test_vecenv_single_space(vec_env_class, space): - def obs_assert(obs): - return check_vecenv_obs(obs, space) - - check_vecenv_spaces(vec_env_class, space, obs_assert) - - -class _UnorderedDictSpace(gym.spaces.Dict): - """Like DictSpace, but returns an unordered dict when sampling.""" - def sample(self): - return dict(super().sample()) - - -@pytest.mark.parametrize('vec_env_class', VEC_ENV_CLASSES) -def test_vecenv_dict_spaces(vec_env_class): - """Test dictionary observation spaces with vectorized environments.""" - space = gym.spaces.Dict(SPACES) - - def obs_assert(obs): - assert isinstance(obs, collections.OrderedDict) - assert obs.keys() == space.spaces.keys() - for key, values in obs.items(): - check_vecenv_obs(values, space.spaces[key]) - - check_vecenv_spaces(vec_env_class, space, obs_assert) - - unordered_space = _UnorderedDictSpace(SPACES) - # Check that vec_env_class can accept unordered dict observations (and convert to OrderedDict) - check_vecenv_spaces(vec_env_class, unordered_space, obs_assert) - - -@pytest.mark.parametrize('vec_env_class', VEC_ENV_CLASSES) -def test_vecenv_tuple_spaces(vec_env_class): - """Test tuple observation spaces with vectorized environments.""" - space = gym.spaces.Tuple(tuple(SPACES.values())) - - def obs_assert(obs): - assert isinstance(obs, tuple) - assert len(obs) == len(space.spaces) - for values, inner_space in zip(obs, space.spaces): - check_vecenv_obs(values, inner_space) - - return check_vecenv_spaces(vec_env_class, space, obs_assert) - - -def test_subproc_start_method(): - start_methods = [None] - # Only test thread-safe methods. Others may deadlock tests! (gh/428) - # safe_methods = {'forkserver', 'spawn'} - safe_methods = {'spawn'} - available_methods = multiprocessing.get_all_start_methods() - start_methods += list(safe_methods.intersection(available_methods)) - space = gym.spaces.Discrete(2) - - def obs_assert(obs): - return check_vecenv_obs(obs, space) - - for start_method in start_methods: - vec_env_class = functools.partial(SubprocVecEnv, start_method=start_method) - check_vecenv_spaces(vec_env_class, space, obs_assert) - - with pytest.raises(ValueError, match="cannot find context for 'illegal_method'"): - vec_env_class = functools.partial(SubprocVecEnv, start_method='illegal_method') - check_vecenv_spaces(vec_env_class, space, obs_assert) - - -class CustomWrapperA(VecNormalize): - def __init__(self, venv): - VecNormalize.__init__(self, venv) - self.var_a = 'a' - - -class CustomWrapperB(VecNormalize): - def __init__(self, venv): - VecNormalize.__init__(self, venv) - self.var_b = 'b' - - def func_b(self): - return self.var_b - - def name_test(self): - return self.__class__ - - -class CustomWrapperBB(CustomWrapperB): - def __init__(self, venv): - CustomWrapperB.__init__(self, venv) - self.var_bb = 'bb' - - -def test_vecenv_wrapper_getattr(): - def make_env(): - return CustomGymEnv(gym.spaces.Box(low=np.zeros(2), high=np.ones(2))) - vec_env = DummyVecEnv([make_env for _ in range(N_ENVS)]) - wrapped = CustomWrapperA(CustomWrapperBB(vec_env)) - assert wrapped.var_a == 'a' - assert wrapped.var_b == 'b' - assert wrapped.var_bb == 'bb' - assert wrapped.func_b() == 'b' - assert wrapped.name_test() == CustomWrapperBB - - double_wrapped = CustomWrapperA(CustomWrapperB(wrapped)) - dummy = double_wrapped.var_a # should not raise as it is directly defined here - with pytest.raises(AttributeError): # should raise due to ambiguity - dummy = double_wrapped.var_b - with pytest.raises(AttributeError): # should raise as does not exist - dummy = double_wrapped.nonexistent_attribute - del dummy # keep linter happy diff --git a/tests/test_vec_normalize.py b/tests/test_vec_normalize.py deleted file mode 100644 index 0a98a02d..00000000 --- a/tests/test_vec_normalize.py +++ /dev/null @@ -1,194 +0,0 @@ -import subprocess - -import gym -import numpy as np -import pytest - -from stable_baselines import DDPG, DQN, SAC, TD3 -from stable_baselines.common.running_mean_std import RunningMeanStd -from stable_baselines.common.vec_env import (DummyVecEnv, VecNormalize, VecFrameStack, - sync_envs_normalization, unwrap_vec_normalize) -from .test_common import _assert_eq - -ENV_ID = 'Pendulum-v0' - - -def make_env(): - return gym.make(ENV_ID) - - -def test_runningmeanstd(): - """Test RunningMeanStd object""" - for (x_1, x_2, x_3) in [ - (np.random.randn(3), np.random.randn(4), np.random.randn(5)), - (np.random.randn(3, 2), np.random.randn(4, 2), np.random.randn(5, 2))]: - rms = RunningMeanStd(epsilon=0.0, shape=x_1.shape[1:]) - - x_cat = np.concatenate([x_1, x_2, x_3], axis=0) - moments_1 = [x_cat.mean(axis=0), x_cat.var(axis=0)] - rms.update(x_1) - rms.update(x_2) - rms.update(x_3) - moments_2 = [rms.mean, rms.var] - - assert np.allclose(moments_1, moments_2) - - -def check_rms_equal(rmsa, rmsb): - assert np.all(rmsa.mean == rmsb.mean) - assert np.all(rmsa.var == rmsb.var) - assert np.all(rmsa.count == rmsb.count) - - -def check_vec_norm_equal(norma, normb): - assert norma.observation_space == normb.observation_space - assert norma.action_space == normb.action_space - assert norma.num_envs == normb.num_envs - - check_rms_equal(norma.obs_rms, normb.obs_rms) - check_rms_equal(norma.ret_rms, normb.ret_rms) - assert norma.clip_obs == normb.clip_obs - assert norma.clip_reward == normb.clip_reward - assert norma.norm_obs == normb.norm_obs - assert norma.norm_reward == normb.norm_reward - - assert np.all(norma.ret == normb.ret) - assert norma.gamma == normb.gamma - assert norma.epsilon == normb.epsilon - assert norma.training == normb.training - - -def test_vec_env(tmpdir): - """Test VecNormalize Object""" - clip_obs = 0.5 - clip_reward = 5.0 - - orig_venv = DummyVecEnv([make_env]) - norm_venv = VecNormalize(orig_venv, norm_obs=True, norm_reward=True, clip_obs=clip_obs, clip_reward=clip_reward) - _, done = norm_venv.reset(), [False] - while not done[0]: - actions = [norm_venv.action_space.sample()] - obs, rew, done, _ = norm_venv.step(actions) - assert np.max(np.abs(obs)) <= clip_obs - assert np.max(np.abs(rew)) <= clip_reward - - path = str(tmpdir.join("vec_normalize")) - norm_venv.save(path) - deserialized = VecNormalize.load(path, venv=orig_venv) - check_vec_norm_equal(norm_venv, deserialized) - - -def _make_warmstart_cartpole(): - """Warm-start VecNormalize by stepping through CartPole""" - venv = DummyVecEnv([lambda: gym.make("CartPole-v1")]) - venv = VecNormalize(venv) - venv.reset() - venv.get_original_obs() - - for _ in range(100): - actions = [venv.action_space.sample()] - venv.step(actions) - return venv - - -def test_get_original(): - venv = _make_warmstart_cartpole() - for _ in range(3): - actions = [venv.action_space.sample()] - obs, rewards, _, _ = venv.step(actions) - obs = obs[0] - orig_obs = venv.get_original_obs()[0] - rewards = rewards[0] - orig_rewards = venv.get_original_reward()[0] - - assert np.all(orig_rewards == 1) - assert orig_obs.shape == obs.shape - assert orig_rewards.dtype == rewards.dtype - assert not np.array_equal(orig_obs, obs) - assert not np.array_equal(orig_rewards, rewards) - np.testing.assert_allclose(venv.normalize_obs(orig_obs), obs) - np.testing.assert_allclose(venv.normalize_reward(orig_rewards), rewards) - - -def test_normalize_external(): - venv = _make_warmstart_cartpole() - - rewards = np.array([1, 1]) - norm_rewards = venv.normalize_reward(rewards) - assert norm_rewards.shape == rewards.shape - # Episode return is almost always >= 1 in CartPole. So reward should shrink. - assert np.all(norm_rewards < 1) - - # Don't have any guarantees on obs normalization, except shape, really. - obs = np.array([0, 0, 0, 0]) - norm_obs = venv.normalize_obs(obs) - assert obs.shape == norm_obs.shape - - -@pytest.mark.parametrize("model_class", [DDPG, DQN, SAC, TD3]) -def test_offpolicy_normalization(model_class): - if model_class == DQN: - env = DummyVecEnv([lambda: gym.make('CartPole-v1')]) - else: - env = DummyVecEnv([make_env]) - env = VecNormalize(env, norm_obs=True, norm_reward=True, clip_obs=10., clip_reward=10.) - - model = model_class('MlpPolicy', env, verbose=1) - model.learn(total_timesteps=1000) - # Check getter - assert isinstance(model.get_vec_normalize_env(), VecNormalize) - - -def test_sync_vec_normalize(): - env = DummyVecEnv([make_env]) - - assert unwrap_vec_normalize(env) is None - - env = VecNormalize(env, norm_obs=True, norm_reward=True, clip_obs=10., clip_reward=10.) - - assert isinstance(unwrap_vec_normalize(env), VecNormalize) - - env = VecFrameStack(env, 1) - - assert isinstance(unwrap_vec_normalize(env), VecNormalize) - - eval_env = DummyVecEnv([make_env]) - eval_env = VecNormalize(eval_env, training=False, norm_obs=True, norm_reward=True, clip_obs=10., clip_reward=10.) - eval_env = VecFrameStack(eval_env, 1) - - env.reset() - # Initialize running mean - for _ in range(100): - env.step([env.action_space.sample()]) - - obs = env.reset() - original_obs = env.get_original_obs() - dummy_rewards = np.random.rand(10) - # Normalization must be different - assert not np.allclose(obs, eval_env.normalize_obs(original_obs)) - - sync_envs_normalization(env, eval_env) - - # Now they must be synced - assert np.allclose(obs, eval_env.normalize_obs(original_obs)) - assert np.allclose(env.normalize_reward(dummy_rewards), eval_env.normalize_reward(dummy_rewards)) - - -def test_mpi_runningmeanstd(): - """Test RunningMeanStd object for MPI""" - # Test will be run in CI before pytest is run - pytest.skip() - return_code = subprocess.call(['mpirun', '--allow-run-as-root', '-np', '2', - 'python', '-m', 'stable_baselines.common.mpi_running_mean_std']) - _assert_eq(return_code, 0) - - -def test_mpi_moments(): - """ - test running mean std function - """ - # Test will be run in CI before pytest is run - pytest.skip() - subprocess.check_call(['mpirun', '--allow-run-as-root', '-np', '3', 'python', '-c', - 'from stable_baselines.common.mpi_moments ' - 'import _helper_runningmeanstd; _helper_runningmeanstd()']) From f55c3dc5b2f841015728ab5bd1c1d01fd6060439 Mon Sep 17 00:00:00 2001 From: Mustafa-249 Date: Wed, 23 Jul 2025 14:53:21 +0300 Subject: [PATCH 02/18] Delete data directory --- data/logo.jpg | Bin 121633 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 data/logo.jpg diff --git a/data/logo.jpg b/data/logo.jpg deleted file mode 100644 index a6fa80192182e827d84e6adf7c135ff57510f14b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121633 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 z 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 W0^bn$hQK!jz9I1cIRg8>jQtO4%H@^- From 7a456bd8f7b2b6b600f76638eb9a6acd8f4be29d Mon Sep 17 00:00:00 2001 From: Mustafa-249 Date: Wed, 23 Jul 2025 14:53:46 +0300 Subject: [PATCH 03/18] Delete setup.py --- setup.py | 168 ------------------------------------------------------- 1 file changed, 168 deletions(-) delete mode 100644 setup.py diff --git a/setup.py b/setup.py deleted file mode 100644 index acfbb295..00000000 --- a/setup.py +++ /dev/null @@ -1,168 +0,0 @@ -import os -import sys -import subprocess -from setuptools import setup, find_packages -from distutils.version import LooseVersion - -if sys.version_info.major != 3: - print('This Python is only compatible with Python 3, but you are running ' - 'Python {}. The installation will likely fail.'.format(sys.version_info.major)) - -# Read version from file -with open(os.path.join('stable_baselines', 'version.txt'), 'r') as file_handler: - __version__ = file_handler.read().strip() - - -# Check tensorflow installation to avoid -# breaking pre-installed tf gpu -def find_tf_dependency(): - install_tf, tf_gpu = False, False - try: - import tensorflow as tf - if tf.__version__ < LooseVersion('1.8.0'): - install_tf = True - # check if a gpu version is needed - tf_gpu = tf.test.is_gpu_available() - except ImportError: - install_tf = True - # Check if a nvidia gpu is present - for command in ['nvidia-smi', '/usr/bin/nvidia-smi', 'nvidia-smi.exe']: - try: - if subprocess.call([command]) == 0: - tf_gpu = True - break - except IOError: # command does not exist / is not executable - pass - if os.environ.get('USE_GPU') == 'True': # force GPU even if not auto-detected - tf_gpu = True - - tf_dependency = [] - if install_tf: - tf_dependency = ['tensorflow-gpu>=1.8.0,<2.0.0'] if tf_gpu else ['tensorflow>=1.8.0,<2.0.0'] - if tf_gpu: - print("A GPU was detected, tensorflow-gpu will be installed") - - return tf_dependency - - -long_description = """ -**WARNING: This package is in maintenance mode, please use [Stable-Baselines3 (SB3)](https://github.com/DLR-RM/stable-baselines3) for an up-to-date version. You can find a [migration guide](https://stable-baselines3.readthedocs.io/en/master/guide/migration.html) in SB3 documentation.** - -[![Build Status](https://travis-ci.com/hill-a/stable-baselines.svg?branch=master)](https://travis-ci.com/hill-a/stable-baselines) [![Documentation Status](https://readthedocs.org/projects/stable-baselines/badge/?version=master)](https://stable-baselines.readthedocs.io/en/master/?badge=master) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3bcb4cd6d76a4270acb16b5fe6dd9efa)](https://www.codacy.com/app/baselines_janitors/stable-baselines?utm_source=github.com&utm_medium=referral&utm_content=hill-a/stable-baselines&utm_campaign=Badge_Grade) [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/3bcb4cd6d76a4270acb16b5fe6dd9efa)](https://www.codacy.com/app/baselines_janitors/stable-baselines?utm_source=github.com&utm_medium=referral&utm_content=hill-a/stable-baselines&utm_campaign=Badge_Coverage) - -# Stable Baselines - -Stable Baselines is a set of improved implementations of reinforcement learning algorithms based on OpenAI [Baselines](https://github.com/openai/baselines/). - -These algorithms will make it easier for the research community and industry to replicate, refine, and identify new ideas, and will create good baselines to build projects on top of. We expect these tools will be used as a base around which new ideas can be added, and as a tool for comparing a new approach against existing ones. We also hope that the simplicity of these tools will allow beginners to experiment with a more advanced toolset, without being buried in implementation details. - -## Main differences with OpenAI Baselines -This toolset is a fork of OpenAI Baselines, with a major structural refactoring, and code cleanups: - -- Unified structure for all algorithms -- PEP8 compliant (unified code style) -- Documented functions and classes -- More tests & more code coverage -- Additional algorithms: SAC and TD3 (+ HER support for DQN, DDPG, SAC and TD3) - -## Links - -Repository: -https://github.com/hill-a/stable-baselines - -Medium article: -https://medium.com/@araffin/df87c4b2fc82 - -Documentation: -https://stable-baselines.readthedocs.io/en/master/ - -RL Baselines Zoo: -https://github.com/araffin/rl-baselines-zoo - -## Quick example - -Most of the library tries to follow a sklearn-like syntax for the Reinforcement Learning algorithms using Gym. - -Here is a quick example of how to train and run PPO2 on a cartpole environment: - -```python -import gym - -from stable_baselines.common.policies import MlpPolicy -from stable_baselines.common.vec_env import DummyVecEnv -from stable_baselines import PPO2 - -env = gym.make('CartPole-v1') -# Optional: PPO2 requires a vectorized environment to run -# the env is now wrapped automatically when passing it to the constructor -# env = DummyVecEnv([lambda: env]) - -model = PPO2(MlpPolicy, env, verbose=1) -model.learn(total_timesteps=10000) - -obs = env.reset() -for i in range(1000): - action, _states = model.predict(obs) - obs, rewards, dones, info = env.step(action) - env.render() -``` - -Or just train a model with a one liner if [the environment is registered in Gym](https://github.com/openai/gym/wiki/Environments) and if [the policy is registered](https://stable-baselines.readthedocs.io/en/master/guide/custom_policy.html): - -```python -from stable_baselines import PPO2 - -model = PPO2('MlpPolicy', 'CartPole-v1').learn(10000) -``` - -""" - -setup(name='stable_baselines', - packages=[package for package in find_packages() - if package.startswith('stable_baselines')], - package_data={ - 'stable_baselines': ['py.typed', 'version.txt'], - }, - install_requires=[ - 'gym[atari,classic_control]==0.19.0', - 'scipy', - 'joblib', - 'cloudpickle>=0.5.5', - 'opencv-python', - 'numpy', - 'pandas', - 'matplotlib' - ] + find_tf_dependency(), - extras_require={ - 'mpi': [ - 'mpi4py', - ], - 'tests': [ - 'pytest', - 'pytest-cov', - 'pytest-env', - 'pytest-xdist', - 'pytype', - ], - 'docs': [ - 'sphinx', - 'sphinx-autobuild', - 'sphinx-rtd-theme' - ] - }, - description='A fork of OpenAI Baselines, implementations of reinforcement learning algorithms.', - author='Ashley Hill', - url='https://github.com/hill-a/stable-baselines', - author_email='ashley.hill@u-psud.fr', - keywords="reinforcement-learning-algorithms reinforcement-learning machine-learning " - "gym openai baselines toolbox python data-science", - license="MIT", - long_description=long_description, - long_description_content_type='text/markdown', - version=__version__, - ) - -# python setup.py sdist -# python setup.py bdist_wheel -# twine upload --repository-url https://test.pypi.org/legacy/ dist/* -# twine upload dist/* From 5f8739b87a7f37c73737a7d6f593e12e30e48fcd Mon Sep 17 00:00:00 2001 From: Mustafa-249 Date: Wed, 23 Jul 2025 14:54:14 +0300 Subject: [PATCH 04/18] Delete setup.cfg --- setup.cfg | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 setup.cfg diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 39378e81..00000000 --- a/setup.cfg +++ /dev/null @@ -1,22 +0,0 @@ -[metadata] -# This includes the license file in the wheel. -license_file = LICENSE - -[tool:pytest] -# Deterministic ordering for tests; useful for pytest-xdist. -env = - PYTHONHASHSEED=0 -filterwarnings = - ignore:inspect.getargspec:DeprecationWarning:tensorflow - ignore::pytest.PytestUnknownMarkWarning - # Tensorflow internal warnings - ignore:builtin type EagerTensor has no __module__ attribute:DeprecationWarning - ignore:The binary mode of fromstring is deprecated:DeprecationWarning - ignore::FutureWarning:tensorflow - # Gym warnings - ignore:Parameters to load are deprecated.:DeprecationWarning - ignore:the imp module is deprecated in favour of importlib:PendingDeprecationWarning - -[pytype] -inputs = stable_baselines -; python_version = 3.5 From 9d2d401e3bdec8f1fdc8f313de2da572e56e57af Mon Sep 17 00:00:00 2001 From: Mustafa-249 Date: Wed, 23 Jul 2025 14:54:31 +0300 Subject: [PATCH 05/18] Delete conftest.py --- conftest.py | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 conftest.py diff --git a/conftest.py b/conftest.py deleted file mode 100644 index f0da3aac..00000000 --- a/conftest.py +++ /dev/null @@ -1,22 +0,0 @@ -"""Configures pytest to ignore certain unit tests unless the appropriate flag is passed. - ---rungpu: tests that require GPU. ---expensive: tests that take a long time to run (e.g. training an RL algorithm for many timestesps).""" - -import pytest - - -def pytest_addoption(parser): - parser.addoption("--rungpu", action="store_true", default=False, help="run gpu tests") - parser.addoption("--expensive", action="store_true", - help="run expensive tests (which are otherwise skipped).") - - -def pytest_collection_modifyitems(config, items): - flags = {'gpu': '--rungpu', 'expensive': '--expensive'} - skips = {keyword: pytest.mark.skip(reason="need {} option to run".format(flag)) - for keyword, flag in flags.items() if not config.getoption(flag)} - for item in items: - for keyword, skip in skips.items(): - if keyword in item.keywords: - item.add_marker(skip) From 4924a265394c51831c5669cba3570fb5b102f2ca Mon Sep 17 00:00:00 2001 From: Mustafa-249 Date: Wed, 23 Jul 2025 14:54:54 +0300 Subject: [PATCH 06/18] Delete Makefile --- Makefile | 41 ----------------------------------------- 1 file changed, 41 deletions(-) delete mode 100644 Makefile diff --git a/Makefile b/Makefile deleted file mode 100644 index 2c7a69df..00000000 --- a/Makefile +++ /dev/null @@ -1,41 +0,0 @@ -# Run pytest and coverage report -pytest: - ./scripts/run_tests.sh - -# Type check -type: - pytype -j auto - -# Build the doc -doc: - cd docs && make html - -# Check the spelling in the doc -spelling: - cd docs && make spelling - -# Clean the doc build folder -clean: - cd docs && make clean - -# Build docker images -# If you do export RELEASE=True, it will also push them -docker: docker-cpu docker-gpu - -docker-cpu: - ./scripts/build_docker.sh - -docker-gpu: - USE_GPU=True ./scripts/build_docker.sh - -# PyPi package release -release: - python setup.py sdist - python setup.py bdist_wheel - twine upload dist/* - -# Test PyPi package release -test-release: - python setup.py sdist - python setup.py bdist_wheel - twine upload --repository-url https://test.pypi.org/legacy/ dist/* From 78183664d61c110e3842cca102b12973c8ddbfe3 Mon Sep 17 00:00:00 2001 From: Mustafa-249 Date: Wed, 23 Jul 2025 14:55:07 +0300 Subject: [PATCH 07/18] Delete scripts directory --- scripts/build_docker.sh | 22 ---------------------- scripts/run_docker_cpu.sh | 11 ----------- scripts/run_docker_gpu.sh | 19 ------------------- scripts/run_tests.sh | 2 -- scripts/run_tests_travis.sh | 32 -------------------------------- 5 files changed, 86 deletions(-) delete mode 100755 scripts/build_docker.sh delete mode 100755 scripts/run_docker_cpu.sh delete mode 100755 scripts/run_docker_gpu.sh delete mode 100755 scripts/run_tests.sh delete mode 100755 scripts/run_tests_travis.sh diff --git a/scripts/build_docker.sh b/scripts/build_docker.sh deleted file mode 100755 index e70df658..00000000 --- a/scripts/build_docker.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -CPU_PARENT=ubuntu:16.04 -GPU_PARENT=nvidia/cuda:9.0-cudnn7-runtime-ubuntu16.04 - -TAG=stablebaselines/stable-baselines -VERSION=$(cat ./stable_baselines/version.txt) - -if [[ ${USE_GPU} == "True" ]]; then - PARENT=${GPU_PARENT} -else - PARENT=${CPU_PARENT} - TAG="${TAG}-cpu" -fi - -docker build --build-arg PARENT_IMAGE=${PARENT} --build-arg USE_GPU=${USE_GPU} -t ${TAG}:${VERSION} . -docker tag ${TAG}:${VERSION} ${TAG}:latest - -if [[ ${RELEASE} == "True" ]]; then - docker push ${TAG}:${VERSION} - docker push ${TAG}:latest -fi diff --git a/scripts/run_docker_cpu.sh b/scripts/run_docker_cpu.sh deleted file mode 100755 index 355490e9..00000000 --- a/scripts/run_docker_cpu.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -# Launch an experiment using the docker cpu image - -cmd_line="$@" - -echo "Executing in the docker (cpu image):" -echo $cmd_line - -docker run -it --rm --network host --ipc=host \ - --mount src=$(pwd),target=/root/code/stable-baselines,type=bind stablebaselines/stable-baselines-cpu:v2.10.0 \ - bash -c "cd /root/code/stable-baselines/ && $cmd_line" diff --git a/scripts/run_docker_gpu.sh b/scripts/run_docker_gpu.sh deleted file mode 100755 index a5783470..00000000 --- a/scripts/run_docker_gpu.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -# Launch an experiment using the docker gpu image - -cmd_line="$@" - -echo "Executing in the docker (gpu image):" -echo $cmd_line - -# TODO: always use new-style once sufficiently widely used (probably 2021 onwards) -if [ -x "$(which nvidia-docker)" ]; then - # old-style nvidia-docker2 - NVIDIA_ARG="--runtime=nvidia" -else - NVIDIA_ARG="--gpus all" -fi - -docker run -it ${NVIDIA_ARG} --rm --network host --ipc=host \ - --mount src=$(pwd),target=/root/code/stable-baselines,type=bind stablebaselines/stable-baselines:v2.10.0 \ - bash -c "cd /root/code/stable-baselines/ && $cmd_line" diff --git a/scripts/run_tests.sh b/scripts/run_tests.sh deleted file mode 100755 index d765f3ad..00000000 --- a/scripts/run_tests.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -python -m pytest --cov-config .coveragerc --cov-report html --cov-report term --cov=. -v diff --git a/scripts/run_tests_travis.sh b/scripts/run_tests_travis.sh deleted file mode 100755 index 76383de0..00000000 --- a/scripts/run_tests_travis.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env bash - -DOCKER_CMD="docker run -it --rm --network host --ipc=host --mount src=$(pwd),target=/root/code/stable-baselines,type=bind" -BASH_CMD="cd /root/code/stable-baselines/" - -if [[ $# -ne 1 ]]; then - echo "usage: $0 " - exit 1 -fi - -if [[ ${DOCKER_IMAGE} = "" ]]; then - echo "Need DOCKER_IMAGE environment variable to be set." - exit 1 -fi - -TEST_GLOB=$1 - -set -e # exit immediately on any error - -# For pull requests from fork, Codacy token is not available, leading to build failure -if [[ ${CODACY_PROJECT_TOKEN} = "" ]]; then - echo "WARNING: CODACY_PROJECT_TOKEN not set. Skipping Codacy upload." - echo "(This is normal when building in a fork and can be ignored.)" - ${DOCKER_CMD} ${DOCKER_IMAGE} \ - bash -c "${BASH_CMD} && \ - pytest --cov-config .coveragerc --cov-report term --cov=. -v tests/test_${TEST_GLOB}" -else - ${DOCKER_CMD} --env CODACY_PROJECT_TOKEN=${CODACY_PROJECT_TOKEN} ${DOCKER_IMAGE} \ - bash -c "${BASH_CMD} && \ - pytest --cov-config .coveragerc --cov-report term --cov-report xml --cov=. -v tests/test_${TEST_GLOB} && \ - java -jar /root/code/codacy-coverage-reporter.jar report -l python -r coverage.xml --partial" -fi From b69c191dc090270e4713af852699e59a983c5869 Mon Sep 17 00:00:00 2001 From: Mustafa-249 Date: Wed, 23 Jul 2025 14:55:18 +0300 Subject: [PATCH 08/18] Delete stable_baselines directory --- stable_baselines/__init__.py | 34 - stable_baselines/a2c/__init__.py | 1 - stable_baselines/a2c/a2c.py | 413 ------ stable_baselines/a2c/run_atari.py | 53 - stable_baselines/acer/__init__.py | 1 - stable_baselines/acer/acer_simple.py | 769 ----------- stable_baselines/acer/buffer.py | 162 --- stable_baselines/acer/run_atari.py | 54 - stable_baselines/acktr/__init__.py | 1 - stable_baselines/acktr/acktr.py | 412 ------ stable_baselines/acktr/kfac.py | 1012 -------------- stable_baselines/acktr/kfac_utils.py | 128 -- stable_baselines/acktr/run_atari.py | 32 - stable_baselines/bench/__init__.py | 1 - stable_baselines/bench/monitor.py | 208 --- stable_baselines/common/__init__.py | 9 - stable_baselines/common/atari_wrappers.py | 313 ----- stable_baselines/common/base_class.py | 1190 ----------------- stable_baselines/common/bit_flipping_env.py | 116 -- stable_baselines/common/buffers.py | 264 ---- stable_baselines/common/callbacks.py | 380 ------ stable_baselines/common/cg.py | 49 - stable_baselines/common/cmd_util.py | 204 --- stable_baselines/common/console_util.py | 78 -- stable_baselines/common/dataset.py | 101 -- stable_baselines/common/distributions.py | 513 ------- stable_baselines/common/env_checker.py | 222 --- stable_baselines/common/evaluation.py | 82 -- stable_baselines/common/identity_env.py | 105 -- stable_baselines/common/input.py | 51 - stable_baselines/common/math_util.py | 140 -- stable_baselines/common/misc_util.py | 67 - stable_baselines/common/mpi_adam.py | 121 -- stable_baselines/common/mpi_moments.py | 71 - .../common/mpi_running_mean_std.py | 105 -- stable_baselines/common/noise.py | 123 -- stable_baselines/common/policies.py | 752 ----------- stable_baselines/common/runners.py | 209 --- stable_baselines/common/running_mean_std.py | 37 - stable_baselines/common/save_util.py | 173 --- stable_baselines/common/schedules.py | 254 ---- stable_baselines/common/segment_tree.py | 171 --- stable_baselines/common/tf_layers.py | 225 ---- stable_baselines/common/tf_util.py | 510 ------- stable_baselines/common/tile_images.py | 27 - stable_baselines/common/vec_env/__init__.py | 52 - .../common/vec_env/base_vec_env.py | 334 ----- .../common/vec_env/dummy_vec_env.py | 117 -- .../common/vec_env/subproc_vec_env.py | 210 --- stable_baselines/common/vec_env/util.py | 73 - .../common/vec_env/vec_check_nan.py | 86 -- .../common/vec_env/vec_frame_stack.py | 55 - .../common/vec_env/vec_normalize.py | 198 --- .../common/vec_env/vec_video_recorder.py | 112 -- stable_baselines/ddpg/__init__.py | 3 - stable_baselines/ddpg/ddpg.py | 1175 ---------------- stable_baselines/ddpg/main.py | 139 -- stable_baselines/ddpg/noise.py | 1 - stable_baselines/ddpg/policies.py | 262 ---- stable_baselines/deepq/__init__.py | 15 - stable_baselines/deepq/build_graph.py | 467 ------- stable_baselines/deepq/dqn.py | 401 ------ .../deepq/experiments/__init__.py | 0 .../deepq/experiments/enjoy_cartpole.py | 36 - .../deepq/experiments/enjoy_mountaincar.py | 41 - .../deepq/experiments/run_atari.py | 50 - .../deepq/experiments/train_cartpole.py | 51 - .../deepq/experiments/train_mountaincar.py | 37 - stable_baselines/deepq/policies.py | 254 ---- stable_baselines/gail/__init__.py | 3 - stable_baselines/gail/adversary.py | 164 --- stable_baselines/gail/dataset/__init__.py | 0 stable_baselines/gail/dataset/dataset.py | 371 ----- .../gail/dataset/expert_cartpole.npz | Bin 1636365 -> 0 bytes .../gail/dataset/expert_pendulum.npz | Bin 501974 -> 0 bytes .../gail/dataset/record_expert.py | 183 --- stable_baselines/gail/model.py | 54 - stable_baselines/her/__init__.py | 3 - stable_baselines/her/her.py | 163 --- stable_baselines/her/replay_buffer.py | 184 --- stable_baselines/her/utils.py | 103 -- stable_baselines/logger.py | 745 ----------- stable_baselines/ppo1/__init__.py | 1 - .../ppo1/experiments/train_cartpole.py | 9 - stable_baselines/ppo1/pposgd_simple.py | 370 ----- stable_baselines/ppo1/run_atari.py | 54 - stable_baselines/ppo1/run_mujoco.py | 34 - stable_baselines/ppo1/run_robotics.py | 42 - stable_baselines/ppo2/__init__.py | 1 - stable_baselines/ppo2/ppo2.py | 541 -------- stable_baselines/ppo2/run_atari.py | 48 - stable_baselines/ppo2/run_mujoco.py | 58 - stable_baselines/py.typed | 0 stable_baselines/results_plotter.py | 146 -- stable_baselines/sac/__init__.py | 2 - stable_baselines/sac/policies.py | 351 ----- stable_baselines/sac/sac.py | 574 -------- stable_baselines/td3/__init__.py | 3 - stable_baselines/td3/policies.py | 242 ---- stable_baselines/td3/td3.py | 501 ------- stable_baselines/trpo_mpi/__init__.py | 1 - stable_baselines/trpo_mpi/run_atari.py | 55 - stable_baselines/trpo_mpi/run_mujoco.py | 45 - stable_baselines/trpo_mpi/trpo_mpi.py | 538 -------- stable_baselines/trpo_mpi/utils.py | 23 - stable_baselines/version.txt | 1 - 106 files changed, 19725 deletions(-) delete mode 100644 stable_baselines/__init__.py delete mode 100644 stable_baselines/a2c/__init__.py delete mode 100644 stable_baselines/a2c/a2c.py delete mode 100644 stable_baselines/a2c/run_atari.py delete mode 100644 stable_baselines/acer/__init__.py delete mode 100644 stable_baselines/acer/acer_simple.py delete mode 100644 stable_baselines/acer/buffer.py delete mode 100644 stable_baselines/acer/run_atari.py delete mode 100644 stable_baselines/acktr/__init__.py delete mode 100644 stable_baselines/acktr/acktr.py delete mode 100644 stable_baselines/acktr/kfac.py delete mode 100644 stable_baselines/acktr/kfac_utils.py delete mode 100644 stable_baselines/acktr/run_atari.py delete mode 100644 stable_baselines/bench/__init__.py delete mode 100644 stable_baselines/bench/monitor.py delete mode 100644 stable_baselines/common/__init__.py delete mode 100644 stable_baselines/common/atari_wrappers.py delete mode 100644 stable_baselines/common/base_class.py delete mode 100644 stable_baselines/common/bit_flipping_env.py delete mode 100644 stable_baselines/common/buffers.py delete mode 100644 stable_baselines/common/callbacks.py delete mode 100644 stable_baselines/common/cg.py delete mode 100644 stable_baselines/common/cmd_util.py delete mode 100644 stable_baselines/common/console_util.py delete mode 100644 stable_baselines/common/dataset.py delete mode 100644 stable_baselines/common/distributions.py delete mode 100644 stable_baselines/common/env_checker.py delete mode 100644 stable_baselines/common/evaluation.py delete mode 100644 stable_baselines/common/identity_env.py delete mode 100644 stable_baselines/common/input.py delete mode 100644 stable_baselines/common/math_util.py delete mode 100644 stable_baselines/common/misc_util.py delete mode 100644 stable_baselines/common/mpi_adam.py delete mode 100644 stable_baselines/common/mpi_moments.py delete mode 100644 stable_baselines/common/mpi_running_mean_std.py delete mode 100644 stable_baselines/common/noise.py delete mode 100644 stable_baselines/common/policies.py delete mode 100644 stable_baselines/common/runners.py delete mode 100644 stable_baselines/common/running_mean_std.py delete mode 100644 stable_baselines/common/save_util.py delete mode 100644 stable_baselines/common/schedules.py delete mode 100644 stable_baselines/common/segment_tree.py delete mode 100644 stable_baselines/common/tf_layers.py delete mode 100644 stable_baselines/common/tf_util.py delete mode 100644 stable_baselines/common/tile_images.py delete mode 100644 stable_baselines/common/vec_env/__init__.py delete mode 100644 stable_baselines/common/vec_env/base_vec_env.py delete mode 100644 stable_baselines/common/vec_env/dummy_vec_env.py delete mode 100644 stable_baselines/common/vec_env/subproc_vec_env.py delete mode 100644 stable_baselines/common/vec_env/util.py delete mode 100644 stable_baselines/common/vec_env/vec_check_nan.py delete mode 100644 stable_baselines/common/vec_env/vec_frame_stack.py delete mode 100644 stable_baselines/common/vec_env/vec_normalize.py delete mode 100644 stable_baselines/common/vec_env/vec_video_recorder.py delete mode 100644 stable_baselines/ddpg/__init__.py delete mode 100644 stable_baselines/ddpg/ddpg.py delete mode 100644 stable_baselines/ddpg/main.py delete mode 100644 stable_baselines/ddpg/noise.py delete mode 100644 stable_baselines/ddpg/policies.py delete mode 100644 stable_baselines/deepq/__init__.py delete mode 100644 stable_baselines/deepq/build_graph.py delete mode 100644 stable_baselines/deepq/dqn.py delete mode 100644 stable_baselines/deepq/experiments/__init__.py delete mode 100644 stable_baselines/deepq/experiments/enjoy_cartpole.py delete mode 100644 stable_baselines/deepq/experiments/enjoy_mountaincar.py delete mode 100644 stable_baselines/deepq/experiments/run_atari.py delete mode 100644 stable_baselines/deepq/experiments/train_cartpole.py delete mode 100644 stable_baselines/deepq/experiments/train_mountaincar.py delete mode 100644 stable_baselines/deepq/policies.py delete mode 100644 stable_baselines/gail/__init__.py delete mode 100644 stable_baselines/gail/adversary.py delete mode 100644 stable_baselines/gail/dataset/__init__.py delete mode 100644 stable_baselines/gail/dataset/dataset.py delete mode 100644 stable_baselines/gail/dataset/expert_cartpole.npz delete mode 100644 stable_baselines/gail/dataset/expert_pendulum.npz delete mode 100644 stable_baselines/gail/dataset/record_expert.py delete mode 100644 stable_baselines/gail/model.py delete mode 100644 stable_baselines/her/__init__.py delete mode 100644 stable_baselines/her/her.py delete mode 100644 stable_baselines/her/replay_buffer.py delete mode 100644 stable_baselines/her/utils.py delete mode 100644 stable_baselines/logger.py delete mode 100644 stable_baselines/ppo1/__init__.py delete mode 100644 stable_baselines/ppo1/experiments/train_cartpole.py delete mode 100644 stable_baselines/ppo1/pposgd_simple.py delete mode 100644 stable_baselines/ppo1/run_atari.py delete mode 100644 stable_baselines/ppo1/run_mujoco.py delete mode 100644 stable_baselines/ppo1/run_robotics.py delete mode 100644 stable_baselines/ppo2/__init__.py delete mode 100644 stable_baselines/ppo2/ppo2.py delete mode 100644 stable_baselines/ppo2/run_atari.py delete mode 100644 stable_baselines/ppo2/run_mujoco.py delete mode 100644 stable_baselines/py.typed delete mode 100644 stable_baselines/results_plotter.py delete mode 100644 stable_baselines/sac/__init__.py delete mode 100644 stable_baselines/sac/policies.py delete mode 100644 stable_baselines/sac/sac.py delete mode 100644 stable_baselines/td3/__init__.py delete mode 100644 stable_baselines/td3/policies.py delete mode 100644 stable_baselines/td3/td3.py delete mode 100644 stable_baselines/trpo_mpi/__init__.py delete mode 100644 stable_baselines/trpo_mpi/run_atari.py delete mode 100644 stable_baselines/trpo_mpi/run_mujoco.py delete mode 100644 stable_baselines/trpo_mpi/trpo_mpi.py delete mode 100644 stable_baselines/trpo_mpi/utils.py delete mode 100644 stable_baselines/version.txt diff --git a/stable_baselines/__init__.py b/stable_baselines/__init__.py deleted file mode 100644 index df22523a..00000000 --- a/stable_baselines/__init__.py +++ /dev/null @@ -1,34 +0,0 @@ -import os -import warnings - -from stable_baselines.a2c import A2C -from stable_baselines.acer import ACER -from stable_baselines.acktr import ACKTR -from stable_baselines.deepq import DQN -from stable_baselines.her import HER -from stable_baselines.ppo2 import PPO2 -from stable_baselines.td3 import TD3 -from stable_baselines.sac import SAC - -# Load mpi4py-dependent algorithms only if mpi is installed. -try: - import mpi4py -except ImportError: - mpi4py = None - -if mpi4py is not None: - from stable_baselines.ddpg import DDPG - from stable_baselines.gail import GAIL - from stable_baselines.ppo1 import PPO1 - from stable_baselines.trpo_mpi import TRPO -del mpi4py - -# Read version from file -version_file = os.path.join(os.path.dirname(__file__), "version.txt") -with open(version_file, "r") as file_handler: - __version__ = file_handler.read().strip() - - -warnings.warn( - "stable-baselines is in maintenance mode, please use [Stable-Baselines3 (SB3)](https://github.com/DLR-RM/stable-baselines3) for an up-to-date version. You can find a [migration guide](https://stable-baselines3.readthedocs.io/en/master/guide/migration.html) in SB3 documentation." -) diff --git a/stable_baselines/a2c/__init__.py b/stable_baselines/a2c/__init__.py deleted file mode 100644 index d68abe7e..00000000 --- a/stable_baselines/a2c/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from stable_baselines.a2c.a2c import A2C diff --git a/stable_baselines/a2c/a2c.py b/stable_baselines/a2c/a2c.py deleted file mode 100644 index 45a96fa4..00000000 --- a/stable_baselines/a2c/a2c.py +++ /dev/null @@ -1,413 +0,0 @@ -import time - -import gym -import numpy as np -import tensorflow as tf - -from stable_baselines import logger -from stable_baselines.common import explained_variance, tf_util, ActorCriticRLModel, SetVerbosity, TensorboardWriter -from stable_baselines.common.policies import ActorCriticPolicy, RecurrentActorCriticPolicy -from stable_baselines.common.runners import AbstractEnvRunner -from stable_baselines.common.schedules import Scheduler -from stable_baselines.common.tf_util import mse, total_episode_reward_logger -from stable_baselines.common.math_util import safe_mean - - -def discount_with_dones(rewards, dones, gamma): - """ - Apply the discount value to the reward, where the environment is not done - - :param rewards: ([float]) The rewards - :param dones: ([bool]) Whether an environment is done or not - :param gamma: (float) The discount value - :return: ([float]) The discounted rewards - """ - discounted = [] - ret = 0 # Return: discounted reward - for reward, done in zip(rewards[::-1], dones[::-1]): - ret = reward + gamma * ret * (1. - done) # fixed off by one bug - discounted.append(ret) - return discounted[::-1] - - -class A2C(ActorCriticRLModel): - """ - The A2C (Advantage Actor Critic) model class, https://arxiv.org/abs/1602.01783 - - :param policy: (ActorCriticPolicy or str) The policy model to use (MlpPolicy, CnnPolicy, CnnLstmPolicy, ...) - :param env: (Gym environment or str) The environment to learn from (if registered in Gym, can be str) - :param gamma: (float) Discount factor - :param n_steps: (int) The number of steps to run for each environment per update - (i.e. batch size is n_steps * n_env where n_env is number of environment copies running in parallel) - :param vf_coef: (float) Value function coefficient for the loss calculation - :param ent_coef: (float) Entropy coefficient for the loss calculation - :param max_grad_norm: (float) The maximum value for the gradient clipping - :param learning_rate: (float) The learning rate - :param alpha: (float) RMSProp decay parameter (default: 0.99) - :param momentum: (float) RMSProp momentum parameter (default: 0.0) - :param epsilon: (float) RMSProp epsilon (stabilizes square root computation in denominator of RMSProp update) - (default: 1e-5) - :param lr_schedule: (str) The type of scheduler for the learning rate update ('linear', 'constant', - 'double_linear_con', 'middle_drop' or 'double_middle_drop') - :param verbose: (int) the verbosity level: 0 none, 1 training information, 2 tensorflow debug - :param tensorboard_log: (str) the log location for tensorboard (if None, no logging) - :param _init_setup_model: (bool) Whether or not to build the network at the creation of the instance - (used only for loading) - :param policy_kwargs: (dict) additional arguments to be passed to the policy on creation - :param full_tensorboard_log: (bool) enable additional logging when using tensorboard - WARNING: this logging can take a lot of space quickly - :param seed: (int) Seed for the pseudo-random generators (python, numpy, tensorflow). - If None (default), use random seed. Note that if you want completely deterministic - results, you must set `n_cpu_tf_sess` to 1. - :param n_cpu_tf_sess: (int) The number of threads for TensorFlow operations - If None, the number of cpu of the current machine will be used. - """ - - def __init__(self, policy, env, gamma=0.99, n_steps=5, vf_coef=0.25, ent_coef=0.01, max_grad_norm=0.5, - learning_rate=7e-4, alpha=0.99, momentum=0.0, epsilon=1e-5, lr_schedule='constant', - verbose=0, tensorboard_log=None, _init_setup_model=True, policy_kwargs=None, - full_tensorboard_log=False, seed=None, n_cpu_tf_sess=None): - - self.n_steps = n_steps - self.gamma = gamma - self.vf_coef = vf_coef - self.ent_coef = ent_coef - self.max_grad_norm = max_grad_norm - self.alpha = alpha - self.momentum = momentum - self.epsilon = epsilon - self.lr_schedule = lr_schedule - self.learning_rate = learning_rate - self.tensorboard_log = tensorboard_log - self.full_tensorboard_log = full_tensorboard_log - - self.learning_rate_ph = None - self.n_batch = None - self.actions_ph = None - self.advs_ph = None - self.rewards_ph = None - self.pg_loss = None - self.vf_loss = None - self.entropy = None - self.apply_backprop = None - self.train_model = None - self.step_model = None - self.proba_step = None - self.value = None - self.initial_state = None - self.learning_rate_schedule = None - self.summary = None - - super(A2C, self).__init__(policy=policy, env=env, verbose=verbose, requires_vec_env=True, - _init_setup_model=_init_setup_model, policy_kwargs=policy_kwargs, - seed=seed, n_cpu_tf_sess=n_cpu_tf_sess) - - # if we are loading, it is possible the environment is not known, however the obs and action space are known - if _init_setup_model: - self.setup_model() - - def _make_runner(self) -> AbstractEnvRunner: - return A2CRunner(self.env, self, n_steps=self.n_steps, gamma=self.gamma) - - def _get_pretrain_placeholders(self): - policy = self.train_model - if isinstance(self.action_space, gym.spaces.Discrete): - return policy.obs_ph, self.actions_ph, policy.policy - return policy.obs_ph, self.actions_ph, policy.deterministic_action - - def setup_model(self): - with SetVerbosity(self.verbose): - - assert issubclass(self.policy, ActorCriticPolicy), "Error: the input policy for the A2C model must be an " \ - "instance of common.policies.ActorCriticPolicy." - - self.graph = tf.Graph() - with self.graph.as_default(): - self.set_random_seed(self.seed) - self.sess = tf_util.make_session(num_cpu=self.n_cpu_tf_sess, graph=self.graph) - - self.n_batch = self.n_envs * self.n_steps - - n_batch_step = None - n_batch_train = None - if issubclass(self.policy, RecurrentActorCriticPolicy): - n_batch_step = self.n_envs - n_batch_train = self.n_envs * self.n_steps - - step_model = self.policy(self.sess, self.observation_space, self.action_space, self.n_envs, 1, - n_batch_step, reuse=False, **self.policy_kwargs) - - with tf.variable_scope("train_model", reuse=True, - custom_getter=tf_util.outer_scope_getter("train_model")): - train_model = self.policy(self.sess, self.observation_space, self.action_space, self.n_envs, - self.n_steps, n_batch_train, reuse=True, **self.policy_kwargs) - - with tf.variable_scope("loss", reuse=False): - self.actions_ph = train_model.pdtype.sample_placeholder([None], name="action_ph") - self.advs_ph = tf.placeholder(tf.float32, [None], name="advs_ph") - self.rewards_ph = tf.placeholder(tf.float32, [None], name="rewards_ph") - self.learning_rate_ph = tf.placeholder(tf.float32, [], name="learning_rate_ph") - - neglogpac = train_model.proba_distribution.neglogp(self.actions_ph) - self.entropy = tf.reduce_mean(train_model.proba_distribution.entropy()) - self.pg_loss = tf.reduce_mean(self.advs_ph * neglogpac) - self.vf_loss = mse(tf.squeeze(train_model.value_flat), self.rewards_ph) - # https://arxiv.org/pdf/1708.04782.pdf#page=9, https://arxiv.org/pdf/1602.01783.pdf#page=4 - # and https://github.com/dennybritz/reinforcement-learning/issues/34 - # suggest to add an entropy component in order to improve exploration. - loss = self.pg_loss - self.entropy * self.ent_coef + self.vf_loss * self.vf_coef - - tf.summary.scalar('entropy_loss', self.entropy) - tf.summary.scalar('policy_gradient_loss', self.pg_loss) - tf.summary.scalar('value_function_loss', self.vf_loss) - tf.summary.scalar('loss', loss) - - self.params = tf_util.get_trainable_vars("model") - grads = tf.gradients(loss, self.params) - if self.max_grad_norm is not None: - grads, _ = tf.clip_by_global_norm(grads, self.max_grad_norm) - grads = list(zip(grads, self.params)) - - with tf.variable_scope("input_info", reuse=False): - tf.summary.scalar('discounted_rewards', tf.reduce_mean(self.rewards_ph)) - tf.summary.scalar('learning_rate', tf.reduce_mean(self.learning_rate_ph)) - tf.summary.scalar('advantage', tf.reduce_mean(self.advs_ph)) - if self.full_tensorboard_log: - tf.summary.histogram('discounted_rewards', self.rewards_ph) - tf.summary.histogram('learning_rate', self.learning_rate_ph) - tf.summary.histogram('advantage', self.advs_ph) - if tf_util.is_image(self.observation_space): - tf.summary.image('observation', train_model.obs_ph) - else: - tf.summary.histogram('observation', train_model.obs_ph) - - trainer = tf.train.RMSPropOptimizer(learning_rate=self.learning_rate_ph, decay=self.alpha, - epsilon=self.epsilon, momentum=self.momentum) - self.apply_backprop = trainer.apply_gradients(grads) - - self.train_model = train_model - self.step_model = step_model - self.step = step_model.step - self.proba_step = step_model.proba_step - self.value = step_model.value - self.initial_state = step_model.initial_state - tf.global_variables_initializer().run(session=self.sess) - - self.summary = tf.summary.merge_all() - - def _train_step(self, obs, states, rewards, masks, actions, values, update, writer=None): - """ - applies a training step to the model - - :param obs: ([float]) The input observations - :param states: ([float]) The states (used for recurrent policies) - :param rewards: ([float]) The rewards from the environment - :param masks: ([bool]) Whether or not the episode is over (used for recurrent policies) - :param actions: ([float]) The actions taken - :param values: ([float]) The logits values - :param update: (int) the current step iteration - :param writer: (TensorFlow Summary.writer) the writer for tensorboard - :return: (float, float, float) policy loss, value loss, policy entropy - """ - advs = rewards - values - cur_lr = None - for _ in range(len(obs)): - cur_lr = self.learning_rate_schedule.value() - assert cur_lr is not None, "Error: the observation input array cannon be empty" - - td_map = {self.train_model.obs_ph: obs, self.actions_ph: actions, self.advs_ph: advs, - self.rewards_ph: rewards, self.learning_rate_ph: cur_lr} - if states is not None: - td_map[self.train_model.states_ph] = states - td_map[self.train_model.dones_ph] = masks - - if writer is not None: - # run loss backprop with summary, but once every 10 runs save the metadata (memory, compute time, ...) - if self.full_tensorboard_log and (1 + update) % 10 == 0: - run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE) - run_metadata = tf.RunMetadata() - summary, policy_loss, value_loss, policy_entropy, _ = self.sess.run( - [self.summary, self.pg_loss, self.vf_loss, self.entropy, self.apply_backprop], - td_map, options=run_options, run_metadata=run_metadata) - writer.add_run_metadata(run_metadata, 'step%d' % (update * self.n_batch)) - else: - summary, policy_loss, value_loss, policy_entropy, _ = self.sess.run( - [self.summary, self.pg_loss, self.vf_loss, self.entropy, self.apply_backprop], td_map) - writer.add_summary(summary, update * self.n_batch) - - else: - policy_loss, value_loss, policy_entropy, _ = self.sess.run( - [self.pg_loss, self.vf_loss, self.entropy, self.apply_backprop], td_map) - - return policy_loss, value_loss, policy_entropy - - def set_env(self,env): - super().set_env(env) - self.n_batch = self.n_envs * self.n_steps - - def learn(self, total_timesteps, callback=None, log_interval=100, tb_log_name="A2C", - reset_num_timesteps=True): - - new_tb_log = self._init_num_timesteps(reset_num_timesteps) - callback = self._init_callback(callback) - - with SetVerbosity(self.verbose), TensorboardWriter(self.graph, self.tensorboard_log, tb_log_name, new_tb_log) \ - as writer: - self._setup_learn() - self.learning_rate_schedule = Scheduler(initial_value=self.learning_rate, n_values=total_timesteps, - schedule=self.lr_schedule) - - t_start = time.time() - callback.on_training_start(locals(), globals()) - - for update in range(1, total_timesteps // self.n_batch + 1): - - callback.on_rollout_start() - # true_reward is the reward without discount - rollout = self.runner.run(callback) - # unpack - obs, states, rewards, masks, actions, values, ep_infos, true_reward = rollout - callback.update_locals(locals()) - callback.on_rollout_end() - - # Early stopping due to the callback - if not self.runner.continue_training: - break - - self.ep_info_buf.extend(ep_infos) - _, value_loss, policy_entropy = self._train_step(obs, states, rewards, masks, actions, values, - self.num_timesteps // self.n_batch, writer) - n_seconds = time.time() - t_start - fps = int((update * self.n_batch) / n_seconds) - - if writer is not None: - total_episode_reward_logger(self.episode_reward, - true_reward.reshape((self.n_envs, self.n_steps)), - masks.reshape((self.n_envs, self.n_steps)), - writer, self.num_timesteps) - - if self.verbose >= 1 and (update % log_interval == 0 or update == 1): - explained_var = explained_variance(values, rewards) - logger.record_tabular("nupdates", update) - logger.record_tabular("total_timesteps", self.num_timesteps) - logger.record_tabular("fps", fps) - logger.record_tabular("policy_entropy", float(policy_entropy)) - logger.record_tabular("value_loss", float(value_loss)) - logger.record_tabular("explained_variance", float(explained_var)) - if len(self.ep_info_buf) > 0 and len(self.ep_info_buf[0]) > 0: - logger.logkv('ep_reward_mean', safe_mean([ep_info['r'] for ep_info in self.ep_info_buf])) - logger.logkv('ep_len_mean', safe_mean([ep_info['l'] for ep_info in self.ep_info_buf])) - logger.dump_tabular() - - callback.on_training_end() - return self - - def save(self, save_path, cloudpickle=False): - data = { - "gamma": self.gamma, - "n_steps": self.n_steps, - "vf_coef": self.vf_coef, - "ent_coef": self.ent_coef, - "max_grad_norm": self.max_grad_norm, - "learning_rate": self.learning_rate, - "alpha": self.alpha, - "epsilon": self.epsilon, - "lr_schedule": self.lr_schedule, - "verbose": self.verbose, - "policy": self.policy, - "observation_space": self.observation_space, - "action_space": self.action_space, - "n_envs": self.n_envs, - "n_cpu_tf_sess": self.n_cpu_tf_sess, - "seed": self.seed, - "_vectorize_action": self._vectorize_action, - "policy_kwargs": self.policy_kwargs - } - - params_to_save = self.get_parameters() - - self._save_to_file(save_path, data=data, params=params_to_save, cloudpickle=cloudpickle) - - -class A2CRunner(AbstractEnvRunner): - def __init__(self, env, model, n_steps=5, gamma=0.99): - """ - A runner to learn the policy of an environment for an a2c model - - :param env: (Gym environment) The environment to learn from - :param model: (Model) The model to learn - :param n_steps: (int) The number of steps to run for each environment - :param gamma: (float) Discount factor - """ - super(A2CRunner, self).__init__(env=env, model=model, n_steps=n_steps) - self.gamma = gamma - - def _run(self): - """ - Run a learning step of the model - - :return: ([float], [float], [float], [bool], [float], [float]) - observations, states, rewards, masks, actions, values - """ - mb_obs, mb_rewards, mb_actions, mb_values, mb_dones = [], [], [], [], [] - mb_states = self.states - ep_infos = [] - for _ in range(self.n_steps): - actions, values, states, _ = self.model.step(self.obs, self.states, self.dones) # pytype: disable=attribute-error - mb_obs.append(np.copy(self.obs)) - mb_actions.append(actions) - mb_values.append(values) - mb_dones.append(self.dones) - clipped_actions = actions - # Clip the actions to avoid out of bound error - if isinstance(self.env.action_space, gym.spaces.Box): - clipped_actions = np.clip(actions, self.env.action_space.low, self.env.action_space.high) - obs, rewards, dones, infos = self.env.step(clipped_actions) - - self.model.num_timesteps += self.n_envs - - if self.callback is not None: - # Abort training early - self.callback.update_locals(locals()) - if self.callback.on_step() is False: - self.continue_training = False - # Return dummy values - return [None] * 8 - - for info in infos: - maybe_ep_info = info.get('episode') - if maybe_ep_info is not None: - ep_infos.append(maybe_ep_info) - - self.states = states - self.dones = dones - self.obs = obs - mb_rewards.append(rewards) - mb_dones.append(self.dones) - # batch of steps to batch of rollouts - mb_obs = np.asarray(mb_obs, dtype=self.obs.dtype).swapaxes(1, 0).reshape(self.batch_ob_shape) - mb_rewards = np.asarray(mb_rewards, dtype=np.float32).swapaxes(0, 1) - mb_actions = np.asarray(mb_actions, dtype=self.env.action_space.dtype).swapaxes(0, 1) - mb_values = np.asarray(mb_values, dtype=np.float32).swapaxes(0, 1) - mb_dones = np.asarray(mb_dones, dtype=np.bool).swapaxes(0, 1) - mb_masks = mb_dones[:, :-1] - mb_dones = mb_dones[:, 1:] - true_rewards = np.copy(mb_rewards) - last_values = self.model.value(self.obs, self.states, self.dones).tolist() # pytype: disable=attribute-error - # discount/bootstrap off value fn - for n, (rewards, dones, value) in enumerate(zip(mb_rewards, mb_dones, last_values)): - rewards = rewards.tolist() - dones = dones.tolist() - if dones[-1] == 0: - rewards = discount_with_dones(rewards + [value], dones + [0], self.gamma)[:-1] - else: - rewards = discount_with_dones(rewards, dones, self.gamma) - mb_rewards[n] = rewards - - # convert from [n_env, n_steps, ...] to [n_steps * n_env, ...] - mb_rewards = mb_rewards.reshape(-1, *mb_rewards.shape[2:]) - mb_actions = mb_actions.reshape(-1, *mb_actions.shape[2:]) - mb_values = mb_values.reshape(-1, *mb_values.shape[2:]) - mb_masks = mb_masks.reshape(-1, *mb_masks.shape[2:]) - true_rewards = true_rewards.reshape(-1, *true_rewards.shape[2:]) - return mb_obs, mb_states, mb_rewards, mb_masks, mb_actions, mb_values, ep_infos, true_rewards diff --git a/stable_baselines/a2c/run_atari.py b/stable_baselines/a2c/run_atari.py deleted file mode 100644 index f8f7817e..00000000 --- a/stable_baselines/a2c/run_atari.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python3 - -from stable_baselines import logger, A2C -from stable_baselines.common.cmd_util import make_atari_env, atari_arg_parser -from stable_baselines.common.vec_env import VecFrameStack -from stable_baselines.common.policies import CnnPolicy, CnnLstmPolicy, CnnLnLstmPolicy - - -def train(env_id, num_timesteps, seed, policy, lr_schedule, num_env): - """ - Train A2C model for atari environment, for testing purposes - - :param env_id: (str) Environment ID - :param num_timesteps: (int) The total number of samples - :param seed: (int) The initial seed for training - :param policy: (A2CPolicy) The policy model to use (MLP, CNN, LSTM, ...) - :param lr_schedule: (str) The type of scheduler for the learning rate update ('linear', 'constant', - 'double_linear_con', 'middle_drop' or 'double_middle_drop') - :param num_env: (int) The number of environments - """ - policy_fn = None - if policy == 'cnn': - policy_fn = CnnPolicy - elif policy == 'lstm': - policy_fn = CnnLstmPolicy - elif policy == 'lnlstm': - policy_fn = CnnLnLstmPolicy - if policy_fn is None: - raise ValueError("Error: policy {} not implemented".format(policy)) - - env = VecFrameStack(make_atari_env(env_id, num_env, seed), 4) - - model = A2C(policy_fn, env, lr_schedule=lr_schedule, seed=seed) - model.learn(total_timesteps=int(num_timesteps * 1.1)) - env.close() - - -def main(): - """ - Runs the test - """ - parser = atari_arg_parser() - parser.add_argument('--policy', choices=['cnn', 'lstm', 'lnlstm'], default='cnn', help='Policy architecture') - parser.add_argument('--lr_schedule', choices=['constant', 'linear'], default='constant', - help='Learning rate schedule') - args = parser.parse_args() - logger.configure() - train(args.env, num_timesteps=args.num_timesteps, seed=args.seed, policy=args.policy, lr_schedule=args.lr_schedule, - num_env=16) - - -if __name__ == '__main__': - main() diff --git a/stable_baselines/acer/__init__.py b/stable_baselines/acer/__init__.py deleted file mode 100644 index a81d161a..00000000 --- a/stable_baselines/acer/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from stable_baselines.acer.acer_simple import ACER diff --git a/stable_baselines/acer/acer_simple.py b/stable_baselines/acer/acer_simple.py deleted file mode 100644 index 160f48a3..00000000 --- a/stable_baselines/acer/acer_simple.py +++ /dev/null @@ -1,769 +0,0 @@ -import time -import warnings - -import numpy as np -import tensorflow as tf -from gym.spaces import Discrete, Box -from collections import deque - -from stable_baselines import logger -from stable_baselines.common.schedules import Scheduler -from stable_baselines.common.tf_util import batch_to_seq, seq_to_batch, \ - check_shape, avg_norm, gradient_add, q_explained_variance, total_episode_reward_logger -from stable_baselines.acer.buffer import Buffer -from stable_baselines.common import ActorCriticRLModel, tf_util, SetVerbosity, TensorboardWriter -from stable_baselines.common.runners import AbstractEnvRunner -from stable_baselines.common.policies import ActorCriticPolicy, RecurrentActorCriticPolicy - - -# For ACER -def get_by_index(input_tensor, idx): - """ - Return the input tensor, offset by a certain value - - :param input_tensor: (TensorFlow Tensor) The input tensor - :param idx: (int) The index offset - :return: (TensorFlow Tensor) the offset tensor - """ - assert len(input_tensor.get_shape()) == 2 - assert len(idx.get_shape()) == 1 - idx_flattened = tf.range(0, input_tensor.shape[0], dtype=tf.int64) * input_tensor.shape[1] + idx - offset_tensor = tf.gather(tf.reshape(input_tensor, [-1]), # flatten input - idx_flattened) # use flattened indices - return offset_tensor - - -def strip(var, n_envs, n_steps, flat=False): - """ - Removes the last step in the batch - - :param var: (TensorFlow Tensor) The input Tensor - :param n_envs: (int) The number of environments - :param n_steps: (int) The number of steps to run for each environment - :param flat: (bool) If the input Tensor is flat - :return: (TensorFlow Tensor) the input tensor, without the last step in the batch - """ - out_vars = batch_to_seq(var, n_envs, n_steps + 1, flat) - return seq_to_batch(out_vars[:-1], flat) - - -def q_retrace(rewards, dones, q_i, values, rho_i, n_envs, n_steps, gamma): - """ - Calculates the target Q-retrace - - :param rewards: ([TensorFlow Tensor]) The rewards - :param dones: ([TensorFlow Tensor]) - :param q_i: ([TensorFlow Tensor]) The Q values for actions taken - :param values: ([TensorFlow Tensor]) The output of the value functions - :param rho_i: ([TensorFlow Tensor]) The importance weight for each action - :param n_envs: (int) The number of environments - :param n_steps: (int) The number of steps to run for each environment - :param gamma: (float) The discount value - :return: ([TensorFlow Tensor]) the target Q-retrace - """ - rho_bar = batch_to_seq(tf.minimum(1.0, rho_i), n_envs, n_steps, True) # list of len steps, shape [n_envs] - reward_seq = batch_to_seq(rewards, n_envs, n_steps, True) # list of len steps, shape [n_envs] - done_seq = batch_to_seq(dones, n_envs, n_steps, True) # list of len steps, shape [n_envs] - q_is = batch_to_seq(q_i, n_envs, n_steps, True) - value_sequence = batch_to_seq(values, n_envs, n_steps + 1, True) - final_value = value_sequence[-1] - qret = final_value - qrets = [] - for i in range(n_steps - 1, -1, -1): - check_shape([qret, done_seq[i], reward_seq[i], rho_bar[i], q_is[i], value_sequence[i]], [[n_envs]] * 6) - qret = reward_seq[i] + gamma * qret * (1.0 - done_seq[i]) - qrets.append(qret) - qret = (rho_bar[i] * (qret - q_is[i])) + value_sequence[i] - qrets = qrets[::-1] - qret = seq_to_batch(qrets, flat=True) - return qret - - -class EpisodeStats: - def __init__(self, n_steps, n_envs): - """ - Calculates the episode statistics - - :param n_steps: (int) The number of steps to run for each environment - :param n_envs: (int) The number of environments - """ - self.episode_rewards = [] - for _ in range(n_envs): - self.episode_rewards.append([]) - self.len_buffer = deque(maxlen=40) # rolling buffer for episode lengths - self.rewbuffer = deque(maxlen=40) # rolling buffer for episode rewards - self.n_steps = n_steps - self.n_envs = n_envs - - def feed(self, rewards, masks): - """ - Update the latest reward and mask - - :param rewards: ([float]) The new rewards for the new step - :param masks: ([float]) The new masks for the new step - """ - rewards = np.reshape(rewards, [self.n_envs, self.n_steps]) - masks = np.reshape(masks, [self.n_envs, self.n_steps]) - for i in range(0, self.n_envs): - for j in range(0, self.n_steps): - self.episode_rewards[i].append(rewards[i][j]) - if masks[i][j]: - reward_length = len(self.episode_rewards[i]) - reward_sum = sum(self.episode_rewards[i]) - self.len_buffer.append(reward_length) - self.rewbuffer.append(reward_sum) - self.episode_rewards[i] = [] - - def mean_length(self): - """ - Returns the average length of each episode - - :return: (float) - """ - if self.len_buffer: - return np.mean(self.len_buffer) - else: - return 0 # on the first params dump, no episodes are finished - - def mean_reward(self): - """ - Returns the average reward of each episode - - :return: (float) - """ - if self.rewbuffer: - return np.mean(self.rewbuffer) - else: - return 0 - - -class ACER(ActorCriticRLModel): - """ - The ACER (Actor-Critic with Experience Replay) model class, https://arxiv.org/abs/1611.01224 - - :param policy: (ActorCriticPolicy or str) The policy model to use (MlpPolicy, CnnPolicy, CnnLstmPolicy, ...) - :param env: (Gym environment or str) The environment to learn from (if registered in Gym, can be str) - :param gamma: (float) The discount value - :param n_steps: (int) The number of steps to run for each environment per update - (i.e. batch size is n_steps * n_env where n_env is number of environment copies running in parallel) - :param num_procs: (int) The number of threads for TensorFlow operations - - .. deprecated:: 2.9.0 - Use `n_cpu_tf_sess` instead. - - :param q_coef: (float) The weight for the loss on the Q value - :param ent_coef: (float) The weight for the entropy loss - :param max_grad_norm: (float) The clipping value for the maximum gradient - :param learning_rate: (float) The initial learning rate for the RMS prop optimizer - :param lr_schedule: (str) The type of scheduler for the learning rate update ('linear', 'constant', - 'double_linear_con', 'middle_drop' or 'double_middle_drop') - :param rprop_epsilon: (float) RMSProp epsilon (stabilizes square root computation in denominator of RMSProp update) - (default: 1e-5) - :param rprop_alpha: (float) RMSProp decay parameter (default: 0.99) - :param buffer_size: (int) The buffer size in number of steps - :param replay_ratio: (float) The number of replay learning per on policy learning on average, - using a poisson distribution - :param replay_start: (int) The minimum number of steps in the buffer, before learning replay - :param correction_term: (float) Importance weight clipping factor (default: 10) - :param trust_region: (bool) Whether or not algorithms estimates the gradient KL divergence - between the old and updated policy and uses it to determine step size (default: True) - :param alpha: (float) The decay rate for the Exponential moving average of the parameters - :param delta: (float) max KL divergence between the old policy and updated policy (default: 1) - :param verbose: (int) the verbosity level: 0 none, 1 training information, 2 tensorflow debug - :param tensorboard_log: (str) the log location for tensorboard (if None, no logging) - :param _init_setup_model: (bool) Whether or not to build the network at the creation of the instance - :param policy_kwargs: (dict) additional arguments to be passed to the policy on creation - :param full_tensorboard_log: (bool) enable additional logging when using tensorboard - WARNING: this logging can take a lot of space quickly - :param seed: (int) Seed for the pseudo-random generators (python, numpy, tensorflow). - If None (default), use random seed. Note that if you want completely deterministic - results, you must set `n_cpu_tf_sess` to 1. - :param n_cpu_tf_sess: (int) The number of threads for TensorFlow operations - If None, the number of cpu of the current machine will be used. - """ - - def __init__(self, policy, env, gamma=0.99, n_steps=20, num_procs=None, q_coef=0.5, ent_coef=0.01, max_grad_norm=10, - learning_rate=7e-4, lr_schedule='linear', rprop_alpha=0.99, rprop_epsilon=1e-5, buffer_size=5000, - replay_ratio=4, replay_start=1000, correction_term=10.0, trust_region=True, - alpha=0.99, delta=1, verbose=0, tensorboard_log=None, - _init_setup_model=True, policy_kwargs=None, - full_tensorboard_log=False, seed=None, n_cpu_tf_sess=1): - - if num_procs is not None: - warnings.warn("num_procs will be removed in a future version (v3.x.x) " - "use n_cpu_tf_sess instead", DeprecationWarning) - n_cpu_tf_sess = num_procs - - self.n_steps = n_steps - self.replay_ratio = replay_ratio - self.buffer_size = buffer_size - self.replay_start = replay_start - self.gamma = gamma - self.alpha = alpha - self.correction_term = correction_term - self.q_coef = q_coef - self.ent_coef = ent_coef - self.trust_region = trust_region - self.delta = delta - self.max_grad_norm = max_grad_norm - self.rprop_alpha = rprop_alpha - self.rprop_epsilon = rprop_epsilon - self.learning_rate = learning_rate - self.lr_schedule = lr_schedule - self.tensorboard_log = tensorboard_log - self.full_tensorboard_log = full_tensorboard_log - - self.action_ph = None - self.done_ph = None - self.reward_ph = None - self.mu_ph = None - self.learning_rate_ph = None - self.polyak_model = None - self.learning_rate_schedule = None - self.run_ops = None - self.names_ops = None - self.train_model = None - self.step_model = None - self.proba_step = None - self.n_act = None - self.n_batch = None - self.summary = None - - super(ACER, self).__init__(policy=policy, env=env, verbose=verbose, requires_vec_env=True, - _init_setup_model=_init_setup_model, policy_kwargs=policy_kwargs, - seed=seed, n_cpu_tf_sess=n_cpu_tf_sess) - - if _init_setup_model: - self.setup_model() - - def _make_runner(self) -> AbstractEnvRunner: - return _Runner(env=self.env, model=self, n_steps=self.n_steps) - - def _get_pretrain_placeholders(self): - policy = self.step_model - action_ph = policy.pdtype.sample_placeholder([None]) - if isinstance(self.action_space, Discrete): - return policy.obs_ph, action_ph, policy.policy - raise NotImplementedError('Only discrete actions are supported for ACER for now') - - def set_env(self, env): - if env is not None: - assert self.n_envs == env.num_envs, \ - "Error: the environment passed must have the same number of environments as the model was trained on." \ - "This is due to ACER not being capable of changing the number of environments." - - super().set_env(env) - - def setup_model(self): - with SetVerbosity(self.verbose): - - assert issubclass(self.policy, ActorCriticPolicy), "Error: the input policy for the ACER model must be " \ - "an instance of common.policies.ActorCriticPolicy." - - if isinstance(self.action_space, Discrete): - self.n_act = self.action_space.n - continuous = False - elif isinstance(self.action_space, Box): - # self.n_act = self.action_space.shape[-1] - # continuous = True - raise NotImplementedError("WIP: Acer does not support Continuous actions yet.") - else: - raise ValueError("Error: ACER does not work with {} actions space.".format(self.action_space)) - - self.n_batch = self.n_envs * self.n_steps - - self.graph = tf.Graph() - with self.graph.as_default(): - self.sess = tf_util.make_session(num_cpu=self.n_cpu_tf_sess, graph=self.graph) - self.set_random_seed(self.seed) - n_batch_step = None - if issubclass(self.policy, RecurrentActorCriticPolicy): - n_batch_step = self.n_envs - n_batch_train = self.n_envs * (self.n_steps + 1) - - step_model = self.policy(self.sess, self.observation_space, self.action_space, self.n_envs, 1, - n_batch_step, reuse=False, **self.policy_kwargs) - - self.params = tf_util.get_trainable_vars("model") - - with tf.variable_scope("train_model", reuse=True, - custom_getter=tf_util.outer_scope_getter("train_model")): - train_model = self.policy(self.sess, self.observation_space, self.action_space, self.n_envs, - self.n_steps + 1, n_batch_train, reuse=True, **self.policy_kwargs) - - with tf.variable_scope("moving_average"): - # create averaged model - ema = tf.train.ExponentialMovingAverage(self.alpha) - ema_apply_op = ema.apply(self.params) - - def custom_getter(getter, name, *args, **kwargs): - name = name.replace("polyak_model/", "") - val = ema.average(getter(name, *args, **kwargs)) - return val - - with tf.variable_scope("polyak_model", reuse=True, custom_getter=custom_getter): - self.polyak_model = polyak_model = self.policy(self.sess, self.observation_space, self.action_space, - self.n_envs, self.n_steps + 1, - self.n_envs * (self.n_steps + 1), reuse=True, - **self.policy_kwargs) - - with tf.variable_scope("loss", reuse=False): - self.done_ph = tf.placeholder(tf.float32, [self.n_batch]) # dones - self.reward_ph = tf.placeholder(tf.float32, [self.n_batch]) # rewards, not returns - self.mu_ph = tf.placeholder(tf.float32, [self.n_batch, self.n_act]) # mu's - self.action_ph = train_model.pdtype.sample_placeholder([self.n_batch]) - self.learning_rate_ph = tf.placeholder(tf.float32, []) - eps = 1e-6 - - # Notation: (var) = batch variable, (var)s = sequence variable, - # (var)_i = variable index by action at step i - # shape is [n_envs * (n_steps + 1)] - if continuous: - value = train_model.value_flat - else: - value = tf.reduce_sum(train_model.policy_proba * train_model.q_value, axis=-1) - - rho, rho_i_ = None, None - if continuous: - action_ = strip(train_model.proba_distribution.sample(), self.n_envs, self.n_steps) - distribution_f = tf.contrib.distributions.MultivariateNormalDiag( - loc=strip(train_model.proba_distribution.mean, self.n_envs, self.n_steps), - scale_diag=strip(train_model.proba_distribution.logstd, self.n_envs, self.n_steps)) - f_polyak = tf.contrib.distributions.MultivariateNormalDiag( - loc=strip(polyak_model.proba_distribution.mean, self.n_envs, self.n_steps), - scale_diag=strip(polyak_model.proba_distribution.logstd, self.n_envs, self.n_steps)) - - f_i = distribution_f.prob(self.action_ph) - f_i_ = distribution_f.prob(action_) - f_polyak_i = f_polyak.prob(self.action_ph) - phi_i = strip(train_model.proba_distribution.mean, self.n_envs, self.n_steps) - - q_value = strip(train_model.value_fn, self.n_envs, self.n_steps) - q_i = q_value[:, 0] - - rho_i = tf.reshape(f_i, [-1, 1]) / (self.mu_ph + eps) - rho_i_ = tf.reshape(f_i_, [-1, 1]) / (self.mu_ph + eps) - - qret = q_retrace(self.reward_ph, self.done_ph, q_i, value, tf.pow(rho_i, 1 / self.n_act), - self.n_envs, self.n_steps, self.gamma) - else: - # strip off last step - # f is a distribution, chosen to be Gaussian distributions - # with fixed diagonal covariance and mean \phi(x) - # in the paper - distribution_f, f_polyak, q_value = \ - map(lambda variables: strip(variables, self.n_envs, self.n_steps), - [train_model.policy_proba, polyak_model.policy_proba, train_model.q_value]) - - # Get pi and q values for actions taken - f_i = get_by_index(distribution_f, self.action_ph) - f_i_ = distribution_f - phi_i = distribution_f - f_polyak_i = f_polyak - - q_i = get_by_index(q_value, self.action_ph) - - # Compute ratios for importance truncation - rho = distribution_f / (self.mu_ph + eps) - rho_i = get_by_index(rho, self.action_ph) - - # Calculate Q_retrace targets - qret = q_retrace(self.reward_ph, self.done_ph, q_i, value, rho_i, self.n_envs, self.n_steps, - self.gamma) - - # Calculate losses - # Entropy - entropy = tf.reduce_sum(train_model.proba_distribution.entropy()) - - # Policy Gradient loss, with truncated importance sampling & bias correction - value = strip(value, self.n_envs, self.n_steps, True) - # check_shape([qret, value, rho_i, f_i], [[self.n_envs * self.n_steps]] * 4) - # check_shape([rho, distribution_f, q_value], [[self.n_envs * self.n_steps, self.n_act]] * 2) - - # Truncated importance sampling - adv = qret - value - log_f = tf.log(f_i + eps) - # [n_envs * n_steps] - gain_f = log_f * tf.stop_gradient(adv * tf.minimum(self.correction_term, rho_i)) - loss_f = -tf.reduce_mean(gain_f) - - # Bias correction for the truncation - adv_bc = (q_value - tf.reshape(value, [self.n_envs * self.n_steps, 1])) # [n_envs * n_steps, n_act] - - # check_shape([adv_bc, log_f_bc], [[self.n_envs * self.n_steps, self.n_act]] * 2) - if continuous: - gain_bc = tf.stop_gradient(adv_bc * - tf.nn.relu(1.0 - (self.correction_term / (rho_i_ + eps))) * - f_i_) - else: - log_f_bc = tf.log(f_i_ + eps) # / (f_old + eps) - gain_bc = tf.reduce_sum(log_f_bc * - tf.stop_gradient( - adv_bc * - tf.nn.relu(1.0 - (self.correction_term / (rho + eps))) * - f_i_), - axis=1) - # IMP: This is sum, as expectation wrt f - loss_bc = -tf.reduce_mean(gain_bc) - - loss_policy = loss_f + loss_bc - - # Value/Q function loss, and explained variance - check_shape([qret, q_i], [[self.n_envs * self.n_steps]] * 2) - explained_variance = q_explained_variance(tf.reshape(q_i, [self.n_envs, self.n_steps]), - tf.reshape(qret, [self.n_envs, self.n_steps])) - loss_q = tf.reduce_mean(tf.square(tf.stop_gradient(qret) - q_i) * 0.5) - - # Net loss - check_shape([loss_policy, loss_q, entropy], [[]] * 3) - loss = loss_policy + self.q_coef * loss_q - self.ent_coef * entropy - - tf.summary.scalar('entropy_loss', entropy) - tf.summary.scalar('policy_gradient_loss', loss_policy) - tf.summary.scalar('value_function_loss', loss_q) - tf.summary.scalar('loss', loss) - - norm_grads_q, norm_grads_policy, avg_norm_grads_f = None, None, None - avg_norm_k, avg_norm_g, avg_norm_k_dot_g, avg_norm_adj = None, None, None, None - if self.trust_region: - # [n_envs * n_steps, n_act] - grad = tf.gradients(- (loss_policy - self.ent_coef * entropy) * self.n_steps * self.n_envs, - phi_i) - # [n_envs * n_steps, n_act] # Directly computed gradient of KL divergence wrt f - kl_grad = - f_polyak_i / (f_i_ + eps) - k_dot_g = tf.reduce_sum(kl_grad * grad, axis=-1) - adj = tf.maximum(0.0, (tf.reduce_sum(kl_grad * grad, axis=-1) - self.delta) / ( - tf.reduce_sum(tf.square(kl_grad), axis=-1) + eps)) # [n_envs * n_steps] - - # Calculate stats (before doing adjustment) for logging. - avg_norm_k = avg_norm(kl_grad) - avg_norm_g = avg_norm(grad) - avg_norm_k_dot_g = tf.reduce_mean(tf.abs(k_dot_g)) - avg_norm_adj = tf.reduce_mean(tf.abs(adj)) - - grad = grad - tf.reshape(adj, [self.n_envs * self.n_steps, 1]) * kl_grad - # These are turst region adjusted gradients wrt f ie statistics of policy pi - grads_f = -grad / (self.n_envs * self.n_steps) - grads_policy = tf.gradients(f_i_, self.params, grads_f) - grads_q = tf.gradients(loss_q * self.q_coef, self.params) - grads = [gradient_add(g1, g2, param, verbose=self.verbose) - for (g1, g2, param) in zip(grads_policy, grads_q, self.params)] - - avg_norm_grads_f = avg_norm(grads_f) * (self.n_steps * self.n_envs) - norm_grads_q = tf.global_norm(grads_q) - norm_grads_policy = tf.global_norm(grads_policy) - else: - grads = tf.gradients(loss, self.params) - - norm_grads = None - if self.max_grad_norm is not None: - grads, norm_grads = tf.clip_by_global_norm(grads, self.max_grad_norm) - grads = list(zip(grads, self.params)) - - with tf.variable_scope("input_info", reuse=False): - tf.summary.scalar('rewards', tf.reduce_mean(self.reward_ph)) - tf.summary.scalar('learning_rate', tf.reduce_mean(self.learning_rate)) - tf.summary.scalar('advantage', tf.reduce_mean(adv)) - tf.summary.scalar('action_probability', tf.reduce_mean(self.mu_ph)) - - if self.full_tensorboard_log: - tf.summary.histogram('rewards', self.reward_ph) - tf.summary.histogram('learning_rate', self.learning_rate) - tf.summary.histogram('advantage', adv) - tf.summary.histogram('action_probability', self.mu_ph) - if tf_util.is_image(self.observation_space): - tf.summary.image('observation', train_model.obs_ph) - else: - tf.summary.histogram('observation', train_model.obs_ph) - - trainer = tf.train.RMSPropOptimizer(learning_rate=self.learning_rate_ph, decay=self.rprop_alpha, - epsilon=self.rprop_epsilon) - _opt_op = trainer.apply_gradients(grads) - - # so when you call _train, you first do the gradient step, then you apply ema - with tf.control_dependencies([_opt_op]): - _train = tf.group(ema_apply_op) - - # Ops/Summaries to run, and their names for logging - assert norm_grads is not None - run_ops = [_train, loss, loss_q, entropy, loss_policy, loss_f, loss_bc, explained_variance, norm_grads] - names_ops = ['loss', 'loss_q', 'entropy', 'loss_policy', 'loss_f', 'loss_bc', 'explained_variance', - 'norm_grads'] - if self.trust_region: - self.run_ops = run_ops + [norm_grads_q, norm_grads_policy, avg_norm_grads_f, avg_norm_k, avg_norm_g, - avg_norm_k_dot_g, avg_norm_adj] - self.names_ops = names_ops + ['norm_grads_q', 'norm_grads_policy', 'avg_norm_grads_f', 'avg_norm_k', - 'avg_norm_g', 'avg_norm_k_dot_g', 'avg_norm_adj'] - - self.train_model = train_model - self.step_model = step_model - self.step = step_model.step - self.proba_step = step_model.proba_step - self.initial_state = step_model.initial_state - - tf.global_variables_initializer().run(session=self.sess) - - self.summary = tf.summary.merge_all() - - def _train_step(self, obs, actions, rewards, dones, mus, states, masks, steps, writer=None): - """ - applies a training step to the model - - :param obs: ([float]) The input observations - :param actions: ([float]) The actions taken - :param rewards: ([float]) The rewards from the environment - :param dones: ([bool]) Whether or not the episode is over (aligned with reward, used for reward calculation) - :param mus: ([float]) The logits values - :param states: ([float]) The states (used for recurrent policies) - :param masks: ([bool]) Whether or not the episode is over (used for recurrent policies) - :param steps: (int) the number of steps done so far (can be None) - :param writer: (TensorFlow Summary.writer) the writer for tensorboard - :return: ([str], [float]) the list of update operation name, and the list of the results of the operations - """ - cur_lr = self.learning_rate_schedule.value_steps(steps) - td_map = {self.train_model.obs_ph: obs, self.polyak_model.obs_ph: obs, self.action_ph: actions, - self.reward_ph: rewards, self.done_ph: dones, self.mu_ph: mus, self.learning_rate_ph: cur_lr} - - if states is not None: - td_map[self.train_model.states_ph] = states - td_map[self.train_model.dones_ph] = masks - td_map[self.polyak_model.states_ph] = states - td_map[self.polyak_model.dones_ph] = masks - - if writer is not None: - # run loss backprop with summary, but once every 10 runs save the metadata (memory, compute time, ...) - if self.full_tensorboard_log and (1 + (steps / self.n_batch)) % 10 == 0: - run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE) - run_metadata = tf.RunMetadata() - step_return = self.sess.run([self.summary] + self.run_ops, td_map, options=run_options, - run_metadata=run_metadata) - writer.add_run_metadata(run_metadata, 'step%d' % steps) - else: - step_return = self.sess.run([self.summary] + self.run_ops, td_map) - writer.add_summary(step_return[0], steps) - step_return = step_return[1:] - else: - step_return = self.sess.run(self.run_ops, td_map) - - return self.names_ops, step_return[1:] # strip off _train - - def learn(self, total_timesteps, callback=None, log_interval=100, tb_log_name="ACER", - reset_num_timesteps=True): - - new_tb_log = self._init_num_timesteps(reset_num_timesteps) - callback = self._init_callback(callback) - - with SetVerbosity(self.verbose), TensorboardWriter(self.graph, self.tensorboard_log, tb_log_name, new_tb_log) \ - as writer: - self._setup_learn() - - self.learning_rate_schedule = Scheduler(initial_value=self.learning_rate, n_values=total_timesteps, - schedule=self.lr_schedule) - - episode_stats = EpisodeStats(self.n_steps, self.n_envs) - - if self.replay_ratio > 0: - buffer = Buffer(env=self.env, n_steps=self.n_steps, size=self.buffer_size) - else: - buffer = None - - t_start = time.time() - callback.on_training_start(locals(), globals()) - - # n_batch samples, 1 on_policy call and multiple off-policy calls - for steps in range(0, total_timesteps, self.n_batch): - - callback.on_rollout_start() - - enc_obs, obs, actions, rewards, mus, dones, masks = self.runner.run(callback) - callback.update_locals(locals()) - callback.on_rollout_end() - - # Early stopping due to the callback - if not self.runner.continue_training: - break - - episode_stats.feed(rewards, dones) - - if buffer is not None: - buffer.put(enc_obs, actions, rewards, mus, dones, masks) - - if writer is not None: - total_episode_reward_logger(self.episode_reward, - rewards.reshape((self.n_envs, self.n_steps)), - dones.reshape((self.n_envs, self.n_steps)), - writer, self.num_timesteps) - - # reshape stuff correctly - obs = obs.reshape(self.runner.batch_ob_shape) - actions = actions.reshape([self.n_batch]) - rewards = rewards.reshape([self.n_batch]) - mus = mus.reshape([self.n_batch, self.n_act]) - dones = dones.reshape([self.n_batch]) - masks = masks.reshape([self.runner.batch_ob_shape[0]]) - - names_ops, values_ops = self._train_step(obs, actions, rewards, dones, mus, self.initial_state, masks, - self.num_timesteps, writer) - - if self.verbose >= 1 and (int(steps / self.n_batch) % log_interval == 0): - logger.record_tabular("total_timesteps", self.num_timesteps) - logger.record_tabular("fps", int(steps / (time.time() - t_start))) - # IMP: In EpisodicLife env, during training, we get done=True at each loss of life, - # not just at the terminal state. Thus, this is mean until end of life, not end of episode. - # For true episode rewards, see the monitor files in the log folder. - logger.record_tabular("mean_episode_length", episode_stats.mean_length()) - logger.record_tabular("mean_episode_reward", episode_stats.mean_reward()) - for name, val in zip(names_ops, values_ops): - logger.record_tabular(name, float(val)) - logger.dump_tabular() - - if (self.replay_ratio > 0 and - buffer is not None and - buffer.has_atleast(self.replay_start)): - samples_number = np.random.poisson(self.replay_ratio) - for _ in range(samples_number): - # get obs, actions, rewards, mus, dones from buffer. - obs, actions, rewards, mus, dones, masks = buffer.get() - - # reshape stuff correctly - obs = obs.reshape(self.runner.batch_ob_shape) - actions = actions.reshape([self.n_batch]) - rewards = rewards.reshape([self.n_batch]) - mus = mus.reshape([self.n_batch, self.n_act]) - dones = dones.reshape([self.n_batch]) - masks = masks.reshape([self.runner.batch_ob_shape[0]]) - - self._train_step(obs, actions, rewards, dones, mus, self.initial_state, masks, - self.num_timesteps) - - callback.on_training_end() - - return self - - def save(self, save_path, cloudpickle=False): - data = { - "gamma": self.gamma, - "n_steps": self.n_steps, - "q_coef": self.q_coef, - "ent_coef": self.ent_coef, - "max_grad_norm": self.max_grad_norm, - "learning_rate": self.learning_rate, - "lr_schedule": self.lr_schedule, - "rprop_alpha": self.rprop_alpha, - "rprop_epsilon": self.rprop_epsilon, - "replay_ratio": self.replay_ratio, - "replay_start": self.replay_start, - "verbose": self.verbose, - "policy": self.policy, - "observation_space": self.observation_space, - "action_space": self.action_space, - "n_envs": self.n_envs, - 'n_cpu_tf_sess': self.n_cpu_tf_sess, - 'seed': self.seed, - "_vectorize_action": self._vectorize_action, - "policy_kwargs": self.policy_kwargs - } - - params_to_save = self.get_parameters() - - self._save_to_file(save_path, data=data, params=params_to_save, cloudpickle=cloudpickle) - - -class _Runner(AbstractEnvRunner): - def __init__(self, env, model, n_steps): - """ - A runner to learn the policy of an environment for a model - - :param env: (Gym environment) The environment to learn from - :param model: (Model) The model to learn - :param n_steps: (int) The number of steps to run for each environment - """ - - super(_Runner, self).__init__(env=env, model=model, n_steps=n_steps) - self.env = env - self.model = model - self.n_env = n_env = env.num_envs - if isinstance(env.action_space, Discrete): - self.n_act = env.action_space.n - else: - self.n_act = env.action_space.shape[-1] - self.n_batch = n_env * n_steps - - if len(env.observation_space.shape) > 1: - self.raw_pixels = True - obs_height, obs_width, obs_num_channels = env.observation_space.shape - self.batch_ob_shape = (n_env * (n_steps + 1), obs_height, obs_width, obs_num_channels) - self.obs_dtype = np.uint8 - self.obs = np.zeros((n_env, obs_height, obs_width, obs_num_channels), dtype=self.obs_dtype) - self.num_channels = obs_num_channels - else: - if len(env.observation_space.shape) == 1: - self.obs_dim = env.observation_space.shape[0] - else: - self.obs_dim = 1 - self.raw_pixels = False - if isinstance(self.env.observation_space, Discrete): - self.batch_ob_shape = (n_env * (n_steps + 1),) - else: - self.batch_ob_shape = (n_env * (n_steps + 1), self.obs_dim) - self.obs_dtype = np.float32 - - self.n_steps = n_steps - self.states = model.initial_state - self.dones = [False for _ in range(n_env)] - - def _run(self): - """ - Run a step leaning of the model - - :return: ([float], [float], [int64], [float], [float], [bool], [float]) - encoded observation, observations, actions, rewards, mus, dones, masks - """ - enc_obs = [self.obs] - mb_obs, mb_actions, mb_mus, mb_dones, mb_rewards = [], [], [], [], [] - for _ in range(self.n_steps): - actions, _, states, _ = self.model.step(self.obs, self.states, self.dones) - mus = self.model.proba_step(self.obs, self.states, self.dones) - mb_obs.append(np.copy(self.obs)) - mb_actions.append(actions) - mb_mus.append(mus) - mb_dones.append(self.dones) - clipped_actions = actions - # Clip the actions to avoid out of bound error - if isinstance(self.env.action_space, Box): - clipped_actions = np.clip(actions, self.env.action_space.low, self.env.action_space.high) - obs, rewards, dones, _ = self.env.step(clipped_actions) - - self.model.num_timesteps += self.n_envs - - if self.callback is not None: - # Abort training early - self.callback.update_locals(locals()) - if self.callback.on_step() is False: - self.continue_training = False - # Return dummy values - return [None] * 7 - - # states information for statefull models like LSTM - self.states = states - self.dones = dones - self.obs = obs - mb_rewards.append(rewards) - enc_obs.append(obs) - mb_obs.append(np.copy(self.obs)) - mb_dones.append(self.dones) - - enc_obs = np.asarray(enc_obs, dtype=self.obs_dtype).swapaxes(1, 0) - mb_obs = np.asarray(mb_obs, dtype=self.obs_dtype).swapaxes(1, 0) - mb_actions = np.asarray(mb_actions, dtype=np.int64).swapaxes(1, 0) - mb_rewards = np.asarray(mb_rewards, dtype=np.float32).swapaxes(1, 0) - mb_mus = np.asarray(mb_mus, dtype=np.float32).swapaxes(1, 0) - mb_dones = np.asarray(mb_dones, dtype=np.bool).swapaxes(1, 0) - - mb_masks = mb_dones # Used for statefull models like LSTM's to mask state when done - mb_dones = mb_dones[:, 1:] # Used for calculating returns. The dones array is now aligned with rewards - - # shapes are now [nenv, nsteps, []] - # When pulling from buffer, arrays will now be reshaped in place, preventing a deep copy. - - return enc_obs, mb_obs, mb_actions, mb_rewards, mb_mus, mb_dones, mb_masks diff --git a/stable_baselines/acer/buffer.py b/stable_baselines/acer/buffer.py deleted file mode 100644 index e946c462..00000000 --- a/stable_baselines/acer/buffer.py +++ /dev/null @@ -1,162 +0,0 @@ -import numpy as np - - -class Buffer(object): - def __init__(self, env, n_steps, size=50000): - """ - A buffer for observations, actions, rewards, mu's, states, masks and dones values - - :param env: (Gym environment) The environment to learn from - :param n_steps: (int) The number of steps to run for each environment - :param size: (int) The buffer size in number of steps - """ - self.n_env = env.num_envs - self.n_steps = n_steps - self.n_batch = self.n_env * self.n_steps - # Each loc contains n_env * n_steps frames, thus total buffer is n_env * size frames - self.size = size // self.n_steps - - if len(env.observation_space.shape) > 1: - self.raw_pixels = True - self.height, self.width, self.n_channels = env.observation_space.shape - self.obs_dtype = np.uint8 - else: - self.raw_pixels = False - if len(env.observation_space.shape) == 1: - self.obs_dim = env.observation_space.shape[-1] - else: - self.obs_dim = 1 - self.obs_dtype = np.float32 - - # Memory - self.enc_obs = None - self.actions = None - self.rewards = None - self.mus = None - self.dones = None - self.masks = None - - # Size indexes - self.next_idx = 0 - self.num_in_buffer = 0 - - def has_atleast(self, frames): - """ - Check to see if the buffer has at least the asked number of frames - - :param frames: (int) The number of frames checked - :return: (bool) number of frames in buffer >= number asked - """ - # Frames per env, so total (n_env * frames) Frames needed - # Each buffer loc has n_env * n_steps frames - return self.num_in_buffer >= (frames // self.n_steps) - - def can_sample(self): - """ - Check if the buffer has at least one frame - - :return: (bool) if the buffer has at least one frame - """ - return self.num_in_buffer > 0 - - def decode(self, enc_obs): - """ - Get the stacked frames of an observation - - :param enc_obs: ([float]) the encoded observation - :return: ([float]) the decoded observation - """ - # enc_obs has shape [n_envs, n_steps + 1, nh, nw, nc] - # dones has shape [n_envs, n_steps, nh, nw, nc] - # returns stacked obs of shape [n_env, (n_steps + 1), nh, nw, nc] - n_env, n_steps = self.n_env, self.n_steps - if self.raw_pixels: - obs_dim = [self.height, self.width, self.n_channels] - else: - obs_dim = [self.obs_dim] - - obs = np.zeros([1, n_steps + 1, n_env] + obs_dim, dtype=self.obs_dtype) - # [n_steps + nstack, n_env, nh, nw, nc] - x_var = np.reshape(enc_obs, [n_env, n_steps + 1] + obs_dim).swapaxes(1, 0) - obs[-1, :] = x_var - - if self.raw_pixels: - obs = obs.transpose((2, 1, 3, 4, 0, 5)) - else: - obs = obs.transpose((2, 1, 3, 0)) - return np.reshape(obs, [n_env, (n_steps + 1)] + obs_dim[:-1] + [obs_dim[-1]]) - - def put(self, enc_obs, actions, rewards, mus, dones, masks): - """ - Adds a frame to the buffer - - :param enc_obs: ([float]) the encoded observation - :param actions: ([float]) the actions - :param rewards: ([float]) the rewards - :param mus: ([float]) the policy probability for the actions - :param dones: ([bool]) - :param masks: ([bool]) - """ - # enc_obs [n_env, (n_steps + n_stack), nh, nw, nc] - # actions, rewards, dones [n_env, n_steps] - # mus [n_env, n_steps, n_act] - - if self.enc_obs is None: - self.enc_obs = np.empty([self.size] + list(enc_obs.shape), dtype=self.obs_dtype) - self.actions = np.empty([self.size] + list(actions.shape), dtype=np.int32) - self.rewards = np.empty([self.size] + list(rewards.shape), dtype=np.float32) - self.mus = np.empty([self.size] + list(mus.shape), dtype=np.float32) - self.dones = np.empty([self.size] + list(dones.shape), dtype=np.bool) - self.masks = np.empty([self.size] + list(masks.shape), dtype=np.bool) - - self.enc_obs[self.next_idx] = enc_obs - self.actions[self.next_idx] = actions - self.rewards[self.next_idx] = rewards - self.mus[self.next_idx] = mus - self.dones[self.next_idx] = dones - self.masks[self.next_idx] = masks - - self.next_idx = (self.next_idx + 1) % self.size - self.num_in_buffer = min(self.size, self.num_in_buffer + 1) - - def take(self, arr, idx, envx): - """ - Reads a frame from a list and index for the asked environment ids - - :param arr: (np.ndarray) the array that is read - :param idx: ([int]) the idx that are read - :param envx: ([int]) the idx for the environments - :return: ([float]) the askes frames from the list - """ - n_env = self.n_env - out = np.empty([n_env] + list(arr.shape[2:]), dtype=arr.dtype) - for i in range(n_env): - out[i] = arr[idx[i], envx[i]] - return out - - def get(self): - """ - randomly read a frame from the buffer - - :return: ([float], [float], [float], [float], [bool], [float]) - observations, actions, rewards, mus, dones, maskes - """ - # returns - # obs [n_env, (n_steps + 1), nh, nw, n_stack*nc] - # actions, rewards, dones [n_env, n_steps] - # mus [n_env, n_steps, n_act] - n_env = self.n_env - assert self.can_sample() - - # Sample exactly one id per env. If you sample across envs, then higher correlation in samples from same env. - idx = np.random.randint(0, self.num_in_buffer, n_env) - envx = np.arange(n_env) - - dones = self.take(self.dones, idx, envx) - enc_obs = self.take(self.enc_obs, idx, envx) - obs = self.decode(enc_obs) - actions = self.take(self.actions, idx, envx) - rewards = self.take(self.rewards, idx, envx) - mus = self.take(self.mus, idx, envx) - masks = self.take(self.masks, idx, envx) - return obs, actions, rewards, mus, dones, masks diff --git a/stable_baselines/acer/run_atari.py b/stable_baselines/acer/run_atari.py deleted file mode 100644 index c09788fe..00000000 --- a/stable_baselines/acer/run_atari.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python3 -import warnings - -from stable_baselines import logger, ACER -from stable_baselines.common.policies import CnnPolicy, CnnLstmPolicy -from stable_baselines.common.cmd_util import make_atari_env, atari_arg_parser -from stable_baselines.common.vec_env import VecFrameStack - - -def train(env_id, num_timesteps, seed, policy, lr_schedule, num_cpu): - """ - train an ACER model on atari - - :param env_id: (str) Environment ID - :param num_timesteps: (int) The total number of samples - :param seed: (int) The initial seed for training - :param policy: (A2CPolicy) The policy model to use (MLP, CNN, LSTM, ...) - :param lr_schedule: (str) The type of scheduler for the learning rate update ('linear', 'constant', - 'double_linear_con', 'middle_drop' or 'double_middle_drop') - :param num_cpu: (int) The number of cpu to train on - """ - env = VecFrameStack(make_atari_env(env_id, num_cpu, seed), 4) - if policy == 'cnn': - policy_fn = CnnPolicy - elif policy == 'lstm': - policy_fn = CnnLstmPolicy - else: - warnings.warn("Policy {} not implemented".format(policy)) - return - - model = ACER(policy_fn, env, lr_schedule=lr_schedule, buffer_size=5000, seed=seed) - model.learn(total_timesteps=int(num_timesteps * 1.1)) - env.close() - # Free memory - del model - - -def main(): - """ - Runs the test - """ - parser = atari_arg_parser() - parser.add_argument('--policy', choices=['cnn', 'lstm', 'lnlstm'], default='cnn', help='Policy architecture') - parser.add_argument('--lr_schedule', choices=['constant', 'linear'], default='constant', - help='Learning rate schedule') - parser.add_argument('--logdir', help='Directory for logging') - args = parser.parse_args() - logger.configure(args.logdir) - train(args.env, num_timesteps=args.num_timesteps, seed=args.seed, - policy=args.policy, lr_schedule=args.lr_schedule, num_cpu=16) - - -if __name__ == '__main__': - main() diff --git a/stable_baselines/acktr/__init__.py b/stable_baselines/acktr/__init__.py deleted file mode 100644 index fcae30ed..00000000 --- a/stable_baselines/acktr/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from stable_baselines.acktr.acktr import ACKTR diff --git a/stable_baselines/acktr/acktr.py b/stable_baselines/acktr/acktr.py deleted file mode 100644 index e8509bd5..00000000 --- a/stable_baselines/acktr/acktr.py +++ /dev/null @@ -1,412 +0,0 @@ -import time -import warnings - -import tensorflow as tf -from gym.spaces import Box, Discrete - -from stable_baselines import logger -from stable_baselines.a2c.a2c import A2CRunner -from stable_baselines.ppo2.ppo2 import Runner as PPO2Runner -from stable_baselines.common.tf_util import mse, total_episode_reward_logger -from stable_baselines.acktr import kfac -from stable_baselines.common.schedules import Scheduler -from stable_baselines.common import explained_variance, ActorCriticRLModel, tf_util, SetVerbosity, TensorboardWriter -from stable_baselines.common.policies import ActorCriticPolicy, RecurrentActorCriticPolicy -from stable_baselines.common.math_util import safe_mean - - -class ACKTR(ActorCriticRLModel): - """ - The ACKTR (Actor Critic using Kronecker-Factored Trust Region) model class, https://arxiv.org/abs/1708.05144 - - :param policy: (ActorCriticPolicy or str) The policy model to use (MlpPolicy, CnnPolicy, CnnLstmPolicy, ...) - :param env: (Gym environment or str) The environment to learn from (if registered in Gym, can be str) - :param gamma: (float) Discount factor - :param nprocs: (int) The number of threads for TensorFlow operations - - .. deprecated:: 2.9.0 - Use `n_cpu_tf_sess` instead. - - :param n_steps: (int) The number of steps to run for each environment - :param ent_coef: (float) The weight for the entropy loss - :param vf_coef: (float) The weight for the loss on the value function - :param vf_fisher_coef: (float) The weight for the fisher loss on the value function - :param learning_rate: (float) The initial learning rate for the RMS prop optimizer - :param max_grad_norm: (float) The clipping value for the maximum gradient - :param kfac_clip: (float) gradient clipping for Kullback-Leibler - :param lr_schedule: (str) The type of scheduler for the learning rate update ('linear', 'constant', - 'double_linear_con', 'middle_drop' or 'double_middle_drop') - :param verbose: (int) the verbosity level: 0 none, 1 training information, 2 tensorflow debug - :param tensorboard_log: (str) the log location for tensorboard (if None, no logging) - :param _init_setup_model: (bool) Whether or not to build the network at the creation of the instance - :param async_eigen_decomp: (bool) Use async eigen decomposition - :param kfac_update: (int) update kfac after kfac_update steps - :param policy_kwargs: (dict) additional arguments to be passed to the policy on creation - :param gae_lambda: (float) Factor for trade-off of bias vs variance for Generalized Advantage Estimator - If None (default), then the classic advantage will be used instead of GAE - :param full_tensorboard_log: (bool) enable additional logging when using tensorboard - WARNING: this logging can take a lot of space quickly - :param seed: (int) Seed for the pseudo-random generators (python, numpy, tensorflow). - If None (default), use random seed. Note that if you want completely deterministic - results, you must set `n_cpu_tf_sess` to 1. - :param n_cpu_tf_sess: (int) The number of threads for TensorFlow operations - If None, the number of cpu of the current machine will be used. - """ - - def __init__(self, policy, env, gamma=0.99, nprocs=None, n_steps=20, ent_coef=0.01, vf_coef=0.25, vf_fisher_coef=1.0, - learning_rate=0.25, max_grad_norm=0.5, kfac_clip=0.001, lr_schedule='linear', verbose=0, - tensorboard_log=None, _init_setup_model=True, async_eigen_decomp=False, kfac_update=1, - gae_lambda=None, policy_kwargs=None, full_tensorboard_log=False, seed=None, n_cpu_tf_sess=1): - - if nprocs is not None: - warnings.warn("nprocs will be removed in a future version (v3.x.x) " - "use n_cpu_tf_sess instead", DeprecationWarning) - n_cpu_tf_sess = nprocs - - self.n_steps = n_steps - self.gamma = gamma - self.ent_coef = ent_coef - self.vf_coef = vf_coef - self.vf_fisher_coef = vf_fisher_coef - self.kfac_clip = kfac_clip - self.max_grad_norm = max_grad_norm - self.learning_rate = learning_rate - self.lr_schedule = lr_schedule - - self.tensorboard_log = tensorboard_log - self.async_eigen_decomp = async_eigen_decomp - self.full_tensorboard_log = full_tensorboard_log - self.kfac_update = kfac_update - self.gae_lambda = gae_lambda - - self.actions_ph = None - self.advs_ph = None - self.rewards_ph = None - self.learning_rate_ph = None - self.step_model = None - self.train_model = None - self.entropy = None - self.pg_loss = None - self.vf_loss = None - self.pg_fisher = None - self.vf_fisher = None - self.joint_fisher = None - self.grads_check = None - self.optim = None - self.train_op = None - self.q_runner = None - self.learning_rate_schedule = None - self.proba_step = None - self.value = None - self.initial_state = None - self.n_batch = None - self.summary = None - self.trained = False - self.continuous_actions = False - - super(ACKTR, self).__init__(policy=policy, env=env, verbose=verbose, requires_vec_env=True, - _init_setup_model=_init_setup_model, policy_kwargs=policy_kwargs, - seed=seed, n_cpu_tf_sess=n_cpu_tf_sess) - - if _init_setup_model: - self.setup_model() - - def _make_runner(self): - if self.gae_lambda is not None: - return PPO2Runner( - env=self.env, model=self, n_steps=self.n_steps, gamma=self.gamma, lam=self.gae_lambda) - else: - return A2CRunner( - self.env, self, n_steps=self.n_steps, gamma=self.gamma) - - def _get_pretrain_placeholders(self): - policy = self.train_model - if isinstance(self.action_space, Discrete): - return policy.obs_ph, self.actions_ph, policy.policy - return policy.obs_ph, self.actions_ph, policy.deterministic_action - - def setup_model(self): - with SetVerbosity(self.verbose): - - assert issubclass(self.policy, ActorCriticPolicy), "Error: the input policy for the ACKTR model must be " \ - "an instance of common.policies.ActorCriticPolicy." - - # Enable continuous actions tricks (normalized advantage) - self.continuous_actions = isinstance(self.action_space, Box) - - self.graph = tf.Graph() - with self.graph.as_default(): - self.set_random_seed(self.seed) - self.sess = tf_util.make_session(num_cpu=self.n_cpu_tf_sess, graph=self.graph) - - n_batch_step = None - n_batch_train = None - if issubclass(self.policy, RecurrentActorCriticPolicy): - n_batch_step = self.n_envs - n_batch_train = self.n_envs * self.n_steps - - step_model = self.policy(self.sess, self.observation_space, self.action_space, self.n_envs, - 1, n_batch_step, reuse=False, **self.policy_kwargs) - - self.params = params = tf_util.get_trainable_vars("model") - - with tf.variable_scope("train_model", reuse=True, - custom_getter=tf_util.outer_scope_getter("train_model")): - train_model = self.policy(self.sess, self.observation_space, self.action_space, - self.n_envs, self.n_steps, n_batch_train, - reuse=True, **self.policy_kwargs) - - with tf.variable_scope("loss", reuse=False, custom_getter=tf_util.outer_scope_getter("loss")): - self.advs_ph = advs_ph = tf.placeholder(tf.float32, [None]) - self.rewards_ph = rewards_ph = tf.placeholder(tf.float32, [None]) - self.learning_rate_ph = learning_rate_ph = tf.placeholder(tf.float32, []) - self.actions_ph = train_model.pdtype.sample_placeholder([None]) - - neg_log_prob = train_model.proba_distribution.neglogp(self.actions_ph) - - # training loss - pg_loss = tf.reduce_mean(advs_ph * neg_log_prob) - self.entropy = entropy = tf.reduce_mean(train_model.proba_distribution.entropy()) - self.pg_loss = pg_loss = pg_loss - self.ent_coef * entropy - self.vf_loss = vf_loss = mse(tf.squeeze(train_model.value_fn), rewards_ph) - train_loss = pg_loss + self.vf_coef * vf_loss - - # Fisher loss construction - self.pg_fisher = pg_fisher_loss = -tf.reduce_mean(neg_log_prob) - sample_net = train_model.value_fn + tf.random_normal(tf.shape(train_model.value_fn)) - self.vf_fisher = vf_fisher_loss = - self.vf_fisher_coef * tf.reduce_mean( - tf.pow(train_model.value_fn - tf.stop_gradient(sample_net), 2)) - self.joint_fisher = pg_fisher_loss + vf_fisher_loss - - tf.summary.scalar('entropy_loss', self.entropy) - tf.summary.scalar('policy_gradient_loss', pg_loss) - tf.summary.scalar('policy_gradient_fisher_loss', pg_fisher_loss) - tf.summary.scalar('value_function_loss', self.vf_loss) - tf.summary.scalar('value_function_fisher_loss', vf_fisher_loss) - tf.summary.scalar('loss', train_loss) - - self.grads_check = tf.gradients(train_loss, params) - - with tf.variable_scope("input_info", reuse=False): - tf.summary.scalar('discounted_rewards', tf.reduce_mean(self.rewards_ph)) - tf.summary.scalar('learning_rate', tf.reduce_mean(self.learning_rate_ph)) - tf.summary.scalar('advantage', tf.reduce_mean(self.advs_ph)) - - if self.full_tensorboard_log: - tf.summary.histogram('discounted_rewards', self.rewards_ph) - tf.summary.histogram('learning_rate', self.learning_rate_ph) - tf.summary.histogram('advantage', self.advs_ph) - if tf_util.is_image(self.observation_space): - tf.summary.image('observation', train_model.obs_ph) - else: - tf.summary.histogram('observation', train_model.obs_ph) - - with tf.variable_scope("kfac", reuse=False, custom_getter=tf_util.outer_scope_getter("kfac")): - with tf.device('/gpu:0'): - self.optim = optim = kfac.KfacOptimizer(learning_rate=learning_rate_ph, clip_kl=self.kfac_clip, - momentum=0.9, kfac_update=self.kfac_update, - epsilon=0.01, stats_decay=0.99, - async_eigen_decomp=self.async_eigen_decomp, - cold_iter=10, - max_grad_norm=self.max_grad_norm, verbose=self.verbose) - - optim.compute_and_apply_stats(self.joint_fisher, var_list=params) - - self.train_model = train_model - self.step_model = step_model - self.step = step_model.step - self.proba_step = step_model.proba_step - self.value = step_model.value - self.initial_state = step_model.initial_state - tf.global_variables_initializer().run(session=self.sess) - - self.summary = tf.summary.merge_all() - - def _train_step(self, obs, states, rewards, masks, actions, values, update, writer): - """ - applies a training step to the model - - :param obs: ([float]) The input observations - :param states: ([float]) The states (used for recurrent policies) - :param rewards: ([float]) The rewards from the environment - :param masks: ([bool]) Whether or not the episode is over (used for recurrent policies) - :param actions: ([float]) The actions taken - :param values: ([float]) The logits values - :param update: (int) the current step iteration - :param writer: (TensorFlow Summary.writer) the writer for tensorboard - :return: (float, float, float) policy loss, value loss, policy entropy - """ - advs = rewards - values - # Normalize advantage (used in the original continuous version) - if self.continuous_actions: - advs = (advs - advs.mean()) / (advs.std() + 1e-8) - - current_lr = None - - assert len(obs) > 0, "Error: the observation input array cannot be empty" - - # Note: in the original continuous version, - # the stepsize was automatically tuned computing the kl div - # and comparing it to the desired one - for _ in range(len(obs)): - current_lr = self.learning_rate_schedule.value() - - td_map = { - self.train_model.obs_ph: obs, - self.actions_ph: actions, - self.advs_ph: advs, - self.rewards_ph: rewards, - self.learning_rate_ph: current_lr - } - - if states is not None: - td_map[self.train_model.states_ph] = states - td_map[self.train_model.dones_ph] = masks - - if writer is not None: - # run loss backprop with summary, but once every 10 runs save the metadata (memory, compute time, ...) - if self.full_tensorboard_log and (1 + update) % 10 == 0: - run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE) - run_metadata = tf.RunMetadata() - summary, policy_loss, value_loss, policy_entropy, _ = self.sess.run( - [self.summary, self.pg_loss, self.vf_loss, self.entropy, self.train_op], - td_map, options=run_options, run_metadata=run_metadata) - writer.add_run_metadata(run_metadata, 'step%d' % (update * (self.n_batch + 1))) - else: - summary, policy_loss, value_loss, policy_entropy, _ = self.sess.run( - [self.summary, self.pg_loss, self.vf_loss, self.entropy, self.train_op], td_map) - writer.add_summary(summary, update * (self.n_batch + 1)) - else: - policy_loss, value_loss, policy_entropy, _ = self.sess.run( - [self.pg_loss, self.vf_loss, self.entropy, self.train_op], td_map) - - return policy_loss, value_loss, policy_entropy - - def learn(self, total_timesteps, callback=None, log_interval=100, tb_log_name="ACKTR", - reset_num_timesteps=True): - - new_tb_log = self._init_num_timesteps(reset_num_timesteps) - callback = self._init_callback(callback) - - with SetVerbosity(self.verbose), TensorboardWriter(self.graph, self.tensorboard_log, tb_log_name, new_tb_log) \ - as writer: - self._setup_learn() - self.n_batch = self.n_envs * self.n_steps - - self.learning_rate_schedule = Scheduler(initial_value=self.learning_rate, n_values=total_timesteps, - schedule=self.lr_schedule) - - # FIFO queue of the q_runner thread is closed at the end of the learn function. - # As a result, it needs to be redefinied at every call - with self.graph.as_default(): - with tf.variable_scope("kfac_apply", reuse=self.trained, - custom_getter=tf_util.outer_scope_getter("kfac_apply")): - # Some of the variables are not in a scope when they are create - # so we make a note of any previously uninitialized variables - tf_vars = tf.global_variables() - is_uninitialized = self.sess.run([tf.is_variable_initialized(var) for var in tf_vars]) - old_uninitialized_vars = [v for (v, f) in zip(tf_vars, is_uninitialized) if not f] - - self.train_op, self.q_runner = self.optim.apply_gradients(list(zip(self.grads_check, self.params))) - - # then we check for new uninitialized variables and initialize them - tf_vars = tf.global_variables() - is_uninitialized = self.sess.run([tf.is_variable_initialized(var) for var in tf_vars]) - new_uninitialized_vars = [v for (v, f) in zip(tf_vars, is_uninitialized) - if not f and v not in old_uninitialized_vars] - - if len(new_uninitialized_vars) != 0: - self.sess.run(tf.variables_initializer(new_uninitialized_vars)) - - self.trained = True - - t_start = time.time() - coord = tf.train.Coordinator() - if self.q_runner is not None: - enqueue_threads = self.q_runner.create_threads(self.sess, coord=coord, start=True) - else: - enqueue_threads = [] - - callback.on_training_start(locals(), globals()) - - for update in range(1, total_timesteps // self.n_batch + 1): - - callback.on_rollout_start() - - # pytype:disable=bad-unpacking - # true_reward is the reward without discount - if isinstance(self.runner, PPO2Runner): - # We are using GAE - rollout = self.runner.run(callback) - obs, returns, masks, actions, values, _, states, ep_infos, true_reward = rollout - else: - rollout = self.runner.run(callback) - obs, states, returns, masks, actions, values, ep_infos, true_reward = rollout - # pytype:enable=bad-unpacking - callback.update_locals(locals()) - callback.on_rollout_end() - - # Early stopping due to the callback - if not self.runner.continue_training: - break - - self.ep_info_buf.extend(ep_infos) - policy_loss, value_loss, policy_entropy = self._train_step(obs, states, returns, masks, actions, values, - self.num_timesteps // (self.n_batch + 1), - writer) - n_seconds = time.time() - t_start - fps = int((update * self.n_batch) / n_seconds) - - if writer is not None: - total_episode_reward_logger(self.episode_reward, - true_reward.reshape((self.n_envs, self.n_steps)), - masks.reshape((self.n_envs, self.n_steps)), - writer, self.num_timesteps) - - if self.verbose >= 1 and (update % log_interval == 0 or update == 1): - explained_var = explained_variance(values, returns) - logger.record_tabular("nupdates", update) - logger.record_tabular("total_timesteps", self.num_timesteps) - logger.record_tabular("fps", fps) - logger.record_tabular("policy_entropy", float(policy_entropy)) - logger.record_tabular("policy_loss", float(policy_loss)) - logger.record_tabular("value_loss", float(value_loss)) - logger.record_tabular("explained_variance", float(explained_var)) - if len(self.ep_info_buf) > 0 and len(self.ep_info_buf[0]) > 0: - logger.logkv('ep_reward_mean', safe_mean([ep_info['r'] for ep_info in self.ep_info_buf])) - logger.logkv('ep_len_mean', safe_mean([ep_info['l'] for ep_info in self.ep_info_buf])) - logger.dump_tabular() - - coord.request_stop() - coord.join(enqueue_threads) - - callback.on_training_end() - return self - - def save(self, save_path, cloudpickle=False): - data = { - "gamma": self.gamma, - "gae_lambda": self.gae_lambda, - "n_steps": self.n_steps, - "vf_coef": self.vf_coef, - "ent_coef": self.ent_coef, - "vf_fisher_coef": self.vf_fisher_coef, - "max_grad_norm": self.max_grad_norm, - "learning_rate": self.learning_rate, - "kfac_clip": self.kfac_clip, - "lr_schedule": self.lr_schedule, - "verbose": self.verbose, - "policy": self.policy, - "observation_space": self.observation_space, - "action_space": self.action_space, - "n_envs": self.n_envs, - "n_cpu_tf_sess": self.n_cpu_tf_sess, - "seed": self.seed, - "kfac_update": self.kfac_update, - "_vectorize_action": self._vectorize_action, - "policy_kwargs": self.policy_kwargs - } - - params_to_save = self.get_parameters() - - self._save_to_file(save_path, data=data, params=params_to_save, cloudpickle=cloudpickle) diff --git a/stable_baselines/acktr/kfac.py b/stable_baselines/acktr/kfac.py deleted file mode 100644 index 4ab20805..00000000 --- a/stable_baselines/acktr/kfac.py +++ /dev/null @@ -1,1012 +0,0 @@ -import re -from functools import reduce - -import tensorflow as tf -import numpy as np - -from stable_baselines.acktr.kfac_utils import detect_min_val, factor_reshape, gmatmul - -KFAC_OPS = ['MatMul', 'Conv2D', 'BiasAdd'] -KFAC_DEBUG = False - - -class KfacOptimizer: - def __init__(self, learning_rate=0.01, momentum=0.9, clip_kl=0.01, kfac_update=2, stats_accum_iter=60, - full_stats_init=False, cold_iter=100, cold_lr=None, async_eigen_decomp=False, - async_stats=False, epsilon=1e-2, stats_decay=0.95, blockdiag_bias=False, - channel_fac=False, factored_damping=False, approx_t2=False, - use_float64=False, weight_decay_dict=None, max_grad_norm=0.5, verbose=1): - """ - Kfac Optimizer for ACKTR models - link: https://arxiv.org/pdf/1708.05144.pdf - - :param learning_rate: (float) The learning rate - :param momentum: (float) The momentum value for the TensorFlow momentum optimizer - :param clip_kl: (float) gradient clipping for Kullback-Leibler - :param kfac_update: (int) update kfac after kfac_update steps - :param stats_accum_iter: (int) how may steps to accumulate stats - :param full_stats_init: (bool) whether or not to fully initialize stats - :param cold_iter: (int) Cold start learning rate for how many steps - :param cold_lr: (float) Cold start learning rate - :param async_eigen_decomp: (bool) Use async eigen decomposition - :param async_stats: (bool) Asynchronous stats update - :param epsilon: (float) epsilon value for small numbers - :param stats_decay: (float) the stats decay rate - :param blockdiag_bias: (bool) - :param channel_fac: (bool) factorization along the channels - :param factored_damping: (bool) use factored damping - :param approx_t2: (bool) approximate T2 act and grad fisher - :param use_float64: (bool) use 64-bit float - :param weight_decay_dict: (dict) custom weight decay coeff for a given gradient - :param max_grad_norm: (float) The maximum value for the gradient clipping - :param verbose: (int) verbosity level - """ - self.max_grad_norm = max_grad_norm - self._lr = learning_rate - self._momentum = momentum - self._clip_kl = clip_kl - self._channel_fac = channel_fac - self._kfac_update = kfac_update - self._async_eigen_decomp = async_eigen_decomp - self._async_stats = async_stats - self._epsilon = epsilon - self._stats_decay = stats_decay - self._blockdiag_bias = blockdiag_bias - self._approx_t2 = approx_t2 - self._use_float64 = use_float64 - self._factored_damping = factored_damping - self._cold_iter = cold_iter - self.verbose = verbose - if cold_lr is None: - # good heuristics - self._cold_lr = self._lr # * 3. - else: - self._cold_lr = cold_lr - self._stats_accum_iter = stats_accum_iter - if weight_decay_dict is None: - weight_decay_dict = {} - self._weight_decay_dict = weight_decay_dict - self._diag_init_coeff = 0. - self._full_stats_init = full_stats_init - if not self._full_stats_init: - self._stats_accum_iter = self._cold_iter - - self.sgd_step = tf.Variable(0, name='KFAC/sgd_step', trainable=False) - self.global_step = tf.Variable( - 0, name='KFAC/global_step', trainable=False) - self.cold_step = tf.Variable(0, name='KFAC/cold_step', trainable=False) - self.factor_step = tf.Variable( - 0, name='KFAC/factor_step', trainable=False) - self.stats_step = tf.Variable( - 0, name='KFAC/stats_step', trainable=False) - self.v_f_v = tf.Variable(0., name='KFAC/vFv', trainable=False) - - self.factors = {} - self.param_vars = [] - self.stats = {} - self.stats_eigen = {} - - self._update_stats_op = None - - def get_factors(self, gradients, varlist): - """ - get factors to update - - :param gradients: ([TensorFlow Tensor]) The gradients - :param varlist: ([TensorFlow Tensor]) The parameters - :return: ([TensorFlow Tensor]) The factors to update - """ - default_graph = tf.get_default_graph() - factor_tensors = {} - fprop_tensors = [] - bprop_tensors = [] - op_types = [] - - def _search_factors(gradient, graph): - # hard coded search stratergy - bprop_op = gradient.op - bprop_op_name = bprop_op.name - - b_tensors = [] - f_tensors = [] - - # combining additive gradient, assume they are the same op type and - # indepedent - if 'AddN' in bprop_op_name: - factors = [] - for grad in gradient.op.inputs: - factors.append(_search_factors(grad, graph)) - op_names = [_item['opName'] for _item in factors] - if self.verbose > 1: - # TODO: need to check all the attribute of the ops as well - print(gradient.name) - print(op_names) - print(len(np.unique(op_names))) - assert len(np.unique(op_names)) == 1, \ - 'Error: {} is shared among different computation OPs'.format(gradient.name) - - b_tensors = reduce(lambda x, y: x + y, - [_item['bpropFactors'] for _item in factors]) - if len(factors[0]['fpropFactors']) > 0: - f_tensors = reduce( - lambda x, y: x + y, [_item['fpropFactors'] for _item in factors]) - fprop_op_name = op_names[0] - fprop_op = factors[0]['op'] - else: - fprop_op_match = re.search('gradientsSampled(_[0-9]+|)/(.+?)_grad', bprop_op_name) - assert fprop_op_match is not None - fprop_op_name = fprop_op_match.group(2) - fprop_op = graph.get_operation_by_name(fprop_op_name) - if fprop_op.op_def.name in KFAC_OPS: - # Known OPs - b_tensor = [_i for _i in bprop_op.inputs if 'gradientsSampled' in _i.name][-1] - b_tensor_shape = fprop_op.outputs[0].get_shape() - if b_tensor.get_shape()[0].value is None: - b_tensor.set_shape(b_tensor_shape) - b_tensors.append(b_tensor) - - if fprop_op.op_def.name == 'BiasAdd': - f_tensors = [] - else: - f_tensors.append([_i for _i in fprop_op.inputs if param.op.name not in _i.name][0]) - fprop_op_name = fprop_op.op_def.name - else: - # unknown OPs, block approximation used - b_inputs_list = [_i for _i in bprop_op.inputs[0].op.inputs - if 'gradientsSampled' in _i.name if 'Shape' not in _i.name] - if len(b_inputs_list) > 0: - b_tensor = b_inputs_list[0] - # only if tensor shape is defined, usually this will prevent tensor like Sum:0 to be used. - if b_tensor.get_shape(): - b_tensor_shape = fprop_op.outputs[0].get_shape() - if len(b_tensor.get_shape()) > 0 and b_tensor.get_shape()[0].value is None: - b_tensor.set_shape(b_tensor_shape) - b_tensors.append(b_tensor) - fprop_op_name = 'UNK-' + fprop_op.op_def.name - op_types.append(fprop_op_name) - - return {'opName': fprop_op_name, 'op': fprop_op, 'fpropFactors': f_tensors, 'bpropFactors': b_tensors} - - for _grad, param in zip(gradients, varlist): - if KFAC_DEBUG: - print(('get factor for ' + param.name)) - found_factors = _search_factors(_grad, default_graph) - factor_tensors[param] = found_factors - - # check associated weights and bias for homogeneous coordinate representation - # and check redundent factors - # TODO: there may be a bug to detect associate bias and weights for forking layer, e.g. in inception models. - for param in varlist: - factor_tensors[param]['assnWeights'] = None - factor_tensors[param]['assnBias'] = None - for param in varlist: - if factor_tensors[param]['opName'] == 'BiasAdd': - factor_tensors[param]['assnWeights'] = None - for item in varlist: - if len(factor_tensors[item]['bpropFactors']) > 0: - if (set(factor_tensors[item]['bpropFactors']) == set(factor_tensors[param]['bpropFactors'])) \ - and (len(factor_tensors[item]['fpropFactors']) > 0): - factor_tensors[param]['assnWeights'] = item - factor_tensors[item]['assnBias'] = param - factor_tensors[param]['bpropFactors'] = factor_tensors[ - item]['bpropFactors'] - - # concatenate the additive gradients along the batch dimension, i.e. assuming independence structure - for key in ['fpropFactors', 'bpropFactors']: - for i, param in enumerate(varlist): - if len(factor_tensors[param][key]) > 0: - if (key + '_concat') not in factor_tensors[param]: - tensor = factor_tensors[param][key][0] # type: tf.Tensor - name_scope = tensor.name.split(':')[ - 0] - with tf.name_scope(name_scope): - factor_tensors[param][ - key + '_concat'] = tf.concat(factor_tensors[param][key], 0) - else: - factor_tensors[param][key + '_concat'] = None - for _, param2 in enumerate(varlist[(i + 1):]): - if (len(factor_tensors[param][key]) > 0) and ( - set(factor_tensors[param2][key]) == set(factor_tensors[param][key])): - factor_tensors[param2][key] = factor_tensors[param][key] - factor_tensors[param2][ - key + '_concat'] = factor_tensors[param][key + '_concat'] - - if KFAC_DEBUG: - for items in zip(varlist, fprop_tensors, bprop_tensors, op_types): - print((items[0].name, factor_tensors[item])) - self.factors = factor_tensors - return factor_tensors - - def get_stats(self, factors, varlist): - """ - return the stats values from the factors to update and the parameters - - :param factors: ([TensorFlow Tensor]) The factors to update - :param varlist: ([TensorFlow Tensor]) The parameters - :return: ([TensorFlow Tensor]) The stats values - """ - if len(self.stats) == 0: - # initialize stats variables on CPU because eigen decomp is - # computed on CPU - with tf.device('/cpu'): - tmp_stats_cache = {} - - # search for tensor factors and - # use block diag approx for the bias units - for var in varlist: - bprop_factor = factors[var]['bpropFactors_concat'] - op_type = factors[var]['opName'] - if op_type == 'Conv2D': - operator_height = bprop_factor.get_shape()[1] - operator_width = bprop_factor.get_shape()[2] - if operator_height == 1 and operator_width == 1 and self._channel_fac: - # factorization along the channels do not support - # homogeneous coordinate - var_assn_bias = factors[var]['assnBias'] - if var_assn_bias: - factors[var]['assnBias'] = None - factors[var_assn_bias]['assnWeights'] = None - - for var in varlist: - fprop_factor = factors[var]['fpropFactors_concat'] - bprop_factor = factors[var]['bpropFactors_concat'] - op_type = factors[var]['opName'] - self.stats[var] = {'opName': op_type, - 'fprop_concat_stats': [], - 'bprop_concat_stats': [], - 'assnWeights': factors[var]['assnWeights'], - 'assnBias': factors[var]['assnBias'], - } - if fprop_factor is not None: - if fprop_factor not in tmp_stats_cache: - if op_type == 'Conv2D': - kernel_height = var.get_shape()[0] - kernel_width = var.get_shape()[1] - n_channels = fprop_factor.get_shape()[-1] - - operator_height = bprop_factor.get_shape()[1] - operator_width = bprop_factor.get_shape()[2] - if operator_height == 1 and operator_width == 1 and self._channel_fac: - # factorization along the channels - # assume independence between input channels and spatial - # 2K-1 x 2K-1 covariance matrix and C x C covariance matrix - # factorization along the channels do not - # support homogeneous coordinate, assnBias - # is always None - fprop_factor2_size = kernel_height * kernel_width - slot_fprop_factor_stats2 = tf.Variable(tf.diag(tf.ones( - [fprop_factor2_size])) * self._diag_init_coeff, - name='KFAC_STATS/' + fprop_factor.op.name, - trainable=False) - self.stats[var]['fprop_concat_stats'].append( - slot_fprop_factor_stats2) - - fprop_factor_size = n_channels - else: - # 2K-1 x 2K-1 x C x C covariance matrix - # assume BHWC - fprop_factor_size = kernel_height * kernel_width * n_channels - else: - # D x D covariance matrix - fprop_factor_size = fprop_factor.get_shape()[-1] - - # use homogeneous coordinate - if not self._blockdiag_bias and self.stats[var]['assnBias']: - fprop_factor_size += 1 - - slot_fprop_factor_stats = tf.Variable( - tf.diag(tf.ones([fprop_factor_size])) * self._diag_init_coeff, - name='KFAC_STATS/' + fprop_factor.op.name, trainable=False) - self.stats[var]['fprop_concat_stats'].append( - slot_fprop_factor_stats) - if op_type != 'Conv2D': - tmp_stats_cache[fprop_factor] = self.stats[ - var]['fprop_concat_stats'] - else: - self.stats[var][ - 'fprop_concat_stats'] = tmp_stats_cache[fprop_factor] - - if bprop_factor is not None: - # no need to collect backward stats for bias vectors if - # using homogeneous coordinates - if not ((not self._blockdiag_bias) and self.stats[var]['assnWeights']): - if bprop_factor not in tmp_stats_cache: - slot_bprop_factor_stats = tf.Variable(tf.diag(tf.ones([bprop_factor.get_shape( - )[-1]])) * self._diag_init_coeff, name='KFAC_STATS/' + bprop_factor.op.name, - trainable=False) - self.stats[var]['bprop_concat_stats'].append( - slot_bprop_factor_stats) - tmp_stats_cache[bprop_factor] = self.stats[ - var]['bprop_concat_stats'] - else: - self.stats[var][ - 'bprop_concat_stats'] = tmp_stats_cache[bprop_factor] - - return self.stats - - def compute_and_apply_stats(self, loss_sampled, var_list=None): - """ - compute and apply stats - - :param loss_sampled: ([TensorFlow Tensor]) the loss function output - :param var_list: ([TensorFlow Tensor]) The parameters - :return: (function) apply stats - """ - varlist = var_list - if varlist is None: - varlist = tf.trainable_variables() - - stats = self.compute_stats(loss_sampled, var_list=varlist) - return self.apply_stats(stats) - - def compute_stats(self, loss_sampled, var_list=None): - """ - compute the stats values - - :param loss_sampled: ([TensorFlow Tensor]) the loss function output - :param var_list: ([TensorFlow Tensor]) The parameters - :return: ([TensorFlow Tensor]) stats updates - """ - varlist = var_list - if varlist is None: - varlist = tf.trainable_variables() - - gradient_sampled = tf.gradients(loss_sampled, varlist, name='gradientsSampled') - self.gradient_sampled = gradient_sampled - - # remove unused variables - gradient_sampled, varlist = zip(*[(grad, var) for (grad, var) in zip(gradient_sampled, varlist) - if grad is not None]) - - factors = self.get_factors(gradient_sampled, varlist) - stats = self.get_stats(factors, varlist) - - update_ops = [] - stats_updates = {} - stats_updates_cache = {} - for var in varlist: - op_type = factors[var]['opName'] - fops = factors[var]['op'] - fprop_factor = factors[var]['fpropFactors_concat'] - fprop_stats_vars = stats[var]['fprop_concat_stats'] - bprop_factor = factors[var]['bpropFactors_concat'] - bprop_stats_vars = stats[var]['bprop_concat_stats'] - svd_factors = {} - for stats_var in fprop_stats_vars: - stats_var_dim = int(stats_var.get_shape()[0]) - if stats_var not in stats_updates_cache: - batch_size = (tf.shape(fprop_factor)[0]) # batch size - if op_type == 'Conv2D': - strides = fops.get_attr("strides") - padding = fops.get_attr("padding") - convkernel_size = var.get_shape()[0:3] - - kernel_height = int(convkernel_size[0]) - kernel_width = int(convkernel_size[1]) - chan = int(convkernel_size[2]) - flatten_size = int(kernel_height * kernel_width * chan) - - operator_height = int(bprop_factor.get_shape()[1]) - operator_width = int(bprop_factor.get_shape()[2]) - - if operator_height == 1 and operator_width == 1 and self._channel_fac: - # factorization along the channels - # assume independence among input channels - # factor = B x 1 x 1 x (KH xKW x C) - # patches = B x Oh x Ow x (KH xKW x C) - if len(svd_factors) == 0: - if KFAC_DEBUG: - print(('approx %s act factor with rank-1 SVD factors' % var.name)) - # find closest rank-1 approx to the feature map - S, U, V = tf.batch_svd(tf.reshape( - fprop_factor, [-1, kernel_height * kernel_width, chan])) - # get rank-1 approx slides - sqrt_s1 = tf.expand_dims(tf.sqrt(S[:, 0, 0]), 1) - patches_k = U[:, :, 0] * sqrt_s1 # B x KH*KW - full_factor_shape = fprop_factor.get_shape() - patches_k.set_shape( - [full_factor_shape[0], kernel_height * kernel_width]) - patches_c = V[:, :, 0] * sqrt_s1 # B x C - patches_c.set_shape([full_factor_shape[0], chan]) - svd_factors[chan] = patches_c - svd_factors[kernel_height * kernel_width] = patches_k - fprop_factor = svd_factors[stats_var_dim] - - else: - # poor mem usage implementation - patches = tf.extract_image_patches(fprop_factor, ksizes=[1, convkernel_size[ - 0], convkernel_size[1], 1], strides=strides, rates=[1, 1, 1, 1], padding=padding) - - if self._approx_t2: - if KFAC_DEBUG: - print(('approxT2 act fisher for %s' % var.name)) - # T^2 terms * 1/T^2, size: B x C - fprop_factor = tf.reduce_mean(patches, [1, 2]) - else: - # size: (B x Oh x Ow) x C - fprop_factor = tf.reshape( - patches, [-1, flatten_size]) / operator_height / operator_width - fprop_factor_size = int(fprop_factor.get_shape()[-1]) - if stats_var_dim == (fprop_factor_size + 1) and not self._blockdiag_bias: - if op_type == 'Conv2D' and not self._approx_t2: - # correct padding for numerical stability (we - # divided out OhxOw from activations for T1 approx) - fprop_factor = tf.concat([fprop_factor, tf.ones( - [tf.shape(fprop_factor)[0], 1]) / operator_height / operator_width], 1) - else: - # use homogeneous coordinates - fprop_factor = tf.concat( - [fprop_factor, tf.ones([tf.shape(fprop_factor)[0], 1])], 1) - - # average over the number of data points in a batch - # divided by B - cov = tf.matmul(fprop_factor, fprop_factor, - transpose_a=True) / tf.cast(batch_size, tf.float32) - update_ops.append(cov) - stats_updates[stats_var] = cov - if op_type != 'Conv2D': - # HACK: for convolution we recompute fprop stats for - # every layer including forking layers - stats_updates_cache[stats_var] = cov - - for stats_var in bprop_stats_vars: - if stats_var not in stats_updates_cache: - bprop_factor_shape = bprop_factor.get_shape() - batch_size = tf.shape(bprop_factor)[0] # batch size - chan = int(bprop_factor_shape[-1]) # num channels - if op_type == 'Conv2D' or len(bprop_factor_shape) == 4: - if fprop_factor is not None: - if self._approx_t2: - if KFAC_DEBUG: - print(('approxT2 grad fisher for %s' % var.name)) - bprop_factor = tf.reduce_sum( - bprop_factor, [1, 2]) # T^2 terms * 1/T^2 - else: - bprop_factor = tf.reshape( - bprop_factor, [-1, chan]) * operator_height * operator_width # T * 1/T terms - else: - # just doing block diag approx. spatial independent - # structure does not apply here. summing over - # spatial locations - if KFAC_DEBUG: - print(('block diag approx fisher for %s' % var.name)) - bprop_factor = tf.reduce_sum(bprop_factor, [1, 2]) - - # assume sampled loss is averaged. TODO:figure out better - # way to handle this - bprop_factor *= tf.cast(batch_size, tf.float32) - ## - - cov_b = tf.matmul(bprop_factor, bprop_factor, - transpose_a=True) / tf.cast(tf.shape(bprop_factor)[0], tf.float32) - - update_ops.append(cov_b) - stats_updates[stats_var] = cov_b - stats_updates_cache[stats_var] = cov_b - - if KFAC_DEBUG: - a_key = list(stats_updates.keys())[0] - stats_updates[a_key] = tf.Print(stats_updates[a_key], [tf.convert_to_tensor('step:'), self.global_step, - tf.convert_to_tensor('computing stats')]) - self.stats_updates = stats_updates - return stats_updates - - def apply_stats(self, stats_updates): - """ - compute stats and update/apply the new stats to the running average - - :param stats_updates: ([TensorFlow Tensor]) The stats updates - :return: (function) update stats operation - """ - - def _update_accum_stats(): - if self._full_stats_init: - return tf.cond(tf.greater(self.sgd_step, self._cold_iter), lambda: tf.group( - *self._apply_stats(stats_updates, accumulate=True, accumulate_coeff=1. / self._stats_accum_iter)), - tf.no_op) - else: - return tf.group( - *self._apply_stats(stats_updates, accumulate=True, accumulate_coeff=1. / self._stats_accum_iter)) - - def _update_running_avg_stats(stats_updates): - return tf.group(*self._apply_stats(stats_updates)) - - if self._async_stats: - # asynchronous stats update - update_stats = self._apply_stats(stats_updates) - - queue = tf.FIFOQueue(1, [item.dtype for item in update_stats], shapes=[ - item.get_shape() for item in update_stats]) - enqueue_op = queue.enqueue(update_stats) - - def dequeue_stats_op(): - return queue.dequeue() - - self.qr_stats = tf.train.QueueRunner(queue, [enqueue_op]) - update_stats_op = tf.cond(tf.equal(queue.size(), tf.convert_to_tensor( - 0)), tf.no_op, lambda: tf.group(*[dequeue_stats_op(), ])) - else: - # synchronous stats update - update_stats_op = tf.cond(tf.greater_equal(self.stats_step, self._stats_accum_iter), - lambda: _update_running_avg_stats(stats_updates), _update_accum_stats) - self._update_stats_op = update_stats_op - return update_stats_op - - def _apply_stats(self, stats_updates, accumulate=False, accumulate_coeff=0.): - update_ops = [] - # obtain the stats var list - for stats_var in stats_updates: - stats_new = stats_updates[stats_var] - if accumulate: - # simple superbatch averaging - update_op = tf.assign_add( - stats_var, accumulate_coeff * stats_new, use_locking=True) - else: - # exponential running averaging - update_op = tf.assign( - stats_var, stats_var * self._stats_decay, use_locking=True) - update_op = tf.assign_add( - update_op, (1. - self._stats_decay) * stats_new, use_locking=True) - update_ops.append(update_op) - - with tf.control_dependencies(update_ops): - stats_step_op = tf.assign_add(self.stats_step, 1) - - if KFAC_DEBUG: - stats_step_op = (tf.Print(stats_step_op, - [tf.convert_to_tensor('step:'), - self.global_step, - tf.convert_to_tensor('fac step:'), - self.factor_step, - tf.convert_to_tensor('sgd step:'), - self.sgd_step, - tf.convert_to_tensor('Accum:'), - tf.convert_to_tensor(accumulate), - tf.convert_to_tensor('Accum coeff:'), - tf.convert_to_tensor(accumulate_coeff), - tf.convert_to_tensor('stat step:'), - self.stats_step, update_ops[0], update_ops[1]])) - return [stats_step_op, ] - - def get_stats_eigen(self, stats=None): - """ - Return the eigen values from the stats - - :param stats: ([TensorFlow Tensor]) The stats - :return: ([TensorFlow Tensor]) The stats eigen values - """ - if len(self.stats_eigen) == 0: - stats_eigen = {} - if stats is None: - stats = self.stats - - tmp_eigen_cache = {} - with tf.device('/cpu:0'): - for var in stats: - for key in ['fprop_concat_stats', 'bprop_concat_stats']: - for stats_var in stats[var][key]: - if stats_var not in tmp_eigen_cache: - stats_dim = stats_var.get_shape()[1].value - eigen_values = tf.Variable(tf.ones( - [stats_dim]), name='KFAC_FAC/' + stats_var.name.split(':')[0] + '/e', - trainable=False) - eigen_vectors = tf.Variable(tf.diag(tf.ones( - [stats_dim])), name='KFAC_FAC/' + stats_var.name.split(':')[0] + '/Q', - trainable=False) - stats_eigen[stats_var] = {'e': eigen_values, 'Q': eigen_vectors} - tmp_eigen_cache[ - stats_var] = stats_eigen[stats_var] - else: - stats_eigen[stats_var] = tmp_eigen_cache[ - stats_var] - self.stats_eigen = stats_eigen - return self.stats_eigen - - def compute_stats_eigen(self): - """ - compute the eigen decomp using copied var stats to avoid concurrent read/write from other queue - - :return: ([TensorFlow Tensor]) update operations - """ - # TODO: figure out why this op has delays (possibly moving eigenvectors around?) - with tf.device('/cpu:0'): - stats_eigen = self.stats_eigen - computed_eigen = {} - eigen_reverse_lookup = {} - update_ops = [] - # sync copied stats - with tf.control_dependencies([]): - for stats_var in stats_eigen: - if stats_var not in computed_eigen: - eigen_decomposition = tf.self_adjoint_eig(stats_var) - eigen_values = eigen_decomposition[0] - eigen_vectors = eigen_decomposition[1] - if self._use_float64: - eigen_values = tf.cast(eigen_values, tf.float64) - eigen_vectors = tf.cast(eigen_vectors, tf.float64) - update_ops.append(eigen_values) - update_ops.append(eigen_vectors) - computed_eigen[stats_var] = {'e': eigen_values, 'Q': eigen_vectors} - eigen_reverse_lookup[eigen_values] = stats_eigen[stats_var]['e'] - eigen_reverse_lookup[eigen_vectors] = stats_eigen[stats_var]['Q'] - - self.eigen_reverse_lookup = eigen_reverse_lookup - self.eigen_update_list = update_ops - - if KFAC_DEBUG: - self.eigen_update_list = [item for item in update_ops] - with tf.control_dependencies(update_ops): - update_ops.append(tf.Print(tf.constant( - 0.), [tf.convert_to_tensor('computed factor eigen')])) - - return update_ops - - def apply_stats_eigen(self, eigen_list): - """ - apply the update using the eigen values of the stats - - :param eigen_list: ([TensorFlow Tensor]) The list of eigen values of the stats - :return: ([TensorFlow Tensor]) update operations - """ - update_ops = [] - if self.verbose > 1: - print(('updating %d eigenvalue/vectors' % len(eigen_list))) - for _, (tensor, mark) in enumerate(zip(eigen_list, self.eigen_update_list)): - stats_eigen_var = self.eigen_reverse_lookup[mark] - update_ops.append( - tf.assign(stats_eigen_var, tensor, use_locking=True)) - - with tf.control_dependencies(update_ops): - factor_step_op = tf.assign_add(self.factor_step, 1) - update_ops.append(factor_step_op) - if KFAC_DEBUG: - update_ops.append(tf.Print(tf.constant( - 0.), [tf.convert_to_tensor('updated kfac factors')])) - return update_ops - - def get_kfac_precond_updates(self, gradlist, varlist): - """ - return the KFAC updates - - :param gradlist: ([TensorFlow Tensor]) The gradients - :param varlist: ([TensorFlow Tensor]) The parameters - :return: ([TensorFlow Tensor]) the update list - """ - v_g = 0. - - assert len(self.stats) > 0 - assert len(self.stats_eigen) > 0 - assert len(self.factors) > 0 - counter = 0 - - grad_dict = {var: grad for grad, var in zip(gradlist, varlist)} - - for grad, var in zip(gradlist, varlist): - grad_reshape = False - - fprop_factored_fishers = self.stats[var]['fprop_concat_stats'] - bprop_factored_fishers = self.stats[var]['bprop_concat_stats'] - - if (len(fprop_factored_fishers) + len(bprop_factored_fishers)) > 0: - counter += 1 - grad_shape = grad.get_shape() - if len(grad.get_shape()) > 2: - # reshape conv kernel parameters - kernel_width = int(grad.get_shape()[0]) - kernel_height = int(grad.get_shape()[1]) - n_channels = int(grad.get_shape()[2]) - depth = int(grad.get_shape()[3]) - - if len(fprop_factored_fishers) > 1 and self._channel_fac: - # reshape conv kernel parameters into tensor - grad = tf.reshape(grad, [kernel_width * kernel_height, n_channels, depth]) - else: - # reshape conv kernel parameters into 2D grad - grad = tf.reshape(grad, [-1, depth]) - grad_reshape = True - elif len(grad.get_shape()) == 1: - # reshape bias or 1D parameters - - grad = tf.expand_dims(grad, 0) - grad_reshape = True - - if (self.stats[var]['assnBias'] is not None) and not self._blockdiag_bias: - # use homogeneous coordinates only works for 2D grad. - # TODO: figure out how to factorize bias grad - # stack bias grad - var_assn_bias = self.stats[var]['assnBias'] - grad = tf.concat( - [grad, tf.expand_dims(grad_dict[var_assn_bias], 0)], 0) - - # project gradient to eigen space and reshape the eigenvalues - # for broadcasting - eig_vals = [] - - for idx, stats in enumerate(self.stats[var]['fprop_concat_stats']): - eigen_vectors = self.stats_eigen[stats]['Q'] - eigen_values = detect_min_val(self.stats_eigen[stats][ - 'e'], var, name='act', debug=KFAC_DEBUG) - - eigen_vectors, eigen_values = factor_reshape(eigen_vectors, eigen_values, - grad, fac_idx=idx, f_type='act') - eig_vals.append(eigen_values) - grad = gmatmul(eigen_vectors, grad, transpose_a=True, reduce_dim=idx) - - for idx, stats in enumerate(self.stats[var]['bprop_concat_stats']): - eigen_vectors = self.stats_eigen[stats]['Q'] - eigen_values = detect_min_val(self.stats_eigen[stats][ - 'e'], var, name='grad', debug=KFAC_DEBUG) - - eigen_vectors, eigen_values = factor_reshape(eigen_vectors, eigen_values, - grad, fac_idx=idx, f_type='grad') - eig_vals.append(eigen_values) - grad = gmatmul(grad, eigen_vectors, transpose_b=False, reduce_dim=idx) - - # whiten using eigenvalues - weight_decay_coeff = 0. - if var in self._weight_decay_dict: - weight_decay_coeff = self._weight_decay_dict[var] - if KFAC_DEBUG: - print(('weight decay coeff for %s is %f' % (var.name, weight_decay_coeff))) - - if self._factored_damping: - if KFAC_DEBUG: - print(('use factored damping for %s' % var.name)) - coeffs = 1. - num_factors = len(eig_vals) - # compute the ratio of two trace norm of the left and right - # KFac matrices, and their generalization - if len(eig_vals) == 1: - damping = self._epsilon + weight_decay_coeff - else: - damping = tf.pow( - self._epsilon + weight_decay_coeff, 1. / num_factors) - eig_vals_tnorm_avg = [tf.reduce_mean( - tf.abs(e)) for e in eig_vals] - for eigen_val, e_tnorm in zip(eig_vals, eig_vals_tnorm_avg): - eig_tnorm_neg_list = [ - item for item in eig_vals_tnorm_avg if item != e_tnorm] - if len(eig_vals) == 1: - adjustment = 1. - elif len(eig_vals) == 2: - adjustment = tf.sqrt( - e_tnorm / eig_tnorm_neg_list[0]) - else: - eig_tnorm_neg_list_prod = reduce( - lambda x, y: x * y, eig_tnorm_neg_list) - adjustment = tf.pow( - tf.pow(e_tnorm, num_factors - 1.) / eig_tnorm_neg_list_prod, 1. / num_factors) - coeffs *= (eigen_val + adjustment * damping) - else: - coeffs = 1. - damping = (self._epsilon + weight_decay_coeff) - for eigen_val in eig_vals: - coeffs *= eigen_val - coeffs += damping - - grad /= coeffs - - # project gradient back to euclidean space - for idx, stats in enumerate(self.stats[var]['fprop_concat_stats']): - eigen_vectors = self.stats_eigen[stats]['Q'] - grad = gmatmul(eigen_vectors, grad, transpose_a=False, reduce_dim=idx) - - for idx, stats in enumerate(self.stats[var]['bprop_concat_stats']): - eigen_vectors = self.stats_eigen[stats]['Q'] - grad = gmatmul(grad, eigen_vectors, transpose_b=True, reduce_dim=idx) - - if (self.stats[var]['assnBias'] is not None) and not self._blockdiag_bias: - # use homogeneous coordinates only works for 2D grad. - # TODO: figure out how to factorize bias grad - # un-stack bias grad - var_assn_bias = self.stats[var]['assnBias'] - c_plus_one = int(grad.get_shape()[0]) - grad_assn_bias = tf.reshape(tf.slice(grad, - begin=[ - c_plus_one - 1, 0], - size=[1, -1]), var_assn_bias.get_shape()) - grad_assn_weights = tf.slice(grad, - begin=[0, 0], - size=[c_plus_one - 1, -1]) - grad_dict[var_assn_bias] = grad_assn_bias - grad = grad_assn_weights - - if grad_reshape: - grad = tf.reshape(grad, grad_shape) - - grad_dict[var] = grad - - if self.verbose > 1: - print(('projecting %d gradient matrices' % counter)) - - for grad_1, var in zip(gradlist, varlist): - grad = grad_dict[var] - # clipping - if KFAC_DEBUG: - print(('apply clipping to %s' % var.name)) - tf.Print(grad, [tf.sqrt(tf.reduce_sum(tf.pow(grad, 2)))], "Euclidean norm of new grad") - local_vg = tf.reduce_sum(grad * grad_1 * (self._lr * self._lr)) - v_g += local_vg - - # rescale everything - if KFAC_DEBUG: - print('apply vFv clipping') - - scaling = tf.minimum(1., tf.sqrt(self._clip_kl / v_g)) - if KFAC_DEBUG: - scaling = tf.Print(scaling, [tf.convert_to_tensor( - 'clip: '), scaling, tf.convert_to_tensor(' vFv: '), v_g]) - with tf.control_dependencies([tf.assign(self.v_f_v, v_g)]): - updatelist = [grad_dict[var] for var in varlist] - for i, item in enumerate(updatelist): - updatelist[i] = scaling * item - - return updatelist - - @classmethod - def compute_gradients(cls, loss, var_list=None): - """ - compute the gradients from the loss and the parameters - - :param loss: ([TensorFlow Tensor]) The loss - :param var_list: ([TensorFlow Tensor]) The parameters - :return: ([TensorFlow Tensor]) the gradient - """ - varlist = var_list - if varlist is None: - varlist = tf.trainable_variables() - gradients = tf.gradients(loss, varlist) - - return [(a, b) for a, b in zip(gradients, varlist)] - - def apply_gradients_kfac(self, grads): - """ - apply the kfac gradient - - :param grads: ([TensorFlow Tensor]) the gradient - :return: ([function], QueueRunner) Update functions, queue operation runner - """ - grad, varlist = list(zip(*grads)) - - if len(self.stats_eigen) == 0: - self.get_stats_eigen() - - queue_runner = None - # launch eigen-decomp on a queue thread - if self._async_eigen_decomp: - if self.verbose > 1: - print('Using async eigen decomposition') - # get a list of factor loading tensors - factor_ops_dummy = self.compute_stats_eigen() - - # define a queue for the list of factor loading tensors - queue = tf.FIFOQueue(1, [item.dtype for item in factor_ops_dummy], - shapes=[item.get_shape() for item in factor_ops_dummy]) - enqueue_op = tf.cond( - tf.logical_and(tf.equal(tf.mod(self.stats_step, self._kfac_update), tf.convert_to_tensor( - 0)), tf.greater_equal(self.stats_step, self._stats_accum_iter)), - lambda: queue.enqueue(self.compute_stats_eigen()), tf.no_op) - - def dequeue_op(): - return queue.dequeue() - - queue_runner = tf.train.QueueRunner(queue, [enqueue_op]) - - update_ops = [] - global_step_op = tf.assign_add(self.global_step, 1) - update_ops.append(global_step_op) - - with tf.control_dependencies([global_step_op]): - - # compute updates - assert self._update_stats_op is not None - update_ops.append(self._update_stats_op) - dependency_list = [] - if not self._async_eigen_decomp: - dependency_list.append(self._update_stats_op) - - with tf.control_dependencies(dependency_list): - def no_op_wrapper(): - return tf.group(*[tf.assign_add(self.cold_step, 1)]) - - if not self._async_eigen_decomp: - # synchronous eigen-decomp updates - update_factor_ops = tf.cond(tf.logical_and(tf.equal(tf.mod(self.stats_step, self._kfac_update), - tf.convert_to_tensor(0)), - tf.greater_equal(self.stats_step, - self._stats_accum_iter)), - lambda: tf.group(*self.apply_stats_eigen(self.compute_stats_eigen())), - no_op_wrapper) - else: - # asynchronous eigen-decomp updates using queue - update_factor_ops = tf.cond(tf.greater_equal(self.stats_step, self._stats_accum_iter), - lambda: tf.cond(tf.equal(queue.size(), tf.convert_to_tensor(0)), - tf.no_op, - - lambda: tf.group( - *self.apply_stats_eigen(dequeue_op())), - ), - no_op_wrapper) - - update_ops.append(update_factor_ops) - - with tf.control_dependencies([update_factor_ops]): - def grad_op(): - return list(grad) - - def get_kfac_grad_op(): - return self.get_kfac_precond_updates(grad, varlist) - - u = tf.cond(tf.greater(self.factor_step, - tf.convert_to_tensor(0)), get_kfac_grad_op, grad_op) - - optim = tf.train.MomentumOptimizer( - self._lr * (1. - self._momentum), self._momentum) - - # optim = tf.train.AdamOptimizer(self._lr, epsilon=0.01) - - def optim_op(): - def update_optim_op(): - if self._full_stats_init: - return tf.cond(tf.greater(self.factor_step, tf.convert_to_tensor(0)), - lambda: optim.apply_gradients(list(zip(u, varlist))), tf.no_op) - else: - return optim.apply_gradients(list(zip(u, varlist))) - - if self._full_stats_init: - return tf.cond(tf.greater_equal(self.stats_step, self._stats_accum_iter), update_optim_op, - tf.no_op) - else: - return tf.cond(tf.greater_equal(self.sgd_step, self._cold_iter), update_optim_op, tf.no_op) - - update_ops.append(optim_op()) - - return tf.group(*update_ops), queue_runner - - def apply_gradients(self, grads): - """ - apply the gradient - - :param grads: ([TensorFlow Tensor]) the gradient - :return: (function, QueueRunner) train operation, queue operation runner - """ - cold_optim = tf.train.MomentumOptimizer(self._cold_lr, self._momentum) - - def _cold_sgd_start(): - sgd_grads, sgd_var = zip(*grads) - - if self.max_grad_norm is not None: - sgd_grads, _ = tf.clip_by_global_norm(sgd_grads, self.max_grad_norm) - - sgd_grads = list(zip(sgd_grads, sgd_var)) - - sgd_step_op = tf.assign_add(self.sgd_step, 1) - cold_optim_op = cold_optim.apply_gradients(sgd_grads) - if KFAC_DEBUG: - with tf.control_dependencies([sgd_step_op, cold_optim_op]): - sgd_step_op = tf.Print( - sgd_step_op, [self.sgd_step, tf.convert_to_tensor('doing cold sgd step')]) - return tf.group(*[sgd_step_op, cold_optim_op]) - - # remove unused variables - grads = [(grad, var) for (grad, var) in grads if grad is not None] - - kfac_optim_op, queue_runner = self.apply_gradients_kfac(grads) - - def _warm_kfac_start(): - return kfac_optim_op - - return tf.cond(tf.greater(self.sgd_step, self._cold_iter), _warm_kfac_start, _cold_sgd_start), queue_runner - - def minimize(self, loss, loss_sampled, var_list=None): - """ - minimize the gradient loss - - :param loss: ([TensorFlow Tensor]) The loss - :param loss_sampled: ([TensorFlow Tensor]) the loss function output - :param var_list: ([TensorFlow Tensor]) The parameters - :return: (function, q_runner) train operation, queue operation runner - """ - grads = self.compute_gradients(loss, var_list=var_list) - self.compute_and_apply_stats(loss_sampled, var_list=var_list) - return self.apply_gradients(grads) diff --git a/stable_baselines/acktr/kfac_utils.py b/stable_baselines/acktr/kfac_utils.py deleted file mode 100644 index 512e21a2..00000000 --- a/stable_baselines/acktr/kfac_utils.py +++ /dev/null @@ -1,128 +0,0 @@ -import tensorflow as tf - - -def gmatmul(tensor_a, tensor_b, transpose_a=False, transpose_b=False, reduce_dim=None): - """ - Do a matrix multiplication with tensor 'a' and 'b', even when their shape do not match - - :param tensor_a: (TensorFlow Tensor) - :param tensor_b: (TensorFlow Tensor) - :param transpose_a: (bool) If 'a' needs transposing - :param transpose_b: (bool) If 'b' needs transposing - :param reduce_dim: (int) the multiplication over the dim - :return: (TensorFlow Tensor) a * b - """ - assert reduce_dim is not None - - # weird batch matmul - if len(tensor_a.get_shape()) == 2 and len(tensor_b.get_shape()) > 2: - # reshape reduce_dim to the left most dim in b - b_shape = tensor_b.get_shape() - if reduce_dim != 0: - b_dims = list(range(len(b_shape))) - b_dims.remove(reduce_dim) - b_dims.insert(0, reduce_dim) - tensor_b = tf.transpose(tensor_b, b_dims) - b_t_shape = tensor_b.get_shape() - tensor_b = tf.reshape(tensor_b, [int(b_shape[reduce_dim]), -1]) - result = tf.matmul(tensor_a, tensor_b, transpose_a=transpose_a, - transpose_b=transpose_b) - result = tf.reshape(result, b_t_shape) - if reduce_dim != 0: - b_dims = list(range(len(b_shape))) - b_dims.remove(0) - b_dims.insert(reduce_dim, 0) - result = tf.transpose(result, b_dims) - return result - - elif len(tensor_a.get_shape()) > 2 and len(tensor_b.get_shape()) == 2: - # reshape reduce_dim to the right most dim in a - a_shape = tensor_a.get_shape() - outter_dim = len(a_shape) - 1 - reduce_dim = len(a_shape) - reduce_dim - 1 - if reduce_dim != outter_dim: - a_dims = list(range(len(a_shape))) - a_dims.remove(reduce_dim) - a_dims.insert(outter_dim, reduce_dim) - tensor_a = tf.transpose(tensor_a, a_dims) - a_t_shape = tensor_a.get_shape() - tensor_a = tf.reshape(tensor_a, [-1, int(a_shape[reduce_dim])]) - result = tf.matmul(tensor_a, tensor_b, transpose_a=transpose_a, - transpose_b=transpose_b) - result = tf.reshape(result, a_t_shape) - if reduce_dim != outter_dim: - a_dims = list(range(len(a_shape))) - a_dims.remove(outter_dim) - a_dims.insert(reduce_dim, outter_dim) - result = tf.transpose(result, a_dims) - return result - - elif len(tensor_a.get_shape()) == 2 and len(tensor_b.get_shape()) == 2: - return tf.matmul(tensor_a, tensor_b, transpose_a=transpose_a, transpose_b=transpose_b) - - assert False, 'something went wrong' - - -def clipout_neg(vec, threshold=1e-6): - """ - clip to 0 if input lower than threshold value - - :param vec: (TensorFlow Tensor) - :param threshold: (float) the cutoff threshold - :return: (TensorFlow Tensor) clipped input - """ - mask = tf.cast(vec > threshold, tf.float32) - return mask * vec - - -def detect_min_val(input_mat, var, threshold=1e-6, name='', debug=False): - """ - If debug is not set, will run clipout_neg. Else, will clip and print out odd eigen values - - :param input_mat: (TensorFlow Tensor) - :param var: (TensorFlow Tensor) variable - :param threshold: (float) the cutoff threshold - :param name: (str) the name of the variable - :param debug: (bool) debug function - :return: (TensorFlow Tensor) clipped tensor - """ - eigen_min = tf.reduce_min(input_mat) - eigen_max = tf.reduce_max(input_mat) - eigen_ratio = eigen_max / eigen_min - input_mat_clipped = clipout_neg(input_mat, threshold) - - if debug: - input_mat_clipped = tf.cond(tf.logical_or(tf.greater(eigen_ratio, 0.), tf.less(eigen_ratio, -500)), - lambda: input_mat_clipped, lambda: tf.Print( - input_mat_clipped, - [tf.convert_to_tensor('odd ratio ' + name + ' eigen values!!!'), tf.convert_to_tensor(var.name), - eigen_min, eigen_max, eigen_ratio])) - - return input_mat_clipped - - -def factor_reshape(eigen_vectors, eigen_values, grad, fac_idx=0, f_type='act'): - """ - factor and reshape input eigen values - - :param eigen_vectors: ([TensorFlow Tensor]) eigen vectors - :param eigen_values: ([TensorFlow Tensor]) eigen values - :param grad: ([TensorFlow Tensor]) gradient - :param fac_idx: (int) index that should be factored - :param f_type: (str) function type to factor and reshape - :return: ([TensorFlow Tensor], [TensorFlow Tensor]) factored and reshaped eigen vectors - and eigen values - """ - grad_shape = grad.get_shape() - if f_type == 'act': - assert eigen_values.get_shape()[0] == grad_shape[fac_idx] - expanded_shape = [1, ] * len(grad_shape) - expanded_shape[fac_idx] = -1 - eigen_values = tf.reshape(eigen_values, expanded_shape) - if f_type == 'grad': - assert eigen_values.get_shape()[0] == grad_shape[len(grad_shape) - fac_idx - 1] - expanded_shape = [1, ] * len(grad_shape) - expanded_shape[len(grad_shape) - fac_idx - 1] = -1 - eigen_values = tf.reshape(eigen_values, expanded_shape) - - return eigen_vectors, eigen_values diff --git a/stable_baselines/acktr/run_atari.py b/stable_baselines/acktr/run_atari.py deleted file mode 100644 index 694eb811..00000000 --- a/stable_baselines/acktr/run_atari.py +++ /dev/null @@ -1,32 +0,0 @@ -from stable_baselines import logger, ACKTR -from stable_baselines.common.cmd_util import make_atari_env, atari_arg_parser -from stable_baselines.common.vec_env.vec_frame_stack import VecFrameStack -from stable_baselines.common.policies import CnnPolicy - - -def train(env_id, num_timesteps, seed, num_cpu): - """ - train an ACKTR model on atari - - :param env_id: (str) Environment ID - :param num_timesteps: (int) The total number of samples - :param seed: (int) The initial seed for training - :param num_cpu: (int) The number of cpu to train on - """ - env = VecFrameStack(make_atari_env(env_id, num_cpu, seed), 4) - model = ACKTR(CnnPolicy, env, nprocs=num_cpu, seed=seed) - model.learn(total_timesteps=int(num_timesteps * 1.1)) - env.close() - - -def main(): - """ - Runs the test - """ - args = atari_arg_parser().parse_args() - logger.configure() - train(args.env, num_timesteps=args.num_timesteps, seed=args.seed, num_cpu=32) - - -if __name__ == '__main__': - main() diff --git a/stable_baselines/bench/__init__.py b/stable_baselines/bench/__init__.py deleted file mode 100644 index 58a0727d..00000000 --- a/stable_baselines/bench/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from stable_baselines.bench.monitor import Monitor, load_results diff --git a/stable_baselines/bench/monitor.py b/stable_baselines/bench/monitor.py deleted file mode 100644 index e308fcd0..00000000 --- a/stable_baselines/bench/monitor.py +++ /dev/null @@ -1,208 +0,0 @@ -__all__ = ['Monitor', 'get_monitor_files', 'load_results'] - -import csv -import json -import os -import time -from glob import glob -from typing import Tuple, Dict, Any, List, Optional - -import gym -import pandas -import numpy as np - - -class Monitor(gym.Wrapper): - """ - A monitor wrapper for Gym environments, it is used to know the episode reward, length, time and other data. - - :param env: (gym.Env) The environment - :param filename: (Optional[str]) the location to save a log file, can be None for no log - :param allow_early_resets: (bool) allows the reset of the environment before it is done - :param reset_keywords: (tuple) extra keywords for the reset call, if extra parameters are needed at reset - :param info_keywords: (tuple) extra information to log, from the information return of environment.step - """ - EXT = "monitor.csv" - file_handler = None - - def __init__(self, - env: gym.Env, - filename: Optional[str], - allow_early_resets: bool = True, - reset_keywords=(), - info_keywords=()): - super(Monitor, self).__init__(env=env) - self.t_start = time.time() - if filename is None: - self.file_handler = None - self.logger = None - else: - if not filename.endswith(Monitor.EXT): - if os.path.isdir(filename): - filename = os.path.join(filename, Monitor.EXT) - else: - filename = filename + "." + Monitor.EXT - self.file_handler = open(filename, "wt") - self.file_handler.write('#%s\n' % json.dumps({"t_start": self.t_start, 'env_id': env.spec and env.spec.id})) - self.logger = csv.DictWriter(self.file_handler, - fieldnames=('r', 'l', 't') + reset_keywords + info_keywords) - self.logger.writeheader() - self.file_handler.flush() - - self.reset_keywords = reset_keywords - self.info_keywords = info_keywords - self.allow_early_resets = allow_early_resets - self.rewards = None - self.needs_reset = True - self.episode_rewards = [] - self.episode_lengths = [] - self.episode_times = [] - self.total_steps = 0 - self.current_reset_info = {} # extra info about the current episode, that was passed in during reset() - - def reset(self, **kwargs) -> np.ndarray: - """ - Calls the Gym environment reset. Can only be called if the environment is over, or if allow_early_resets is True - - :param kwargs: Extra keywords saved for the next episode. only if defined by reset_keywords - :return: (np.ndarray) the first observation of the environment - """ - if not self.allow_early_resets and not self.needs_reset: - raise RuntimeError("Tried to reset an environment before done. If you want to allow early resets, " - "wrap your env with Monitor(env, path, allow_early_resets=True)") - self.rewards = [] - self.needs_reset = False - for key in self.reset_keywords: - value = kwargs.get(key) - if value is None: - raise ValueError('Expected you to pass kwarg {} into reset'.format(key)) - self.current_reset_info[key] = value - return self.env.reset(**kwargs) - - def step(self, action: np.ndarray) -> Tuple[np.ndarray, float, bool, Dict[Any, Any]]: - """ - Step the environment with the given action - - :param action: (np.ndarray) the action - :return: (Tuple[np.ndarray, float, bool, Dict[Any, Any]]) observation, reward, done, information - """ - if self.needs_reset: - raise RuntimeError("Tried to step environment that needs reset") - observation, reward, done, info = self.env.step(action) - self.rewards.append(reward) - if done: - self.needs_reset = True - ep_rew = sum(self.rewards) - eplen = len(self.rewards) - ep_info = {"r": round(ep_rew, 6), "l": eplen, "t": round(time.time() - self.t_start, 6)} - for key in self.info_keywords: - ep_info[key] = info[key] - self.episode_rewards.append(ep_rew) - self.episode_lengths.append(eplen) - self.episode_times.append(time.time() - self.t_start) - ep_info.update(self.current_reset_info) - if self.logger: - self.logger.writerow(ep_info) - self.file_handler.flush() - info['episode'] = ep_info - self.total_steps += 1 - return observation, reward, done, info - - def close(self): - """ - Closes the environment - """ - super(Monitor, self).close() - if self.file_handler is not None: - self.file_handler.close() - - def get_total_steps(self) -> int: - """ - Returns the total number of timesteps - - :return: (int) - """ - return self.total_steps - - def get_episode_rewards(self) -> List[float]: - """ - Returns the rewards of all the episodes - - :return: ([float]) - """ - return self.episode_rewards - - def get_episode_lengths(self) -> List[int]: - """ - Returns the number of timesteps of all the episodes - - :return: ([int]) - """ - return self.episode_lengths - - def get_episode_times(self) -> List[float]: - """ - Returns the runtime in seconds of all the episodes - - :return: ([float]) - """ - return self.episode_times - - -class LoadMonitorResultsError(Exception): - """ - Raised when loading the monitor log fails. - """ - pass - - -def get_monitor_files(path: str) -> List[str]: - """ - get all the monitor files in the given path - - :param path: (str) the logging folder - :return: ([str]) the log files - """ - return glob(os.path.join(path, "*" + Monitor.EXT)) - - -def load_results(path: str) -> pandas.DataFrame: - """ - Load all Monitor logs from a given directory path matching ``*monitor.csv`` and ``*monitor.json`` - - :param path: (str) the directory path containing the log file(s) - :return: (pandas.DataFrame) the logged data - """ - # get both csv and (old) json files - monitor_files = (glob(os.path.join(path, "*monitor.json")) + get_monitor_files(path)) - if not monitor_files: - raise LoadMonitorResultsError("no monitor files of the form *%s found in %s" % (Monitor.EXT, path)) - data_frames = [] - headers = [] - for file_name in monitor_files: - with open(file_name, 'rt') as file_handler: - if file_name.endswith('csv'): - first_line = file_handler.readline() - assert first_line[0] == '#' - header = json.loads(first_line[1:]) - data_frame = pandas.read_csv(file_handler, index_col=None) - headers.append(header) - elif file_name.endswith('json'): # Deprecated json format - episodes = [] - lines = file_handler.readlines() - header = json.loads(lines[0]) - headers.append(header) - for line in lines[1:]: - episode = json.loads(line) - episodes.append(episode) - data_frame = pandas.DataFrame(episodes) - else: - assert 0, 'unreachable' - data_frame['t'] += header['t_start'] - data_frames.append(data_frame) - data_frame = pandas.concat(data_frames) - data_frame.sort_values('t', inplace=True) - data_frame.reset_index(inplace=True) - data_frame['t'] -= min(header['t_start'] for header in headers) - # data_frame.headers = headers # HACK to preserve backwards compatibility - return data_frame diff --git a/stable_baselines/common/__init__.py b/stable_baselines/common/__init__.py deleted file mode 100644 index 7087980e..00000000 --- a/stable_baselines/common/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -# flake8: noqa F403 -from stable_baselines.common.console_util import fmt_row, fmt_item, colorize -from stable_baselines.common.dataset import Dataset -from stable_baselines.common.math_util import discount, discount_with_boundaries, explained_variance, \ - explained_variance_2d, flatten_arrays, unflatten_vector -from stable_baselines.common.misc_util import zipsame, set_global_seeds, boolean_flag -from stable_baselines.common.base_class import BaseRLModel, ActorCriticRLModel, OffPolicyRLModel, SetVerbosity, \ - TensorboardWriter -from stable_baselines.common.cmd_util import make_vec_env diff --git a/stable_baselines/common/atari_wrappers.py b/stable_baselines/common/atari_wrappers.py deleted file mode 100644 index 2a0488f3..00000000 --- a/stable_baselines/common/atari_wrappers.py +++ /dev/null @@ -1,313 +0,0 @@ -from collections import deque - -import numpy as np -import gym -from gym import spaces -import cv2 # pytype:disable=import-error -cv2.ocl.setUseOpenCL(False) - - -class NoopResetEnv(gym.Wrapper): - def __init__(self, env, noop_max=30): - """ - Sample initial states by taking random number of no-ops on reset. - No-op is assumed to be action 0. - - :param env: (Gym Environment) the environment to wrap - :param noop_max: (int) the maximum value of no-ops to run - """ - gym.Wrapper.__init__(self, env) - self.noop_max = noop_max - self.override_num_noops = None - self.noop_action = 0 - assert env.unwrapped.get_action_meanings()[0] == 'NOOP' - - def reset(self, **kwargs): - self.env.reset(**kwargs) - if self.override_num_noops is not None: - noops = self.override_num_noops - else: - noops = self.unwrapped.np_random.randint(1, self.noop_max + 1) - assert noops > 0 - obs = None - for _ in range(noops): - obs, _, done, _ = self.env.step(self.noop_action) - if done: - obs = self.env.reset(**kwargs) - return obs - - def step(self, action): - return self.env.step(action) - - -class FireResetEnv(gym.Wrapper): - def __init__(self, env): - """ - Take action on reset for environments that are fixed until firing. - - :param env: (Gym Environment) the environment to wrap - """ - gym.Wrapper.__init__(self, env) - assert env.unwrapped.get_action_meanings()[1] == 'FIRE' - assert len(env.unwrapped.get_action_meanings()) >= 3 - - def reset(self, **kwargs): - self.env.reset(**kwargs) - obs, _, done, _ = self.env.step(1) - if done: - self.env.reset(**kwargs) - obs, _, done, _ = self.env.step(2) - if done: - self.env.reset(**kwargs) - return obs - - def step(self, action): - return self.env.step(action) - - -class EpisodicLifeEnv(gym.Wrapper): - def __init__(self, env): - """ - Make end-of-life == end-of-episode, but only reset on true game over. - Done by DeepMind for the DQN and co. since it helps value estimation. - - :param env: (Gym Environment) the environment to wrap - """ - gym.Wrapper.__init__(self, env) - self.lives = 0 - self.was_real_done = True - - def step(self, action): - obs, reward, done, info = self.env.step(action) - self.was_real_done = done - # check current lives, make loss of life terminal, - # then update lives to handle bonus lives - lives = self.env.unwrapped.ale.lives() - if 0 < lives < self.lives: - # for Qbert sometimes we stay in lives == 0 condtion for a few frames - # so its important to keep lives > 0, so that we only reset once - # the environment advertises done. - done = True - self.lives = lives - return obs, reward, done, info - - def reset(self, **kwargs): - """ - Calls the Gym environment reset, only when lives are exhausted. - This way all states are still reachable even though lives are episodic, - and the learner need not know about any of this behind-the-scenes. - - :param kwargs: Extra keywords passed to env.reset() call - :return: ([int] or [float]) the first observation of the environment - """ - if self.was_real_done: - obs = self.env.reset(**kwargs) - else: - # no-op step to advance from terminal/lost life state - obs, _, _, _ = self.env.step(0) - self.lives = self.env.unwrapped.ale.lives() - return obs - - -class MaxAndSkipEnv(gym.Wrapper): - def __init__(self, env, skip=4): - """ - Return only every `skip`-th frame (frameskipping) - - :param env: (Gym Environment) the environment - :param skip: (int) number of `skip`-th frame - """ - gym.Wrapper.__init__(self, env) - # most recent raw observations (for max pooling across time steps) - self._obs_buffer = np.zeros((2,) + env.observation_space.shape, dtype=env.observation_space.dtype) - self._skip = skip - - def step(self, action): - """ - Step the environment with the given action - Repeat action, sum reward, and max over last observations. - - :param action: ([int] or [float]) the action - :return: ([int] or [float], [float], [bool], dict) observation, reward, done, information - """ - total_reward = 0.0 - done = None - for i in range(self._skip): - obs, reward, done, info = self.env.step(action) - if i == self._skip - 2: - self._obs_buffer[0] = obs - if i == self._skip - 1: - self._obs_buffer[1] = obs - total_reward += reward - if done: - break - # Note that the observation on the done=True frame - # doesn't matter - max_frame = self._obs_buffer.max(axis=0) - - return max_frame, total_reward, done, info - - def reset(self, **kwargs): - return self.env.reset(**kwargs) - - -class ClipRewardEnv(gym.RewardWrapper): - def __init__(self, env): - """ - clips the reward to {+1, 0, -1} by its sign. - - :param env: (Gym Environment) the environment - """ - gym.RewardWrapper.__init__(self, env) - - def reward(self, reward): - """ - Bin reward to {+1, 0, -1} by its sign. - - :param reward: (float) - """ - return np.sign(reward) - - -class WarpFrame(gym.ObservationWrapper): - def __init__(self, env): - """ - Warp frames to 84x84 as done in the Nature paper and later work. - - :param env: (Gym Environment) the environment - """ - gym.ObservationWrapper.__init__(self, env) - self.width = 84 - self.height = 84 - self.observation_space = spaces.Box(low=0, high=255, shape=(self.height, self.width, 1), - dtype=env.observation_space.dtype) - - def observation(self, frame): - """ - returns the current observation from a frame - - :param frame: ([int] or [float]) environment frame - :return: ([int] or [float]) the observation - """ - frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) - frame = cv2.resize(frame, (self.width, self.height), interpolation=cv2.INTER_AREA) - return frame[:, :, None] - - -class FrameStack(gym.Wrapper): - def __init__(self, env, n_frames): - """Stack n_frames last frames. - - Returns lazy array, which is much more memory efficient. - - See Also - -------- - stable_baselines.common.atari_wrappers.LazyFrames - - :param env: (Gym Environment) the environment - :param n_frames: (int) the number of frames to stack - """ - gym.Wrapper.__init__(self, env) - self.n_frames = n_frames - self.frames = deque([], maxlen=n_frames) - shp = env.observation_space.shape - self.observation_space = spaces.Box(low=0, high=255, shape=(shp[0], shp[1], shp[2] * n_frames), - dtype=env.observation_space.dtype) - - def reset(self, **kwargs): - obs = self.env.reset(**kwargs) - for _ in range(self.n_frames): - self.frames.append(obs) - return self._get_ob() - - def step(self, action): - obs, reward, done, info = self.env.step(action) - self.frames.append(obs) - return self._get_ob(), reward, done, info - - def _get_ob(self): - assert len(self.frames) == self.n_frames - return LazyFrames(list(self.frames)) - - -class ScaledFloatFrame(gym.ObservationWrapper): - def __init__(self, env): - gym.ObservationWrapper.__init__(self, env) - self.observation_space = spaces.Box(low=0, high=1.0, shape=env.observation_space.shape, dtype=np.float32) - - def observation(self, observation): - # careful! This undoes the memory optimization, use - # with smaller replay buffers only. - return np.array(observation).astype(np.float32) / 255.0 - - -class LazyFrames(object): - def __init__(self, frames): - """ - This object ensures that common frames between the observations are only stored once. - It exists purely to optimize memory usage which can be huge for DQN's 1M frames replay - buffers. - - This object should only be converted to np.ndarray before being passed to the model. - - :param frames: ([int] or [float]) environment frames - """ - self._frames = frames - self._out = None - - def _force(self): - if self._out is None: - self._out = np.concatenate(self._frames, axis=2) - self._frames = None - return self._out - - def __array__(self, dtype=None): - out = self._force() - if dtype is not None: - out = out.astype(dtype) - return out - - def __len__(self): - return len(self._force()) - - def __getitem__(self, i): - return self._force()[i] - - -def make_atari(env_id): - """ - Create a wrapped atari Environment - - :param env_id: (str) the environment ID - :return: (Gym Environment) the wrapped atari environment - """ - env = gym.make(env_id) - assert 'NoFrameskip' in env.spec.id - env = NoopResetEnv(env, noop_max=30) - env = MaxAndSkipEnv(env, skip=4) - return env - - -def wrap_deepmind(env, episode_life=True, clip_rewards=True, frame_stack=False, scale=False): - """ - Configure environment for DeepMind-style Atari. - - :param env: (Gym Environment) the atari environment - :param episode_life: (bool) wrap the episode life wrapper - :param clip_rewards: (bool) wrap the reward clipping wrapper - :param frame_stack: (bool) wrap the frame stacking wrapper - :param scale: (bool) wrap the scaling observation wrapper - :return: (Gym Environment) the wrapped atari environment - """ - if episode_life: - env = EpisodicLifeEnv(env) - if 'FIRE' in env.unwrapped.get_action_meanings(): - env = FireResetEnv(env) - env = WarpFrame(env) - if scale: - env = ScaledFloatFrame(env) - if clip_rewards: - env = ClipRewardEnv(env) - if frame_stack: - env = FrameStack(env, 4) - return env diff --git a/stable_baselines/common/base_class.py b/stable_baselines/common/base_class.py deleted file mode 100644 index 50431288..00000000 --- a/stable_baselines/common/base_class.py +++ /dev/null @@ -1,1190 +0,0 @@ -import os -import glob -import json -import zipfile -import warnings -from abc import ABC, abstractmethod -from collections import OrderedDict, deque -from typing import Union, List, Callable, Optional - -import gym -import cloudpickle -import numpy as np -import tensorflow as tf - -from stable_baselines.common.misc_util import set_global_seeds -from stable_baselines.common.save_util import data_to_json, json_to_data, params_to_bytes, bytes_to_params -from stable_baselines.common.policies import get_policy_from_name, ActorCriticPolicy -from stable_baselines.common.runners import AbstractEnvRunner -from stable_baselines.common.vec_env import (VecEnvWrapper, VecEnv, DummyVecEnv, - VecNormalize, unwrap_vec_normalize) -from stable_baselines.common.callbacks import BaseCallback, CallbackList, ConvertCallback -from stable_baselines import logger - - -class BaseRLModel(ABC): - """ - The base RL model - - :param policy: (BasePolicy) Policy object - :param env: (Gym environment) The environment to learn from - (if registered in Gym, can be str. Can be None for loading trained models) - :param verbose: (int) the verbosity level: 0 none, 1 training information, 2 tensorflow debug - :param requires_vec_env: (bool) Does this model require a vectorized environment - :param policy_base: (BasePolicy) the base policy used by this method - :param policy_kwargs: (dict) additional arguments to be passed to the policy on creation - :param seed: (int) Seed for the pseudo-random generators (python, numpy, tensorflow). - If None (default), use random seed. Note that if you want completely deterministic - results, you must set `n_cpu_tf_sess` to 1. - :param n_cpu_tf_sess: (int) The number of threads for TensorFlow operations - If None, the number of cpu of the current machine will be used. - """ - - def __init__(self, policy, env, verbose=0, *, requires_vec_env, policy_base, - policy_kwargs=None, seed=None, n_cpu_tf_sess=None): - if isinstance(policy, str) and policy_base is not None: - self.policy = get_policy_from_name(policy_base, policy) - else: - self.policy = policy - self.env = env - self.verbose = verbose - self._requires_vec_env = requires_vec_env - self.policy_kwargs = {} if policy_kwargs is None else policy_kwargs - self.observation_space = None - self.action_space = None - self.n_envs = None - self._vectorize_action = False - self.num_timesteps = 0 - self.graph = None - self.sess = None - self.params = None - self.seed = seed - self._param_load_ops = None - self.n_cpu_tf_sess = n_cpu_tf_sess - self.episode_reward = None - self.ep_info_buf = None - - if env is not None: - if isinstance(env, str): - if self.verbose >= 1: - print("Creating environment from the given name, wrapped in a DummyVecEnv.") - self.env = env = DummyVecEnv([lambda: gym.make(env)]) - - self.observation_space = env.observation_space - self.action_space = env.action_space - if requires_vec_env: - if isinstance(env, VecEnv): - self.n_envs = env.num_envs - else: - # The model requires a VecEnv - # wrap it in a DummyVecEnv to avoid error - self.env = DummyVecEnv([lambda: env]) - if self.verbose >= 1: - print("Wrapping the env in a DummyVecEnv.") - self.n_envs = 1 - else: - if isinstance(env, VecEnv): - if env.num_envs == 1: - self.env = _UnvecWrapper(env) - self._vectorize_action = True - else: - raise ValueError("Error: the model requires a non vectorized environment or a single vectorized" - " environment.") - self.n_envs = 1 - - # Get VecNormalize object if it exists - self._vec_normalize_env = unwrap_vec_normalize(self.env) - - def get_env(self): - """ - returns the current environment (can be None if not defined) - - :return: (Gym Environment) The current environment - """ - return self.env - - def get_vec_normalize_env(self) -> Optional[VecNormalize]: - """ - Return the ``VecNormalize`` wrapper of the training env - if it exists. - - :return: Optional[VecNormalize] The ``VecNormalize`` env. - """ - return self._vec_normalize_env - - def set_env(self, env): - """ - Checks the validity of the environment, and if it is coherent, set it as the current environment. - - :param env: (Gym Environment) The environment for learning a policy - """ - if env is None and self.env is None: - if self.verbose >= 1: - print("Loading a model without an environment, " - "this model cannot be trained until it has a valid environment.") - return - elif env is None: - raise ValueError("Error: trying to replace the current environment with None") - - # sanity checking the environment - assert self.observation_space == env.observation_space, \ - "Error: the environment passed must have at least the same observation space as the model was trained on." - assert self.action_space == env.action_space, \ - "Error: the environment passed must have at least the same action space as the model was trained on." - if self._requires_vec_env: - assert isinstance(env, VecEnv), \ - "Error: the environment passed is not a vectorized environment, however {} requires it".format( - self.__class__.__name__) - assert not self.policy.recurrent or self.n_envs == env.num_envs, \ - "Error: the environment passed must have the same number of environments as the model was trained on." \ - "This is due to the Lstm policy not being capable of changing the number of environments." - self.n_envs = env.num_envs - else: - # for models that dont want vectorized environment, check if they make sense and adapt them. - # Otherwise tell the user about this issue - if isinstance(env, VecEnv): - if env.num_envs == 1: - env = _UnvecWrapper(env) - self._vectorize_action = True - else: - raise ValueError("Error: the model requires a non vectorized environment or a single vectorized " - "environment.") - else: - self._vectorize_action = False - - self.n_envs = 1 - - self.env = env - self._vec_normalize_env = unwrap_vec_normalize(env) - - # Invalidated by environment change. - self.episode_reward = None - self.ep_info_buf = None - - def _init_num_timesteps(self, reset_num_timesteps=True): - """ - Initialize and resets num_timesteps (total timesteps since beginning of training) - if needed. Mainly used logging and plotting (tensorboard). - - :param reset_num_timesteps: (bool) Set it to false when continuing training - to not create new plotting curves in tensorboard. - :return: (bool) Whether a new tensorboard log needs to be created - """ - if reset_num_timesteps: - self.num_timesteps = 0 - - new_tb_log = self.num_timesteps == 0 - return new_tb_log - - @abstractmethod - def setup_model(self): - """ - Create all the functions and tensorflow graphs necessary to train the model - """ - pass - - def _init_callback(self, - callback: Union[None, Callable, List[BaseCallback], BaseCallback] - ) -> BaseCallback: - """ - :param callback: (Union[None, Callable, List[BaseCallback], BaseCallback]) - :return: (BaseCallback) - """ - # Convert a list of callbacks into a callback - if isinstance(callback, list): - callback = CallbackList(callback) - # Convert functional callback to object - if not isinstance(callback, BaseCallback): - callback = ConvertCallback(callback) - - callback.init_callback(self) - return callback - - def set_random_seed(self, seed: Optional[int]) -> None: - """ - :param seed: (Optional[int]) Seed for the pseudo-random generators. If None, - do not change the seeds. - """ - # Ignore if the seed is None - if seed is None: - return - # Seed python, numpy and tf random generator - set_global_seeds(seed) - if self.env is not None: - self.env.seed(seed) - # Seed the action space - # useful when selecting random actions - self.env.action_space.seed(seed) - self.action_space.seed(seed) - - def _setup_learn(self): - """ - Check the environment. - """ - if self.env is None: - raise ValueError("Error: cannot train the model without a valid environment, please set an environment with" - "set_env(self, env) method.") - if self.episode_reward is None: - self.episode_reward = np.zeros((self.n_envs,)) - if self.ep_info_buf is None: - self.ep_info_buf = deque(maxlen=100) - - @abstractmethod - def get_parameter_list(self): - """ - Get tensorflow Variables of model's parameters - - This includes all variables necessary for continuing training (saving / loading). - - :return: (list) List of tensorflow Variables - """ - pass - - def get_parameters(self): - """ - Get current model parameters as dictionary of variable name -> ndarray. - - :return: (OrderedDict) Dictionary of variable name -> ndarray of model's parameters. - """ - parameters = self.get_parameter_list() - parameter_values = self.sess.run(parameters) - return_dictionary = OrderedDict((param.name, value) for param, value in zip(parameters, parameter_values)) - return return_dictionary - - def _setup_load_operations(self): - """ - Create tensorflow operations for loading model parameters - """ - # Assume tensorflow graphs are static -> check - # that we only call this function once - if self._param_load_ops is not None: - raise RuntimeError("Parameter load operations have already been created") - # For each loadable parameter, create appropiate - # placeholder and an assign op, and store them to - # self.load_param_ops as dict of variable.name -> (placeholder, assign) - loadable_parameters = self.get_parameter_list() - # Use OrderedDict to store order for backwards compatibility with - # list-based params - self._param_load_ops = OrderedDict() - with self.graph.as_default(): - for param in loadable_parameters: - placeholder = tf.placeholder(dtype=param.dtype, shape=param.shape) - # param.name is unique (tensorflow variables have unique names) - self._param_load_ops[param.name] = (placeholder, param.assign(placeholder)) - - @abstractmethod - def _get_pretrain_placeholders(self): - """ - Return the placeholders needed for the pretraining: - - obs_ph: observation placeholder - - actions_ph will be population with an action from the environment - (from the expert dataset) - - deterministic_actions_ph: e.g., in the case of a Gaussian policy, - the mean. - - :return: ((tf.placeholder)) (obs_ph, actions_ph, deterministic_actions_ph) - """ - pass - - def pretrain(self, dataset, n_epochs=10, learning_rate=1e-4, - adam_epsilon=1e-8, val_interval=None): - """ - Pretrain a model using behavior cloning: - supervised learning given an expert dataset. - - NOTE: only Box and Discrete spaces are supported for now. - - :param dataset: (ExpertDataset) Dataset manager - :param n_epochs: (int) Number of iterations on the training set - :param learning_rate: (float) Learning rate - :param adam_epsilon: (float) the epsilon value for the adam optimizer - :param val_interval: (int) Report training and validation losses every n epochs. - By default, every 10th of the maximum number of epochs. - :return: (BaseRLModel) the pretrained model - """ - continuous_actions = isinstance(self.action_space, gym.spaces.Box) - discrete_actions = isinstance(self.action_space, gym.spaces.Discrete) - - assert discrete_actions or continuous_actions, 'Only Discrete and Box action spaces are supported' - - # Validate the model every 10% of the total number of iteration - if val_interval is None: - # Prevent modulo by zero - if n_epochs < 10: - val_interval = 1 - else: - val_interval = int(n_epochs / 10) - - with self.graph.as_default(): - with tf.variable_scope('pretrain', reuse=tf.AUTO_REUSE): - if continuous_actions: - obs_ph, actions_ph, deterministic_actions_ph = self._get_pretrain_placeholders() - loss = tf.reduce_mean(tf.square(actions_ph - deterministic_actions_ph)) - else: - obs_ph, actions_ph, actions_logits_ph = self._get_pretrain_placeholders() - # actions_ph has a shape if (n_batch,), we reshape it to (n_batch, 1) - # so no additional changes is needed in the dataloader - actions_ph = tf.expand_dims(actions_ph, axis=1) - one_hot_actions = tf.one_hot(actions_ph, self.action_space.n) - loss = tf.nn.softmax_cross_entropy_with_logits_v2( - logits=actions_logits_ph, - labels=tf.stop_gradient(one_hot_actions) - ) - loss = tf.reduce_mean(loss) - optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate, epsilon=adam_epsilon) - optim_op = optimizer.minimize(loss, var_list=self.params) - - self.sess.run(tf.global_variables_initializer()) - - if self.verbose > 0: - print("Pretraining with Behavior Cloning...") - - for epoch_idx in range(int(n_epochs)): - train_loss = 0.0 - # Full pass on the training set - for _ in range(len(dataset.train_loader)): - expert_obs, expert_actions = dataset.get_next_batch('train') - feed_dict = { - obs_ph: expert_obs, - actions_ph: expert_actions, - } - train_loss_, _ = self.sess.run([loss, optim_op], feed_dict) - train_loss += train_loss_ - - train_loss /= len(dataset.train_loader) - - if self.verbose > 0 and (epoch_idx + 1) % val_interval == 0: - val_loss = 0.0 - # Full pass on the validation set - for _ in range(len(dataset.val_loader)): - expert_obs, expert_actions = dataset.get_next_batch('val') - val_loss_, = self.sess.run([loss], {obs_ph: expert_obs, - actions_ph: expert_actions}) - val_loss += val_loss_ - - val_loss /= len(dataset.val_loader) - if self.verbose > 0: - print("==== Training progress {:.2f}% ====".format(100 * (epoch_idx + 1) / n_epochs)) - print('Epoch {}'.format(epoch_idx + 1)) - print("Training loss: {:.6f}, Validation loss: {:.6f}".format(train_loss, val_loss)) - print() - # Free memory - del expert_obs, expert_actions - if self.verbose > 0: - print("Pretraining done.") - return self - - @abstractmethod - def learn(self, total_timesteps, callback=None, log_interval=100, tb_log_name="run", - reset_num_timesteps=True): - """ - Return a trained model. - - :param total_timesteps: (int) The total number of samples to train on - :param callback: (Union[callable, [callable], BaseCallback]) - function called at every steps with state of the algorithm. - It takes the local and global variables. If it returns False, training is aborted. - When the callback inherits from BaseCallback, you will have access - to additional stages of the training (training start/end), - please read the documentation for more details. - :param log_interval: (int) The number of timesteps before logging. - :param tb_log_name: (str) the name of the run for tensorboard log - :param reset_num_timesteps: (bool) whether or not to reset the current timestep number (used in logging) - :return: (BaseRLModel) the trained model - """ - pass - - @abstractmethod - def predict(self, observation, state=None, mask=None, deterministic=False): - """ - Get the model's action from an observation - - :param observation: (np.ndarray) the input observation - :param state: (np.ndarray) The last states (can be None, used in recurrent policies) - :param mask: (np.ndarray) The last masks (can be None, used in recurrent policies) - :param deterministic: (bool) Whether or not to return deterministic actions. - :return: (np.ndarray, np.ndarray) the model's action and the next state (used in recurrent policies) - """ - pass - - @abstractmethod - def action_probability(self, observation, state=None, mask=None, actions=None, logp=False): - """ - If ``actions`` is ``None``, then get the model's action probability distribution from a given observation. - - Depending on the action space the output is: - - Discrete: probability for each possible action - - Box: mean and standard deviation of the action output - - However if ``actions`` is not ``None``, this function will return the probability that the given actions are - taken with the given parameters (observation, state, ...) on this model. For discrete action spaces, it - returns the probability mass; for continuous action spaces, the probability density. This is since the - probability mass will always be zero in continuous spaces, see http://blog.christianperone.com/2019/01/ - for a good explanation - - :param observation: (np.ndarray) the input observation - :param state: (np.ndarray) The last states (can be None, used in recurrent policies) - :param mask: (np.ndarray) The last masks (can be None, used in recurrent policies) - :param actions: (np.ndarray) (OPTIONAL) For calculating the likelihood that the given actions are chosen by - the model for each of the given parameters. Must have the same number of actions and observations. - (set to None to return the complete action probability distribution) - :param logp: (bool) (OPTIONAL) When specified with actions, returns probability in log-space. - This has no effect if actions is None. - :return: (np.ndarray) the model's (log) action probability - """ - pass - - def load_parameters(self, load_path_or_dict, exact_match=True): - """ - Load model parameters from a file or a dictionary - - Dictionary keys should be tensorflow variable names, which can be obtained - with ``get_parameters`` function. If ``exact_match`` is True, dictionary - should contain keys for all model's parameters, otherwise RunTimeError - is raised. If False, only variables included in the dictionary will be updated. - - This does not load agent's hyper-parameters. - - .. warning:: - This function does not update trainer/optimizer variables (e.g. momentum). - As such training after using this function may lead to less-than-optimal results. - - :param load_path_or_dict: (str or file-like or dict) Save parameter location - or dict of parameters as variable.name -> ndarrays to be loaded. - :param exact_match: (bool) If True, expects load dictionary to contain keys for - all variables in the model. If False, loads parameters only for variables - mentioned in the dictionary. Defaults to True. - """ - # Make sure we have assign ops - if self._param_load_ops is None: - self._setup_load_operations() - - if isinstance(load_path_or_dict, dict): - # Assume `load_path_or_dict` is dict of variable.name -> ndarrays we want to load - params = load_path_or_dict - elif isinstance(load_path_or_dict, list): - warnings.warn("Loading model parameters from a list. This has been replaced " + - "with parameter dictionaries with variable names and parameters. " + - "If you are loading from a file, consider re-saving the file.", - DeprecationWarning) - # Assume `load_path_or_dict` is list of ndarrays. - # Create param dictionary assuming the parameters are in same order - # as `get_parameter_list` returns them. - params = dict() - for i, param_name in enumerate(self._param_load_ops.keys()): - params[param_name] = load_path_or_dict[i] - else: - # Assume a filepath or file-like. - # Use existing deserializer to load the parameters. - # We only need the parameters part of the file, so - # only load that part. - _, params = BaseRLModel._load_from_file(load_path_or_dict, load_data=False) - params = dict(params) - - feed_dict = {} - param_update_ops = [] - # Keep track of not-updated variables - not_updated_variables = set(self._param_load_ops.keys()) - for param_name, param_value in params.items(): - placeholder, assign_op = self._param_load_ops[param_name] - feed_dict[placeholder] = param_value - # Create list of tf.assign operations for sess.run - param_update_ops.append(assign_op) - # Keep track which variables are updated - not_updated_variables.remove(param_name) - - # Check that we updated all parameters if exact_match=True - if exact_match and len(not_updated_variables) > 0: - raise RuntimeError("Load dictionary did not contain all variables. " + - "Missing variables: {}".format(", ".join(not_updated_variables))) - - self.sess.run(param_update_ops, feed_dict=feed_dict) - - @abstractmethod - def save(self, save_path, cloudpickle=False): - """ - Save the current parameters to file - - :param save_path: (str or file-like) The save location - :param cloudpickle: (bool) Use older cloudpickle format instead of zip-archives. - """ - raise NotImplementedError() - - @classmethod - @abstractmethod - def load(cls, load_path, env=None, custom_objects=None, **kwargs): - """ - Load the model from file - - :param load_path: (str or file-like) the saved parameter location - :param env: (Gym Environment) the new environment to run the loaded model on - (can be None if you only need prediction from a trained model) - :param custom_objects: (dict) Dictionary of objects to replace - upon loading. If a variable is present in this dictionary as a - key, it will not be deserialized and the corresponding item - will be used instead. Similar to custom_objects in - `keras.models.load_model`. Useful when you have an object in - file that can not be deserialized. - :param kwargs: extra arguments to change the model when loading - """ - raise NotImplementedError() - - @staticmethod - def _save_to_file_cloudpickle(save_path, data=None, params=None): - """Legacy code for saving models with cloudpickle - - :param save_path: (str or file-like) Where to store the model - :param data: (OrderedDict) Class parameters being stored - :param params: (OrderedDict) Model parameters being stored - """ - if isinstance(save_path, str): - _, ext = os.path.splitext(save_path) - if ext == "": - save_path += ".pkl" - - with open(save_path, "wb") as file_: - cloudpickle.dump((data, params), file_) - else: - # Here save_path is a file-like object, not a path - cloudpickle.dump((data, params), save_path) - - @staticmethod - def _save_to_file_zip(save_path, data=None, params=None): - """Save model to a .zip archive - - :param save_path: (str or file-like) Where to store the model - :param data: (OrderedDict) Class parameters being stored - :param params: (OrderedDict) Model parameters being stored - """ - # data/params can be None, so do not - # try to serialize them blindly - if data is not None: - serialized_data = data_to_json(data) - if params is not None: - serialized_params = params_to_bytes(params) - # We also have to store list of the parameters - # to store the ordering for OrderedDict. - # We can trust these to be strings as they - # are taken from the Tensorflow graph. - serialized_param_list = json.dumps( - list(params.keys()), - indent=4 - ) - - # Check postfix if save_path is a string - if isinstance(save_path, str): - _, ext = os.path.splitext(save_path) - if ext == "": - save_path += ".zip" - - # Create a zip-archive and write our objects - # there. This works when save_path - # is either str or a file-like - with zipfile.ZipFile(save_path, "w") as file_: - # Do not try to save "None" elements - if data is not None: - file_.writestr("data", serialized_data) - if params is not None: - file_.writestr("parameters", serialized_params) - file_.writestr("parameter_list", serialized_param_list) - - @staticmethod - def _save_to_file(save_path, data=None, params=None, cloudpickle=False): - """Save model to a zip archive or cloudpickle file. - - :param save_path: (str or file-like) Where to store the model - :param data: (OrderedDict) Class parameters being stored - :param params: (OrderedDict) Model parameters being stored - :param cloudpickle: (bool) Use old cloudpickle format - (stable-baselines<=2.7.0) instead of a zip archive. - """ - if cloudpickle: - BaseRLModel._save_to_file_cloudpickle(save_path, data, params) - else: - BaseRLModel._save_to_file_zip(save_path, data, params) - - @staticmethod - def _load_from_file_cloudpickle(load_path): - """Legacy code for loading older models stored with cloudpickle - - :param load_path: (str or file-like) where from to load the file - :return: (dict, OrderedDict) Class parameters and model parameters - """ - if isinstance(load_path, str): - if not os.path.exists(load_path): - if os.path.exists(load_path + ".pkl"): - load_path += ".pkl" - else: - raise ValueError("Error: the file {} could not be found".format(load_path)) - - with open(load_path, "rb") as file_: - data, params = cloudpickle.load(file_) - else: - # Here load_path is a file-like object, not a path - data, params = cloudpickle.load(load_path) - - return data, params - - @staticmethod - def _load_from_file(load_path, load_data=True, custom_objects=None): - """Load model data from a .zip archive - - :param load_path: (str or file-like) Where to load model from - :param load_data: (bool) Whether we should load and return data - (class parameters). Mainly used by `load_parameters` to - only load model parameters (weights). - :param custom_objects: (dict) Dictionary of objects to replace - upon loading. If a variable is present in this dictionary as a - key, it will not be deserialized and the corresponding item - will be used instead. Similar to custom_objects in - `keras.models.load_model`. Useful when you have an object in - file that can not be deserialized. - :return: (dict, OrderedDict) Class parameters and model parameters - """ - # Check if file exists if load_path is - # a string - if isinstance(load_path, str): - if not os.path.exists(load_path): - if os.path.exists(load_path + ".zip"): - load_path += ".zip" - else: - raise ValueError("Error: the file {} could not be found".format(load_path)) - - # Open the zip archive and load data. - try: - with zipfile.ZipFile(load_path, "r") as file_: - namelist = file_.namelist() - # If data or parameters is not in the - # zip archive, assume they were stored - # as None (_save_to_file allows this). - data = None - params = None - if "data" in namelist and load_data: - # Load class parameters and convert to string - # (Required for json library in Python 3.5) - json_data = file_.read("data").decode() - data = json_to_data(json_data, custom_objects=custom_objects) - - if "parameters" in namelist: - # Load parameter list and and parameters - parameter_list_json = file_.read("parameter_list").decode() - parameter_list = json.loads(parameter_list_json) - serialized_params = file_.read("parameters") - params = bytes_to_params( - serialized_params, parameter_list - ) - except zipfile.BadZipFile: - # load_path wasn't a zip file. Possibly a cloudpickle - # file. Show a warning and fall back to loading cloudpickle. - warnings.warn("It appears you are loading from a file with old format. " + - "Older cloudpickle format has been replaced with zip-archived " + - "models. Consider saving the model with new format.", - DeprecationWarning) - # Attempt loading with the cloudpickle format. - # If load_path is file-like, seek back to beginning of file - if not isinstance(load_path, str): - load_path.seek(0) - data, params = BaseRLModel._load_from_file_cloudpickle(load_path) - - return data, params - - @staticmethod - def _softmax(x_input): - """ - An implementation of softmax. - - :param x_input: (numpy float) input vector - :return: (numpy float) output vector - """ - x_exp = np.exp(x_input.T - np.max(x_input.T, axis=0)) - return (x_exp / x_exp.sum(axis=0)).T - - @staticmethod - def _is_vectorized_observation(observation, observation_space): - """ - For every observation type, detects and validates the shape, - then returns whether or not the observation is vectorized. - - :param observation: (np.ndarray) the input observation to validate - :param observation_space: (gym.spaces) the observation space - :return: (bool) whether the given observation is vectorized or not - """ - if isinstance(observation_space, gym.spaces.Box): - if observation.shape == observation_space.shape: - return False - elif observation.shape[1:] == observation_space.shape: - return True - else: - raise ValueError("Error: Unexpected observation shape {} for ".format(observation.shape) + - "Box environment, please use {} ".format(observation_space.shape) + - "or (n_env, {}) for the observation shape." - .format(", ".join(map(str, observation_space.shape)))) - elif isinstance(observation_space, gym.spaces.Discrete): - if observation.shape == (): # A numpy array of a number, has shape empty tuple '()' - return False - elif len(observation.shape) == 1: - return True - else: - raise ValueError("Error: Unexpected observation shape {} for ".format(observation.shape) + - "Discrete environment, please use (1,) or (n_env, 1) for the observation shape.") - elif isinstance(observation_space, gym.spaces.MultiDiscrete): - if observation.shape == (len(observation_space.nvec),): - return False - elif len(observation.shape) == 2 and observation.shape[1] == len(observation_space.nvec): - return True - else: - raise ValueError("Error: Unexpected observation shape {} for MultiDiscrete ".format(observation.shape) + - "environment, please use ({},) or ".format(len(observation_space.nvec)) + - "(n_env, {}) for the observation shape.".format(len(observation_space.nvec))) - elif isinstance(observation_space, gym.spaces.MultiBinary): - if observation.shape == (observation_space.n,): - return False - elif len(observation.shape) == 2 and observation.shape[1] == observation_space.n: - return True - else: - raise ValueError("Error: Unexpected observation shape {} for MultiBinary ".format(observation.shape) + - "environment, please use ({},) or ".format(observation_space.n) + - "(n_env, {}) for the observation shape.".format(observation_space.n)) - else: - raise ValueError("Error: Cannot determine if the observation is vectorized with the space type {}." - .format(observation_space)) - - -class ActorCriticRLModel(BaseRLModel): - """ - The base class for Actor critic model - - :param policy: (BasePolicy) Policy object - :param env: (Gym environment) The environment to learn from - (if registered in Gym, can be str. Can be None for loading trained models) - :param verbose: (int) the verbosity level: 0 none, 1 training information, 2 tensorflow debug - :param policy_base: (BasePolicy) the base policy used by this method (default=ActorCriticPolicy) - :param requires_vec_env: (bool) Does this model require a vectorized environment - :param policy_kwargs: (dict) additional arguments to be passed to the policy on creation - :param seed: (int) Seed for the pseudo-random generators (python, numpy, tensorflow). - If None (default), use random seed. Note that if you want completely deterministic - results, you must set `n_cpu_tf_sess` to 1. - :param n_cpu_tf_sess: (int) The number of threads for TensorFlow operations - If None, the number of cpu of the current machine will be used. - """ - - def __init__(self, policy, env, _init_setup_model, verbose=0, policy_base=ActorCriticPolicy, - requires_vec_env=False, policy_kwargs=None, seed=None, n_cpu_tf_sess=None): - super(ActorCriticRLModel, self).__init__(policy, env, verbose=verbose, requires_vec_env=requires_vec_env, - policy_base=policy_base, policy_kwargs=policy_kwargs, - seed=seed, n_cpu_tf_sess=n_cpu_tf_sess) - - self.sess = None - self.initial_state = None - self.step = None - self.proba_step = None - self.params = None - self._runner = None - - def _make_runner(self) -> AbstractEnvRunner: - """Builds a new Runner. - - Lazily called whenever `self.runner` is accessed and `self._runner is None`. - """ - raise NotImplementedError("This model is not configured to use a Runner") - - @property - def runner(self) -> AbstractEnvRunner: - if self._runner is None: - self._runner = self._make_runner() - return self._runner - - def set_env(self, env): - self._runner = None # New environment invalidates `self._runner`. - super().set_env(env) - - @abstractmethod - def setup_model(self): - pass - - @abstractmethod - def learn(self, total_timesteps, callback=None, - log_interval=100, tb_log_name="run", reset_num_timesteps=True): - pass - - def predict(self, observation, state=None, mask=None, deterministic=False): - if state is None: - state = self.initial_state - if mask is None: - mask = [False for _ in range(self.n_envs)] - observation = np.array(observation) - vectorized_env = self._is_vectorized_observation(observation, self.observation_space) - - observation = observation.reshape((-1,) + self.observation_space.shape) - actions, _, states, _ = self.step(observation, state, mask, deterministic=deterministic) - - clipped_actions = actions - # Clip the actions to avoid out of bound error - if isinstance(self.action_space, gym.spaces.Box): - clipped_actions = np.clip(actions, self.action_space.low, self.action_space.high) - - if not vectorized_env: - if state is not None: - raise ValueError("Error: The environment must be vectorized when using recurrent policies.") - clipped_actions = clipped_actions[0] - - return clipped_actions, states - - def action_probability(self, observation, state=None, mask=None, actions=None, logp=False): - if state is None: - state = self.initial_state - if mask is None: - mask = [False for _ in range(self.n_envs)] - observation = np.array(observation) - vectorized_env = self._is_vectorized_observation(observation, self.observation_space) - - observation = observation.reshape((-1,) + self.observation_space.shape) - actions_proba = self.proba_step(observation, state, mask) - - if len(actions_proba) == 0: # empty list means not implemented - warnings.warn("Warning: action probability is not implemented for {} action space. Returning None." - .format(type(self.action_space).__name__)) - return None - - if actions is not None: # comparing the action distribution, to given actions - prob = None - logprob = None - actions = np.array([actions]) - if isinstance(self.action_space, gym.spaces.Discrete): - actions = actions.reshape((-1,)) - assert observation.shape[0] == actions.shape[0], \ - "Error: batch sizes differ for actions and observations." - prob = actions_proba[np.arange(actions.shape[0]), actions] - - elif isinstance(self.action_space, gym.spaces.MultiDiscrete): - actions = actions.reshape((-1, len(self.action_space.nvec))) - assert observation.shape[0] == actions.shape[0], \ - "Error: batch sizes differ for actions and observations." - # Discrete action probability, over multiple categories - actions = np.swapaxes(actions, 0, 1) # swap axis for easier categorical split - prob = np.prod([proba[np.arange(act.shape[0]), act] - for proba, act in zip(actions_proba, actions)], axis=0) - - elif isinstance(self.action_space, gym.spaces.MultiBinary): - actions = actions.reshape((-1, self.action_space.n)) - assert observation.shape[0] == actions.shape[0], \ - "Error: batch sizes differ for actions and observations." - # Bernoulli action probability, for every action - prob = np.prod(actions_proba * actions + (1 - actions_proba) * (1 - actions), axis=1) - - elif isinstance(self.action_space, gym.spaces.Box): - actions = actions.reshape((-1, ) + self.action_space.shape) - mean, std = actions_proba - logstd = np.log(std) - - n_elts = np.prod(mean.shape[1:]) # first dimension is batch size - log_normalizer = n_elts / 2.0 * np.log(2 * np.pi) + np.sum(logstd, axis=1) - - # Diagonal Gaussian action probability, for every action - logprob = -np.sum(np.square(actions - mean) / (2 * np.square(std)), axis=1) - log_normalizer - - else: - warnings.warn("Warning: action_probability not implemented for {} actions space. Returning None." - .format(type(self.action_space).__name__)) - return None - - # Return in space (log or normal) requested by user, converting if necessary - if logp: - if logprob is None: - logprob = np.log(prob) - ret = logprob - else: - if prob is None: - prob = np.exp(logprob) - ret = prob - - # normalize action proba shape for the different gym spaces - ret = ret.reshape((-1, 1)) - else: - ret = actions_proba - - if not vectorized_env: - if state is not None: - raise ValueError("Error: The environment must be vectorized when using recurrent policies.") - ret = ret[0] - - return ret - - def get_parameter_list(self): - return self.params - - @abstractmethod - def save(self, save_path, cloudpickle=False): - pass - - @classmethod - def load(cls, load_path, env=None, custom_objects=None, **kwargs): - """ - Load the model from file - - :param load_path: (str or file-like) the saved parameter location - :param env: (Gym Environment) the new environment to run the loaded model on - (can be None if you only need prediction from a trained model) - :param custom_objects: (dict) Dictionary of objects to replace - upon loading. If a variable is present in this dictionary as a - key, it will not be deserialized and the corresponding item - will be used instead. Similar to custom_objects in - `keras.models.load_model`. Useful when you have an object in - file that can not be deserialized. - :param kwargs: extra arguments to change the model when loading - """ - data, params = cls._load_from_file(load_path, custom_objects=custom_objects) - - if 'policy_kwargs' in kwargs and kwargs['policy_kwargs'] != data['policy_kwargs']: - raise ValueError("The specified policy kwargs do not equal the stored policy kwargs. " - "Stored kwargs: {}, specified kwargs: {}".format(data['policy_kwargs'], - kwargs['policy_kwargs'])) - - model = cls(policy=data["policy"], env=None, _init_setup_model=False) # pytype: disable=not-instantiable - model.__dict__.update(data) - model.__dict__.update(kwargs) - model.set_env(env) - model.setup_model() - - model.load_parameters(params) - - return model - - -class OffPolicyRLModel(BaseRLModel): - """ - The base class for off policy RL model - - :param policy: (BasePolicy) Policy object - :param env: (Gym environment) The environment to learn from - (if registered in Gym, can be str. Can be None for loading trained models) - :param replay_buffer: (ReplayBuffer) the type of replay buffer - :param verbose: (int) the verbosity level: 0 none, 1 training information, 2 tensorflow debug - :param requires_vec_env: (bool) Does this model require a vectorized environment - :param policy_base: (BasePolicy) the base policy used by this method - :param policy_kwargs: (dict) additional arguments to be passed to the policy on creation - :param seed: (int) Seed for the pseudo-random generators (python, numpy, tensorflow). - If None (default), use random seed. Note that if you want completely deterministic - results, you must set `n_cpu_tf_sess` to 1. - :param n_cpu_tf_sess: (int) The number of threads for TensorFlow operations - If None, the number of cpu of the current machine will be used. - """ - - def __init__(self, policy, env, replay_buffer=None, _init_setup_model=False, verbose=0, *, - requires_vec_env=False, policy_base=None, - policy_kwargs=None, seed=None, n_cpu_tf_sess=None): - super(OffPolicyRLModel, self).__init__(policy, env, verbose=verbose, requires_vec_env=requires_vec_env, - policy_base=policy_base, policy_kwargs=policy_kwargs, - seed=seed, n_cpu_tf_sess=n_cpu_tf_sess) - - self.replay_buffer = replay_buffer - - def is_using_her(self) -> bool: - """ - Check if is using HER - - :return: (bool) Whether is using HER or not - """ - # Avoid circular import - from stable_baselines.her.replay_buffer import HindsightExperienceReplayWrapper - return isinstance(self.replay_buffer, HindsightExperienceReplayWrapper) - - def replay_buffer_add(self, obs_t, action, reward, obs_tp1, done, info): - """ - Add a new transition to the replay buffer - - :param obs_t: (np.ndarray) the last observation - :param action: ([float]) the action - :param reward: (float) the reward of the transition - :param obs_tp1: (np.ndarray) the new observation - :param done: (bool) is the episode done - :param info: (dict) extra values used to compute the reward when using HER - """ - # Pass info dict when using HER, as it can be used to compute the reward - kwargs = dict(info=info) if self.is_using_her() else {} - self.replay_buffer.add(obs_t, action, reward, obs_tp1, float(done), **kwargs) - - @abstractmethod - def setup_model(self): - pass - - @abstractmethod - def learn(self, total_timesteps, callback=None, - log_interval=100, tb_log_name="run", reset_num_timesteps=True, replay_wrapper=None): - pass - - @abstractmethod - def predict(self, observation, state=None, mask=None, deterministic=False): - pass - - @abstractmethod - def action_probability(self, observation, state=None, mask=None, actions=None, logp=False): - pass - - @abstractmethod - def save(self, save_path, cloudpickle=False): - pass - - @classmethod - def load(cls, load_path, env=None, custom_objects=None, **kwargs): - """ - Load the model from file - - :param load_path: (str or file-like) the saved parameter location - :param env: (Gym Environment) the new environment to run the loaded model on - (can be None if you only need prediction from a trained model) - :param custom_objects: (dict) Dictionary of objects to replace - upon loading. If a variable is present in this dictionary as a - key, it will not be deserialized and the corresponding item - will be used instead. Similar to custom_objects in - `keras.models.load_model`. Useful when you have an object in - file that can not be deserialized. - :param kwargs: extra arguments to change the model when loading - """ - data, params = cls._load_from_file(load_path, custom_objects=custom_objects) - - if 'policy_kwargs' in kwargs and kwargs['policy_kwargs'] != data['policy_kwargs']: - raise ValueError("The specified policy kwargs do not equal the stored policy kwargs. " - "Stored kwargs: {}, specified kwargs: {}".format(data['policy_kwargs'], - kwargs['policy_kwargs'])) - - model = cls(policy=data["policy"], env=None, _init_setup_model=False) # pytype: disable=not-instantiable - model.__dict__.update(data) - model.__dict__.update(kwargs) - model.set_env(env) - model.setup_model() - - model.load_parameters(params) - - return model - - -class _UnvecWrapper(VecEnvWrapper): - def __init__(self, venv): - """ - Unvectorize a vectorized environment, for vectorized environment that only have one environment - - :param venv: (VecEnv) the vectorized environment to wrap - """ - super().__init__(venv) - assert venv.num_envs == 1, "Error: cannot unwrap a environment wrapper that has more than one environment." - - def seed(self, seed=None): - return self.venv.env_method('seed', seed) - - def __getattr__(self, attr): - if attr in self.__dict__: - return getattr(self, attr) - return getattr(self.venv, attr) - - def __set_attr__(self, attr, value): - if attr in self.__dict__: - setattr(self, attr, value) - else: - setattr(self.venv, attr, value) - - def compute_reward(self, achieved_goal, desired_goal, _info): - return float(self.venv.env_method('compute_reward', achieved_goal, desired_goal, _info)[0]) - - @staticmethod - def unvec_obs(obs): - """ - :param obs: (Union[np.ndarray, dict]) - :return: (Union[np.ndarray, dict]) - """ - if not isinstance(obs, dict): - return obs[0] - obs_ = OrderedDict() - for key in obs.keys(): - obs_[key] = obs[key][0] - del obs - return obs_ - - def reset(self): - return self.unvec_obs(self.venv.reset()) - - def step_async(self, actions): - self.venv.step_async([actions]) - - def step_wait(self): - obs, rewards, dones, information = self.venv.step_wait() - return self.unvec_obs(obs), float(rewards[0]), dones[0], information[0] - - def render(self, mode='human'): - return self.venv.render(mode=mode) - - -class SetVerbosity: - def __init__(self, verbose=0): - """ - define a region of code for certain level of verbosity - - :param verbose: (int) the verbosity level: 0 none, 1 training information, 2 tensorflow debug - """ - self.verbose = verbose - - def __enter__(self): - self.tf_level = os.environ.get('TF_CPP_MIN_LOG_LEVEL', '0') - self.log_level = logger.get_level() - self.gym_level = gym.logger.MIN_LEVEL - - if self.verbose <= 1: - os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' - - if self.verbose <= 0: - logger.set_level(logger.DISABLED) - gym.logger.set_level(gym.logger.DISABLED) - - def __exit__(self, exc_type, exc_val, exc_tb): - if self.verbose <= 1: - os.environ['TF_CPP_MIN_LOG_LEVEL'] = self.tf_level - - if self.verbose <= 0: - logger.set_level(self.log_level) - gym.logger.set_level(self.gym_level) - - -class TensorboardWriter: - def __init__(self, graph, tensorboard_log_path, tb_log_name, new_tb_log=True): - """ - Create a Tensorboard writer for a code segment, and saves it to the log directory as its own run - - :param graph: (Tensorflow Graph) the model graph - :param tensorboard_log_path: (str) the save path for the log (can be None for no logging) - :param tb_log_name: (str) the name of the run for tensorboard log - :param new_tb_log: (bool) whether or not to create a new logging folder for tensorbaord - """ - self.graph = graph - self.tensorboard_log_path = tensorboard_log_path - self.tb_log_name = tb_log_name - self.writer = None - self.new_tb_log = new_tb_log - - def __enter__(self): - if self.tensorboard_log_path is not None: - latest_run_id = self._get_latest_run_id() - if self.new_tb_log: - latest_run_id = latest_run_id + 1 - save_path = os.path.join(self.tensorboard_log_path, "{}_{}".format(self.tb_log_name, latest_run_id)) - self.writer = tf.summary.FileWriter(save_path, graph=self.graph) - return self.writer - - def _get_latest_run_id(self): - """ - returns the latest run number for the given log name and log path, - by finding the greatest number in the directories. - - :return: (int) latest run number - """ - max_run_id = 0 - for path in glob.glob("{}/{}_[0-9]*".format(self.tensorboard_log_path, self.tb_log_name)): - file_name = path.split(os.sep)[-1] - ext = file_name.split("_")[-1] - if self.tb_log_name == "_".join(file_name.split("_")[:-1]) and ext.isdigit() and int(ext) > max_run_id: - max_run_id = int(ext) - return max_run_id - - def __exit__(self, exc_type, exc_val, exc_tb): - if self.writer is not None: - self.writer.add_graph(self.graph) - self.writer.flush() diff --git a/stable_baselines/common/bit_flipping_env.py b/stable_baselines/common/bit_flipping_env.py deleted file mode 100644 index 15a055dc..00000000 --- a/stable_baselines/common/bit_flipping_env.py +++ /dev/null @@ -1,116 +0,0 @@ -from collections import OrderedDict - -import numpy as np -from gym import GoalEnv, spaces - - -class BitFlippingEnv(GoalEnv): - """ - Simple bit flipping env, useful to test HER. - The goal is to flip all the bits to get a vector of ones. - In the continuous variant, if the ith action component has a value > 0, - then the ith bit will be flipped. - - :param n_bits: (int) Number of bits to flip - :param continuous: (bool) Whether to use the continuous actions version or not, - by default, it uses the discrete one - :param max_steps: (int) Max number of steps, by default, equal to n_bits - :param discrete_obs_space: (bool) Whether to use the discrete observation - version or not, by default, it uses the MultiBinary one - """ - def __init__(self, n_bits=10, continuous=False, max_steps=None, - discrete_obs_space=False): - super(BitFlippingEnv, self).__init__() - # The achieved goal is determined by the current state - # here, it is a special where they are equal - if discrete_obs_space: - # In the discrete case, the agent act on the binary - # representation of the observation - self.observation_space = spaces.Dict({ - 'observation': spaces.Discrete(2 ** n_bits - 1), - 'achieved_goal': spaces.Discrete(2 ** n_bits - 1), - 'desired_goal': spaces.Discrete(2 ** n_bits - 1) - }) - else: - self.observation_space = spaces.Dict({ - 'observation': spaces.MultiBinary(n_bits), - 'achieved_goal': spaces.MultiBinary(n_bits), - 'desired_goal': spaces.MultiBinary(n_bits) - }) - - self.obs_space = spaces.MultiBinary(n_bits) - - if continuous: - self.action_space = spaces.Box(-1, 1, shape=(n_bits,), dtype=np.float32) - else: - self.action_space = spaces.Discrete(n_bits) - self.continuous = continuous - self.discrete_obs_space = discrete_obs_space - self.state = None - self.desired_goal = np.ones((n_bits,)) - if max_steps is None: - max_steps = n_bits - self.max_steps = max_steps - self.current_step = 0 - self.reset() - - def convert_if_needed(self, state): - """ - Convert to discrete space if needed. - - :param state: (np.ndarray) - :return: (np.ndarray or int) - """ - if self.discrete_obs_space: - # The internal state is the binary representation of the - # observed one - return int(sum([state[i] * 2**i for i in range(len(state))])) - return state - - def _get_obs(self): - """ - Helper to create the observation. - - :return: (OrderedDict) - """ - return OrderedDict([ - ('observation', self.convert_if_needed(self.state.copy())), - ('achieved_goal', self.convert_if_needed(self.state.copy())), - ('desired_goal', self.convert_if_needed(self.desired_goal.copy())) - ]) - - def reset(self): - self.current_step = 0 - self.state = self.obs_space.sample() - return self._get_obs() - - def step(self, action): - if self.continuous: - self.state[action > 0] = 1 - self.state[action > 0] - else: - self.state[action] = 1 - self.state[action] - obs = self._get_obs() - reward = self.compute_reward(obs['achieved_goal'], obs['desired_goal'], None) - done = reward == 0 - self.current_step += 1 - # Episode terminate when we reached the goal or the max number of steps - info = {'is_success': done} - done = done or self.current_step >= self.max_steps - return obs, reward, done, info - - def compute_reward(self, - achieved_goal: np.ndarray, - desired_goal: np.ndarray, - _info) -> float: - # Deceptive reward: it is positive only when the goal is achieved - if self.discrete_obs_space: - return 0.0 if achieved_goal == desired_goal else -1.0 - return 0.0 if (achieved_goal == desired_goal).all() else -1.0 - - def render(self, mode='human'): - if mode == 'rgb_array': - return self.state.copy() - print(self.state) - - def close(self): - pass diff --git a/stable_baselines/common/buffers.py b/stable_baselines/common/buffers.py deleted file mode 100644 index ec9eb2ba..00000000 --- a/stable_baselines/common/buffers.py +++ /dev/null @@ -1,264 +0,0 @@ -import random -from typing import Optional, List, Union - -import numpy as np - -from stable_baselines.common.segment_tree import SumSegmentTree, MinSegmentTree -from stable_baselines.common.vec_env import VecNormalize - - -class ReplayBuffer(object): - def __init__(self, size: int): - """ - Implements a ring buffer (FIFO). - - :param size: (int) Max number of transitions to store in the buffer. When the buffer overflows the old - memories are dropped. - """ - self._storage = [] - self._maxsize = size - self._next_idx = 0 - - def __len__(self) -> int: - return len(self._storage) - - @property - def storage(self): - """[(Union[np.ndarray, int], Union[np.ndarray, int], float, Union[np.ndarray, int], bool)]: content of the replay buffer""" - return self._storage - - @property - def buffer_size(self) -> int: - """float: Max capacity of the buffer""" - return self._maxsize - - def can_sample(self, n_samples: int) -> bool: - """ - Check if n_samples samples can be sampled - from the buffer. - - :param n_samples: (int) - :return: (bool) - """ - return len(self) >= n_samples - - def is_full(self) -> int: - """ - Check whether the replay buffer is full or not. - - :return: (bool) - """ - return len(self) == self.buffer_size - - def add(self, obs_t, action, reward, obs_tp1, done): - """ - add a new transition to the buffer - - :param obs_t: (Union[np.ndarray, int]) the last observation - :param action: (Union[np.ndarray, int]) the action - :param reward: (float) the reward of the transition - :param obs_tp1: (Union[np.ndarray, int]) the current observation - :param done: (bool) is the episode done - """ - data = (obs_t, action, reward, obs_tp1, done) - - if self._next_idx >= len(self._storage): - self._storage.append(data) - else: - self._storage[self._next_idx] = data - self._next_idx = (self._next_idx + 1) % self._maxsize - - def extend(self, obs_t, action, reward, obs_tp1, done): - """ - add a new batch of transitions to the buffer - - :param obs_t: (Union[Tuple[Union[np.ndarray, int]], np.ndarray]) the last batch of observations - :param action: (Union[Tuple[Union[np.ndarray, int]]], np.ndarray]) the batch of actions - :param reward: (Union[Tuple[float], np.ndarray]) the batch of the rewards of the transition - :param obs_tp1: (Union[Tuple[Union[np.ndarray, int]], np.ndarray]) the current batch of observations - :param done: (Union[Tuple[bool], np.ndarray]) terminal status of the batch - - Note: uses the same names as .add to keep compatibility with named argument passing - but expects iterables and arrays with more than 1 dimensions - """ - for data in zip(obs_t, action, reward, obs_tp1, done): - if self._next_idx >= len(self._storage): - self._storage.append(data) - else: - self._storage[self._next_idx] = data - self._next_idx = (self._next_idx + 1) % self._maxsize - - @staticmethod - def _normalize_obs(obs: np.ndarray, - env: Optional[VecNormalize] = None) -> np.ndarray: - """ - Helper for normalizing the observation. - """ - if env is not None: - return env.normalize_obs(obs) - return obs - - @staticmethod - def _normalize_reward(reward: np.ndarray, - env: Optional[VecNormalize] = None) -> np.ndarray: - """ - Helper for normalizing the reward. - """ - if env is not None: - return env.normalize_reward(reward) - return reward - - def _encode_sample(self, idxes: Union[List[int], np.ndarray], env: Optional[VecNormalize] = None): - obses_t, actions, rewards, obses_tp1, dones = [], [], [], [], [] - for i in idxes: - data = self._storage[i] - obs_t, action, reward, obs_tp1, done = data - obses_t.append(np.array(obs_t, copy=False)) - actions.append(np.array(action, copy=False)) - rewards.append(reward) - obses_tp1.append(np.array(obs_tp1, copy=False)) - dones.append(done) - return (self._normalize_obs(np.array(obses_t), env), - np.array(actions), - self._normalize_reward(np.array(rewards), env), - self._normalize_obs(np.array(obses_tp1), env), - np.array(dones)) - - def sample(self, batch_size: int, env: Optional[VecNormalize] = None, **_kwargs): - """ - Sample a batch of experiences. - - :param batch_size: (int) How many transitions to sample. - :param env: (Optional[VecNormalize]) associated gym VecEnv - to normalize the observations/rewards when sampling - :return: - - obs_batch: (np.ndarray) batch of observations - - act_batch: (numpy float) batch of actions executed given obs_batch - - rew_batch: (numpy float) rewards received as results of executing act_batch - - next_obs_batch: (np.ndarray) next set of observations seen after executing act_batch - - done_mask: (numpy bool) done_mask[i] = 1 if executing act_batch[i] resulted in the end of an episode - and 0 otherwise. - """ - idxes = [random.randint(0, len(self._storage) - 1) for _ in range(batch_size)] - return self._encode_sample(idxes, env=env) - - -class PrioritizedReplayBuffer(ReplayBuffer): - def __init__(self, size, alpha): - """ - Create Prioritized Replay buffer. - - See Also ReplayBuffer.__init__ - - :param size: (int) Max number of transitions to store in the buffer. When the buffer overflows the old memories - are dropped. - :param alpha: (float) how much prioritization is used (0 - no prioritization, 1 - full prioritization) - """ - super(PrioritizedReplayBuffer, self).__init__(size) - assert alpha >= 0 - self._alpha = alpha - - it_capacity = 1 - while it_capacity < size: - it_capacity *= 2 - - self._it_sum = SumSegmentTree(it_capacity) - self._it_min = MinSegmentTree(it_capacity) - self._max_priority = 1.0 - - def add(self, obs_t, action, reward, obs_tp1, done): - """ - add a new transition to the buffer - - :param obs_t: (Any) the last observation - :param action: ([float]) the action - :param reward: (float) the reward of the transition - :param obs_tp1: (Any) the current observation - :param done: (bool) is the episode done - """ - idx = self._next_idx - super().add(obs_t, action, reward, obs_tp1, done) - self._it_sum[idx] = self._max_priority ** self._alpha - self._it_min[idx] = self._max_priority ** self._alpha - - def extend(self, obs_t, action, reward, obs_tp1, done): - """ - add a new batch of transitions to the buffer - - :param obs_t: (Union[Tuple[Union[np.ndarray, int]], np.ndarray]) the last batch of observations - :param action: (Union[Tuple[Union[np.ndarray, int]]], np.ndarray]) the batch of actions - :param reward: (Union[Tuple[float], np.ndarray]) the batch of the rewards of the transition - :param obs_tp1: (Union[Tuple[Union[np.ndarray, int]], np.ndarray]) the current batch of observations - :param done: (Union[Tuple[bool], np.ndarray]) terminal status of the batch - - Note: uses the same names as .add to keep compatibility with named argument passing - but expects iterables and arrays with more than 1 dimensions - """ - idx = self._next_idx - super().extend(obs_t, action, reward, obs_tp1, done) - while idx != self._next_idx: - self._it_sum[idx] = self._max_priority ** self._alpha - self._it_min[idx] = self._max_priority ** self._alpha - idx = (idx + 1) % self._maxsize - - def _sample_proportional(self, batch_size): - mass = [] - total = self._it_sum.sum(0, len(self._storage) - 1) - # TODO(szymon): should we ensure no repeats? - mass = np.random.random(size=batch_size) * total - idx = self._it_sum.find_prefixsum_idx(mass) - return idx - - def sample(self, batch_size: int, beta: float = 0, env: Optional[VecNormalize] = None): - """ - Sample a batch of experiences. - - compared to ReplayBuffer.sample - it also returns importance weights and idxes - of sampled experiences. - - :param batch_size: (int) How many transitions to sample. - :param beta: (float) To what degree to use importance weights (0 - no corrections, 1 - full correction) - :param env: (Optional[VecNormalize]) associated gym VecEnv - to normalize the observations/rewards when sampling - :return: - - obs_batch: (np.ndarray) batch of observations - - act_batch: (numpy float) batch of actions executed given obs_batch - - rew_batch: (numpy float) rewards received as results of executing act_batch - - next_obs_batch: (np.ndarray) next set of observations seen after executing act_batch - - done_mask: (numpy bool) done_mask[i] = 1 if executing act_batch[i] resulted in the end of an episode - and 0 otherwise. - - weights: (numpy float) Array of shape (batch_size,) and dtype np.float32 denoting importance weight of - each sampled transition - - idxes: (numpy int) Array of shape (batch_size,) and dtype np.int32 idexes in buffer of sampled experiences - """ - assert beta > 0 - - idxes = self._sample_proportional(batch_size) - weights = [] - p_min = self._it_min.min() / self._it_sum.sum() - max_weight = (p_min * len(self._storage)) ** (-beta) - p_sample = self._it_sum[idxes] / self._it_sum.sum() - weights = (p_sample * len(self._storage)) ** (-beta) / max_weight - encoded_sample = self._encode_sample(idxes, env=env) - return tuple(list(encoded_sample) + [weights, idxes]) - - def update_priorities(self, idxes, priorities): - """ - Update priorities of sampled transitions. - - sets priority of transition at index idxes[i] in buffer - to priorities[i]. - - :param idxes: ([int]) List of idxes of sampled transitions - :param priorities: ([float]) List of updated priorities corresponding to transitions at the sampled idxes - denoted by variable `idxes`. - """ - assert len(idxes) == len(priorities) - assert np.min(priorities) > 0 - assert np.min(idxes) >= 0 - assert np.max(idxes) < len(self.storage) - self._it_sum[idxes] = priorities ** self._alpha - self._it_min[idxes] = priorities ** self._alpha - - self._max_priority = max(self._max_priority, np.max(priorities)) diff --git a/stable_baselines/common/callbacks.py b/stable_baselines/common/callbacks.py deleted file mode 100644 index 81f62ed5..00000000 --- a/stable_baselines/common/callbacks.py +++ /dev/null @@ -1,380 +0,0 @@ -import os -from abc import ABC -import warnings -import typing -from typing import Union, List, Dict, Any, Optional - -import gym -import numpy as np - -from stable_baselines.common.vec_env import VecEnv, sync_envs_normalization, DummyVecEnv -from stable_baselines.common.evaluation import evaluate_policy -from stable_baselines import logger - -if typing.TYPE_CHECKING: - from stable_baselines.common.base_class import BaseRLModel # pytype: disable=pyi-error - - -class BaseCallback(ABC): - """ - Base class for callback. - - :param verbose: (int) - """ - def __init__(self, verbose: int = 0): - super(BaseCallback, self).__init__() - # The RL model - self.model = None # type: Optional[BaseRLModel] - # An alias for self.model.get_env(), the environment used for training - self.training_env = None # type: Union[gym.Env, VecEnv, None] - # Number of time the callback was called - self.n_calls = 0 # type: int - # n_envs * n times env.step() was called - self.num_timesteps = 0 # type: int - self.verbose = verbose - self.locals = None # type: Optional[Dict[str, Any]] - self.globals = None # type: Optional[Dict[str, Any]] - self.logger = None # type: Optional[logger.Logger] - # Sometimes, for event callback, it is useful - # to have access to the parent object - self.parent = None # type: Optional[BaseCallback] - - # Type hint as string to avoid circular import - def init_callback(self, model: 'BaseRLModel') -> None: - """ - Initialize the callback by saving references to the - RL model and the training environment for convenience. - """ - self.model = model - self.training_env = model.get_env() - self.logger = logger.Logger.CURRENT - self._init_callback() - - def update_locals(self, locals_: Dict[str, Any]) -> None: - """ - Updates the local variables of the training process - - For reference to which variables are accessible, - check each individual algorithm's documentation - :param `locals_`: (Dict[str, Any]) current local variables - """ - self.locals.update(locals_) - - def _init_callback(self) -> None: - pass - - def on_training_start(self, locals_: Dict[str, Any], globals_: Dict[str, Any]) -> None: - # Those are reference and will be updated automatically - self.locals = locals_ - self.globals = globals_ - self._on_training_start() - - def _on_training_start(self) -> None: - pass - - def on_rollout_start(self) -> None: - self._on_rollout_start() - - def _on_rollout_start(self) -> None: - pass - - def _on_step(self) -> bool: - """ - :return: (bool) If the callback returns False, training is aborted early. - """ - return True - - def on_step(self) -> bool: - """ - This method will be called by the model after each call to `env.step()`. - - For child callback (of an `EventCallback`), this will be called - when the event is triggered. - - :return: (bool) If the callback returns False, training is aborted early. - """ - self.n_calls += 1 - self.num_timesteps = self.model.num_timesteps - - return self._on_step() - - def on_training_end(self) -> None: - self._on_training_end() - - def _on_training_end(self) -> None: - pass - - def on_rollout_end(self) -> None: - self._on_rollout_end() - - def _on_rollout_end(self) -> None: - pass - - -class EventCallback(BaseCallback): - """ - Base class for triggering callback on event. - - :param callback: (Optional[BaseCallback]) Callback that will be called - when an event is triggered. - :param verbose: (int) - """ - def __init__(self, callback: Optional[BaseCallback] = None, verbose: int = 0): - super(EventCallback, self).__init__(verbose=verbose) - self.callback = callback - # Give access to the parent - if callback is not None: - self.callback.parent = self - - def init_callback(self, model: 'BaseRLModel') -> None: - super(EventCallback, self).init_callback(model) - if self.callback is not None: - self.callback.init_callback(self.model) - - def _on_training_start(self) -> None: - if self.callback is not None: - self.callback.on_training_start(self.locals, self.globals) - - def _on_event(self) -> bool: - if self.callback is not None: - return self.callback.on_step() - return True - - def _on_step(self) -> bool: - return True - - -class CallbackList(BaseCallback): - """ - Class for chaining callbacks. - - :param callbacks: (List[BaseCallback]) A list of callbacks that will be called - sequentially. - """ - def __init__(self, callbacks: List[BaseCallback]): - super(CallbackList, self).__init__() - assert isinstance(callbacks, list) - self.callbacks = callbacks - - def _init_callback(self) -> None: - for callback in self.callbacks: - callback.init_callback(self.model) - - def _on_training_start(self) -> None: - for callback in self.callbacks: - callback.on_training_start(self.locals, self.globals) - - def _on_rollout_start(self) -> None: - for callback in self.callbacks: - callback.on_rollout_start() - - def _on_step(self) -> bool: - continue_training = True - for callback in self.callbacks: - # Return False (stop training) if at least one callback returns False - continue_training = callback.on_step() and continue_training - return continue_training - - def _on_rollout_end(self) -> None: - for callback in self.callbacks: - callback.on_rollout_end() - - def _on_training_end(self) -> None: - for callback in self.callbacks: - callback.on_training_end() - - -class CheckpointCallback(BaseCallback): - """ - Callback for saving a model every `save_freq` steps - - :param save_freq: (int) - :param save_path: (str) Path to the folder where the model will be saved. - :param name_prefix: (str) Common prefix to the saved models - """ - def __init__(self, save_freq: int, save_path: str, name_prefix='rl_model', verbose=0): - super(CheckpointCallback, self).__init__(verbose) - self.save_freq = save_freq - self.save_path = save_path - self.name_prefix = name_prefix - - def _init_callback(self) -> None: - # Create folder if needed - if self.save_path is not None: - os.makedirs(self.save_path, exist_ok=True) - - def _on_step(self) -> bool: - if self.n_calls % self.save_freq == 0: - path = os.path.join(self.save_path, '{}_{}_steps'.format(self.name_prefix, self.num_timesteps)) - self.model.save(path) - if self.verbose > 1: - print("Saving model checkpoint to {}".format(path)) - return True - - -class ConvertCallback(BaseCallback): - """ - Convert functional callback (old-style) to object. - - :param callback: (Callable) - :param verbose: (int) - """ - def __init__(self, callback, verbose=0): - super(ConvertCallback, self).__init__(verbose) - self.callback = callback - - def _on_step(self) -> bool: - if self.callback is not None: - return self.callback(self.locals, self.globals) - return True - - -class EvalCallback(EventCallback): - """ - Callback for evaluating an agent. - - :param eval_env: (Union[gym.Env, VecEnv]) The environment used for initialization - :param callback_on_new_best: (Optional[BaseCallback]) Callback to trigger - when there is a new best model according to the `mean_reward` - :param n_eval_episodes: (int) The number of episodes to test the agent - :param eval_freq: (int) Evaluate the agent every eval_freq call of the callback. - :param log_path: (str) Path to a folder where the evaluations (`evaluations.npz`) - will be saved. It will be updated at each evaluation. - :param best_model_save_path: (str) Path to a folder where the best model - according to performance on the eval env will be saved. - :param deterministic: (bool) Whether the evaluation should - use a stochastic or deterministic actions. - :param render: (bool) Whether to render or not the environment during evaluation - :param verbose: (int) - """ - def __init__(self, eval_env: Union[gym.Env, VecEnv], - callback_on_new_best: Optional[BaseCallback] = None, - n_eval_episodes: int = 5, - eval_freq: int = 10000, - log_path: Optional[str] = None, - best_model_save_path: Optional[str] = None, - deterministic: bool = True, - render: bool = False, - verbose: int = 1): - super(EvalCallback, self).__init__(callback_on_new_best, verbose=verbose) - self.n_eval_episodes = n_eval_episodes - self.eval_freq = eval_freq - self.best_mean_reward = -np.inf - self.last_mean_reward = -np.inf - self.deterministic = deterministic - self.render = render - - # Convert to VecEnv for consistency - if not isinstance(eval_env, VecEnv): - eval_env = DummyVecEnv([lambda: eval_env]) - - assert eval_env.num_envs == 1, "You must pass only one environment for evaluation" - - self.eval_env = eval_env - self.best_model_save_path = best_model_save_path - # Logs will be written in `evaluations.npz` - if log_path is not None: - log_path = os.path.join(log_path, 'evaluations') - self.log_path = log_path - self.evaluations_results = [] - self.evaluations_timesteps = [] - self.evaluations_length = [] - - def _init_callback(self): - # Does not work in some corner cases, where the wrapper is not the same - if not type(self.training_env) is type(self.eval_env): - warnings.warn("Training and eval env are not of the same type" - "{} != {}".format(self.training_env, self.eval_env)) - - # Create folders if needed - if self.best_model_save_path is not None: - os.makedirs(self.best_model_save_path, exist_ok=True) - if self.log_path is not None: - os.makedirs(os.path.dirname(self.log_path), exist_ok=True) - - def _on_step(self) -> bool: - - if self.eval_freq > 0 and self.n_calls % self.eval_freq == 0: - # Sync training and eval env if there is VecNormalize - sync_envs_normalization(self.training_env, self.eval_env) - - episode_rewards, episode_lengths = evaluate_policy(self.model, self.eval_env, - n_eval_episodes=self.n_eval_episodes, - render=self.render, - deterministic=self.deterministic, - return_episode_rewards=True) - - if self.log_path is not None: - self.evaluations_timesteps.append(self.num_timesteps) - self.evaluations_results.append(episode_rewards) - self.evaluations_length.append(episode_lengths) - np.savez(self.log_path, timesteps=self.evaluations_timesteps, - results=self.evaluations_results, ep_lengths=self.evaluations_length) - - mean_reward, std_reward = np.mean(episode_rewards), np.std(episode_rewards) - mean_ep_length, std_ep_length = np.mean(episode_lengths), np.std(episode_lengths) - # Keep track of the last evaluation, useful for classes that derive from this callback - self.last_mean_reward = mean_reward - - if self.verbose > 0: - print("Eval num_timesteps={}, " - "episode_reward={:.2f} +/- {:.2f}".format(self.num_timesteps, mean_reward, std_reward)) - print("Episode length: {:.2f} +/- {:.2f}".format(mean_ep_length, std_ep_length)) - - if mean_reward > self.best_mean_reward: - if self.verbose > 0: - print("New best mean reward!") - if self.best_model_save_path is not None: - self.model.save(os.path.join(self.best_model_save_path, 'best_model')) - self.best_mean_reward = mean_reward - # Trigger callback if needed - if self.callback is not None: - return self._on_event() - - return True - - -class StopTrainingOnRewardThreshold(BaseCallback): - """ - Stop the training once a threshold in episodic reward - has been reached (i.e. when the model is good enough). - - It must be used with the `EvalCallback`. - - :param reward_threshold: (float) Minimum expected reward per episode - to stop training. - :param verbose: (int) - """ - def __init__(self, reward_threshold: float, verbose: int = 0): - super(StopTrainingOnRewardThreshold, self).__init__(verbose=verbose) - self.reward_threshold = reward_threshold - - def _on_step(self) -> bool: - assert self.parent is not None, ("`StopTrainingOnRewardThreshold` callback must be used " - "with an `EvalCallback`") - # Convert np.bool to bool, otherwise callback.on_step() is False won't work - continue_training = bool(self.parent.best_mean_reward < self.reward_threshold) - if self.verbose > 0 and not continue_training: - print("Stopping training because the mean reward {:.2f} " - " is above the threshold {}".format(self.parent.best_mean_reward, self.reward_threshold)) - return continue_training - - -class EveryNTimesteps(EventCallback): - """ - Trigger a callback every `n_steps` timesteps - - :param n_steps: (int) Number of timesteps between two trigger. - :param callback: (BaseCallback) Callback that will be called - when the event is triggered. - """ - def __init__(self, n_steps: int, callback: BaseCallback): - super(EveryNTimesteps, self).__init__(callback) - self.n_steps = n_steps - self.last_time_trigger = 0 - - def _on_step(self) -> bool: - if (self.num_timesteps - self.last_time_trigger) >= self.n_steps: - self.last_time_trigger = self.num_timesteps - return self._on_event() - return True diff --git a/stable_baselines/common/cg.py b/stable_baselines/common/cg.py deleted file mode 100644 index 15c0f952..00000000 --- a/stable_baselines/common/cg.py +++ /dev/null @@ -1,49 +0,0 @@ -import numpy as np - - -def conjugate_gradient(f_ax, b_vec, cg_iters=10, callback=None, verbose=False, residual_tol=1e-10): - """ - conjugate gradient calculation (Ax = b), bases on - https://epubs.siam.org/doi/book/10.1137/1.9781611971446 Demmel p 312 - - :param f_ax: (function) The function describing the Matrix A dot the vector x - (x being the input parameter of the function) - :param b_vec: (numpy float) vector b, where Ax = b - :param cg_iters: (int) the maximum number of iterations for converging - :param callback: (function) callback the values of x while converging - :param verbose: (bool) print extra information - :param residual_tol: (float) the break point if the residual is below this value - :return: (numpy float) vector x, where Ax = b - """ - first_basis_vect = b_vec.copy() # the first basis vector - residual = b_vec.copy() # the residual - x_var = np.zeros_like(b_vec) # vector x, where Ax = b - residual_dot_residual = residual.dot(residual) # L2 norm of the residual - - fmt_str = "%10i %10.3g %10.3g" - title_str = "%10s %10s %10s" - if verbose: - print(title_str % ("iter", "residual norm", "soln norm")) - - for i in range(cg_iters): - if callback is not None: - callback(x_var) - if verbose: - print(fmt_str % (i, residual_dot_residual, np.linalg.norm(x_var))) - z_var = f_ax(first_basis_vect) - v_var = residual_dot_residual / first_basis_vect.dot(z_var) - x_var += v_var * first_basis_vect - residual -= v_var * z_var - new_residual_dot_residual = residual.dot(residual) - mu_val = new_residual_dot_residual / residual_dot_residual - first_basis_vect = residual + mu_val * first_basis_vect - - residual_dot_residual = new_residual_dot_residual - if residual_dot_residual < residual_tol: - break - - if callback is not None: - callback(x_var) - if verbose: - print(fmt_str % (i + 1, residual_dot_residual, np.linalg.norm(x_var))) - return x_var diff --git a/stable_baselines/common/cmd_util.py b/stable_baselines/common/cmd_util.py deleted file mode 100644 index c5ff6633..00000000 --- a/stable_baselines/common/cmd_util.py +++ /dev/null @@ -1,204 +0,0 @@ -""" -Helpers for scripts like run_atari.py. -""" - -import os -import warnings - -import gym - -from stable_baselines import logger -from stable_baselines.bench import Monitor -from stable_baselines.common.misc_util import set_global_seeds -from stable_baselines.common.atari_wrappers import make_atari, wrap_deepmind -from stable_baselines.common.misc_util import mpi_rank_or_zero -from stable_baselines.common.vec_env import DummyVecEnv, SubprocVecEnv - - -def make_vec_env(env_id, n_envs=1, seed=None, start_index=0, - monitor_dir=None, wrapper_class=None, - env_kwargs=None, vec_env_cls=None, vec_env_kwargs=None): - """ - Create a wrapped, monitored `VecEnv`. - By default it uses a `DummyVecEnv` which is usually faster - than a `SubprocVecEnv`. - - :param env_id: (str or Type[gym.Env]) the environment ID or the environment class - :param n_envs: (int) the number of environments you wish to have in parallel - :param seed: (int) the initial seed for the random number generator - :param start_index: (int) start rank index - :param monitor_dir: (str) Path to a folder where the monitor files will be saved. - If None, no file will be written, however, the env will still be wrapped - in a Monitor wrapper to provide additional information about training. - :param wrapper_class: (gym.Wrapper or callable) Additional wrapper to use on the environment. - This can also be a function with single argument that wraps the environment in many things. - :param env_kwargs: (dict) Optional keyword argument to pass to the env constructor - :param vec_env_cls: (Type[VecEnv]) A custom `VecEnv` class constructor. Default: None. - :param vec_env_kwargs: (dict) Keyword arguments to pass to the `VecEnv` class constructor. - :return: (VecEnv) The wrapped environment - """ - env_kwargs = {} if env_kwargs is None else env_kwargs - vec_env_kwargs = {} if vec_env_kwargs is None else vec_env_kwargs - - def make_env(rank): - def _init(): - if isinstance(env_id, str): - env = gym.make(env_id) - if len(env_kwargs) > 0: - warnings.warn("No environment class was passed (only an env ID) so `env_kwargs` will be ignored") - else: - env = env_id(**env_kwargs) - if seed is not None: - env.seed(seed + rank) - env.action_space.seed(seed + rank) - # Wrap the env in a Monitor wrapper - # to have additional training information - monitor_path = os.path.join(monitor_dir, str(rank)) if monitor_dir is not None else None - # Create the monitor folder if needed - if monitor_path is not None: - os.makedirs(monitor_dir, exist_ok=True) - env = Monitor(env, filename=monitor_path) - # Optionally, wrap the environment with the provided wrapper - if wrapper_class is not None: - env = wrapper_class(env) - return env - return _init - - # No custom VecEnv is passed - if vec_env_cls is None: - # Default: use a DummyVecEnv - vec_env_cls = DummyVecEnv - - return vec_env_cls([make_env(i + start_index) for i in range(n_envs)], **vec_env_kwargs) - - -def make_atari_env(env_id, num_env, seed, wrapper_kwargs=None, - start_index=0, allow_early_resets=True, - start_method=None, use_subprocess=False): - """ - Create a wrapped, monitored VecEnv for Atari. - - :param env_id: (str) the environment ID - :param num_env: (int) the number of environment you wish to have in subprocesses - :param seed: (int) the initial seed for RNG - :param wrapper_kwargs: (dict) the parameters for wrap_deepmind function - :param start_index: (int) start rank index - :param allow_early_resets: (bool) allows early reset of the environment - :param start_method: (str) method used to start the subprocesses. - See SubprocVecEnv doc for more information - :param use_subprocess: (bool) Whether to use `SubprocVecEnv` or `DummyVecEnv` when - `num_env` > 1, `DummyVecEnv` is usually faster. Default: False - :return: (VecEnv) The atari environment - """ - if wrapper_kwargs is None: - wrapper_kwargs = {} - - def make_env(rank): - def _thunk(): - env = make_atari(env_id) - env.seed(seed + rank) - env = Monitor(env, logger.get_dir() and os.path.join(logger.get_dir(), str(rank)), - allow_early_resets=allow_early_resets) - return wrap_deepmind(env, **wrapper_kwargs) - return _thunk - set_global_seeds(seed) - - # When using one environment, no need to start subprocesses - if num_env == 1 or not use_subprocess: - return DummyVecEnv([make_env(i + start_index) for i in range(num_env)]) - - return SubprocVecEnv([make_env(i + start_index) for i in range(num_env)], - start_method=start_method) - - -def make_mujoco_env(env_id, seed, allow_early_resets=True): - """ - Create a wrapped, monitored gym.Env for MuJoCo. - - :param env_id: (str) the environment ID - :param seed: (int) the initial seed for RNG - :param allow_early_resets: (bool) allows early reset of the environment - :return: (Gym Environment) The mujoco environment - """ - set_global_seeds(seed + 10000 * mpi_rank_or_zero()) - env = gym.make(env_id) - env = Monitor(env, os.path.join(logger.get_dir(), '0'), allow_early_resets=allow_early_resets) - env.seed(seed) - return env - - -def make_robotics_env(env_id, seed, rank=0, allow_early_resets=True): - """ - Create a wrapped, monitored gym.Env for MuJoCo. - - :param env_id: (str) the environment ID - :param seed: (int) the initial seed for RNG - :param rank: (int) the rank of the environment (for logging) - :param allow_early_resets: (bool) allows early reset of the environment - :return: (Gym Environment) The robotic environment - """ - set_global_seeds(seed) - env = gym.make(env_id) - keys = ['observation', 'desired_goal'] - # TODO: remove try-except once most users are running modern Gym - try: # for modern Gym (>=0.15.4) - from gym.wrappers import FilterObservation, FlattenObservation - env = FlattenObservation(FilterObservation(env, keys)) - except ImportError: # for older gym (<=0.15.3) - from gym.wrappers import FlattenDictWrapper # pytype:disable=import-error - env = FlattenDictWrapper(env, keys) - env = Monitor( - env, logger.get_dir() and os.path.join(logger.get_dir(), str(rank)), - info_keywords=('is_success',), allow_early_resets=allow_early_resets) - env.seed(seed) - return env - - -def arg_parser(): - """ - Create an empty argparse.ArgumentParser. - - :return: (ArgumentParser) - """ - import argparse - return argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) - - -def atari_arg_parser(): - """ - Create an argparse.ArgumentParser for run_atari.py. - - :return: (ArgumentParser) parser {'--env': 'BreakoutNoFrameskip-v4', '--seed': 0, '--num-timesteps': int(1e7)} - """ - parser = arg_parser() - parser.add_argument('--env', help='environment ID', default='BreakoutNoFrameskip-v4') - parser.add_argument('--seed', help='RNG seed', type=int, default=0) - parser.add_argument('--num-timesteps', type=int, default=int(1e7)) - return parser - - -def mujoco_arg_parser(): - """ - Create an argparse.ArgumentParser for run_mujoco.py. - - :return: (ArgumentParser) parser {'--env': 'Reacher-v2', '--seed': 0, '--num-timesteps': int(1e6), '--play': False} - """ - parser = arg_parser() - parser.add_argument('--env', help='environment ID', type=str, default='Reacher-v2') - parser.add_argument('--seed', help='RNG seed', type=int, default=0) - parser.add_argument('--num-timesteps', type=int, default=int(1e6)) - parser.add_argument('--play', default=False, action='store_true') - return parser - - -def robotics_arg_parser(): - """ - Create an argparse.ArgumentParser for run_mujoco.py. - - :return: (ArgumentParser) parser {'--env': 'FetchReach-v0', '--seed': 0, '--num-timesteps': int(1e6)} - """ - parser = arg_parser() - parser.add_argument('--env', help='environment ID', type=str, default='FetchReach-v0') - parser.add_argument('--seed', help='RNG seed', type=int, default=0) - parser.add_argument('--num-timesteps', type=int, default=int(1e6)) - return parser diff --git a/stable_baselines/common/console_util.py b/stable_baselines/common/console_util.py deleted file mode 100644 index c8b4c94c..00000000 --- a/stable_baselines/common/console_util.py +++ /dev/null @@ -1,78 +0,0 @@ -from __future__ import print_function - -import numpy as np - - -# ================================================================ -# Misc -# ================================================================ - - -def fmt_row(width, row, header=False): - """ - fits a list of items to at least a certain length - - :param width: (int) the minimum width of the string - :param row: ([Any]) a list of object you wish to get the string representation - :param header: (bool) whether or not to return the string as a header - :return: (str) the string representation of all the elements in 'row', of length >= 'width' - """ - out = " | ".join(fmt_item(x, width) for x in row) - if header: - out = out + "\n" + "-" * len(out) - return out - - -def fmt_item(item, min_width): - """ - fits items to a given string length - - :param item: (Any) the item you wish to get the string representation - :param min_width: (int) the minimum width of the string - :return: (str) the string representation of 'x' of length >= 'l' - """ - if isinstance(item, np.ndarray): - assert item.ndim == 0 - item = item.item() - if isinstance(item, (float, np.float32, np.float64)): - value = abs(item) - if (value < 1e-4 or value > 1e+4) and value > 0: - rep = "%7.2e" % item - else: - rep = "%7.5f" % item - else: - rep = str(item) - return " " * (min_width - len(rep)) + rep - - -COLOR_TO_NUM = dict( - gray=30, - red=31, - green=32, - yellow=33, - blue=34, - magenta=35, - cyan=36, - white=37, - crimson=38 -) - - -def colorize(string, color, bold=False, highlight=False): - """ - Colorize, bold and/or highlight a string for terminal print - - :param string: (str) input string - :param color: (str) the color, the lookup table is the dict at console_util.color2num - :param bold: (bool) if the string should be bold or not - :param highlight: (bool) if the string should be highlighted or not - :return: (str) the stylized output string - """ - attr = [] - num = COLOR_TO_NUM[color] - if highlight: - num += 10 - attr.append(str(num)) - if bold: - attr.append('1') - return '\x1b[%sm%s\x1b[0m' % (';'.join(attr), string) diff --git a/stable_baselines/common/dataset.py b/stable_baselines/common/dataset.py deleted file mode 100644 index b1bb5f79..00000000 --- a/stable_baselines/common/dataset.py +++ /dev/null @@ -1,101 +0,0 @@ -import numpy as np - - -class Dataset(object): - def __init__(self, data_map, shuffle=True): - """ - Data loader that handles batches and shuffling. - WARNING: this will alter the given data_map ordering, as dicts are mutable - - :param data_map: (dict) the input data, where every column is a key - :param shuffle: (bool) Whether to shuffle or not the dataset - Important: this should be disabled for recurrent policies - """ - self.data_map = data_map - self.shuffle = shuffle - self.n_samples = next(iter(data_map.values())).shape[0] - self._next_id = 0 - if self.shuffle: - self.shuffle_dataset() - - def shuffle_dataset(self): - """ - Shuffles the data_map - """ - perm = np.arange(self.n_samples) - np.random.shuffle(perm) - - for key in self.data_map: - self.data_map[key] = self.data_map[key][perm] - - def next_batch(self, batch_size): - """ - returns a batch of data of a given size - - :param batch_size: (int) the size of the batch - :return: (dict) a batch of the input data of size 'batch_size' - """ - if self._next_id >= self.n_samples: - self._next_id = 0 - if self.shuffle: - self.shuffle_dataset() - - cur_id = self._next_id - cur_batch_size = min(batch_size, self.n_samples - self._next_id) - self._next_id += cur_batch_size - - data_map = dict() - for key in self.data_map: - data_map[key] = self.data_map[key][cur_id:cur_id + cur_batch_size] - return data_map - - def iterate_once(self, batch_size): - """ - generator that iterates over the dataset - - :param batch_size: (int) the size of the batch - :return: (dict) a batch of the input data of size 'batch_size' - """ - if self.shuffle: - self.shuffle_dataset() - - while self._next_id <= self.n_samples - batch_size: - yield self.next_batch(batch_size) - self._next_id = 0 - - def subset(self, num_elements, shuffle=True): - """ - Return a subset of the current dataset - - :param num_elements: (int) the number of element you wish to have in the subset - :param shuffle: (bool) Whether to shuffle or not the dataset - :return: (Dataset) a new subset of the current Dataset object - """ - data_map = dict() - for key in self.data_map: - data_map[key] = self.data_map[key][:num_elements] - return Dataset(data_map, shuffle) - - -def iterbatches(arrays, *, num_batches=None, batch_size=None, shuffle=True, include_final_partial_batch=True): - """ - Iterates over arrays in batches, must provide either num_batches or batch_size, the other must be None. - - :param arrays: (tuple) a tuple of arrays - :param num_batches: (int) the number of batches, must be None is batch_size is defined - :param batch_size: (int) the size of the batch, must be None is num_batches is defined - :param shuffle: (bool) enable auto shuffle - :param include_final_partial_batch: (bool) add the last batch if not the same size as the batch_size - :return: (tuples) a tuple of a batch of the arrays - """ - assert (num_batches is None) != (batch_size is None), 'Provide num_batches or batch_size, but not both' - arrays = tuple(map(np.asarray, arrays)) - n_samples = arrays[0].shape[0] - assert all(a.shape[0] == n_samples for a in arrays[1:]) - inds = np.arange(n_samples) - if shuffle: - np.random.shuffle(inds) - sections = np.arange(0, n_samples, batch_size)[1:] if num_batches is None else num_batches - for batch_inds in np.array_split(inds, sections): - if include_final_partial_batch or len(batch_inds) == batch_size: - yield tuple(a[batch_inds] for a in arrays) diff --git a/stable_baselines/common/distributions.py b/stable_baselines/common/distributions.py deleted file mode 100644 index f38dd657..00000000 --- a/stable_baselines/common/distributions.py +++ /dev/null @@ -1,513 +0,0 @@ -import numpy as np -import tensorflow as tf -from tensorflow.python.ops import math_ops -from gym import spaces - -from stable_baselines.common.tf_layers import linear - - -class ProbabilityDistribution(object): - """ - Base class for describing a probability distribution. - """ - def __init__(self): - super(ProbabilityDistribution, self).__init__() - - def flatparam(self): - """ - Return the direct probabilities - - :return: ([float]) the probabilities - """ - raise NotImplementedError - - def mode(self): - """ - Returns the probability - - :return: (Tensorflow Tensor) the deterministic action - """ - raise NotImplementedError - - def neglogp(self, x): - """ - returns the of the negative log likelihood - - :param x: (str) the labels of each index - :return: ([float]) The negative log likelihood of the distribution - """ - # Usually it's easier to define the negative logprob - raise NotImplementedError - - def kl(self, other): - """ - Calculates the Kullback-Leibler divergence from the given probability distribution - - :param other: ([float]) the distribution to compare with - :return: (float) the KL divergence of the two distributions - """ - raise NotImplementedError - - def entropy(self): - """ - Returns Shannon's entropy of the probability - - :return: (float) the entropy - """ - raise NotImplementedError - - def sample(self): - """ - returns a sample from the probability distribution - - :return: (Tensorflow Tensor) the stochastic action - """ - raise NotImplementedError - - def logp(self, x): - """ - returns the of the log likelihood - - :param x: (str) the labels of each index - :return: ([float]) The log likelihood of the distribution - """ - return - self.neglogp(x) - - -class ProbabilityDistributionType(object): - """ - Parametrized family of probability distributions - """ - - def probability_distribution_class(self): - """ - returns the ProbabilityDistribution class of this type - - :return: (Type ProbabilityDistribution) the probability distribution class associated - """ - raise NotImplementedError - - def proba_distribution_from_flat(self, flat): - """ - Returns the probability distribution from flat probabilities - flat: flattened vector of parameters of probability distribution - - :param flat: ([float]) the flat probabilities - :return: (ProbabilityDistribution) the instance of the ProbabilityDistribution associated - """ - return self.probability_distribution_class()(flat) - - def proba_distribution_from_latent(self, pi_latent_vector, vf_latent_vector, init_scale=1.0, init_bias=0.0): - """ - returns the probability distribution from latent values - - :param pi_latent_vector: ([float]) the latent pi values - :param vf_latent_vector: ([float]) the latent vf values - :param init_scale: (float) the initial scale of the distribution - :param init_bias: (float) the initial bias of the distribution - :return: (ProbabilityDistribution) the instance of the ProbabilityDistribution associated - """ - raise NotImplementedError - - def param_shape(self): - """ - returns the shape of the input parameters - - :return: ([int]) the shape - """ - raise NotImplementedError - - def sample_shape(self): - """ - returns the shape of the sampling - - :return: ([int]) the shape - """ - raise NotImplementedError - - def sample_dtype(self): - """ - returns the type of the sampling - - :return: (type) the type - """ - raise NotImplementedError - - def param_placeholder(self, prepend_shape, name=None): - """ - returns the TensorFlow placeholder for the input parameters - - :param prepend_shape: ([int]) the prepend shape - :param name: (str) the placeholder name - :return: (TensorFlow Tensor) the placeholder - """ - return tf.placeholder(dtype=tf.float32, shape=prepend_shape + self.param_shape(), name=name) - - def sample_placeholder(self, prepend_shape, name=None): - """ - returns the TensorFlow placeholder for the sampling - - :param prepend_shape: ([int]) the prepend shape - :param name: (str) the placeholder name - :return: (TensorFlow Tensor) the placeholder - """ - return tf.placeholder(dtype=self.sample_dtype(), shape=prepend_shape + self.sample_shape(), name=name) - - -class CategoricalProbabilityDistributionType(ProbabilityDistributionType): - def __init__(self, n_cat): - """ - The probability distribution type for categorical input - - :param n_cat: (int) the number of categories - """ - self.n_cat = n_cat - - def probability_distribution_class(self): - return CategoricalProbabilityDistribution - - def proba_distribution_from_latent(self, pi_latent_vector, vf_latent_vector, init_scale=1.0, init_bias=0.0): - pdparam = linear(pi_latent_vector, 'pi', self.n_cat, init_scale=init_scale, init_bias=init_bias) - q_values = linear(vf_latent_vector, 'q', self.n_cat, init_scale=init_scale, init_bias=init_bias) - return self.proba_distribution_from_flat(pdparam), pdparam, q_values - - def param_shape(self): - return [self.n_cat] - - def sample_shape(self): - return [] - - def sample_dtype(self): - return tf.int64 - - -class MultiCategoricalProbabilityDistributionType(ProbabilityDistributionType): - def __init__(self, n_vec): - """ - The probability distribution type for multiple categorical input - - :param n_vec: ([int]) the vectors - """ - # Cast the variable because tf does not allow uint32 - self.n_vec = n_vec.astype(np.int32) - # Check that the cast was valid - assert (self.n_vec > 0).all(), "Casting uint32 to int32 was invalid" - - def probability_distribution_class(self): - return MultiCategoricalProbabilityDistribution - - def proba_distribution_from_flat(self, flat): - return MultiCategoricalProbabilityDistribution(self.n_vec, flat) - - def proba_distribution_from_latent(self, pi_latent_vector, vf_latent_vector, init_scale=1.0, init_bias=0.0): - pdparam = linear(pi_latent_vector, 'pi', sum(self.n_vec), init_scale=init_scale, init_bias=init_bias) - q_values = linear(vf_latent_vector, 'q', sum(self.n_vec), init_scale=init_scale, init_bias=init_bias) - return self.proba_distribution_from_flat(pdparam), pdparam, q_values - - def param_shape(self): - return [sum(self.n_vec)] - - def sample_shape(self): - return [len(self.n_vec)] - - def sample_dtype(self): - return tf.int64 - - -class DiagGaussianProbabilityDistributionType(ProbabilityDistributionType): - def __init__(self, size): - """ - The probability distribution type for multivariate Gaussian input - - :param size: (int) the number of dimensions of the multivariate gaussian - """ - self.size = size - - def probability_distribution_class(self): - return DiagGaussianProbabilityDistribution - - def proba_distribution_from_flat(self, flat): - """ - returns the probability distribution from flat probabilities - - :param flat: ([float]) the flat probabilities - :return: (ProbabilityDistribution) the instance of the ProbabilityDistribution associated - """ - return self.probability_distribution_class()(flat) - - def proba_distribution_from_latent(self, pi_latent_vector, vf_latent_vector, init_scale=1.0, init_bias=0.0): - mean = linear(pi_latent_vector, 'pi', self.size, init_scale=init_scale, init_bias=init_bias) - logstd = tf.get_variable(name='pi/logstd', shape=[1, self.size], initializer=tf.zeros_initializer()) - pdparam = tf.concat([mean, mean * 0.0 + logstd], axis=1) - q_values = linear(vf_latent_vector, 'q', self.size, init_scale=init_scale, init_bias=init_bias) - return self.proba_distribution_from_flat(pdparam), mean, q_values - - def param_shape(self): - return [2 * self.size] - - def sample_shape(self): - return [self.size] - - def sample_dtype(self): - return tf.float32 - - -class BernoulliProbabilityDistributionType(ProbabilityDistributionType): - def __init__(self, size): - """ - The probability distribution type for Bernoulli input - - :param size: (int) the number of dimensions of the Bernoulli distribution - """ - self.size = size - - def probability_distribution_class(self): - return BernoulliProbabilityDistribution - - def proba_distribution_from_latent(self, pi_latent_vector, vf_latent_vector, init_scale=1.0, init_bias=0.0): - pdparam = linear(pi_latent_vector, 'pi', self.size, init_scale=init_scale, init_bias=init_bias) - q_values = linear(vf_latent_vector, 'q', self.size, init_scale=init_scale, init_bias=init_bias) - return self.proba_distribution_from_flat(pdparam), pdparam, q_values - - def param_shape(self): - return [self.size] - - def sample_shape(self): - return [self.size] - - def sample_dtype(self): - return tf.int32 - - -class CategoricalProbabilityDistribution(ProbabilityDistribution): - def __init__(self, logits): - """ - Probability distributions from categorical input - - :param logits: ([float]) the categorical logits input - """ - self.logits = logits - super(CategoricalProbabilityDistribution, self).__init__() - - def flatparam(self): - return self.logits - - def mode(self): - return tf.argmax(self.logits, axis=-1) - - def neglogp(self, x): - # Note: we can't use sparse_softmax_cross_entropy_with_logits because - # the implementation does not allow second-order derivatives... - one_hot_actions = tf.one_hot(x, self.logits.get_shape().as_list()[-1]) - return tf.nn.softmax_cross_entropy_with_logits_v2( - logits=self.logits, - labels=tf.stop_gradient(one_hot_actions)) - - def kl(self, other): - a_0 = self.logits - tf.reduce_max(self.logits, axis=-1, keepdims=True) - a_1 = other.logits - tf.reduce_max(other.logits, axis=-1, keepdims=True) - exp_a_0 = tf.exp(a_0) - exp_a_1 = tf.exp(a_1) - z_0 = tf.reduce_sum(exp_a_0, axis=-1, keepdims=True) - z_1 = tf.reduce_sum(exp_a_1, axis=-1, keepdims=True) - p_0 = exp_a_0 / z_0 - return tf.reduce_sum(p_0 * (a_0 - tf.log(z_0) - a_1 + tf.log(z_1)), axis=-1) - - def entropy(self): - a_0 = self.logits - tf.reduce_max(self.logits, axis=-1, keepdims=True) - exp_a_0 = tf.exp(a_0) - z_0 = tf.reduce_sum(exp_a_0, axis=-1, keepdims=True) - p_0 = exp_a_0 / z_0 - return tf.reduce_sum(p_0 * (tf.log(z_0) - a_0), axis=-1) - - def sample(self): - # Gumbel-max trick to sample - # a categorical distribution (see http://amid.fish/humble-gumbel) - uniform = tf.random_uniform(tf.shape(self.logits), dtype=self.logits.dtype) - return tf.argmax(self.logits - tf.log(-tf.log(uniform)), axis=-1) - - @classmethod - def fromflat(cls, flat): - """ - Create an instance of this from new logits values - - :param flat: ([float]) the categorical logits input - :return: (ProbabilityDistribution) the instance from the given categorical input - """ - return cls(flat) - - -class MultiCategoricalProbabilityDistribution(ProbabilityDistribution): - def __init__(self, nvec, flat): - """ - Probability distributions from multicategorical input - - :param nvec: ([int]) the sizes of the different categorical inputs - :param flat: ([float]) the categorical logits input - """ - self.flat = flat - self.categoricals = list(map(CategoricalProbabilityDistribution, tf.split(flat, nvec, axis=-1))) - super(MultiCategoricalProbabilityDistribution, self).__init__() - - def flatparam(self): - return self.flat - - def mode(self): - return tf.stack([p.mode() for p in self.categoricals], axis=-1) - - def neglogp(self, x): - return tf.add_n([p.neglogp(px) for p, px in zip(self.categoricals, tf.unstack(x, axis=-1))]) - - def kl(self, other): - return tf.add_n([p.kl(q) for p, q in zip(self.categoricals, other.categoricals)]) - - def entropy(self): - return tf.add_n([p.entropy() for p in self.categoricals]) - - def sample(self): - return tf.stack([p.sample() for p in self.categoricals], axis=-1) - - @classmethod - def fromflat(cls, flat): - """ - Create an instance of this from new logits values - - :param flat: ([float]) the multi categorical logits input - :return: (ProbabilityDistribution) the instance from the given multi categorical input - """ - raise NotImplementedError - - -class DiagGaussianProbabilityDistribution(ProbabilityDistribution): - def __init__(self, flat): - """ - Probability distributions from multivariate Gaussian input - - :param flat: ([float]) the multivariate Gaussian input data - """ - self.flat = flat - mean, logstd = tf.split(axis=len(flat.shape) - 1, num_or_size_splits=2, value=flat) - self.mean = mean - self.logstd = logstd - self.std = tf.exp(logstd) - super(DiagGaussianProbabilityDistribution, self).__init__() - - def flatparam(self): - return self.flat - - def mode(self): - # Bounds are taken into account outside this class (during training only) - return self.mean - - def neglogp(self, x): - return 0.5 * tf.reduce_sum(tf.square((x - self.mean) / self.std), axis=-1) \ - + 0.5 * np.log(2.0 * np.pi) * tf.cast(tf.shape(x)[-1], tf.float32) \ - + tf.reduce_sum(self.logstd, axis=-1) - - def kl(self, other): - assert isinstance(other, DiagGaussianProbabilityDistribution) - return tf.reduce_sum(other.logstd - self.logstd + (tf.square(self.std) + tf.square(self.mean - other.mean)) / - (2.0 * tf.square(other.std)) - 0.5, axis=-1) - - def entropy(self): - return tf.reduce_sum(self.logstd + .5 * np.log(2.0 * np.pi * np.e), axis=-1) - - def sample(self): - # Bounds are taken into acount outside this class (during training only) - # Otherwise, it changes the distribution and breaks PPO2 for instance - return self.mean + self.std * tf.random_normal(tf.shape(self.mean), - dtype=self.mean.dtype) - - @classmethod - def fromflat(cls, flat): - """ - Create an instance of this from new multivariate Gaussian input - - :param flat: ([float]) the multivariate Gaussian input data - :return: (ProbabilityDistribution) the instance from the given multivariate Gaussian input data - """ - return cls(flat) - - -class BernoulliProbabilityDistribution(ProbabilityDistribution): - def __init__(self, logits): - """ - Probability distributions from Bernoulli input - - :param logits: ([float]) the Bernoulli input data - """ - self.logits = logits - self.probabilities = tf.sigmoid(logits) - super(BernoulliProbabilityDistribution, self).__init__() - - def flatparam(self): - return self.logits - - def mode(self): - return tf.round(self.probabilities) - - def neglogp(self, x): - return tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(logits=self.logits, - labels=tf.cast(x, tf.float32)), - axis=-1) - - def kl(self, other): - return tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(logits=other.logits, - labels=self.probabilities), axis=-1) - \ - tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(logits=self.logits, - labels=self.probabilities), axis=-1) - - def entropy(self): - return tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(logits=self.logits, - labels=self.probabilities), axis=-1) - - def sample(self): - samples_from_uniform = tf.random_uniform(tf.shape(self.probabilities)) - return tf.cast(math_ops.less(samples_from_uniform, self.probabilities), tf.float32) - - @classmethod - def fromflat(cls, flat): - """ - Create an instance of this from new Bernoulli input - - :param flat: ([float]) the Bernoulli input data - :return: (ProbabilityDistribution) the instance from the given Bernoulli input data - """ - return cls(flat) - - -def make_proba_dist_type(ac_space): - """ - return an instance of ProbabilityDistributionType for the correct type of action space - - :param ac_space: (Gym Space) the input action space - :return: (ProbabilityDistributionType) the appropriate instance of a ProbabilityDistributionType - """ - if isinstance(ac_space, spaces.Box): - assert len(ac_space.shape) == 1, "Error: the action space must be a vector" - return DiagGaussianProbabilityDistributionType(ac_space.shape[0]) - elif isinstance(ac_space, spaces.Discrete): - return CategoricalProbabilityDistributionType(ac_space.n) - elif isinstance(ac_space, spaces.MultiDiscrete): - return MultiCategoricalProbabilityDistributionType(ac_space.nvec) - elif isinstance(ac_space, spaces.MultiBinary): - return BernoulliProbabilityDistributionType(ac_space.n) - else: - raise NotImplementedError("Error: probability distribution, not implemented for action space of type {}." - .format(type(ac_space)) + - " Must be of type Gym Spaces: Box, Discrete, MultiDiscrete or MultiBinary.") - - -def shape_el(tensor, index): - """ - get the shape of a TensorFlow Tensor element - - :param tensor: (TensorFlow Tensor) the input tensor - :param index: (int) the element - :return: ([int]) the shape - """ - maybe = tensor.get_shape()[index] - if maybe is not None: - return maybe - else: - return tf.shape(tensor)[index] diff --git a/stable_baselines/common/env_checker.py b/stable_baselines/common/env_checker.py deleted file mode 100644 index bba496b8..00000000 --- a/stable_baselines/common/env_checker.py +++ /dev/null @@ -1,222 +0,0 @@ -import warnings -from typing import Union - -import gym -from gym import spaces -import numpy as np - -from stable_baselines.common.vec_env import DummyVecEnv, VecCheckNan - - -def _enforce_array_obs(observation_space: spaces.Space) -> bool: - """ - Whether to check that the returned observation is a numpy array - it is not mandatory for `Dict` and `Tuple` spaces. - """ - return not isinstance(observation_space, (spaces.Dict, spaces.Tuple)) - - -def _check_image_input(observation_space: spaces.Box) -> None: - """ - Check that the input will be compatible with Stable-Baselines - when the observation is apparently an image. - """ - if observation_space.dtype != np.uint8: - warnings.warn("It seems that your observation is an image but the `dtype` " - "of your observation_space is not `np.uint8`. " - "If your observation is not an image, we recommend you to flatten the observation " - "to have only a 1D vector") - - if np.any(observation_space.low != 0) or np.any(observation_space.high != 255): - warnings.warn("It seems that your observation space is an image but the " - "upper and lower bounds are not in [0, 255]. " - "Because the CNN policy normalize automatically the observation " - "you may encounter issue if the values are not in that range." - ) - - if observation_space.shape[0] < 36 or observation_space.shape[1] < 36: - warnings.warn("The minimal resolution for an image is 36x36 for the default CnnPolicy. " - "You might need to use a custom `cnn_extractor` " - "cf https://stable-baselines.readthedocs.io/en/master/guide/custom_policy.html") - - -def _check_unsupported_obs_spaces(env: gym.Env, observation_space: spaces.Space) -> None: - """Emit warnings when the observation space used is not supported by Stable-Baselines.""" - - if isinstance(observation_space, spaces.Dict) and not isinstance(env, gym.GoalEnv): - warnings.warn("The observation space is a Dict but the environment is not a gym.GoalEnv " - "(cf https://github.com/openai/gym/blob/master/gym/core.py), " - "this is currently not supported by Stable Baselines " - "(cf https://github.com/hill-a/stable-baselines/issues/133), " - "you will need to use a custom policy. " - ) - - if isinstance(observation_space, spaces.Tuple): - warnings.warn("The observation space is a Tuple," - "this is currently not supported by Stable Baselines " - "(cf https://github.com/hill-a/stable-baselines/issues/133), " - "you will need to flatten the observation and maybe use a custom policy. " - ) - - -def _check_nan(env: gym.Env) -> None: - """Check for Inf and NaN using the VecWrapper.""" - vec_env = VecCheckNan(DummyVecEnv([lambda: env])) - for _ in range(10): - action = [env.action_space.sample()] - _, _, _, _ = vec_env.step(action) - - -def _check_obs(obs: Union[tuple, dict, np.ndarray, int], - observation_space: spaces.Space, - method_name: str) -> None: - """ - Check that the observation returned by the environment - correspond to the declared one. - """ - if not isinstance(observation_space, spaces.Tuple): - assert not isinstance(obs, tuple), ("The observation returned by the `{}()` " - "method should be a single value, not a tuple".format(method_name)) - - # The check for a GoalEnv is done by the base class - if isinstance(observation_space, spaces.Discrete): - assert isinstance(obs, int), "The observation returned by `{}()` method must be an int".format(method_name) - elif _enforce_array_obs(observation_space): - assert isinstance(obs, np.ndarray), ("The observation returned by `{}()` " - "method must be a numpy array".format(method_name)) - - assert observation_space.contains(obs), ("The observation returned by the `{}()` " - "method does not match the given observation space".format(method_name)) - - -def _check_returned_values(env: gym.Env, observation_space: spaces.Space, action_space: spaces.Space) -> None: - """ - Check the returned values by the env when calling `.reset()` or `.step()` methods. - """ - # because env inherits from gym.Env, we assume that `reset()` and `step()` methods exists - obs = env.reset() - - _check_obs(obs, observation_space, 'reset') - - # Sample a random action - action = action_space.sample() - data = env.step(action) - - assert len(data) == 4, "The `step()` method must return four values: obs, reward, done, info" - - # Unpack - obs, reward, done, info = data - - _check_obs(obs, observation_space, 'step') - - # We also allow int because the reward will be cast to float - assert isinstance(reward, (float, int)), "The reward returned by `step()` must be a float" - assert isinstance(done, bool), "The `done` signal must be a boolean" - assert isinstance(info, dict), "The `info` returned by `step()` must be a python dictionary" - - if isinstance(env, gym.GoalEnv): - # For a GoalEnv, the keys are checked at reset - assert reward == env.compute_reward(obs['achieved_goal'], obs['desired_goal'], info) - - -def _check_spaces(env: gym.Env) -> None: - """ - Check that the observation and action spaces are defined - and inherit from gym.spaces.Space. - """ - # Helper to link to the code, because gym has no proper documentation - gym_spaces = " cf https://github.com/openai/gym/blob/master/gym/spaces/" - - assert hasattr(env, 'observation_space'), "You must specify an observation space (cf gym.spaces)" + gym_spaces - assert hasattr(env, 'action_space'), "You must specify an action space (cf gym.spaces)" + gym_spaces - - assert isinstance(env.observation_space, - spaces.Space), "The observation space must inherit from gym.spaces" + gym_spaces - assert isinstance(env.action_space, spaces.Space), "The action space must inherit from gym.spaces" + gym_spaces - - -def _check_render(env: gym.Env, warn: bool = True, headless: bool = False) -> None: - """ - Check the declared render modes and the `render()`/`close()` - method of the environment. - - :param env: (gym.Env) The environment to check - :param warn: (bool) Whether to output additional warnings - :param headless: (bool) Whether to disable render modes - that require a graphical interface. False by default. - """ - render_modes = env.metadata.get('render.modes') - if render_modes is None: - if warn: - warnings.warn("No render modes was declared in the environment " - " (env.metadata['render.modes'] is None or not defined), " - "you may have trouble when calling `.render()`") - - else: - # Don't check render mode that require a - # graphical interface (useful for CI) - if headless and 'human' in render_modes: - render_modes.remove('human') - # Check all declared render modes - for render_mode in render_modes: - env.render(mode=render_mode) - env.close() - - -def check_env(env: gym.Env, warn: bool = True, skip_render_check: bool = True) -> None: - """ - Check that an environment follows Gym API. - This is particularly useful when using a custom environment. - Please take a look at https://github.com/openai/gym/blob/master/gym/core.py - for more information about the API. - - It also optionally check that the environment is compatible with Stable-Baselines. - - :param env: (gym.Env) The Gym environment that will be checked - :param warn: (bool) Whether to output additional warnings - mainly related to the interaction with Stable Baselines - :param skip_render_check: (bool) Whether to skip the checks for the render method. - True by default (useful for the CI) - """ - assert isinstance(env, gym.Env), ("Your environment must inherit from the gym.Env class " - "cf https://github.com/openai/gym/blob/master/gym/core.py") - - # ============= Check the spaces (observation and action) ================ - _check_spaces(env) - - # Define aliases for convenience - observation_space = env.observation_space - action_space = env.action_space - - # Warn the user if needed. - # A warning means that the environment may run but not work properly with Stable Baselines algorithms - if warn: - _check_unsupported_obs_spaces(env, observation_space) - - # If image, check the low and high values, the type and the number of channels - # and the shape (minimal value) - if isinstance(observation_space, spaces.Box) and len(observation_space.shape) == 3: - _check_image_input(observation_space) - - if isinstance(observation_space, spaces.Box) and len(observation_space.shape) not in [1, 3]: - warnings.warn("Your observation has an unconventional shape (neither an image, nor a 1D vector). " - "We recommend you to flatten the observation " - "to have only a 1D vector") - - # Check for the action space, it may lead to hard-to-debug issues - if (isinstance(action_space, spaces.Box) and - (np.any(np.abs(action_space.low) != np.abs(action_space.high)) - or np.any(np.abs(action_space.low) > 1) or np.any(np.abs(action_space.high) > 1))): - warnings.warn("We recommend you to use a symmetric and normalized Box action space (range=[-1, 1]) " - "cf https://stable-baselines.readthedocs.io/en/master/guide/rl_tips.html") - - # ============ Check the returned values =============== - _check_returned_values(env, observation_space, action_space) - - # ==== Check the render method and the declared render modes ==== - if not skip_render_check: - _check_render(env, warn=warn) - - # The check only works with numpy arrays - if _enforce_array_obs(observation_space): - _check_nan(env) diff --git a/stable_baselines/common/evaluation.py b/stable_baselines/common/evaluation.py deleted file mode 100644 index 2c911f99..00000000 --- a/stable_baselines/common/evaluation.py +++ /dev/null @@ -1,82 +0,0 @@ -import typing -from typing import Callable, List, Optional, Tuple, Union - -import gym -import numpy as np - -from stable_baselines.common.vec_env import VecEnv - -if typing.TYPE_CHECKING: - from stable_baselines.common.base_class import BaseRLModel - - -def evaluate_policy( - model: "BaseRLModel", - env: Union[gym.Env, VecEnv], - n_eval_episodes: int = 10, - deterministic: bool = True, - render: bool = False, - callback: Optional[Callable] = None, - reward_threshold: Optional[float] = None, - return_episode_rewards: bool = False, -) -> Union[Tuple[float, float], Tuple[List[float], List[int]]]: - """ - Runs policy for ``n_eval_episodes`` episodes and returns average reward. - This is made to work only with one env. - - :param model: (BaseRLModel) The RL agent you want to evaluate. - :param env: (gym.Env or VecEnv) The gym environment. In the case of a ``VecEnv`` - this must contain only one environment. - :param n_eval_episodes: (int) Number of episode to evaluate the agent - :param deterministic: (bool) Whether to use deterministic or stochastic actions - :param render: (bool) Whether to render the environment or not - :param callback: (callable) callback function to do additional checks, - called after each step. - :param reward_threshold: (float) Minimum expected reward per episode, - this will raise an error if the performance is not met - :param return_episode_rewards: (Optional[float]) If True, a list of reward per episode - will be returned instead of the mean. - :return: (float, float) Mean reward per episode, std of reward per episode - returns ([float], [int]) when ``return_episode_rewards`` is True - """ - if isinstance(env, VecEnv): - assert env.num_envs == 1, "You must pass only one environment when using this function" - - is_recurrent = model.policy.recurrent - - episode_rewards, episode_lengths = [], [] - for i in range(n_eval_episodes): - # Avoid double reset, as VecEnv are reset automatically - if not isinstance(env, VecEnv) or i == 0: - obs = env.reset() - # Because recurrent policies need the same observation space during training and evaluation, we need to pad - # observation to match training shape. See https://github.com/hill-a/stable-baselines/issues/1015 - if is_recurrent: - zero_completed_obs = np.zeros((model.n_envs,) + model.observation_space.shape) - zero_completed_obs[0, :] = obs - obs = zero_completed_obs - done, state = False, None - episode_reward = 0.0 - episode_length = 0 - while not done: - action, state = model.predict(obs, state=state, deterministic=deterministic) - new_obs, reward, done, _info = env.step(action) - if is_recurrent: - obs[0, :] = new_obs - else: - obs = new_obs - episode_reward += reward - if callback is not None: - callback(locals(), globals()) - episode_length += 1 - if render: - env.render() - episode_rewards.append(episode_reward) - episode_lengths.append(episode_length) - mean_reward = np.mean(episode_rewards) - std_reward = np.std(episode_rewards) - if reward_threshold is not None: - assert mean_reward > reward_threshold, "Mean reward below threshold: {:.2f} < {:.2f}".format(mean_reward, reward_threshold) - if return_episode_rewards: - return episode_rewards, episode_lengths - return mean_reward, std_reward diff --git a/stable_baselines/common/identity_env.py b/stable_baselines/common/identity_env.py deleted file mode 100644 index 41fd9ef5..00000000 --- a/stable_baselines/common/identity_env.py +++ /dev/null @@ -1,105 +0,0 @@ -import numpy as np -from typing import Optional - -from gym import Env, Space -from gym.spaces import Discrete, MultiDiscrete, MultiBinary, Box - - -class IdentityEnv(Env): - def __init__(self, - dim: Optional[int] = None, - space: Optional[Space] = None, - ep_length: int = 100): - """ - Identity environment for testing purposes - - :param dim: the size of the action and observation dimension you want - to learn. Provide at most one of `dim` and `space`. If both are - None, then initialization proceeds with `dim=1` and `space=None`. - :param space: the action and observation space. Provide at most one of - `dim` and `space`. - :param ep_length: the length of each episode in timesteps - """ - if space is None: - if dim is None: - dim = 1 - space = Discrete(dim) - else: - assert dim is None, "arguments for both 'dim' and 'space' provided: at most one allowed" - - self.action_space = self.observation_space = space - self.ep_length = ep_length - self.current_step = 0 - self.num_resets = -1 # Becomes 0 after __init__ exits. - self.reset() - - def reset(self): - self.current_step = 0 - self.num_resets += 1 - self._choose_next_state() - return self.state - - def step(self, action): - reward = self._get_reward(action) - self._choose_next_state() - self.current_step += 1 - done = self.current_step >= self.ep_length - return self.state, reward, done, {} - - def _choose_next_state(self): - self.state = self.action_space.sample() - - def _get_reward(self, action): - return 1 if np.all(self.state == action) else 0 - - def render(self, mode='human'): - pass - - -class IdentityEnvBox(IdentityEnv): - def __init__(self, low=-1, high=1, eps=0.05, ep_length=100): - """ - Identity environment for testing purposes - - :param low: (float) the lower bound of the box dim - :param high: (float) the upper bound of the box dim - :param eps: (float) the epsilon bound for correct value - :param ep_length: (int) the length of each episode in timesteps - """ - space = Box(low=low, high=high, shape=(1,), dtype=np.float32) - super().__init__(ep_length=ep_length, space=space) - self.eps = eps - - def step(self, action): - reward = self._get_reward(action) - self._choose_next_state() - self.current_step += 1 - done = self.current_step >= self.ep_length - return self.state, reward, done, {} - - def _get_reward(self, action): - return 1 if (self.state - self.eps) <= action <= (self.state + self.eps) else 0 - - -class IdentityEnvMultiDiscrete(IdentityEnv): - def __init__(self, dim=1, ep_length=100): - """ - Identity environment for testing purposes - - :param dim: (int) the size of the dimensions you want to learn - :param ep_length: (int) the length of each episode in timesteps - """ - space = MultiDiscrete([dim, dim]) - super().__init__(ep_length=ep_length, space=space) - - -class IdentityEnvMultiBinary(IdentityEnv): - def __init__(self, dim=1, ep_length=100): - """ - Identity environment for testing purposes - - :param dim: (int) the size of the dimensions you want to learn - :param ep_length: (int) the length of each episode in timesteps - """ - space = MultiBinary(dim) - super().__init__(ep_length=ep_length, space=space) diff --git a/stable_baselines/common/input.py b/stable_baselines/common/input.py deleted file mode 100644 index e8cfa3c8..00000000 --- a/stable_baselines/common/input.py +++ /dev/null @@ -1,51 +0,0 @@ -import numpy as np -import tensorflow as tf -from gym.spaces import Discrete, Box, MultiBinary, MultiDiscrete - - -def observation_input(ob_space, batch_size=None, name='Ob', scale=False): - """ - Build observation input with encoding depending on the observation space type - - When using Box ob_space, the input will be normalized between [1, 0] on the bounds ob_space.low and ob_space.high. - - :param ob_space: (Gym Space) The observation space - :param batch_size: (int) batch size for input - (default is None, so that resulting input placeholder can take tensors with any batch size) - :param name: (str) tensorflow variable name for input placeholder - :param scale: (bool) whether or not to scale the input - :return: (TensorFlow Tensor, TensorFlow Tensor) input_placeholder, processed_input_tensor - """ - if isinstance(ob_space, Discrete): - observation_ph = tf.placeholder(shape=(batch_size,), dtype=tf.int32, name=name) - processed_observations = tf.cast(tf.one_hot(observation_ph, ob_space.n), tf.float32) - return observation_ph, processed_observations - - elif isinstance(ob_space, Box): - observation_ph = tf.placeholder(shape=(batch_size,) + ob_space.shape, dtype=ob_space.dtype, name=name) - processed_observations = tf.cast(observation_ph, tf.float32) - # rescale to [1, 0] if the bounds are defined - if (scale and - not np.any(np.isinf(ob_space.low)) and not np.any(np.isinf(ob_space.high)) and - np.any((ob_space.high - ob_space.low) != 0)): - - # equivalent to processed_observations / 255.0 when bounds are set to [255, 0] - processed_observations = ((processed_observations - ob_space.low) / (ob_space.high - ob_space.low)) - return observation_ph, processed_observations - - elif isinstance(ob_space, MultiBinary): - observation_ph = tf.placeholder(shape=(batch_size, ob_space.n), dtype=tf.int32, name=name) - processed_observations = tf.cast(observation_ph, tf.float32) - return observation_ph, processed_observations - - elif isinstance(ob_space, MultiDiscrete): - observation_ph = tf.placeholder(shape=(batch_size, len(ob_space.nvec)), dtype=tf.int32, name=name) - processed_observations = tf.concat([ - tf.cast(tf.one_hot(input_split, ob_space.nvec[i]), tf.float32) for i, input_split - in enumerate(tf.split(observation_ph, len(ob_space.nvec), axis=-1)) - ], axis=-1) - return observation_ph, processed_observations - - else: - raise NotImplementedError("Error: the model does not support input space of type {}".format( - type(ob_space).__name__)) diff --git a/stable_baselines/common/math_util.py b/stable_baselines/common/math_util.py deleted file mode 100644 index 06ce27cb..00000000 --- a/stable_baselines/common/math_util.py +++ /dev/null @@ -1,140 +0,0 @@ -import numpy as np -import scipy.signal - - -def safe_mean(arr): - """ - Compute the mean of an array if there is at least one element. - For empty array, return nan. It is used for logging only. - - :param arr: (np.ndarray) - :return: (float) - """ - return np.nan if len(arr) == 0 else np.mean(arr) - - -def discount(vector, gamma): - """ - computes discounted sums along 0th dimension of vector x. - y[t] = x[t] + gamma*x[t+1] + gamma^2*x[t+2] + ... + gamma^k x[t+k], - where k = len(x) - t - 1 - - :param vector: (np.ndarray) the input vector - :param gamma: (float) the discount value - :return: (np.ndarray) the output vector - """ - assert vector.ndim >= 1 - return scipy.signal.lfilter([1], [1, -gamma], vector[::-1], axis=0)[::-1] - - -def explained_variance(y_pred, y_true): - """ - Computes fraction of variance that ypred explains about y. - Returns 1 - Var[y-ypred] / Var[y] - - interpretation: - ev=0 => might as well have predicted zero - ev=1 => perfect prediction - ev<0 => worse than just predicting zero - - :param y_pred: (np.ndarray) the prediction - :param y_true: (np.ndarray) the expected value - :return: (float) explained variance of ypred and y - """ - assert y_true.ndim == 1 and y_pred.ndim == 1 - var_y = np.var(y_true) - return np.nan if var_y == 0 else 1 - np.var(y_true - y_pred) / var_y - - -def explained_variance_2d(y_pred, y_true): - """ - Computes fraction of variance that ypred explains about y, for 2D arrays. - Returns 1 - Var[y-ypred] / Var[y] - - interpretation: - ev=0 => might as well have predicted zero - ev=1 => perfect prediction - ev<0 => worse than just predicting zero - - :param y_pred: (np.ndarray) the prediction - :param y_true: (np.ndarray) the expected value - :return: (float) explained variance of ypred and y - """ - assert y_true.ndim == 2 and y_pred.ndim == 2 - var_y = np.var(y_true, axis=0) - explained_var = 1 - np.var(y_true - y_pred) / var_y - explained_var[var_y < 1e-10] = 0 - return explained_var - - -def flatten_arrays(arrs): - """ - flattens a list of arrays down to 1D - - :param arrs: ([np.ndarray]) arrays - :return: (np.ndarray) 1D flattened array - """ - return np.concatenate([arr.flat for arr in arrs]) - - -def unflatten_vector(vec, shapes): - """ - reshape a flattened array - - :param vec: (np.ndarray) 1D arrays - :param shapes: (tuple) - :return: ([np.ndarray]) reshaped array - """ - i = 0 - arrs = [] - for shape in shapes: - size = np.prod(shape) - arr = vec[i:i + size].reshape(shape) - arrs.append(arr) - i += size - return arrs - - -def discount_with_boundaries(rewards, episode_starts, gamma): - """ - computes discounted sums along 0th dimension of x (reward), while taking into account the start of each episode. - y[t] = x[t] + gamma*x[t+1] + gamma^2*x[t+2] + ... + gamma^k x[t+k], - where k = len(x) - t - 1 - - :param rewards: (np.ndarray) the input vector (rewards) - :param episode_starts: (np.ndarray) 2d array of bools, indicating when a new episode has started - :param gamma: (float) the discount factor - :return: (np.ndarray) the output vector (discounted rewards) - """ - discounted_rewards = np.zeros_like(rewards) - n_samples = rewards.shape[0] - discounted_rewards[n_samples - 1] = rewards[n_samples - 1] - for step in range(n_samples - 2, -1, -1): - discounted_rewards[step] = rewards[step] + gamma * discounted_rewards[step + 1] * (1 - episode_starts[step + 1]) - return discounted_rewards - - -def scale_action(action_space, action): - """ - Rescale the action from [low, high] to [-1, 1] - (no need for symmetric action space) - - :param action_space: (gym.spaces.box.Box) - :param action: (np.ndarray) - :return: (np.ndarray) - """ - low, high = action_space.low, action_space.high - return 2.0 * ((action - low) / (high - low)) - 1.0 - - -def unscale_action(action_space, scaled_action): - """ - Rescale the action from [-1, 1] to [low, high] - (no need for symmetric action space) - - :param action_space: (gym.spaces.box.Box) - :param action: (np.ndarray) - :return: (np.ndarray) - """ - low, high = action_space.low, action_space.high - return low + (0.5 * (scaled_action + 1.0) * (high - low)) diff --git a/stable_baselines/common/misc_util.py b/stable_baselines/common/misc_util.py deleted file mode 100644 index 2d8730c0..00000000 --- a/stable_baselines/common/misc_util.py +++ /dev/null @@ -1,67 +0,0 @@ -import random - -import gym -import numpy as np -import tensorflow as tf - - -def zipsame(*seqs): - """ - Performes a zip function, but asserts that all zipped elements are of the same size - - :param seqs: a list of arrays that are zipped together - :return: the zipped arguments - """ - length = len(seqs[0]) - assert all(len(seq) == length for seq in seqs[1:]) - return zip(*seqs) - - -def set_global_seeds(seed): - """ - set the seed for python random, tensorflow, numpy and gym spaces - - :param seed: (int) the seed - """ - tf.set_random_seed(seed) - np.random.seed(seed) - random.seed(seed) - # prng was removed in latest gym version - if hasattr(gym.spaces, 'prng'): - gym.spaces.prng.seed(seed) - - -def boolean_flag(parser, name, default=False, help_msg=None): - """ - Add a boolean flag to argparse parser. - - :param parser: (argparse.Parser) parser to add the flag to - :param name: (str) -- will enable the flag, while --no- will disable it - :param default: (bool) default value of the flag - :param help_msg: (str) help string for the flag - """ - dest = name.replace('-', '_') - parser.add_argument("--" + name, action="store_true", default=default, dest=dest, help=help_msg) - parser.add_argument("--no-" + name, action="store_false", dest=dest) - - -def mpi_rank_or_zero(): - """ - Return the MPI rank if mpi is installed. Otherwise, return 0. - :return: (int) - """ - try: - import mpi4py - return mpi4py.MPI.COMM_WORLD.Get_rank() - except ImportError: - return 0 - - -def flatten_lists(listoflists): - """ - Flatten a python list of list - - :param listoflists: (list(list)) - :return: (list) - """ - return [el for list_ in listoflists for el in list_] diff --git a/stable_baselines/common/mpi_adam.py b/stable_baselines/common/mpi_adam.py deleted file mode 100644 index 02c3de8b..00000000 --- a/stable_baselines/common/mpi_adam.py +++ /dev/null @@ -1,121 +0,0 @@ -import tensorflow as tf -import numpy as np -import mpi4py - -import stable_baselines.common.tf_util as tf_utils - - -class MpiAdam(object): - def __init__(self, var_list, *, beta1=0.9, beta2=0.999, epsilon=1e-08, scale_grad_by_procs=True, comm=None, - sess=None): - """ - A parallel MPI implementation of the Adam optimizer for TensorFlow - https://arxiv.org/abs/1412.6980 - - :param var_list: ([TensorFlow Tensor]) the variables - :param beta1: (float) Adam beta1 parameter - :param beta2: (float) Adam beta1 parameter - :param epsilon: (float) to help with preventing arithmetic issues - :param scale_grad_by_procs: (bool) if the scaling should be done by processes - :param comm: (MPI Communicators) if None, mpi4py.MPI.COMM_WORLD - :param sess: (TensorFlow Session) if None, tf.get_default_session() - """ - self.var_list = var_list - self.beta1 = beta1 - self.beta2 = beta2 - self.epsilon = epsilon - self.scale_grad_by_procs = scale_grad_by_procs - size = sum(tf_utils.numel(v) for v in var_list) - # Exponential moving average of gradient values - # "first moment estimate" m in the paper - self.exp_avg = np.zeros(size, 'float32') - # Exponential moving average of squared gradient values - # "second raw moment estimate" v in the paper - self.exp_avg_sq = np.zeros(size, 'float32') - self.step = 0 - self.setfromflat = tf_utils.SetFromFlat(var_list, sess=sess) - self.getflat = tf_utils.GetFlat(var_list, sess=sess) - self.comm = mpi4py.MPI.COMM_WORLD if comm is None else comm - - def update(self, local_grad, learning_rate): - """ - update the values of the graph - - :param local_grad: (numpy float) the gradient - :param learning_rate: (float) the learning_rate for the update - """ - if self.step % 100 == 0: - self.check_synced() - local_grad = local_grad.astype('float32') - global_grad = np.zeros_like(local_grad) - self.comm.Allreduce(local_grad, global_grad, op=mpi4py.MPI.SUM) - if self.scale_grad_by_procs: - global_grad /= self.comm.Get_size() - - self.step += 1 - # Learning rate with bias correction - step_size = learning_rate * np.sqrt(1 - self.beta2 ** self.step) / (1 - self.beta1 ** self.step) - # Decay the first and second moment running average coefficient - self.exp_avg = self.beta1 * self.exp_avg + (1 - self.beta1) * global_grad - self.exp_avg_sq = self.beta2 * self.exp_avg_sq + (1 - self.beta2) * (global_grad * global_grad) - step = (- step_size) * self.exp_avg / (np.sqrt(self.exp_avg_sq) + self.epsilon) - self.setfromflat(self.getflat() + step) - - def sync(self): - """ - syncronize the MPI threads - """ - theta = self.getflat() - self.comm.Bcast(theta, root=0) - self.setfromflat(theta) - - def check_synced(self): - """ - confirm the MPI threads are synced - """ - if self.comm.Get_rank() == 0: # this is root - theta = self.getflat() - self.comm.Bcast(theta, root=0) - else: - thetalocal = self.getflat() - thetaroot = np.empty_like(thetalocal) - self.comm.Bcast(thetaroot, root=0) - assert (thetaroot == thetalocal).all(), (thetaroot, thetalocal) - - -@tf_utils.in_session -def test_mpi_adam(): - """ - tests the MpiAdam object's functionality - """ - np.random.seed(0) - tf.set_random_seed(0) - - a_var = tf.Variable(np.random.randn(3).astype('float32')) - b_var = tf.Variable(np.random.randn(2, 5).astype('float32')) - loss = tf.reduce_sum(tf.square(a_var)) + tf.reduce_sum(tf.sin(b_var)) - - learning_rate = 1e-2 - update_op = tf.train.AdamOptimizer(learning_rate).minimize(loss) - do_update = tf_utils.function([], loss, updates=[update_op]) - - tf.get_default_session().run(tf.global_variables_initializer()) - for step in range(10): - print(step, do_update()) - - tf.set_random_seed(0) - tf.get_default_session().run(tf.global_variables_initializer()) - - var_list = [a_var, b_var] - lossandgrad = tf_utils.function([], [loss, tf_utils.flatgrad(loss, var_list)], updates=[update_op]) - adam = MpiAdam(var_list) - - for step in range(10): - loss, grad = lossandgrad() - adam.update(grad, learning_rate) - print(step, loss) - - -if __name__ == "__main__": - # Run with mpirun -np 2 python - test_mpi_adam() diff --git a/stable_baselines/common/mpi_moments.py b/stable_baselines/common/mpi_moments.py deleted file mode 100644 index 5f01d119..00000000 --- a/stable_baselines/common/mpi_moments.py +++ /dev/null @@ -1,71 +0,0 @@ -from mpi4py import MPI -import numpy as np - -from stable_baselines.common.misc_util import zipsame - - -def mpi_mean(arr, axis=0, comm=None, keepdims=False): - """ - calculates the mean of an array, using MPI - - :param arr: (np.ndarray) - :param axis: (int or tuple or list) the axis to run the means over - :param comm: (MPI Communicators) if None, MPI.COMM_WORLD - :param keepdims: (bool) keep the other dimensions intact - :return: (np.ndarray or Number) the result of the sum - """ - arr = np.asarray(arr) - assert arr.ndim > 0 - if comm is None: - comm = MPI.COMM_WORLD - xsum = arr.sum(axis=axis, keepdims=keepdims) - size = xsum.size - localsum = np.zeros(size + 1, arr.dtype) - localsum[:size] = xsum.ravel() - localsum[size] = arr.shape[axis] - globalsum = np.zeros_like(localsum) - comm.Allreduce(localsum, globalsum, op=MPI.SUM) - return globalsum[:size].reshape(xsum.shape) / globalsum[size], globalsum[size] - - -def mpi_moments(arr, axis=0, comm=None, keepdims=False): - """ - calculates the mean and std of an array, using MPI - - :param arr: (np.ndarray) - :param axis: (int or tuple or list) the axis to run the moments over - :param comm: (MPI Communicators) if None, MPI.COMM_WORLD - :param keepdims: (bool) keep the other dimensions intact - :return: (np.ndarray or Number) the result of the moments - """ - arr = np.asarray(arr) - assert arr.ndim > 0 - mean, count = mpi_mean(arr, axis=axis, comm=comm, keepdims=True) - sqdiffs = np.square(arr - mean) - meansqdiff, count1 = mpi_mean(sqdiffs, axis=axis, comm=comm, keepdims=True) - assert count1 == count - std = np.sqrt(meansqdiff) - if not keepdims: - newshape = mean.shape[:axis] + mean.shape[axis + 1:] - mean = mean.reshape(newshape) - std = std.reshape(newshape) - return mean, std, count - - -def _helper_runningmeanstd(): - comm = MPI.COMM_WORLD - np.random.seed(0) - for (triple, axis) in [ - ((np.random.randn(3), np.random.randn(4), np.random.randn(5)), 0), - ((np.random.randn(3, 2), np.random.randn(4, 2), np.random.randn(5, 2)), 0), - ((np.random.randn(2, 3), np.random.randn(2, 4), np.random.randn(2, 4)), 1)]: - - arr = np.concatenate(triple, axis=axis) - ms1 = [arr.mean(axis=axis), arr.std(axis=axis), arr.shape[axis]] - - ms2 = mpi_moments(triple[comm.Get_rank()], axis=axis) - - for (res_1, res_2) in zipsame(ms1, ms2): - print(res_1, res_2) - assert np.allclose(res_1, res_2) - print("ok!") diff --git a/stable_baselines/common/mpi_running_mean_std.py b/stable_baselines/common/mpi_running_mean_std.py deleted file mode 100644 index 5e52129b..00000000 --- a/stable_baselines/common/mpi_running_mean_std.py +++ /dev/null @@ -1,105 +0,0 @@ -import mpi4py -import tensorflow as tf -import numpy as np - -import stable_baselines.common.tf_util as tf_util - - -class RunningMeanStd(object): - def __init__(self, epsilon=1e-2, shape=()): - """ - calulates the running mean and std of a data stream - https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Parallel_algorithm - - :param epsilon: (float) helps with arithmetic issues - :param shape: (tuple) the shape of the data stream's output - """ - self._sum = tf.get_variable( - dtype=tf.float64, - shape=shape, - initializer=tf.constant_initializer(0.0), - name="runningsum", trainable=False) - self._sumsq = tf.get_variable( - dtype=tf.float64, - shape=shape, - initializer=tf.constant_initializer(epsilon), - name="runningsumsq", trainable=False) - self._count = tf.get_variable( - dtype=tf.float64, - shape=(), - initializer=tf.constant_initializer(epsilon), - name="count", trainable=False) - self.shape = shape - - self.mean = tf.cast(self._sum / self._count, tf.float32) - self.std = tf.sqrt(tf.maximum(tf.cast(self._sumsq / self._count, tf.float32) - tf.square(self.mean), - 1e-2)) - - newsum = tf.placeholder(shape=self.shape, dtype=tf.float64, name='sum') - newsumsq = tf.placeholder(shape=self.shape, dtype=tf.float64, name='var') - newcount = tf.placeholder(shape=[], dtype=tf.float64, name='count') - self.incfiltparams = tf_util.function([newsum, newsumsq, newcount], [], - updates=[tf.assign_add(self._sum, newsum), - tf.assign_add(self._sumsq, newsumsq), - tf.assign_add(self._count, newcount)]) - - def update(self, data): - """ - update the running mean and std - - :param data: (np.ndarray) the data - """ - data = data.astype('float64') - data_size = int(np.prod(self.shape)) - totalvec = np.zeros(data_size * 2 + 1, 'float64') - addvec = np.concatenate([data.sum(axis=0).ravel(), np.square(data).sum(axis=0).ravel(), - np.array([len(data)], dtype='float64')]) - mpi4py.MPI.COMM_WORLD.Allreduce(addvec, totalvec, op=mpi4py.MPI.SUM) - self.incfiltparams(totalvec[0: data_size].reshape(self.shape), - totalvec[data_size: 2 * data_size].reshape(self.shape), totalvec[2 * data_size]) - - -@tf_util.in_session -def test_dist(): - """ - test the running mean std - """ - np.random.seed(0) - p_1, p_2, p_3 = (np.random.randn(3, 1), np.random.randn(4, 1), np.random.randn(5, 1)) - q_1, q_2, q_3 = (np.random.randn(6, 1), np.random.randn(7, 1), np.random.randn(8, 1)) - - comm = mpi4py.MPI.COMM_WORLD - assert comm.Get_size() == 2 - if comm.Get_rank() == 0: - x_1, x_2, x_3 = p_1, p_2, p_3 - elif comm.Get_rank() == 1: - x_1, x_2, x_3 = q_1, q_2, q_3 - else: - assert False - - rms = RunningMeanStd(epsilon=0.0, shape=(1,)) - tf_util.initialize() - - rms.update(x_1) - rms.update(x_2) - rms.update(x_3) - - bigvec = np.concatenate([p_1, p_2, p_3, q_1, q_2, q_3]) - - def checkallclose(var_1, var_2): - print(var_1, var_2) - return np.allclose(var_1, var_2) - - assert checkallclose( - bigvec.mean(axis=0), - rms.mean.eval(), - ) - assert checkallclose( - bigvec.std(axis=0), - rms.std.eval(), - ) - - -if __name__ == "__main__": - # Run with mpirun -np 2 python - test_dist() diff --git a/stable_baselines/common/noise.py b/stable_baselines/common/noise.py deleted file mode 100644 index eecfd9fc..00000000 --- a/stable_baselines/common/noise.py +++ /dev/null @@ -1,123 +0,0 @@ -from abc import ABC, abstractmethod - -import numpy as np - - -class AdaptiveParamNoiseSpec(object): - """ - Implements adaptive parameter noise - - :param initial_stddev: (float) the initial value for the standard deviation of the noise - :param desired_action_stddev: (float) the desired value for the standard deviation of the noise - :param adoption_coefficient: (float) the update coefficient for the standard deviation of the noise - """ - - def __init__(self, initial_stddev=0.1, desired_action_stddev=0.1, adoption_coefficient=1.01): - self.initial_stddev = initial_stddev - self.desired_action_stddev = desired_action_stddev - self.adoption_coefficient = adoption_coefficient - - self.current_stddev = initial_stddev - - def adapt(self, distance): - """ - update the standard deviation for the parameter noise - - :param distance: (float) the noise distance applied to the parameters - """ - if distance > self.desired_action_stddev: - # Decrease stddev. - self.current_stddev /= self.adoption_coefficient - else: - # Increase stddev. - self.current_stddev *= self.adoption_coefficient - - def get_stats(self): - """ - return the standard deviation for the parameter noise - - :return: (dict) the stats of the noise - """ - return {'param_noise_stddev': self.current_stddev} - - def __repr__(self): - fmt = 'AdaptiveParamNoiseSpec(initial_stddev={}, desired_action_stddev={}, adoption_coefficient={})' - return fmt.format(self.initial_stddev, self.desired_action_stddev, self.adoption_coefficient) - - -class ActionNoise(ABC): - """ - The action noise base class - """ - - def __init__(self): - super(ActionNoise, self).__init__() - - def reset(self) -> None: - """ - call end of episode reset for the noise - """ - pass - - @abstractmethod - def __call__(self) -> np.ndarray: - raise NotImplementedError() - - -class NormalActionNoise(ActionNoise): - """ - A Gaussian action noise - - :param mean: (float) the mean value of the noise - :param sigma: (float) the scale of the noise (std here) - """ - - def __init__(self, mean, sigma): - super().__init__() - self._mu = mean - self._sigma = sigma - - def __call__(self) -> np.ndarray: - return np.random.normal(self._mu, self._sigma) - - def __repr__(self) -> str: - return 'NormalActionNoise(mu={}, sigma={})'.format(self._mu, self._sigma) - - -class OrnsteinUhlenbeckActionNoise(ActionNoise): - """ - A Ornstein Uhlenbeck action noise, this is designed to approximate brownian motion with friction. - - Based on http://math.stackexchange.com/questions/1287634/implementing-ornstein-uhlenbeck-in-matlab - - :param mean: (float) the mean of the noise - :param sigma: (float) the scale of the noise - :param theta: (float) the rate of mean reversion - :param dt: (float) the timestep for the noise - :param initial_noise: ([float]) the initial value for the noise output, (if None: 0) - """ - - def __init__(self, mean, sigma, theta=.15, dt=1e-2, initial_noise=None): - super().__init__() - self._theta = theta - self._mu = mean - self._sigma = sigma - self._dt = dt - self.initial_noise = initial_noise - self.noise_prev = None - self.reset() - - def __call__(self) -> np.ndarray: - noise = self.noise_prev + self._theta * (self._mu - self.noise_prev) * self._dt + \ - self._sigma * np.sqrt(self._dt) * np.random.normal(size=self._mu.shape) - self.noise_prev = noise - return noise - - def reset(self) -> None: - """ - reset the Ornstein Uhlenbeck noise, to the initial position - """ - self.noise_prev = self.initial_noise if self.initial_noise is not None else np.zeros_like(self._mu) - - def __repr__(self) -> str: - return 'OrnsteinUhlenbeckActionNoise(mu={}, sigma={})'.format(self._mu, self._sigma) diff --git a/stable_baselines/common/policies.py b/stable_baselines/common/policies.py deleted file mode 100644 index a2f3cc7f..00000000 --- a/stable_baselines/common/policies.py +++ /dev/null @@ -1,752 +0,0 @@ -import warnings -from itertools import zip_longest -from abc import ABC, abstractmethod - -import numpy as np -import tensorflow as tf -from gym.spaces import Discrete - -from stable_baselines.common.tf_util import batch_to_seq, seq_to_batch -from stable_baselines.common.tf_layers import conv, linear, conv_to_fc, lstm -from stable_baselines.common.distributions import make_proba_dist_type, CategoricalProbabilityDistribution, \ - MultiCategoricalProbabilityDistribution, DiagGaussianProbabilityDistribution, BernoulliProbabilityDistribution -from stable_baselines.common.input import observation_input - - -def nature_cnn(scaled_images, **kwargs): - """ - CNN from Nature paper. - - :param scaled_images: (TensorFlow Tensor) Image input placeholder - :param kwargs: (dict) Extra keywords parameters for the convolutional layers of the CNN - :return: (TensorFlow Tensor) The CNN output layer - """ - activ = tf.nn.relu - layer_1 = activ(conv(scaled_images, 'c1', n_filters=32, filter_size=8, stride=4, init_scale=np.sqrt(2), **kwargs)) - layer_2 = activ(conv(layer_1, 'c2', n_filters=64, filter_size=4, stride=2, init_scale=np.sqrt(2), **kwargs)) - layer_3 = activ(conv(layer_2, 'c3', n_filters=64, filter_size=3, stride=1, init_scale=np.sqrt(2), **kwargs)) - layer_3 = conv_to_fc(layer_3) - return activ(linear(layer_3, 'fc1', n_hidden=512, init_scale=np.sqrt(2))) - - -def mlp_extractor(flat_observations, net_arch, act_fun): - """ - Constructs an MLP that receives observations as an input and outputs a latent representation for the policy and - a value network. The ``net_arch`` parameter allows to specify the amount and size of the hidden layers and how many - of them are shared between the policy network and the value network. It is assumed to be a list with the following - structure: - - 1. An arbitrary length (zero allowed) number of integers each specifying the number of units in a shared layer. - If the number of ints is zero, there will be no shared layers. - 2. An optional dict, to specify the following non-shared layers for the value network and the policy network. - It is formatted like ``dict(vf=[], pi=[])``. - If it is missing any of the keys (pi or vf), no non-shared layers (empty list) is assumed. - - For example to construct a network with one shared layer of size 55 followed by two non-shared layers for the value - network of size 255 and a single non-shared layer of size 128 for the policy network, the following layers_spec - would be used: ``[55, dict(vf=[255, 255], pi=[128])]``. A simple shared network topology with two layers of size 128 - would be specified as [128, 128]. - - :param flat_observations: (tf.Tensor) The observations to base policy and value function on. - :param net_arch: ([int or dict]) The specification of the policy and value networks. - See above for details on its formatting. - :param act_fun: (tf function) The activation function to use for the networks. - :return: (tf.Tensor, tf.Tensor) latent_policy, latent_value of the specified network. - If all layers are shared, then ``latent_policy == latent_value`` - """ - latent = flat_observations - policy_only_layers = [] # Layer sizes of the network that only belongs to the policy network - value_only_layers = [] # Layer sizes of the network that only belongs to the value network - - # Iterate through the shared layers and build the shared parts of the network - for idx, layer in enumerate(net_arch): - if isinstance(layer, int): # Check that this is a shared layer - layer_size = layer - latent = act_fun(linear(latent, "shared_fc{}".format(idx), layer_size, init_scale=np.sqrt(2))) - else: - assert isinstance(layer, dict), "Error: the net_arch list can only contain ints and dicts" - if 'pi' in layer: - assert isinstance(layer['pi'], list), "Error: net_arch[-1]['pi'] must contain a list of integers." - policy_only_layers = layer['pi'] - - if 'vf' in layer: - assert isinstance(layer['vf'], list), "Error: net_arch[-1]['vf'] must contain a list of integers." - value_only_layers = layer['vf'] - break # From here on the network splits up in policy and value network - - # Build the non-shared part of the network - latent_policy = latent - latent_value = latent - for idx, (pi_layer_size, vf_layer_size) in enumerate(zip_longest(policy_only_layers, value_only_layers)): - if pi_layer_size is not None: - assert isinstance(pi_layer_size, int), "Error: net_arch[-1]['pi'] must only contain integers." - latent_policy = act_fun(linear(latent_policy, "pi_fc{}".format(idx), pi_layer_size, init_scale=np.sqrt(2))) - - if vf_layer_size is not None: - assert isinstance(vf_layer_size, int), "Error: net_arch[-1]['vf'] must only contain integers." - latent_value = act_fun(linear(latent_value, "vf_fc{}".format(idx), vf_layer_size, init_scale=np.sqrt(2))) - - return latent_policy, latent_value - - -class BasePolicy(ABC): - """ - The base policy object - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batches to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param scale: (bool) whether or not to scale the input - :param obs_phs: (TensorFlow Tensor, TensorFlow Tensor) a tuple containing an override for observation placeholder - and the processed observation placeholder respectively - :param add_action_ph: (bool) whether or not to create an action placeholder - """ - - recurrent = False - - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse=False, scale=False, - obs_phs=None, add_action_ph=False): - self.n_env = n_env - self.n_steps = n_steps - self.n_batch = n_batch - with tf.variable_scope("input", reuse=False): - if obs_phs is None: - self._obs_ph, self._processed_obs = observation_input(ob_space, n_batch, scale=scale) - else: - self._obs_ph, self._processed_obs = obs_phs - - self._action_ph = None - if add_action_ph: - self._action_ph = tf.placeholder(dtype=ac_space.dtype, shape=(n_batch,) + ac_space.shape, - name="action_ph") - self.sess = sess - self.reuse = reuse - self.ob_space = ob_space - self.ac_space = ac_space - - @property - def is_discrete(self): - """bool: is action space discrete.""" - return isinstance(self.ac_space, Discrete) - - @property - def initial_state(self): - """ - The initial state of the policy. For feedforward policies, None. For a recurrent policy, - a NumPy array of shape (self.n_env, ) + state_shape. - """ - assert not self.recurrent, "When using recurrent policies, you must overwrite `initial_state()` method" - return None - - @property - def obs_ph(self): - """tf.Tensor: placeholder for observations, shape (self.n_batch, ) + self.ob_space.shape.""" - return self._obs_ph - - @property - def processed_obs(self): - """tf.Tensor: processed observations, shape (self.n_batch, ) + self.ob_space.shape. - - The form of processing depends on the type of the observation space, and the parameters - whether scale is passed to the constructor; see observation_input for more information.""" - return self._processed_obs - - @property - def action_ph(self): - """tf.Tensor: placeholder for actions, shape (self.n_batch, ) + self.ac_space.shape.""" - return self._action_ph - - @staticmethod - def _kwargs_check(feature_extraction, kwargs): - """ - Ensure that the user is not passing wrong keywords - when using policy_kwargs. - - :param feature_extraction: (str) - :param kwargs: (dict) - """ - # When using policy_kwargs parameter on model creation, - # all keywords arguments must be consumed by the policy constructor except - # the ones for the cnn_extractor network (cf nature_cnn()), where the keywords arguments - # are not passed explicitly (using **kwargs to forward the arguments) - # that's why there should be not kwargs left when using the mlp_extractor - # (in that case the keywords arguments are passed explicitly) - if feature_extraction == 'mlp' and len(kwargs) > 0: - raise ValueError("Unknown keywords for policy: {}".format(kwargs)) - - @abstractmethod - def step(self, obs, state=None, mask=None): - """ - Returns the policy for a single step - - :param obs: ([float] or [int]) The current observation of the environment - :param state: ([float]) The last states (used in recurrent policies) - :param mask: ([float]) The last masks (used in recurrent policies) - :return: ([float], [float], [float], [float]) actions, values, states, neglogp - """ - raise NotImplementedError - - @abstractmethod - def proba_step(self, obs, state=None, mask=None): - """ - Returns the action probability for a single step - - :param obs: ([float] or [int]) The current observation of the environment - :param state: ([float]) The last states (used in recurrent policies) - :param mask: ([float]) The last masks (used in recurrent policies) - :return: ([float]) the action probability - """ - raise NotImplementedError - - -class ActorCriticPolicy(BasePolicy): - """ - Policy object that implements actor critic - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param scale: (bool) whether or not to scale the input - """ - - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse=False, scale=False): - super(ActorCriticPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse=reuse, - scale=scale) - self._pdtype = make_proba_dist_type(ac_space) - self._policy = None - self._proba_distribution = None - self._value_fn = None - self._action = None - self._deterministic_action = None - - def _setup_init(self): - """Sets up the distributions, actions, and value.""" - with tf.variable_scope("output", reuse=True): - assert self.policy is not None and self.proba_distribution is not None and self.value_fn is not None - self._action = self.proba_distribution.sample() - self._deterministic_action = self.proba_distribution.mode() - self._neglogp = self.proba_distribution.neglogp(self.action) - if isinstance(self.proba_distribution, CategoricalProbabilityDistribution): - self._policy_proba = tf.nn.softmax(self.policy) - elif isinstance(self.proba_distribution, DiagGaussianProbabilityDistribution): - self._policy_proba = [self.proba_distribution.mean, self.proba_distribution.std] - elif isinstance(self.proba_distribution, BernoulliProbabilityDistribution): - self._policy_proba = tf.nn.sigmoid(self.policy) - elif isinstance(self.proba_distribution, MultiCategoricalProbabilityDistribution): - self._policy_proba = [tf.nn.softmax(categorical.flatparam()) - for categorical in self.proba_distribution.categoricals] - else: - self._policy_proba = [] # it will return nothing, as it is not implemented - self._value_flat = self.value_fn[:, 0] - - @property - def pdtype(self): - """ProbabilityDistributionType: type of the distribution for stochastic actions.""" - return self._pdtype - - @property - def policy(self): - """tf.Tensor: policy output, e.g. logits.""" - return self._policy - - @property - def proba_distribution(self): - """ProbabilityDistribution: distribution of stochastic actions.""" - return self._proba_distribution - - @property - def value_fn(self): - """tf.Tensor: value estimate, of shape (self.n_batch, 1)""" - return self._value_fn - - @property - def value_flat(self): - """tf.Tensor: value estimate, of shape (self.n_batch, )""" - return self._value_flat - - @property - def action(self): - """tf.Tensor: stochastic action, of shape (self.n_batch, ) + self.ac_space.shape.""" - return self._action - - @property - def deterministic_action(self): - """tf.Tensor: deterministic action, of shape (self.n_batch, ) + self.ac_space.shape.""" - return self._deterministic_action - - @property - def neglogp(self): - """tf.Tensor: negative log likelihood of the action sampled by self.action.""" - return self._neglogp - - @property - def policy_proba(self): - """tf.Tensor: parameters of the probability distribution. Depends on pdtype.""" - return self._policy_proba - - @abstractmethod - def step(self, obs, state=None, mask=None, deterministic=False): - """ - Returns the policy for a single step - - :param obs: ([float] or [int]) The current observation of the environment - :param state: ([float]) The last states (used in recurrent policies) - :param mask: ([float]) The last masks (used in recurrent policies) - :param deterministic: (bool) Whether or not to return deterministic actions. - :return: ([float], [float], [float], [float]) actions, values, states, neglogp - """ - raise NotImplementedError - - @abstractmethod - def value(self, obs, state=None, mask=None): - """ - Returns the value for a single step - - :param obs: ([float] or [int]) The current observation of the environment - :param state: ([float]) The last states (used in recurrent policies) - :param mask: ([float]) The last masks (used in recurrent policies) - :return: ([float]) The associated value of the action - """ - raise NotImplementedError - - -class RecurrentActorCriticPolicy(ActorCriticPolicy): - """ - Actor critic policy object uses a previous state in the computation for the current step. - NOTE: this class is not limited to recurrent neural network policies, - see https://github.com/hill-a/stable-baselines/issues/241 - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param state_shape: (tuple) shape of the per-environment state space. - :param reuse: (bool) If the policy is reusable or not - :param scale: (bool) whether or not to scale the input - """ - - recurrent = True - - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, - state_shape, reuse=False, scale=False): - super(RecurrentActorCriticPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, - n_batch, reuse=reuse, scale=scale) - - with tf.variable_scope("input", reuse=False): - self._dones_ph = tf.placeholder(tf.float32, (n_batch, ), name="dones_ph") # (done t-1) - state_ph_shape = (self.n_env, ) + tuple(state_shape) - self._states_ph = tf.placeholder(tf.float32, state_ph_shape, name="states_ph") - - initial_state_shape = (self.n_env, ) + tuple(state_shape) - self._initial_state = np.zeros(initial_state_shape, dtype=np.float32) - - @property - def initial_state(self): - return self._initial_state - - @property - def dones_ph(self): - """tf.Tensor: placeholder for whether episode has terminated (done), shape (self.n_batch, ). - Internally used to reset the state before the next episode starts.""" - return self._dones_ph - - @property - def states_ph(self): - """tf.Tensor: placeholder for states, shape (self.n_env, ) + state_shape.""" - return self._states_ph - - @abstractmethod - def value(self, obs, state=None, mask=None): - """ - Cf base class doc. - """ - raise NotImplementedError - - -class LstmPolicy(RecurrentActorCriticPolicy): - """ - Policy object that implements actor critic, using LSTMs. - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param n_lstm: (int) The number of LSTM cells (for recurrent policies) - :param reuse: (bool) If the policy is reusable or not - :param layers: ([int]) The size of the Neural network before the LSTM layer (if None, default to [64, 64]) - :param net_arch: (list) Specification of the actor-critic policy network architecture. Notation similar to the - format described in mlp_extractor but with additional support for a 'lstm' entry in the shared network part. - :param act_fun: (tf.func) the activation function to use in the neural network. - :param cnn_extractor: (function (TensorFlow Tensor, ``**kwargs``): (TensorFlow Tensor)) the CNN feature extraction - :param layer_norm: (bool) Whether or not to use layer normalizing LSTMs - :param feature_extraction: (str) The feature extraction type ("cnn" or "mlp") - :param kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - recurrent = True - - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, n_lstm=256, reuse=False, layers=None, - net_arch=None, act_fun=tf.tanh, cnn_extractor=nature_cnn, layer_norm=False, feature_extraction="cnn", - **kwargs): - # state_shape = [n_lstm * 2] dim because of the cell and hidden states of the LSTM - super(LstmPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, - state_shape=(2 * n_lstm, ), reuse=reuse, - scale=(feature_extraction == "cnn")) - - self._kwargs_check(feature_extraction, kwargs) - - if net_arch is None: # Legacy mode - if layers is None: - layers = [64, 64] - else: - warnings.warn("The layers parameter is deprecated. Use the net_arch parameter instead.") - - with tf.variable_scope("model", reuse=reuse): - if feature_extraction == "cnn": - extracted_features = cnn_extractor(self.processed_obs, **kwargs) - else: - extracted_features = tf.layers.flatten(self.processed_obs) - for i, layer_size in enumerate(layers): - extracted_features = act_fun(linear(extracted_features, 'pi_fc' + str(i), n_hidden=layer_size, - init_scale=np.sqrt(2))) - input_sequence = batch_to_seq(extracted_features, self.n_env, n_steps) - masks = batch_to_seq(self.dones_ph, self.n_env, n_steps) - rnn_output, self.snew = lstm(input_sequence, masks, self.states_ph, 'lstm1', n_hidden=n_lstm, - layer_norm=layer_norm) - rnn_output = seq_to_batch(rnn_output) - value_fn = linear(rnn_output, 'vf', 1) - - self._proba_distribution, self._policy, self.q_value = \ - self.pdtype.proba_distribution_from_latent(rnn_output, rnn_output) - - self._value_fn = value_fn - else: # Use the new net_arch parameter - if layers is not None: - warnings.warn("The new net_arch parameter overrides the deprecated layers parameter.") - if feature_extraction == "cnn": - raise NotImplementedError() - - with tf.variable_scope("model", reuse=reuse): - latent = tf.layers.flatten(self.processed_obs) - policy_only_layers = [] # Layer sizes of the network that only belongs to the policy network - value_only_layers = [] # Layer sizes of the network that only belongs to the value network - - # Iterate through the shared layers and build the shared parts of the network - lstm_layer_constructed = False - for idx, layer in enumerate(net_arch): - if isinstance(layer, int): # Check that this is a shared layer - layer_size = layer - latent = act_fun(linear(latent, "shared_fc{}".format(idx), layer_size, init_scale=np.sqrt(2))) - elif layer == "lstm": - if lstm_layer_constructed: - raise ValueError("The net_arch parameter must only contain one occurrence of 'lstm'!") - input_sequence = batch_to_seq(latent, self.n_env, n_steps) - masks = batch_to_seq(self.dones_ph, self.n_env, n_steps) - rnn_output, self.snew = lstm(input_sequence, masks, self.states_ph, 'lstm1', n_hidden=n_lstm, - layer_norm=layer_norm) - latent = seq_to_batch(rnn_output) - lstm_layer_constructed = True - else: - assert isinstance(layer, dict), "Error: the net_arch list can only contain ints and dicts" - if 'pi' in layer: - assert isinstance(layer['pi'], - list), "Error: net_arch[-1]['pi'] must contain a list of integers." - policy_only_layers = layer['pi'] - - if 'vf' in layer: - assert isinstance(layer['vf'], - list), "Error: net_arch[-1]['vf'] must contain a list of integers." - value_only_layers = layer['vf'] - break # From here on the network splits up in policy and value network - - # Build the non-shared part of the policy-network - latent_policy = latent - for idx, pi_layer_size in enumerate(policy_only_layers): - if pi_layer_size == "lstm": - raise NotImplementedError("LSTMs are only supported in the shared part of the policy network.") - assert isinstance(pi_layer_size, int), "Error: net_arch[-1]['pi'] must only contain integers." - latent_policy = act_fun( - linear(latent_policy, "pi_fc{}".format(idx), pi_layer_size, init_scale=np.sqrt(2))) - - # Build the non-shared part of the value-network - latent_value = latent - for idx, vf_layer_size in enumerate(value_only_layers): - if vf_layer_size == "lstm": - raise NotImplementedError("LSTMs are only supported in the shared part of the value function " - "network.") - assert isinstance(vf_layer_size, int), "Error: net_arch[-1]['vf'] must only contain integers." - latent_value = act_fun( - linear(latent_value, "vf_fc{}".format(idx), vf_layer_size, init_scale=np.sqrt(2))) - - if not lstm_layer_constructed: - raise ValueError("The net_arch parameter must contain at least one occurrence of 'lstm'!") - - self._value_fn = linear(latent_value, 'vf', 1) - # TODO: why not init_scale = 0.001 here like in the feedforward - self._proba_distribution, self._policy, self.q_value = \ - self.pdtype.proba_distribution_from_latent(latent_policy, latent_value) - self._setup_init() - - def step(self, obs, state=None, mask=None, deterministic=False): - if deterministic: - return self.sess.run([self.deterministic_action, self.value_flat, self.snew, self.neglogp], - {self.obs_ph: obs, self.states_ph: state, self.dones_ph: mask}) - else: - return self.sess.run([self.action, self.value_flat, self.snew, self.neglogp], - {self.obs_ph: obs, self.states_ph: state, self.dones_ph: mask}) - - def proba_step(self, obs, state=None, mask=None): - return self.sess.run(self.policy_proba, {self.obs_ph: obs, self.states_ph: state, self.dones_ph: mask}) - - def value(self, obs, state=None, mask=None): - return self.sess.run(self.value_flat, {self.obs_ph: obs, self.states_ph: state, self.dones_ph: mask}) - - -class FeedForwardPolicy(ActorCriticPolicy): - """ - Policy object that implements actor critic, using a feed forward neural network. - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param layers: ([int]) (deprecated, use net_arch instead) The size of the Neural network for the policy - (if None, default to [64, 64]) - :param net_arch: (list) Specification of the actor-critic policy network architecture (see mlp_extractor - documentation for details). - :param act_fun: (tf.func) the activation function to use in the neural network. - :param cnn_extractor: (function (TensorFlow Tensor, ``**kwargs``): (TensorFlow Tensor)) the CNN feature extraction - :param feature_extraction: (str) The feature extraction type ("cnn" or "mlp") - :param kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse=False, layers=None, net_arch=None, - act_fun=tf.tanh, cnn_extractor=nature_cnn, feature_extraction="cnn", **kwargs): - super(FeedForwardPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse=reuse, - scale=(feature_extraction == "cnn")) - - self._kwargs_check(feature_extraction, kwargs) - - if layers is not None: - warnings.warn("Usage of the `layers` parameter is deprecated! Use net_arch instead " - "(it has a different semantics though).", DeprecationWarning) - if net_arch is not None: - warnings.warn("The new `net_arch` parameter overrides the deprecated `layers` parameter!", - DeprecationWarning) - - if net_arch is None: - if layers is None: - layers = [64, 64] - net_arch = [dict(vf=layers, pi=layers)] - - with tf.variable_scope("model", reuse=reuse): - if feature_extraction == "cnn": - pi_latent = vf_latent = cnn_extractor(self.processed_obs, **kwargs) - else: - pi_latent, vf_latent = mlp_extractor(tf.layers.flatten(self.processed_obs), net_arch, act_fun) - - self._value_fn = linear(vf_latent, 'vf', 1) - - self._proba_distribution, self._policy, self.q_value = \ - self.pdtype.proba_distribution_from_latent(pi_latent, vf_latent, init_scale=0.01) - - self._setup_init() - - def step(self, obs, state=None, mask=None, deterministic=False): - if deterministic: - action, value, neglogp = self.sess.run([self.deterministic_action, self.value_flat, self.neglogp], - {self.obs_ph: obs}) - else: - action, value, neglogp = self.sess.run([self.action, self.value_flat, self.neglogp], - {self.obs_ph: obs}) - return action, value, self.initial_state, neglogp - - def proba_step(self, obs, state=None, mask=None): - return self.sess.run(self.policy_proba, {self.obs_ph: obs}) - - def value(self, obs, state=None, mask=None): - return self.sess.run(self.value_flat, {self.obs_ph: obs}) - - -class CnnPolicy(FeedForwardPolicy): - """ - Policy object that implements actor critic, using a CNN (the nature CNN) - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param _kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse=False, **_kwargs): - super(CnnPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse, - feature_extraction="cnn", **_kwargs) - - -class CnnLstmPolicy(LstmPolicy): - """ - Policy object that implements actor critic, using LSTMs with a CNN feature extraction - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param n_lstm: (int) The number of LSTM cells (for recurrent policies) - :param reuse: (bool) If the policy is reusable or not - :param kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, n_lstm=256, reuse=False, **_kwargs): - super(CnnLstmPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, n_lstm, reuse, - layer_norm=False, feature_extraction="cnn", **_kwargs) - - -class CnnLnLstmPolicy(LstmPolicy): - """ - Policy object that implements actor critic, using a layer normalized LSTMs with a CNN feature extraction - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param n_lstm: (int) The number of LSTM cells (for recurrent policies) - :param reuse: (bool) If the policy is reusable or not - :param kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, n_lstm=256, reuse=False, **_kwargs): - super(CnnLnLstmPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, n_lstm, reuse, - layer_norm=True, feature_extraction="cnn", **_kwargs) - - -class MlpPolicy(FeedForwardPolicy): - """ - Policy object that implements actor critic, using a MLP (2 layers of 64) - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param _kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse=False, **_kwargs): - super(MlpPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse, - feature_extraction="mlp", **_kwargs) - - -class MlpLstmPolicy(LstmPolicy): - """ - Policy object that implements actor critic, using LSTMs with a MLP feature extraction - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param n_lstm: (int) The number of LSTM cells (for recurrent policies) - :param reuse: (bool) If the policy is reusable or not - :param kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, n_lstm=256, reuse=False, **_kwargs): - super(MlpLstmPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, n_lstm, reuse, - layer_norm=False, feature_extraction="mlp", **_kwargs) - - -class MlpLnLstmPolicy(LstmPolicy): - """ - Policy object that implements actor critic, using a layer normalized LSTMs with a MLP feature extraction - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param n_lstm: (int) The number of LSTM cells (for recurrent policies) - :param reuse: (bool) If the policy is reusable or not - :param kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, n_lstm=256, reuse=False, **_kwargs): - super(MlpLnLstmPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, n_lstm, reuse, - layer_norm=True, feature_extraction="mlp", **_kwargs) - - -_policy_registry = { - ActorCriticPolicy: { - "CnnPolicy": CnnPolicy, - "CnnLstmPolicy": CnnLstmPolicy, - "CnnLnLstmPolicy": CnnLnLstmPolicy, - "MlpPolicy": MlpPolicy, - "MlpLstmPolicy": MlpLstmPolicy, - "MlpLnLstmPolicy": MlpLnLstmPolicy, - } -} - - -def get_policy_from_name(base_policy_type, name): - """ - returns the registed policy from the base type and name - - :param base_policy_type: (BasePolicy) the base policy object - :param name: (str) the policy name - :return: (base_policy_type) the policy - """ - if base_policy_type not in _policy_registry: - raise ValueError("Error: the policy type {} is not registered!".format(base_policy_type)) - if name not in _policy_registry[base_policy_type]: - raise ValueError("Error: unknown policy type {}, the only registed policy type are: {}!" - .format(name, list(_policy_registry[base_policy_type].keys()))) - return _policy_registry[base_policy_type][name] - - -def register_policy(name, policy): - """ - returns the registed policy from the base type and name - - :param name: (str) the policy name - :param policy: (subclass of BasePolicy) the policy - """ - sub_class = None - for cls in BasePolicy.__subclasses__(): - if issubclass(policy, cls): - sub_class = cls - break - if sub_class is None: - raise ValueError("Error: the policy {} is not of any known subclasses of BasePolicy!".format(policy)) - - if sub_class not in _policy_registry: - _policy_registry[sub_class] = {} - if name in _policy_registry[sub_class]: - raise ValueError("Error: the name {} is alreay registered for a different policy, will not override." - .format(name)) - _policy_registry[sub_class][name] = policy diff --git a/stable_baselines/common/runners.py b/stable_baselines/common/runners.py deleted file mode 100644 index f5253e4d..00000000 --- a/stable_baselines/common/runners.py +++ /dev/null @@ -1,209 +0,0 @@ -from abc import ABC, abstractmethod -import typing -from typing import Union, Optional, Any - -import gym -import numpy as np - -from stable_baselines.common.callbacks import BaseCallback -from stable_baselines.common.vec_env import VecEnv - -if typing.TYPE_CHECKING: - from stable_baselines.common.base_class import BaseRLModel # pytype: disable=pyi-error - - -class AbstractEnvRunner(ABC): - def __init__(self, *, env: Union[gym.Env, VecEnv], model: 'BaseRLModel', n_steps: int): - """ - Collect experience by running `n_steps` in the environment. - Note: if this is a `VecEnv`, the total number of steps will - be `n_steps * n_envs`. - - :param env: (Union[gym.Env, VecEnv]) The environment to learn from - :param model: (BaseRLModel) The model to learn - :param n_steps: (int) The number of steps to run for each environment - """ - self.env = env - self.model = model - n_envs = env.num_envs - self.batch_ob_shape = (n_envs * n_steps,) + env.observation_space.shape - self.obs = np.zeros((n_envs,) + env.observation_space.shape, dtype=env.observation_space.dtype.name) - self.obs[:] = env.reset() - self.n_steps = n_steps - self.states = model.initial_state # pytype: disable=attribute-error - self.dones = [False for _ in range(n_envs)] - self.callback = None # type: Optional[BaseCallback] - self.continue_training = True - self.n_envs = n_envs - - def run(self, callback: Optional[BaseCallback] = None) -> Any: - """ - Collect experience. - - :param callback: (Optional[BaseCallback]) The callback that will be called - at each environment step. - """ - self.callback = callback - self.continue_training = True - return self._run() - - @abstractmethod - def _run(self) -> Any: - """ - This method must be overwritten by child class. - """ - raise NotImplementedError - - -def traj_segment_generator(policy, env, horizon, reward_giver=None, gail=False, callback=None): - """ - Compute target value using TD(lambda) estimator, and advantage with GAE(lambda) - :param policy: (MLPPolicy) the policy - :param env: (Gym Environment) the environment - :param horizon: (int) the number of timesteps to run per batch - :param reward_giver: (TransitionClassifier) the reward predicter from obsevation and action - :param gail: (bool) Whether we are using this generator for standard trpo or with gail - :param callback: (BaseCallback) - :return: (dict) generator that returns a dict with the following keys: - - observations: (np.ndarray) observations - - rewards: (numpy float) rewards (if gail is used it is the predicted reward) - - true_rewards: (numpy float) if gail is used it is the original reward - - vpred: (numpy float) action logits - - dones: (numpy bool) dones (is end of episode, used for logging) - - episode_starts: (numpy bool) - True if first timestep of an episode, used for GAE - - actions: (np.ndarray) actions - - nextvpred: (numpy float) next action logits - - ep_rets: (float) cumulated current episode reward - - ep_lens: (int) the length of the current episode - - ep_true_rets: (float) the real environment reward - - continue_training: (bool) Whether to continue training - or stop early (triggered by the callback) - """ - # Check when using GAIL - assert not (gail and reward_giver is None), "You must pass a reward giver when using GAIL" - - # Initialize state variables - step = 0 - action = env.action_space.sample() # not used, just so we have the datatype - observation = env.reset() - - cur_ep_ret = 0 # return in current episode - current_it_len = 0 # len of current iteration - current_ep_len = 0 # len of current episode - cur_ep_true_ret = 0 - ep_true_rets = [] - ep_rets = [] # returns of completed episodes in this segment - ep_lens = [] # Episode lengths - - # Initialize history arrays - observations = np.array([observation for _ in range(horizon)]) - true_rewards = np.zeros(horizon, 'float32') - rewards = np.zeros(horizon, 'float32') - vpreds = np.zeros(horizon, 'float32') - episode_starts = np.zeros(horizon, 'bool') - dones = np.zeros(horizon, 'bool') - actions = np.array([action for _ in range(horizon)]) - states = policy.initial_state - episode_start = True # marks if we're on first timestep of an episode - done = False - - callback.on_rollout_start() - - while True: - action, vpred, states, _ = policy.step(observation.reshape(-1, *observation.shape), states, done) - # Slight weirdness here because we need value function at time T - # before returning segment [0, T-1] so we get the correct - # terminal value - if step > 0 and step % horizon == 0: - callback.update_locals(locals()) - callback.on_rollout_end() - yield { - "observations": observations, - "rewards": rewards, - "dones": dones, - "episode_starts": episode_starts, - "true_rewards": true_rewards, - "vpred": vpreds, - "actions": actions, - "nextvpred": vpred[0] * (1 - episode_start), - "ep_rets": ep_rets, - "ep_lens": ep_lens, - "ep_true_rets": ep_true_rets, - "total_timestep": current_it_len, - 'continue_training': True - } - _, vpred, _, _ = policy.step(observation.reshape(-1, *observation.shape)) - # Be careful!!! if you change the downstream algorithm to aggregate - # several of these batches, then be sure to do a deepcopy - ep_rets = [] - ep_true_rets = [] - ep_lens = [] - # Reset current iteration length - current_it_len = 0 - callback.on_rollout_start() - i = step % horizon - observations[i] = observation - vpreds[i] = vpred[0] - actions[i] = action[0] - episode_starts[i] = episode_start - - clipped_action = action - # Clip the actions to avoid out of bound error - if isinstance(env.action_space, gym.spaces.Box): - clipped_action = np.clip(action, env.action_space.low, env.action_space.high) - - if gail: - reward = reward_giver.get_reward(observation, clipped_action[0]) - observation, true_reward, done, info = env.step(clipped_action[0]) - else: - observation, reward, done, info = env.step(clipped_action[0]) - true_reward = reward - - if callback is not None: - callback.update_locals(locals()) - if callback.on_step() is False: - # We have to return everything so pytype does not complain - yield { - "observations": observations, - "rewards": rewards, - "dones": dones, - "episode_starts": episode_starts, - "true_rewards": true_rewards, - "vpred": vpreds, - "actions": actions, - "nextvpred": vpred[0] * (1 - episode_start), - "ep_rets": ep_rets, - "ep_lens": ep_lens, - "ep_true_rets": ep_true_rets, - "total_timestep": current_it_len, - 'continue_training': False - } - return - - rewards[i] = reward - true_rewards[i] = true_reward - dones[i] = done - episode_start = done - - cur_ep_ret += reward - cur_ep_true_ret += true_reward - current_it_len += 1 - current_ep_len += 1 - if done: - # Retrieve unnormalized reward if using Monitor wrapper - maybe_ep_info = info.get('episode') - if maybe_ep_info is not None: - if not gail: - cur_ep_ret = maybe_ep_info['r'] - cur_ep_true_ret = maybe_ep_info['r'] - - ep_rets.append(cur_ep_ret) - ep_true_rets.append(cur_ep_true_ret) - ep_lens.append(current_ep_len) - cur_ep_ret = 0 - cur_ep_true_ret = 0 - current_ep_len = 0 - if not isinstance(env, VecEnv): - observation = env.reset() - step += 1 diff --git a/stable_baselines/common/running_mean_std.py b/stable_baselines/common/running_mean_std.py deleted file mode 100644 index d6a03d6e..00000000 --- a/stable_baselines/common/running_mean_std.py +++ /dev/null @@ -1,37 +0,0 @@ -import numpy as np - - -class RunningMeanStd(object): - def __init__(self, epsilon=1e-4, shape=()): - """ - calulates the running mean and std of a data stream - https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Parallel_algorithm - - :param epsilon: (float) helps with arithmetic issues - :param shape: (tuple) the shape of the data stream's output - """ - self.mean = np.zeros(shape, 'float64') - self.var = np.ones(shape, 'float64') - self.count = epsilon - - def update(self, arr): - batch_mean = np.mean(arr, axis=0) - batch_var = np.var(arr, axis=0) - batch_count = arr.shape[0] - self.update_from_moments(batch_mean, batch_var, batch_count) - - def update_from_moments(self, batch_mean, batch_var, batch_count): - delta = batch_mean - self.mean - tot_count = self.count + batch_count - - new_mean = self.mean + delta * batch_count / tot_count - m_a = self.var * self.count - m_b = batch_var * batch_count - m_2 = m_a + m_b + np.square(delta) * self.count * batch_count / (self.count + batch_count) - new_var = m_2 / (self.count + batch_count) - - new_count = batch_count + self.count - - self.mean = new_mean - self.var = new_var - self.count = new_count diff --git a/stable_baselines/common/save_util.py b/stable_baselines/common/save_util.py deleted file mode 100644 index 70a9fa54..00000000 --- a/stable_baselines/common/save_util.py +++ /dev/null @@ -1,173 +0,0 @@ -import base64 -from collections import OrderedDict -import io -import json -import pickle - -import cloudpickle -import numpy as np - - -def is_json_serializable(item): - """ - Test if an object is serializable into JSON - - :param item: (object) The object to be tested for JSON serialization. - :return: (bool) True if object is JSON serializable, false otherwise. - """ - # Try with try-except struct. - json_serializable = True - try: - _ = json.dumps(item) - except TypeError: - json_serializable = False - return json_serializable - - -def data_to_json(data): - """ - Turn data (class parameters) into a JSON string for storing - - :param data: (Dict) Dictionary of class parameters to be - stored. Items that are not JSON serializable will be - pickled with Cloudpickle and stored as bytearray in - the JSON file - :return: (str) JSON string of the data serialized. - """ - # First, check what elements can not be JSONfied, - # and turn them into byte-strings - serializable_data = {} - for data_key, data_item in data.items(): - # See if object is JSON serializable - if is_json_serializable(data_item): - # All good, store as it is - serializable_data[data_key] = data_item - else: - # Not serializable, cloudpickle it into - # bytes and convert to base64 string for storing. - # Also store type of the class for consumption - # from other languages/humans, so we have an - # idea what was being stored. - base64_encoded = base64.b64encode( - cloudpickle.dumps(data_item) - ).decode() - - # Use ":" to make sure we do - # not override these keys - # when we include variables of the object later - cloudpickle_serialization = { - ":type:": str(type(data_item)), - ":serialized:": base64_encoded - } - - # Add first-level JSON-serializable items of the - # object for further details (but not deeper than this to - # avoid deep nesting). - # First we check that object has attributes (not all do, - # e.g. numpy scalars) - if hasattr(data_item, "__dict__") or isinstance(data_item, dict): - # Take elements from __dict__ for custom classes - item_generator = ( - data_item.items if isinstance(data_item, dict) else data_item.__dict__.items - ) - for variable_name, variable_item in item_generator(): - # Check if serializable. If not, just include the - # string-representation of the object. - if is_json_serializable(variable_item): - cloudpickle_serialization[variable_name] = variable_item - else: - cloudpickle_serialization[variable_name] = str(variable_item) - - serializable_data[data_key] = cloudpickle_serialization - json_string = json.dumps(serializable_data, indent=4) - return json_string - - -def json_to_data(json_string, custom_objects=None): - """ - Turn JSON serialization of class-parameters back into dictionary. - - :param json_string: (str) JSON serialization of the class-parameters - that should be loaded. - :param custom_objects: (dict) Dictionary of objects to replace - upon loading. If a variable is present in this dictionary as a - key, it will not be deserialized and the corresponding item - will be used instead. Similar to custom_objects in - `keras.models.load_model`. Useful when you have an object in - file that can not be deserialized. - :return: (dict) Loaded class parameters. - """ - if custom_objects is not None and not isinstance(custom_objects, dict): - raise ValueError("custom_objects argument must be a dict or None") - - json_dict = json.loads(json_string) - # This will be filled with deserialized data - return_data = {} - for data_key, data_item in json_dict.items(): - if custom_objects is not None and data_key in custom_objects.keys(): - # If item is provided in custom_objects, replace - # the one from JSON with the one in custom_objects - return_data[data_key] = custom_objects[data_key] - elif isinstance(data_item, dict) and ":serialized:" in data_item.keys(): - # If item is dictionary with ":serialized:" - # key, this means it is serialized with cloudpickle. - serialization = data_item[":serialized:"] - # Try-except deserialization in case we run into - # errors. If so, we can tell bit more information to - # user. - try: - deserialized_object = cloudpickle.loads( - base64.b64decode(serialization.encode()) - ) - except pickle.UnpicklingError: - raise RuntimeError( - "Could not deserialize object {}. ".format(data_key) + - "Consider using `custom_objects` argument to replace " + - "this object." - ) - return_data[data_key] = deserialized_object - else: - # Read as it is - return_data[data_key] = data_item - return return_data - - -def params_to_bytes(params): - """ - Turn params (OrderedDict of variable name -> ndarray) into - serialized bytes for storing. - - Note: `numpy.savez` does not save the ordering. - - :param params: (OrderedDict) Dictionary mapping variable - names to numpy arrays of the current parameters of the - model. - :return: (bytes) Bytes object of the serialized content. - """ - # Create byte-buffer and save params with - # savez function, and return the bytes. - byte_file = io.BytesIO() - np.savez(byte_file, **params) - serialized_params = byte_file.getvalue() - return serialized_params - - -def bytes_to_params(serialized_params, param_list): - """ - Turn serialized parameters (bytes) back into OrderedDictionary. - - :param serialized_params: (byte) Serialized parameters - with `numpy.savez`. - :param param_list: (list) List of strings, representing - the order of parameters in which they should be returned - :return: (OrderedDict) Dictionary mapping variable name to - numpy array of the parameters. - """ - byte_file = io.BytesIO(serialized_params) - params = np.load(byte_file) - return_dictionary = OrderedDict() - # Assign parameters to return_dictionary - # in the order specified by param_list - for param_name in param_list: - return_dictionary[param_name] = params[param_name] - return return_dictionary diff --git a/stable_baselines/common/schedules.py b/stable_baselines/common/schedules.py deleted file mode 100644 index 698bf03c..00000000 --- a/stable_baselines/common/schedules.py +++ /dev/null @@ -1,254 +0,0 @@ -"""This file is used for specifying various schedules that evolve over -time throughout the execution of the algorithm, such as: - - - learning rate for the optimizer - - exploration epsilon for the epsilon greedy exploration strategy - - beta parameter for beta parameter in prioritized replay - -Each schedule has a function `value(t)` which returns the current value -of the parameter given the timestep t of the optimization procedure. -""" - - -class Schedule(object): - def value(self, step): - """ - Value of the schedule for a given timestep - - :param step: (int) the timestep - :return: (float) the output value for the given timestep - """ - raise NotImplementedError - - -class ConstantSchedule(Schedule): - """ - Value remains constant over time. - - :param value: (float) Constant value of the schedule - """ - - def __init__(self, value): - self._value = value - - def value(self, step): - return self._value - - -def linear_interpolation(left, right, alpha): - """ - Linear interpolation between `left` and `right`. - - :param left: (float) left boundary - :param right: (float) right boundary - :param alpha: (float) coeff in [0, 1] - :return: (float) - """ - - return left + alpha * (right - left) - - -class PiecewiseSchedule(Schedule): - """ - Piecewise schedule. - - :param endpoints: ([(int, int)]) - list of pairs `(time, value)` meaning that schedule should output - `value` when `t==time`. All the values for time must be sorted in - an increasing order. When t is between two times, e.g. `(time_a, value_a)` - and `(time_b, value_b)`, such that `time_a <= t < time_b` then value outputs - `interpolation(value_a, value_b, alpha)` where alpha is a fraction of - time passed between `time_a` and `time_b` for time `t`. - :param interpolation: (lambda (float, float, float): float) - a function that takes value to the left and to the right of t according - to the `endpoints`. Alpha is the fraction of distance from left endpoint to - right endpoint that t has covered. See linear_interpolation for example. - :param outside_value: (float) - if the value is requested outside of all the intervals specified in - `endpoints` this value is returned. If None then AssertionError is - raised when outside value is requested. - """ - - def __init__(self, endpoints, interpolation=linear_interpolation, outside_value=None): - idxes = [e[0] for e in endpoints] - assert idxes == sorted(idxes) - self._interpolation = interpolation - self._outside_value = outside_value - self._endpoints = endpoints - - def value(self, step): - for (left_t, left), (right_t, right) in zip(self._endpoints[:-1], self._endpoints[1:]): - if left_t <= step < right_t: - alpha = float(step - left_t) / (right_t - left_t) - return self._interpolation(left, right, alpha) - - # t does not belong to any of the pieces, so doom. - assert self._outside_value is not None - return self._outside_value - - -class LinearSchedule(Schedule): - """ - Linear interpolation between initial_p and final_p over - schedule_timesteps. After this many timesteps pass final_p is - returned. - - :param schedule_timesteps: (int) Number of timesteps for which to linearly anneal initial_p to final_p - :param initial_p: (float) initial output value - :param final_p: (float) final output value - """ - - def __init__(self, schedule_timesteps, final_p, initial_p=1.0): - self.schedule_timesteps = schedule_timesteps - self.final_p = final_p - self.initial_p = initial_p - - def value(self, step): - fraction = min(float(step) / self.schedule_timesteps, 1.0) - return self.initial_p + fraction * (self.final_p - self.initial_p) - - -def get_schedule_fn(value_schedule): - """ - Transform (if needed) learning rate and clip range - to callable. - - :param value_schedule: (callable or float) - :return: (function) - """ - # If the passed schedule is a float - # create a constant function - if isinstance(value_schedule, (float, int)): - # Cast to float to avoid errors - value_schedule = constfn(float(value_schedule)) - else: - assert callable(value_schedule) - return value_schedule - - -def constfn(val): - """ - Create a function that returns a constant - It is useful for learning rate schedule (to avoid code duplication) - - :param val: (float) - :return: (function) - """ - - def func(_): - return val - - return func - - -# ================================================================ -# Legacy scheduler used by A2C, AKCTR and ACER -# ================================================================ - -def constant(_): - """ - Returns a constant value for the Scheduler - - :param _: ignored - :return: (float) 1 - """ - return 1. - - -def linear_schedule(progress): - """ - Returns a linear value for the Scheduler - - :param progress: (float) Current progress status (in [0, 1]) - :return: (float) 1 - progress - """ - return 1 - progress - - -def middle_drop(progress): - """ - Returns a linear value with a drop near the middle to a constant value for the Scheduler - - :param progress: (float) Current progress status (in [0, 1]) - :return: (float) 1 - progress if (1 - progress) >= 0.75 else 0.075 - """ - eps = 0.75 - if 1 - progress < eps: - return eps * 0.1 - return 1 - progress - - -def double_linear_con(progress): - """ - Returns a linear value (x2) with a flattened tail for the Scheduler - - :param progress: (float) Current progress status (in [0, 1]) - :return: (float) 1 - progress*2 if (1 - progress*2) >= 0.125 else 0.125 - """ - progress *= 2 - eps = 0.125 - if 1 - progress < eps: - return eps - return 1 - progress - - -def double_middle_drop(progress): - """ - Returns a linear value with two drops near the middle to a constant value for the Scheduler - - :param progress: (float) Current progress status (in [0, 1]) - :return: (float) if 0.75 <= 1 - p: 1 - p, if 0.25 <= 1 - p < 0.75: 0.75, if 1 - p < 0.25: 0.125 - """ - eps1 = 0.75 - eps2 = 0.25 - if 1 - progress < eps1: - if 1 - progress < eps2: - return eps2 * 0.5 - return eps1 * 0.1 - return 1 - progress - - -SCHEDULES = { - 'linear': linear_schedule, - 'constant': constant, - 'double_linear_con': double_linear_con, - 'middle_drop': middle_drop, - 'double_middle_drop': double_middle_drop -} - - -class Scheduler(object): - def __init__(self, initial_value, n_values, schedule): - """ - Update a value every iteration, with a specific curve. - - This is a legacy version of schedules, originally defined - in a2c/utils.py. Used by A2C, ACER and ACKTR algorithms. - - :param initial_value: (float) initial value - :param n_values: (int) the total number of iterations - :param schedule: (function) the curve you wish to follow for your value - """ - self.step = 0. - self.initial_value = initial_value - self.nvalues = n_values - self.schedule = SCHEDULES[schedule] - - def value(self): - """ - Update the Scheduler, and return the current value - - :return: (float) the current value - """ - current_value = self.initial_value * self.schedule(self.step / self.nvalues) - self.step += 1. - return current_value - - def value_steps(self, steps): - """ - Get a value for a given step - - :param steps: (int) The current number of iterations - :return: (float) the value for the current number of iterations - """ - return self.initial_value * self.schedule(steps / self.nvalues) diff --git a/stable_baselines/common/segment_tree.py b/stable_baselines/common/segment_tree.py deleted file mode 100644 index 6b184fa4..00000000 --- a/stable_baselines/common/segment_tree.py +++ /dev/null @@ -1,171 +0,0 @@ -import numpy as np - - -def unique(sorted_array): - """ - More efficient implementation of np.unique for sorted arrays - :param sorted_array: (np.ndarray) - :return:(np.ndarray) sorted_array without duplicate elements - """ - if len(sorted_array) == 1: - return sorted_array - left = sorted_array[:-1] - right = sorted_array[1:] - uniques = np.append(right != left, True) - return sorted_array[uniques] - - -class SegmentTree(object): - def __init__(self, capacity, operation, neutral_element): - """ - Build a Segment Tree data structure. - - https://en.wikipedia.org/wiki/Segment_tree - - Can be used as regular array that supports Index arrays, but with two - important differences: - - a) setting item's value is slightly slower. - It is O(lg capacity) instead of O(1). - b) user has access to an efficient ( O(log segment size) ) - `reduce` operation which reduces `operation` over - a contiguous subsequence of items in the array. - - :param capacity: (int) Total size of the array - must be a power of two. - :param operation: (lambda (Any, Any): Any) operation for combining elements (eg. sum, max) must form a - mathematical group together with the set of possible values for array elements (i.e. be associative) - :param neutral_element: (Any) neutral element for the operation above. eg. float('-inf') for max and 0 for sum. - """ - assert capacity > 0 and capacity & (capacity - 1) == 0, "capacity must be positive and a power of 2." - self._capacity = capacity - self._value = [neutral_element for _ in range(2 * capacity)] - self._operation = operation - self.neutral_element = neutral_element - - def _reduce_helper(self, start, end, node, node_start, node_end): - if start == node_start and end == node_end: - return self._value[node] - mid = (node_start + node_end) // 2 - if end <= mid: - return self._reduce_helper(start, end, 2 * node, node_start, mid) - else: - if mid + 1 <= start: - return self._reduce_helper(start, end, 2 * node + 1, mid + 1, node_end) - else: - return self._operation( - self._reduce_helper(start, mid, 2 * node, node_start, mid), - self._reduce_helper(mid + 1, end, 2 * node + 1, mid + 1, node_end) - ) - - def reduce(self, start=0, end=None): - """ - Returns result of applying `self.operation` - to a contiguous subsequence of the array. - - self.operation(arr[start], operation(arr[start+1], operation(... arr[end]))) - - :param start: (int) beginning of the subsequence - :param end: (int) end of the subsequences - :return: (Any) result of reducing self.operation over the specified range of array elements. - """ - if end is None: - end = self._capacity - if end < 0: - end += self._capacity - end -= 1 - return self._reduce_helper(start, end, 1, 0, self._capacity - 1) - - def __setitem__(self, idx, val): - # indexes of the leaf - idxs = idx + self._capacity - self._value[idxs] = val - if isinstance(idxs, int): - idxs = np.array([idxs]) - # go up one level in the tree and remove duplicate indexes - idxs = unique(idxs // 2) - while len(idxs) > 1 or idxs[0] > 0: - # as long as there are non-zero indexes, update the corresponding values - self._value[idxs] = self._operation( - self._value[2 * idxs], - self._value[2 * idxs + 1] - ) - # go up one level in the tree and remove duplicate indexes - idxs = unique(idxs // 2) - - def __getitem__(self, idx): - assert np.max(idx) < self._capacity - assert 0 <= np.min(idx) - return self._value[self._capacity + idx] - - -class SumSegmentTree(SegmentTree): - def __init__(self, capacity): - super(SumSegmentTree, self).__init__( - capacity=capacity, - operation=np.add, - neutral_element=0.0 - ) - self._value = np.array(self._value) - - def sum(self, start=0, end=None): - """ - Returns arr[start] + ... + arr[end] - - :param start: (int) start position of the reduction (must be >= 0) - :param end: (int) end position of the reduction (must be < len(arr), can be None for len(arr) - 1) - :return: (Any) reduction of SumSegmentTree - """ - return super(SumSegmentTree, self).reduce(start, end) - - def find_prefixsum_idx(self, prefixsum): - """ - Find the highest index `i` in the array such that - sum(arr[0] + arr[1] + ... + arr[i - i]) <= prefixsum for each entry in prefixsum - - if array values are probabilities, this function - allows to sample indexes according to the discrete - probability efficiently. - - :param prefixsum: (np.ndarray) float upper bounds on the sum of array prefix - :return: (np.ndarray) highest indexes satisfying the prefixsum constraint - """ - if isinstance(prefixsum, float): - prefixsum = np.array([prefixsum]) - assert 0 <= np.min(prefixsum) - assert np.max(prefixsum) <= self.sum() + 1e-5 - assert isinstance(prefixsum[0], float) - - idx = np.ones(len(prefixsum), dtype=int) - cont = np.ones(len(prefixsum), dtype=bool) - - while np.any(cont): # while not all nodes are leafs - idx[cont] = 2 * idx[cont] - prefixsum_new = np.where(self._value[idx] <= prefixsum, prefixsum - self._value[idx], prefixsum) - # prepare update of prefixsum for all right children - idx = np.where(np.logical_or(self._value[idx] > prefixsum, np.logical_not(cont)), idx, idx + 1) - # Select child node for non-leaf nodes - prefixsum = prefixsum_new - # update prefixsum - cont = idx < self._capacity - # collect leafs - return idx - self._capacity - - -class MinSegmentTree(SegmentTree): - def __init__(self, capacity): - super(MinSegmentTree, self).__init__( - capacity=capacity, - operation=np.minimum, - neutral_element=float('inf') - ) - self._value = np.array(self._value) - - def min(self, start=0, end=None): - """ - Returns min(arr[start], ..., arr[end]) - - :param start: (int) start position of the reduction (must be >= 0) - :param end: (int) end position of the reduction (must be < len(arr), can be None for len(arr) - 1) - :return: (Any) reduction of MinSegmentTree - """ - return super(MinSegmentTree, self).reduce(start, end) diff --git a/stable_baselines/common/tf_layers.py b/stable_baselines/common/tf_layers.py deleted file mode 100644 index c35bf852..00000000 --- a/stable_baselines/common/tf_layers.py +++ /dev/null @@ -1,225 +0,0 @@ -import numpy as np -import tensorflow as tf - - -def ortho_init(scale=1.0): - """ - Orthogonal initialization for the policy weights - - :param scale: (float) Scaling factor for the weights. - :return: (function) an initialization function for the weights - """ - - # _ortho_init(shape, dtype, partition_info=None) - def _ortho_init(shape, *_, **_kwargs): - """Intialize weights as Orthogonal matrix. - - Orthogonal matrix initialization [1]_. For n-dimensional shapes where - n > 2, the n-1 trailing axes are flattened. For convolutional layers, this - corresponds to the fan-in, so this makes the initialization usable for - both dense and convolutional layers. - - References - ---------- - .. [1] Saxe, Andrew M., James L. McClelland, and Surya Ganguli. - "Exact solutions to the nonlinear dynamics of learning in deep - linear - """ - # lasagne ortho init for tf - shape = tuple(shape) - if len(shape) == 2: - flat_shape = shape - elif len(shape) == 4: # assumes NHWC - flat_shape = (np.prod(shape[:-1]), shape[-1]) - else: - raise NotImplementedError - gaussian_noise = np.random.normal(0.0, 1.0, flat_shape) - u, _, v = np.linalg.svd(gaussian_noise, full_matrices=False) - weights = u if u.shape == flat_shape else v # pick the one with the correct shape - weights = weights.reshape(shape) - return (scale * weights[:shape[0], :shape[1]]).astype(np.float32) - - return _ortho_init - - -def mlp(input_tensor, layers, activ_fn=tf.nn.relu, layer_norm=False): - """ - Create a multi-layer fully connected neural network. - - :param input_tensor: (tf.placeholder) - :param layers: ([int]) Network architecture - :param activ_fn: (tf.function) Activation function - :param layer_norm: (bool) Whether to apply layer normalization or not - :return: (tf.Tensor) - """ - output = input_tensor - for i, layer_size in enumerate(layers): - output = tf.layers.dense(output, layer_size, name='fc' + str(i)) - if layer_norm: - output = tf.contrib.layers.layer_norm(output, center=True, scale=True) - output = activ_fn(output) - return output - - -def conv(input_tensor, scope, *, n_filters, filter_size, stride, - pad='VALID', init_scale=1.0, data_format='NHWC', one_dim_bias=False): - """ - Creates a 2d convolutional layer for TensorFlow - - :param input_tensor: (TensorFlow Tensor) The input tensor for the convolution - :param scope: (str) The TensorFlow variable scope - :param n_filters: (int) The number of filters - :param filter_size: (Union[int, [int], tuple]) The filter size for the squared kernel matrix, - or the height and width of kernel filter if the input is a list or tuple - :param stride: (int) The stride of the convolution - :param pad: (str) The padding type ('VALID' or 'SAME') - :param init_scale: (int) The initialization scale - :param data_format: (str) The data format for the convolution weights - :param one_dim_bias: (bool) If the bias should be one dimentional or not - :return: (TensorFlow Tensor) 2d convolutional layer - """ - if isinstance(filter_size, list) or isinstance(filter_size, tuple): - assert len(filter_size) == 2, \ - "Filter size must have 2 elements (height, width), {} were given".format(len(filter_size)) - filter_height = filter_size[0] - filter_width = filter_size[1] - else: - filter_height = filter_size - filter_width = filter_size - if data_format == 'NHWC': - channel_ax = 3 - strides = [1, stride, stride, 1] - bshape = [1, 1, 1, n_filters] - elif data_format == 'NCHW': - channel_ax = 1 - strides = [1, 1, stride, stride] - bshape = [1, n_filters, 1, 1] - else: - raise NotImplementedError - bias_var_shape = [n_filters] if one_dim_bias else [1, n_filters, 1, 1] - n_input = input_tensor.get_shape()[channel_ax].value - wshape = [filter_height, filter_width, n_input, n_filters] - with tf.variable_scope(scope): - weight = tf.get_variable("w", wshape, initializer=ortho_init(init_scale)) - bias = tf.get_variable("b", bias_var_shape, initializer=tf.constant_initializer(0.0)) - if not one_dim_bias and data_format == 'NHWC': - bias = tf.reshape(bias, bshape) - return bias + tf.nn.conv2d(input_tensor, weight, strides=strides, padding=pad, data_format=data_format) - - -def linear(input_tensor, scope, n_hidden, *, init_scale=1.0, init_bias=0.0): - """ - Creates a fully connected layer for TensorFlow - - :param input_tensor: (TensorFlow Tensor) The input tensor for the fully connected layer - :param scope: (str) The TensorFlow variable scope - :param n_hidden: (int) The number of hidden neurons - :param init_scale: (int) The initialization scale - :param init_bias: (int) The initialization offset bias - :return: (TensorFlow Tensor) fully connected layer - """ - with tf.variable_scope(scope): - n_input = input_tensor.get_shape()[1].value - weight = tf.get_variable("w", [n_input, n_hidden], initializer=ortho_init(init_scale)) - bias = tf.get_variable("b", [n_hidden], initializer=tf.constant_initializer(init_bias)) - return tf.matmul(input_tensor, weight) + bias - - -def lstm(input_tensor, mask_tensor, cell_state_hidden, scope, n_hidden, init_scale=1.0, layer_norm=False): - """ - Creates an Long Short Term Memory (LSTM) cell for TensorFlow - - :param input_tensor: (TensorFlow Tensor) The input tensor for the LSTM cell - :param mask_tensor: (TensorFlow Tensor) The mask tensor for the LSTM cell - :param cell_state_hidden: (TensorFlow Tensor) The state tensor for the LSTM cell - :param scope: (str) The TensorFlow variable scope - :param n_hidden: (int) The number of hidden neurons - :param init_scale: (int) The initialization scale - :param layer_norm: (bool) Whether to apply Layer Normalization or not - :return: (TensorFlow Tensor) LSTM cell - """ - _, n_input = [v.value for v in input_tensor[0].get_shape()] - with tf.variable_scope(scope): - weight_x = tf.get_variable("wx", [n_input, n_hidden * 4], initializer=ortho_init(init_scale)) - weight_h = tf.get_variable("wh", [n_hidden, n_hidden * 4], initializer=ortho_init(init_scale)) - bias = tf.get_variable("b", [n_hidden * 4], initializer=tf.constant_initializer(0.0)) - - if layer_norm: - # Gain and bias of layer norm - gain_x = tf.get_variable("gx", [n_hidden * 4], initializer=tf.constant_initializer(1.0)) - bias_x = tf.get_variable("bx", [n_hidden * 4], initializer=tf.constant_initializer(0.0)) - - gain_h = tf.get_variable("gh", [n_hidden * 4], initializer=tf.constant_initializer(1.0)) - bias_h = tf.get_variable("bh", [n_hidden * 4], initializer=tf.constant_initializer(0.0)) - - gain_c = tf.get_variable("gc", [n_hidden], initializer=tf.constant_initializer(1.0)) - bias_c = tf.get_variable("bc", [n_hidden], initializer=tf.constant_initializer(0.0)) - - cell_state, hidden = tf.split(axis=1, num_or_size_splits=2, value=cell_state_hidden) - for idx, (_input, mask) in enumerate(zip(input_tensor, mask_tensor)): - cell_state = cell_state * (1 - mask) - hidden = hidden * (1 - mask) - if layer_norm: - gates = _ln(tf.matmul(_input, weight_x), gain_x, bias_x) \ - + _ln(tf.matmul(hidden, weight_h), gain_h, bias_h) + bias - else: - gates = tf.matmul(_input, weight_x) + tf.matmul(hidden, weight_h) + bias - in_gate, forget_gate, out_gate, cell_candidate = tf.split(axis=1, num_or_size_splits=4, value=gates) - in_gate = tf.nn.sigmoid(in_gate) - forget_gate = tf.nn.sigmoid(forget_gate) - out_gate = tf.nn.sigmoid(out_gate) - cell_candidate = tf.tanh(cell_candidate) - cell_state = forget_gate * cell_state + in_gate * cell_candidate - if layer_norm: - hidden = out_gate * tf.tanh(_ln(cell_state, gain_c, bias_c)) - else: - hidden = out_gate * tf.tanh(cell_state) - input_tensor[idx] = hidden - cell_state_hidden = tf.concat(axis=1, values=[cell_state, hidden]) - return input_tensor, cell_state_hidden - - -def _ln(input_tensor, gain, bias, epsilon=1e-5, axes=None): - """ - Apply layer normalisation. - - :param input_tensor: (TensorFlow Tensor) The input tensor for the Layer normalization - :param gain: (TensorFlow Tensor) The scale tensor for the Layer normalization - :param bias: (TensorFlow Tensor) The bias tensor for the Layer normalization - :param epsilon: (float) The epsilon value for floating point calculations - :param axes: (tuple, list or int) The axes to apply the mean and variance calculation - :return: (TensorFlow Tensor) a normalizing layer - """ - if axes is None: - axes = [1] - mean, variance = tf.nn.moments(input_tensor, axes=axes, keep_dims=True) - input_tensor = (input_tensor - mean) / tf.sqrt(variance + epsilon) - input_tensor = input_tensor * gain + bias - return input_tensor - - -def lnlstm(input_tensor, mask_tensor, cell_state, scope, n_hidden, init_scale=1.0): - """ - Creates a LSTM with Layer Normalization (lnlstm) cell for TensorFlow - - :param input_tensor: (TensorFlow Tensor) The input tensor for the LSTM cell - :param mask_tensor: (TensorFlow Tensor) The mask tensor for the LSTM cell - :param cell_state: (TensorFlow Tensor) The state tensor for the LSTM cell - :param scope: (str) The TensorFlow variable scope - :param n_hidden: (int) The number of hidden neurons - :param init_scale: (int) The initialization scale - :return: (TensorFlow Tensor) lnlstm cell - """ - return lstm(input_tensor, mask_tensor, cell_state, scope, n_hidden, init_scale, layer_norm=True) - - -def conv_to_fc(input_tensor): - """ - Reshapes a Tensor from a convolutional network to a Tensor for a fully connected network - - :param input_tensor: (TensorFlow Tensor) The convolutional input tensor - :return: (TensorFlow Tensor) The fully connected output tensor - """ - n_hidden = np.prod([v.value for v in input_tensor.get_shape()[1:]]) - input_tensor = tf.reshape(input_tensor, [-1, n_hidden]) - return input_tensor diff --git a/stable_baselines/common/tf_util.py b/stable_baselines/common/tf_util.py deleted file mode 100644 index ba78c042..00000000 --- a/stable_baselines/common/tf_util.py +++ /dev/null @@ -1,510 +0,0 @@ -import os -import collections -import functools -import multiprocessing -from typing import Set - -import numpy as np -import tensorflow as tf - - -def is_image(tensor): - """ - Check if a tensor has the shape of - a valid image for tensorboard logging. - Valid image: RGB, RGBD, GrayScale - - :param tensor: (np.ndarray or tf.placeholder) - :return: (bool) - """ - - return len(tensor.shape) == 3 and tensor.shape[-1] in [1, 3, 4] - - -def batch_to_seq(tensor_batch, n_batch, n_steps, flat=False): - """ - Transform a batch of Tensors, into a sequence of Tensors for recurrent policies - - :param tensor_batch: (TensorFlow Tensor) The input tensor to unroll - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param n_steps: (int) The number of steps to run for each environment - :param flat: (bool) If the input Tensor is flat - :return: (TensorFlow Tensor) sequence of Tensors for recurrent policies - """ - if flat: - tensor_batch = tf.reshape(tensor_batch, [n_batch, n_steps]) - else: - tensor_batch = tf.reshape(tensor_batch, [n_batch, n_steps, -1]) - return [tf.squeeze(v, [1]) for v in tf.split(axis=1, num_or_size_splits=n_steps, value=tensor_batch)] - - -def seq_to_batch(tensor_sequence, flat=False): - """ - Transform a sequence of Tensors, into a batch of Tensors for recurrent policies - - :param tensor_sequence: (TensorFlow Tensor) The input tensor to batch - :param flat: (bool) If the input Tensor is flat - :return: (TensorFlow Tensor) batch of Tensors for recurrent policies - """ - shape = tensor_sequence[0].get_shape().as_list() - if not flat: - assert len(shape) > 1 - n_hidden = tensor_sequence[0].get_shape()[-1].value - return tf.reshape(tf.concat(axis=1, values=tensor_sequence), [-1, n_hidden]) - else: - return tf.reshape(tf.stack(values=tensor_sequence, axis=1), [-1]) - - -def check_shape(tensors, shapes): - """ - Verifies the tensors match the given shape, will raise an error if the shapes do not match - - :param tensors: ([TensorFlow Tensor]) The tensors that should be checked - :param shapes: ([list]) The list of shapes for each tensor - """ - i = 0 - for (tensor, shape) in zip(tensors, shapes): - assert tensor.get_shape().as_list() == shape, "id " + str(i) + " shape " + str(tensor.get_shape()) + str(shape) - i += 1 - -# ================================================================ -# Mathematical utils -# ================================================================ - - -def huber_loss(tensor, delta=1.0): - """ - Reference: https://en.wikipedia.org/wiki/Huber_loss - - :param tensor: (TensorFlow Tensor) the input value - :param delta: (float) Huber loss delta value - :return: (TensorFlow Tensor) Huber loss output - """ - return tf.where( - tf.abs(tensor) < delta, - tf.square(tensor) * 0.5, - delta * (tf.abs(tensor) - 0.5 * delta) - ) - - -def sample(logits): - """ - Creates a sampling Tensor for non deterministic policies - when using categorical distribution. - It uses the Gumbel-max trick: http://amid.fish/humble-gumbel - - :param logits: (TensorFlow Tensor) The input probability for each action - :return: (TensorFlow Tensor) The sampled action - """ - noise = tf.random_uniform(tf.shape(logits)) - return tf.argmax(logits - tf.log(-tf.log(noise)), 1) - - -def calc_entropy(logits): - """ - Calculates the entropy of the output values of the network - - :param logits: (TensorFlow Tensor) The input probability for each action - :return: (TensorFlow Tensor) The Entropy of the output values of the network - """ - # Compute softmax - a_0 = logits - tf.reduce_max(logits, 1, keepdims=True) - exp_a_0 = tf.exp(a_0) - z_0 = tf.reduce_sum(exp_a_0, 1, keepdims=True) - p_0 = exp_a_0 / z_0 - return tf.reduce_sum(p_0 * (tf.log(z_0) - a_0), 1) - - -def mse(pred, target): - """ - Returns the Mean squared error between prediction and target - - :param pred: (TensorFlow Tensor) The predicted value - :param target: (TensorFlow Tensor) The target value - :return: (TensorFlow Tensor) The Mean squared error between prediction and target - """ - return tf.reduce_mean(tf.square(pred - target)) - - -def avg_norm(tensor): - """ - Return an average of the L2 normalization of the batch - - :param tensor: (TensorFlow Tensor) The input tensor - :return: (TensorFlow Tensor) Average L2 normalization of the batch - """ - return tf.reduce_mean(tf.sqrt(tf.reduce_sum(tf.square(tensor), axis=-1))) - - -def gradient_add(grad_1, grad_2, param, verbose=0): - """ - Sum two gradients - - :param grad_1: (TensorFlow Tensor) The first gradient - :param grad_2: (TensorFlow Tensor) The second gradient - :param param: (TensorFlow parameters) The trainable parameters - :param verbose: (int) verbosity level - :return: (TensorFlow Tensor) the sum of the gradients - """ - if verbose > 1: - print([grad_1, grad_2, param.name]) - if grad_1 is None and grad_2 is None: - return None - elif grad_1 is None: - return grad_2 - elif grad_2 is None: - return grad_1 - else: - return grad_1 + grad_2 - - -def q_explained_variance(q_pred, q_true): - """ - Calculates the explained variance of the Q value - - :param q_pred: (TensorFlow Tensor) The predicted Q value - :param q_true: (TensorFlow Tensor) The expected Q value - :return: (TensorFlow Tensor) the explained variance of the Q value - """ - _, var_y = tf.nn.moments(q_true, axes=[0, 1]) - _, var_pred = tf.nn.moments(q_true - q_pred, axes=[0, 1]) - check_shape([var_y, var_pred], [[]] * 2) - return 1.0 - (var_pred / var_y) - - -# ================================================================ -# Global session -# ================================================================ - - -def make_session(num_cpu=None, make_default=False, graph=None): - """ - Returns a session that will use CPU's only - - :param num_cpu: (int) number of CPUs to use for TensorFlow - :param make_default: (bool) if this should return an InteractiveSession or a normal Session - :param graph: (TensorFlow Graph) the graph of the session - :return: (TensorFlow session) - """ - if num_cpu is None: - num_cpu = int(os.getenv('RCALL_NUM_CPU', multiprocessing.cpu_count())) - tf_config = tf.ConfigProto( - allow_soft_placement=True, - inter_op_parallelism_threads=num_cpu, - intra_op_parallelism_threads=num_cpu) - # Prevent tensorflow from taking all the gpu memory - tf_config.gpu_options.allow_growth = True - if make_default: - return tf.InteractiveSession(config=tf_config, graph=graph) - else: - return tf.Session(config=tf_config, graph=graph) - - -def single_threaded_session(make_default=False, graph=None): - """ - Returns a session which will only use a single CPU - - :param make_default: (bool) if this should return an InteractiveSession or a normal Session - :param graph: (TensorFlow Graph) the graph of the session - :return: (TensorFlow session) - """ - return make_session(num_cpu=1, make_default=make_default, graph=graph) - - -def in_session(func): - """ - Wraps a function so that it is in a TensorFlow Session - - :param func: (function) the function to wrap - :return: (function) - """ - - @functools.wraps(func) - def newfunc(*args, **kwargs): - with tf.Session(): - func(*args, **kwargs) - - return newfunc - - -ALREADY_INITIALIZED = set() # type: Set[tf.Variable] - - -def initialize(sess=None): - """ - Initialize all the uninitialized variables in the global scope. - - :param sess: (TensorFlow Session) - """ - if sess is None: - sess = tf.get_default_session() - new_variables = set(tf.global_variables()) - ALREADY_INITIALIZED - sess.run(tf.variables_initializer(new_variables)) - ALREADY_INITIALIZED.update(new_variables) - - -# ================================================================ -# Theano-like Function -# ================================================================ - - -def function(inputs, outputs, updates=None, givens=None): - """ - Take a bunch of tensorflow placeholders and expressions - computed based on those placeholders and produces f(inputs) -> outputs. Function f takes - values to be fed to the input's placeholders and produces the values of the expressions - in outputs. Just like a Theano function. - - Input values can be passed in the same order as inputs or can be provided as kwargs based - on placeholder name (passed to constructor or accessible via placeholder.op.name). - - Example: - >>> x = tf.placeholder(tf.int32, (), name="x") - >>> y = tf.placeholder(tf.int32, (), name="y") - >>> z = 3 * x + 2 * y - >>> lin = function([x, y], z, givens={y: 0}) - >>> with single_threaded_session(): - >>> initialize() - >>> assert lin(2) == 6 - >>> assert lin(x=3) == 9 - >>> assert lin(2, 2) == 10 - - :param inputs: (TensorFlow Tensor or Object with make_feed_dict) list of input arguments - :param outputs: (TensorFlow Tensor) list of outputs or a single output to be returned from function. Returned - value will also have the same shape. - :param updates: ([tf.Operation] or tf.Operation) - list of update functions or single update function that will be run whenever - the function is called. The return is ignored. - :param givens: (dict) the values known for the output - """ - if isinstance(outputs, list): - return _Function(inputs, outputs, updates, givens=givens) - elif isinstance(outputs, (dict, collections.OrderedDict)): - func = _Function(inputs, outputs.values(), updates, givens=givens) - return lambda *args, **kwargs: type(outputs)(zip(outputs.keys(), func(*args, **kwargs))) - else: - func = _Function(inputs, [outputs], updates, givens=givens) - return lambda *args, **kwargs: func(*args, **kwargs)[0] - - -class _Function(object): - def __init__(self, inputs, outputs, updates, givens): - """ - Theano like function - - :param inputs: (TensorFlow Tensor or Object with make_feed_dict) list of input arguments - :param outputs: (TensorFlow Tensor) list of outputs or a single output to be returned from function. Returned - value will also have the same shape. - :param updates: ([tf.Operation] or tf.Operation) - list of update functions or single update function that will be run whenever - the function is called. The return is ignored. - :param givens: (dict) the values known for the output - """ - for inpt in inputs: - if not hasattr(inpt, 'make_feed_dict') and not (isinstance(inpt, tf.Tensor) and len(inpt.op.inputs) == 0): - assert False, "inputs should all be placeholders, constants, or have a make_feed_dict method" - self.inputs = inputs - updates = updates or [] - self.update_group = tf.group(*updates) - self.outputs_update = list(outputs) + [self.update_group] - self.givens = {} if givens is None else givens - - @classmethod - def _feed_input(cls, feed_dict, inpt, value): - if hasattr(inpt, 'make_feed_dict'): - feed_dict.update(inpt.make_feed_dict(value)) - else: - feed_dict[inpt] = value - - def __call__(self, *args, sess=None, **kwargs): - assert len(args) <= len(self.inputs), "Too many arguments provided" - if sess is None: - sess = tf.get_default_session() - feed_dict = {} - # Update the args - for inpt, value in zip(self.inputs, args): - self._feed_input(feed_dict, inpt, value) - # Update feed dict with givens. - for inpt in self.givens: - feed_dict[inpt] = feed_dict.get(inpt, self.givens[inpt]) - results = sess.run(self.outputs_update, feed_dict=feed_dict, **kwargs)[:-1] - return results - - -# ================================================================ -# Flat vectors -# ================================================================ - - -def var_shape(tensor): - """ - get TensorFlow Tensor shape - - :param tensor: (TensorFlow Tensor) the input tensor - :return: ([int]) the shape - """ - out = tensor.get_shape().as_list() - assert all(isinstance(a, int) for a in out), \ - "shape function assumes that shape is fully known" - return out - - -def numel(tensor): - """ - get TensorFlow Tensor's number of elements - - :param tensor: (TensorFlow Tensor) the input tensor - :return: (int) the number of elements - """ - return intprod(var_shape(tensor)) - - -def intprod(tensor): - """ - calculates the product of all the elements in a list - - :param tensor: ([Number]) the list of elements - :return: (int) the product truncated - """ - return int(np.prod(tensor)) - - -def flatgrad(loss, var_list, clip_norm=None): - """ - calculates the gradient and flattens it - - :param loss: (float) the loss value - :param var_list: ([TensorFlow Tensor]) the variables - :param clip_norm: (float) clip the gradients (disabled if None) - :return: ([TensorFlow Tensor]) flattened gradient - """ - grads = tf.gradients(loss, var_list) - if clip_norm is not None: - grads = [tf.clip_by_norm(grad, clip_norm=clip_norm) for grad in grads] - return tf.concat(axis=0, values=[ - tf.reshape(grad if grad is not None else tf.zeros_like(v), [numel(v)]) - for (v, grad) in zip(var_list, grads) - ]) - - -class SetFromFlat(object): - def __init__(self, var_list, dtype=tf.float32, sess=None): - """ - Set the parameters from a flat vector - - :param var_list: ([TensorFlow Tensor]) the variables - :param dtype: (type) the type for the placeholder - :param sess: (TensorFlow Session) - """ - shapes = list(map(var_shape, var_list)) - total_size = np.sum([intprod(shape) for shape in shapes]) - - self.theta = theta = tf.placeholder(dtype, [total_size]) - start = 0 - assigns = [] - for (shape, _var) in zip(shapes, var_list): - size = intprod(shape) - assigns.append(tf.assign(_var, tf.reshape(theta[start:start + size], shape))) - start += size - self.operation = tf.group(*assigns) - self.sess = sess - - def __call__(self, theta): - if self.sess is None: - return tf.get_default_session().run(self.operation, feed_dict={self.theta: theta}) - else: - return self.sess.run(self.operation, feed_dict={self.theta: theta}) - - -class GetFlat(object): - def __init__(self, var_list, sess=None): - """ - Get the parameters as a flat vector - - :param var_list: ([TensorFlow Tensor]) the variables - :param sess: (TensorFlow Session) - """ - self.operation = tf.concat(axis=0, values=[tf.reshape(v, [numel(v)]) for v in var_list]) - self.sess = sess - - def __call__(self): - if self.sess is None: - return tf.get_default_session().run(self.operation) - else: - return self.sess.run(self.operation) - - -# ================================================================ -# retrieving variables -# ================================================================ - - -def get_trainable_vars(name): - """ - returns the trainable variables - - :param name: (str) the scope - :return: ([TensorFlow Variable]) - """ - return tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope=name) - - -def get_globals_vars(name): - """ - returns the trainable variables - - :param name: (str) the scope - :return: ([TensorFlow Variable]) - """ - return tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope=name) - - -def outer_scope_getter(scope, new_scope=""): - """ - remove a scope layer for the getter - - :param scope: (str) the layer to remove - :param new_scope: (str) optional replacement name - :return: (function (function, str, ``*args``, ``**kwargs``): Tensorflow Tensor) - """ - def _getter(getter, name, *args, **kwargs): - name = name.replace(scope + "/", new_scope, 1) - val = getter(name, *args, **kwargs) - return val - return _getter - - -# ================================================================ -# Logging -# ================================================================ - - -def total_episode_reward_logger(rew_acc, rewards, masks, writer, steps): - """ - calculates the cumulated episode reward, and prints to tensorflow log the output - - :param rew_acc: (np.array float) the total running reward - :param rewards: (np.array float) the rewards - :param masks: (np.array bool) the end of episodes - :param writer: (TensorFlow Session.writer) the writer to log to - :param steps: (int) the current timestep - :return: (np.array float) the updated total running reward - :return: (np.array float) the updated total running reward - """ - with tf.variable_scope("environment_info", reuse=True): - for env_idx in range(rewards.shape[0]): - dones_idx = np.sort(np.argwhere(masks[env_idx])) - - if len(dones_idx) == 0: - rew_acc[env_idx] += sum(rewards[env_idx]) - else: - rew_acc[env_idx] += sum(rewards[env_idx, :dones_idx[0, 0]]) - summary = tf.Summary(value=[tf.Summary.Value(tag="episode_reward", simple_value=rew_acc[env_idx])]) - writer.add_summary(summary, steps + dones_idx[0, 0]) - for k in range(1, len(dones_idx[:, 0])): - rew_acc[env_idx] = sum(rewards[env_idx, dones_idx[k - 1, 0]:dones_idx[k, 0]]) - summary = tf.Summary(value=[tf.Summary.Value(tag="episode_reward", simple_value=rew_acc[env_idx])]) - writer.add_summary(summary, steps + dones_idx[k, 0]) - rew_acc[env_idx] = sum(rewards[env_idx, dones_idx[-1, 0]:]) - - return rew_acc diff --git a/stable_baselines/common/tile_images.py b/stable_baselines/common/tile_images.py deleted file mode 100644 index 30d60fcd..00000000 --- a/stable_baselines/common/tile_images.py +++ /dev/null @@ -1,27 +0,0 @@ -import numpy as np - - -def tile_images(img_nhwc): - """ - Tile N images into one big PxQ image - (P,Q) are chosen to be as close as possible, and if N - is square, then P=Q. - - :param img_nhwc: (list) list or array of images, ndim=4 once turned into array. img nhwc - n = batch index, h = height, w = width, c = channel - :return: (numpy float) img_HWc, ndim=3 - """ - img_nhwc = np.asarray(img_nhwc) - n_images, height, width, n_channels = img_nhwc.shape - # new_height was named H before - new_height = int(np.ceil(np.sqrt(n_images))) - # new_width was named W before - new_width = int(np.ceil(float(n_images) / new_height)) - img_nhwc = np.array(list(img_nhwc) + [img_nhwc[0] * 0 for _ in range(n_images, new_height * new_width)]) - # img_HWhwc - out_image = img_nhwc.reshape(new_height, new_width, height, width, n_channels) - # img_HhWwc - out_image = out_image.transpose(0, 2, 1, 3, 4) - # img_Hh_Ww_c - out_image = out_image.reshape(new_height * height, new_width * width, n_channels) - return out_image diff --git a/stable_baselines/common/vec_env/__init__.py b/stable_baselines/common/vec_env/__init__.py deleted file mode 100644 index e3343f5f..00000000 --- a/stable_baselines/common/vec_env/__init__.py +++ /dev/null @@ -1,52 +0,0 @@ -from typing import Union -from copy import deepcopy - -import gym - -# flake8: noqa F401 -from stable_baselines.common.vec_env.base_vec_env import AlreadySteppingError, NotSteppingError, VecEnv, VecEnvWrapper, \ - CloudpickleWrapper -from stable_baselines.common.vec_env.dummy_vec_env import DummyVecEnv -from stable_baselines.common.vec_env.subproc_vec_env import SubprocVecEnv -from stable_baselines.common.vec_env.vec_frame_stack import VecFrameStack -from stable_baselines.common.vec_env.vec_normalize import VecNormalize -from stable_baselines.common.vec_env.vec_video_recorder import VecVideoRecorder -from stable_baselines.common.vec_env.vec_check_nan import VecCheckNan - - -def unwrap_vec_normalize(env: Union[gym.Env, VecEnv]) -> Union[VecNormalize, None]: - """ - :param env: (Union[gym.Env, VecEnv]) - :return: (VecNormalize) - """ - env_tmp = env - while isinstance(env_tmp, VecEnvWrapper): - if isinstance(env_tmp, VecNormalize): - return env_tmp - env_tmp = env_tmp.venv - return None - - -# Define here to avoid circular import -def sync_envs_normalization(env: Union[gym.Env, VecEnv], eval_env: Union[gym.Env, VecEnv]) -> None: - """ - Sync eval and train environments when using VecNormalize - - :param env: (Union[gym.Env, VecEnv])) - :param eval_env: (Union[gym.Env, VecEnv])) - """ - env_tmp, eval_env_tmp = env, eval_env - # Special case for the _UnvecWrapper - # Avoid circular import - from stable_baselines.common.base_class import _UnvecWrapper - if isinstance(env_tmp, _UnvecWrapper): - return - while isinstance(env_tmp, VecEnvWrapper): - if isinstance(env_tmp, VecNormalize): - # sync reward and observation scaling - eval_env_tmp.obs_rms = deepcopy(env_tmp.obs_rms) - eval_env_tmp.ret_rms = deepcopy(env_tmp.ret_rms) - env_tmp = env_tmp.venv - # Make pytype happy, in theory env and eval_env have the same type - assert isinstance(eval_env_tmp, VecEnvWrapper), "the second env differs from the first env" - eval_env_tmp = eval_env_tmp.venv diff --git a/stable_baselines/common/vec_env/base_vec_env.py b/stable_baselines/common/vec_env/base_vec_env.py deleted file mode 100644 index 46ee7be0..00000000 --- a/stable_baselines/common/vec_env/base_vec_env.py +++ /dev/null @@ -1,334 +0,0 @@ -from abc import ABC, abstractmethod -import inspect -import pickle -from typing import Sequence, Optional, List, Union - -import cloudpickle -import numpy as np - -from stable_baselines import logger -from stable_baselines.common.tile_images import tile_images - - -class AlreadySteppingError(Exception): - """ - Raised when an asynchronous step is running while - step_async() is called again. - """ - - def __init__(self): - msg = 'already running an async step' - Exception.__init__(self, msg) - - -class NotSteppingError(Exception): - """ - Raised when an asynchronous step is not running but - step_wait() is called. - """ - - def __init__(self): - msg = 'not running an async step' - Exception.__init__(self, msg) - - -class VecEnv(ABC): - """ - An abstract asynchronous, vectorized environment. - - :param num_envs: (int) the number of environments - :param observation_space: (Gym Space) the observation space - :param action_space: (Gym Space) the action space - """ - metadata = { - 'render.modes': ['human', 'rgb_array'] - } - - def __init__(self, num_envs, observation_space, action_space): - self.num_envs = num_envs - self.observation_space = observation_space - self.action_space = action_space - - @abstractmethod - def reset(self): - """ - Reset all the environments and return an array of - observations, or a tuple of observation arrays. - - If step_async is still doing work, that work will - be cancelled and step_wait() should not be called - until step_async() is invoked again. - - :return: ([int] or [float]) observation - """ - pass - - @abstractmethod - def step_async(self, actions): - """ - Tell all the environments to start taking a step - with the given actions. - Call step_wait() to get the results of the step. - - You should not call this if a step_async run is - already pending. - """ - pass - - @abstractmethod - def step_wait(self): - """ - Wait for the step taken with step_async(). - - :return: ([int] or [float], [float], [bool], dict) observation, reward, done, information - """ - pass - - @abstractmethod - def close(self): - """ - Clean up the environment's resources. - """ - pass - - @abstractmethod - def get_attr(self, attr_name, indices=None): - """ - Return attribute from vectorized environment. - - :param attr_name: (str) The name of the attribute whose value to return - :param indices: (list,int) Indices of envs to get attribute from - :return: (list) List of values of 'attr_name' in all environments - """ - pass - - @abstractmethod - def set_attr(self, attr_name, value, indices=None): - """ - Set attribute inside vectorized environments. - - :param attr_name: (str) The name of attribute to assign new value - :param value: (obj) Value to assign to `attr_name` - :param indices: (list,int) Indices of envs to assign value - :return: (NoneType) - """ - pass - - @abstractmethod - def env_method(self, method_name, *method_args, indices=None, **method_kwargs): - """ - Call instance methods of vectorized environments. - - :param method_name: (str) The name of the environment method to invoke. - :param indices: (list,int) Indices of envs whose method to call - :param method_args: (tuple) Any positional arguments to provide in the call - :param method_kwargs: (dict) Any keyword arguments to provide in the call - :return: (list) List of items returned by the environment's method call - """ - pass - - @abstractmethod - def seed(self, seed: Optional[int] = None) -> List[Union[None, int]]: - """ - Sets the random seeds for all environments, based on a given seed. - Each individual environment will still get its own seed, by incrementing the given seed. - - :param seed: (Optional[int]) The random seed. May be None for completely random seeding. - :return: (List[Union[None, int]]) Returns a list containing the seeds for each individual env. - Note that all list elements may be None, if the env does not return anything when being seeded. - """ - pass - - def step(self, actions): - """ - Step the environments with the given action - - :param actions: ([int] or [float]) the action - :return: ([int] or [float], [float], [bool], dict) observation, reward, done, information - """ - self.step_async(actions) - return self.step_wait() - - def get_images(self) -> Sequence[np.ndarray]: - """ - Return RGB images from each environment - """ - raise NotImplementedError - - def render(self, mode: str = 'human'): - """ - Gym environment rendering - - :param mode: the rendering type - """ - try: - imgs = self.get_images() - except NotImplementedError: - logger.warn('Render not defined for {}'.format(self)) - return - - # Create a big image by tiling images from subprocesses - bigimg = tile_images(imgs) - if mode == 'human': - import cv2 # pytype:disable=import-error - cv2.imshow('vecenv', bigimg[:, :, ::-1]) - cv2.waitKey(1) - elif mode == 'rgb_array': - return bigimg - else: - raise NotImplementedError - - @property - def unwrapped(self): - if isinstance(self, VecEnvWrapper): - return self.venv.unwrapped - else: - return self - - def getattr_depth_check(self, name, already_found): - """Check if an attribute reference is being hidden in a recursive call to __getattr__ - - :param name: (str) name of attribute to check for - :param already_found: (bool) whether this attribute has already been found in a wrapper - :return: (str or None) name of module whose attribute is being shadowed, if any. - """ - if hasattr(self, name) and already_found: - return "{0}.{1}".format(type(self).__module__, type(self).__name__) - else: - return None - - def _get_indices(self, indices): - """ - Convert a flexibly-typed reference to environment indices to an implied list of indices. - - :param indices: (None,int,Iterable) refers to indices of envs. - :return: (list) the implied list of indices. - """ - if indices is None: - indices = range(self.num_envs) - elif isinstance(indices, int): - indices = [indices] - return indices - - -class VecEnvWrapper(VecEnv): - """ - Vectorized environment base class - - :param venv: (VecEnv) the vectorized environment to wrap - :param observation_space: (Gym Space) the observation space (can be None to load from venv) - :param action_space: (Gym Space) the action space (can be None to load from venv) - """ - - def __init__(self, venv, observation_space=None, action_space=None): - self.venv = venv - VecEnv.__init__(self, num_envs=venv.num_envs, observation_space=observation_space or venv.observation_space, - action_space=action_space or venv.action_space) - self.class_attributes = dict(inspect.getmembers(self.__class__)) - - def step_async(self, actions): - self.venv.step_async(actions) - - @abstractmethod - def reset(self): - pass - - @abstractmethod - def step_wait(self): - pass - - def seed(self, seed=None): - return self.venv.seed(seed) - - def close(self): - return self.venv.close() - - def render(self, mode: str = 'human'): - return self.venv.render(mode=mode) - - def get_images(self): - return self.venv.get_images() - - def get_attr(self, attr_name, indices=None): - return self.venv.get_attr(attr_name, indices) - - def set_attr(self, attr_name, value, indices=None): - return self.venv.set_attr(attr_name, value, indices) - - def env_method(self, method_name, *method_args, indices=None, **method_kwargs): - return self.venv.env_method(method_name, *method_args, indices=indices, **method_kwargs) - - def __getattr__(self, name): - """Find attribute from wrapped venv(s) if this wrapper does not have it. - Useful for accessing attributes from venvs which are wrapped with multiple wrappers - which have unique attributes of interest. - """ - blocked_class = self.getattr_depth_check(name, already_found=False) - if blocked_class is not None: - own_class = "{0}.{1}".format(type(self).__module__, type(self).__name__) - format_str = ("Error: Recursive attribute lookup for {0} from {1} is " - "ambiguous and hides attribute from {2}") - raise AttributeError(format_str.format(name, own_class, blocked_class)) - - return self.getattr_recursive(name) - - def _get_all_attributes(self): - """Get all (inherited) instance and class attributes - - :return: (dict) all_attributes - """ - all_attributes = self.__dict__.copy() - all_attributes.update(self.class_attributes) - return all_attributes - - def getattr_recursive(self, name): - """Recursively check wrappers to find attribute. - - :param name (str) name of attribute to look for - :return: (object) attribute - """ - all_attributes = self._get_all_attributes() - if name in all_attributes: # attribute is present in this wrapper - attr = getattr(self, name) - elif hasattr(self.venv, 'getattr_recursive'): - # Attribute not present, child is wrapper. Call getattr_recursive rather than getattr - # to avoid a duplicate call to getattr_depth_check. - attr = self.venv.getattr_recursive(name) - else: # attribute not present, child is an unwrapped VecEnv - attr = getattr(self.venv, name) - - return attr - - def getattr_depth_check(self, name, already_found): - """See base class. - - :return: (str or None) name of module whose attribute is being shadowed, if any. - """ - all_attributes = self._get_all_attributes() - if name in all_attributes and already_found: - # this venv's attribute is being hidden because of a higher venv. - shadowed_wrapper_class = "{0}.{1}".format(type(self).__module__, type(self).__name__) - elif name in all_attributes and not already_found: - # we have found the first reference to the attribute. Now check for duplicates. - shadowed_wrapper_class = self.venv.getattr_depth_check(name, True) - else: - # this wrapper does not have the attribute. Keep searching. - shadowed_wrapper_class = self.venv.getattr_depth_check(name, already_found) - - return shadowed_wrapper_class - - -class CloudpickleWrapper(object): - def __init__(self, var): - """ - Uses cloudpickle to serialize contents (otherwise multiprocessing tries to use pickle) - - :param var: (Any) the variable you wish to wrap for pickling with cloudpickle - """ - self.var = var - - def __getstate__(self): - return cloudpickle.dumps(self.var) - - def __setstate__(self, obs): - self.var = cloudpickle.loads(obs) diff --git a/stable_baselines/common/vec_env/dummy_vec_env.py b/stable_baselines/common/vec_env/dummy_vec_env.py deleted file mode 100644 index 35785f2d..00000000 --- a/stable_baselines/common/vec_env/dummy_vec_env.py +++ /dev/null @@ -1,117 +0,0 @@ -from collections import OrderedDict -from typing import Sequence -from copy import deepcopy - -import numpy as np - -from stable_baselines.common.vec_env.base_vec_env import VecEnv -from stable_baselines.common.vec_env.util import copy_obs_dict, dict_to_obs, obs_space_info - - -class DummyVecEnv(VecEnv): - """ - Creates a simple vectorized wrapper for multiple environments, calling each environment in sequence on the current - Python process. This is useful for computationally simple environment such as ``cartpole-v1``, as the overhead of - multiprocess or multithread outweighs the environment computation time. This can also be used for RL methods that - require a vectorized environment, but that you want a single environments to train with. - - :param env_fns: ([callable]) A list of functions that will create the environments - (each callable returns a `Gym.Env` instance when called). - """ - - def __init__(self, env_fns): - self.envs = [fn() for fn in env_fns] - env = self.envs[0] - VecEnv.__init__(self, len(env_fns), env.observation_space, env.action_space) - obs_space = env.observation_space - self.keys, shapes, dtypes = obs_space_info(obs_space) - - self.buf_obs = OrderedDict([ - (k, np.zeros((self.num_envs,) + tuple(shapes[k]), dtype=dtypes[k])) - for k in self.keys]) - self.buf_dones = np.zeros((self.num_envs,), dtype=np.bool) - self.buf_rews = np.zeros((self.num_envs,), dtype=np.float32) - self.buf_infos = [{} for _ in range(self.num_envs)] - self.actions = None - self.metadata = env.metadata - - def step_async(self, actions): - self.actions = actions - - def step_wait(self): - for env_idx in range(self.num_envs): - obs, self.buf_rews[env_idx], self.buf_dones[env_idx], self.buf_infos[env_idx] =\ - self.envs[env_idx].step(self.actions[env_idx]) - if self.buf_dones[env_idx]: - # save final observation where user can get it, then reset - self.buf_infos[env_idx]['terminal_observation'] = obs - obs = self.envs[env_idx].reset() - self._save_obs(env_idx, obs) - return (self._obs_from_buf(), np.copy(self.buf_rews), np.copy(self.buf_dones), - deepcopy(self.buf_infos)) - - def seed(self, seed=None): - seeds = list() - for idx, env in enumerate(self.envs): - seeds.append(env.seed(seed + idx)) - return seeds - - def reset(self): - for env_idx in range(self.num_envs): - obs = self.envs[env_idx].reset() - self._save_obs(env_idx, obs) - return self._obs_from_buf() - - def close(self): - for env in self.envs: - env.close() - - def get_images(self) -> Sequence[np.ndarray]: - return [env.render(mode='rgb_array') for env in self.envs] - - def render(self, mode: str = 'human'): - """ - Gym environment rendering. If there are multiple environments then - they are tiled together in one image via `BaseVecEnv.render()`. - Otherwise (if `self.num_envs == 1`), we pass the render call directly to the - underlying environment. - - Therefore, some arguments such as `mode` will have values that are valid - only when `num_envs == 1`. - - :param mode: The rendering type. - """ - if self.num_envs == 1: - return self.envs[0].render(mode=mode) - else: - return super().render(mode=mode) - - def _save_obs(self, env_idx, obs): - for key in self.keys: - if key is None: - self.buf_obs[key][env_idx] = obs - else: - self.buf_obs[key][env_idx] = obs[key] - - def _obs_from_buf(self): - return dict_to_obs(self.observation_space, copy_obs_dict(self.buf_obs)) - - def get_attr(self, attr_name, indices=None): - """Return attribute from vectorized environment (see base class).""" - target_envs = self._get_target_envs(indices) - return [getattr(env_i, attr_name) for env_i in target_envs] - - def set_attr(self, attr_name, value, indices=None): - """Set attribute inside vectorized environments (see base class).""" - target_envs = self._get_target_envs(indices) - for env_i in target_envs: - setattr(env_i, attr_name, value) - - def env_method(self, method_name, *method_args, indices=None, **method_kwargs): - """Call instance methods of vectorized environments.""" - target_envs = self._get_target_envs(indices) - return [getattr(env_i, method_name)(*method_args, **method_kwargs) for env_i in target_envs] - - def _get_target_envs(self, indices): - indices = self._get_indices(indices) - return [self.envs[i] for i in indices] diff --git a/stable_baselines/common/vec_env/subproc_vec_env.py b/stable_baselines/common/vec_env/subproc_vec_env.py deleted file mode 100644 index a6b356f8..00000000 --- a/stable_baselines/common/vec_env/subproc_vec_env.py +++ /dev/null @@ -1,210 +0,0 @@ -import os -import multiprocessing -from collections import OrderedDict -from typing import Sequence - -import gym -import numpy as np - -from stable_baselines.common.vec_env.base_vec_env import VecEnv, CloudpickleWrapper - - -def _worker(remote, parent_remote, env_fn_wrapper): - parent_remote.close() - env = env_fn_wrapper.var() - while True: - try: - cmd, data = remote.recv() - if cmd == 'step': - observation, reward, done, info = env.step(data) - if done: - # save final observation where user can get it, then reset - info['terminal_observation'] = observation - observation = env.reset() - remote.send((observation, reward, done, info)) - elif cmd == 'seed': - remote.send(env.seed(data)) - elif cmd == 'reset': - observation = env.reset() - remote.send(observation) - elif cmd == 'render': - remote.send(env.render(data)) - elif cmd == 'close': - env.close() - remote.close() - break - elif cmd == 'get_spaces': - remote.send((env.observation_space, env.action_space)) - elif cmd == 'env_method': - method = getattr(env, data[0]) - remote.send(method(*data[1], **data[2])) - elif cmd == 'get_attr': - remote.send(getattr(env, data)) - elif cmd == 'set_attr': - remote.send(setattr(env, data[0], data[1])) - else: - raise NotImplementedError("`{}` is not implemented in the worker".format(cmd)) - except EOFError: - break - - -class SubprocVecEnv(VecEnv): - """ - Creates a multiprocess vectorized wrapper for multiple environments, distributing each environment to its own - process, allowing significant speed up when the environment is computationally complex. - - For performance reasons, if your environment is not IO bound, the number of environments should not exceed the - number of logical cores on your CPU. - - .. warning:: - - Only 'forkserver' and 'spawn' start methods are thread-safe, - which is important when TensorFlow sessions or other non thread-safe - libraries are used in the parent (see issue #217). However, compared to - 'fork' they incur a small start-up cost and have restrictions on - global variables. With those methods, users must wrap the code in an - ``if __name__ == "__main__":`` block. - For more information, see the multiprocessing documentation. - - :param env_fns: ([callable]) A list of functions that will create the environments - (each callable returns a `Gym.Env` instance when called). - :param start_method: (str) method used to start the subprocesses. - Must be one of the methods returned by multiprocessing.get_all_start_methods(). - Defaults to 'forkserver' on available platforms, and 'spawn' otherwise. - """ - - def __init__(self, env_fns, start_method=None): - self.waiting = False - self.closed = False - n_envs = len(env_fns) - - # In some cases (like on GitHub workflow machine when running tests), - # "forkserver" method results in an "connection error" (probably due to mpi) - # We allow to bypass the default start method if an environment variable - # is specified by the user - if start_method is None: - start_method = os.environ.get("DEFAULT_START_METHOD") - - # No DEFAULT_START_METHOD was specified, start_method may still be None - if start_method is None: - # Fork is not a thread safe method (see issue #217) - # but is more user friendly (does not require to wrap the code in - # a `if __name__ == "__main__":`) - forkserver_available = 'forkserver' in multiprocessing.get_all_start_methods() - start_method = 'forkserver' if forkserver_available else 'spawn' - ctx = multiprocessing.get_context(start_method) - - self.remotes, self.work_remotes = zip(*[ctx.Pipe(duplex=True) for _ in range(n_envs)]) - self.processes = [] - for work_remote, remote, env_fn in zip(self.work_remotes, self.remotes, env_fns): - args = (work_remote, remote, CloudpickleWrapper(env_fn)) - # daemon=True: if the main process crashes, we should not cause things to hang - process = ctx.Process(target=_worker, args=args, daemon=True) # pytype:disable=attribute-error - process.start() - self.processes.append(process) - work_remote.close() - - self.remotes[0].send(('get_spaces', None)) - observation_space, action_space = self.remotes[0].recv() - VecEnv.__init__(self, len(env_fns), observation_space, action_space) - - def step_async(self, actions): - for remote, action in zip(self.remotes, actions): - remote.send(('step', action)) - self.waiting = True - - def step_wait(self): - results = [remote.recv() for remote in self.remotes] - self.waiting = False - obs, rews, dones, infos = zip(*results) - return _flatten_obs(obs, self.observation_space), np.stack(rews), np.stack(dones), infos - - def seed(self, seed=None): - for idx, remote in enumerate(self.remotes): - remote.send(('seed', seed + idx)) - return [remote.recv() for remote in self.remotes] - - def reset(self): - for remote in self.remotes: - remote.send(('reset', None)) - obs = [remote.recv() for remote in self.remotes] - return _flatten_obs(obs, self.observation_space) - - def close(self): - if self.closed: - return - if self.waiting: - for remote in self.remotes: - remote.recv() - for remote in self.remotes: - remote.send(('close', None)) - for process in self.processes: - process.join() - self.closed = True - - def get_images(self) -> Sequence[np.ndarray]: - for pipe in self.remotes: - # gather images from subprocesses - # `mode` will be taken into account later - pipe.send(('render', 'rgb_array')) - imgs = [pipe.recv() for pipe in self.remotes] - return imgs - - def get_attr(self, attr_name, indices=None): - """Return attribute from vectorized environment (see base class).""" - target_remotes = self._get_target_remotes(indices) - for remote in target_remotes: - remote.send(('get_attr', attr_name)) - return [remote.recv() for remote in target_remotes] - - def set_attr(self, attr_name, value, indices=None): - """Set attribute inside vectorized environments (see base class).""" - target_remotes = self._get_target_remotes(indices) - for remote in target_remotes: - remote.send(('set_attr', (attr_name, value))) - for remote in target_remotes: - remote.recv() - - def env_method(self, method_name, *method_args, indices=None, **method_kwargs): - """Call instance methods of vectorized environments.""" - target_remotes = self._get_target_remotes(indices) - for remote in target_remotes: - remote.send(('env_method', (method_name, method_args, method_kwargs))) - return [remote.recv() for remote in target_remotes] - - def _get_target_remotes(self, indices): - """ - Get the connection object needed to communicate with the wanted - envs that are in subprocesses. - - :param indices: (None,int,Iterable) refers to indices of envs. - :return: ([multiprocessing.Connection]) Connection object to communicate between processes. - """ - indices = self._get_indices(indices) - return [self.remotes[i] for i in indices] - - -def _flatten_obs(obs, space): - """ - Flatten observations, depending on the observation space. - - :param obs: (list or tuple where X is dict, tuple or ndarray) observations. - A list or tuple of observations, one per environment. - Each environment observation may be a NumPy array, or a dict or tuple of NumPy arrays. - :return (OrderedDict, tuple or ndarray) flattened observations. - A flattened NumPy array or an OrderedDict or tuple of flattened numpy arrays. - Each NumPy array has the environment index as its first axis. - """ - assert isinstance(obs, (list, tuple)), "expected list or tuple of observations per environment" - assert len(obs) > 0, "need observations from at least one environment" - - if isinstance(space, gym.spaces.Dict): - assert isinstance(space.spaces, OrderedDict), "Dict space must have ordered subspaces" - assert isinstance(obs[0], dict), "non-dict observation for environment with Dict observation space" - return OrderedDict([(k, np.stack([o[k] for o in obs])) for k in space.spaces.keys()]) - elif isinstance(space, gym.spaces.Tuple): - assert isinstance(obs[0], tuple), "non-tuple observation for environment with Tuple observation space" - obs_len = len(space.spaces) - return tuple((np.stack([o[i] for o in obs]) for i in range(obs_len))) - else: - return np.stack(obs) diff --git a/stable_baselines/common/vec_env/util.py b/stable_baselines/common/vec_env/util.py deleted file mode 100644 index 03ce286d..00000000 --- a/stable_baselines/common/vec_env/util.py +++ /dev/null @@ -1,73 +0,0 @@ -""" -Helpers for dealing with vectorized environments. -""" - -from collections import OrderedDict - -import gym -import numpy as np - - -def copy_obs_dict(obs): - """ - Deep-copy a dict of numpy arrays. - - :param obs: (OrderedDict): a dict of numpy arrays. - :return (OrderedDict) a dict of copied numpy arrays. - """ - assert isinstance(obs, OrderedDict), "unexpected type for observations '{}'".format(type(obs)) - return OrderedDict([(k, np.copy(v)) for k, v in obs.items()]) - - -def dict_to_obs(space, obs_dict): - """ - Convert an internal representation raw_obs into the appropriate type - specified by space. - - :param space: (gym.spaces.Space) an observation space. - :param obs_dict: (OrderedDict) a dict of numpy arrays. - :return (ndarray, tuple or dict): returns an observation - of the same type as space. If space is Dict, function is identity; - if space is Tuple, converts dict to Tuple; otherwise, space is - unstructured and returns the value raw_obs[None]. - """ - if isinstance(space, gym.spaces.Dict): - return obs_dict - elif isinstance(space, gym.spaces.Tuple): - assert len(obs_dict) == len(space.spaces), "size of observation does not match size of observation space" - return tuple((obs_dict[i] for i in range(len(space.spaces)))) - else: - assert set(obs_dict.keys()) == {None}, "multiple observation keys for unstructured observation space" - return obs_dict[None] - - -def obs_space_info(obs_space): - """ - Get dict-structured information about a gym.Space. - - Dict spaces are represented directly by their dict of subspaces. - Tuple spaces are converted into a dict with keys indexing into the tuple. - Unstructured spaces are represented by {None: obs_space}. - - :param obs_space: (gym.spaces.Space) an observation space - :return (tuple) A tuple (keys, shapes, dtypes): - keys: a list of dict keys. - shapes: a dict mapping keys to shapes. - dtypes: a dict mapping keys to dtypes. - """ - if isinstance(obs_space, gym.spaces.Dict): - assert isinstance(obs_space.spaces, OrderedDict), "Dict space must have ordered subspaces" - subspaces = obs_space.spaces - elif isinstance(obs_space, gym.spaces.Tuple): - subspaces = {i: space for i, space in enumerate(obs_space.spaces)} - else: - assert not hasattr(obs_space, 'spaces'), "Unsupported structured space '{}'".format(type(obs_space)) - subspaces = {None: obs_space} - keys = [] - shapes = {} - dtypes = {} - for key, box in subspaces.items(): - keys.append(key) - shapes[key] = box.shape - dtypes[key] = box.dtype - return keys, shapes, dtypes diff --git a/stable_baselines/common/vec_env/vec_check_nan.py b/stable_baselines/common/vec_env/vec_check_nan.py deleted file mode 100644 index 6deda56c..00000000 --- a/stable_baselines/common/vec_env/vec_check_nan.py +++ /dev/null @@ -1,86 +0,0 @@ -import warnings - -import numpy as np - -from stable_baselines.common.vec_env.base_vec_env import VecEnvWrapper - - -class VecCheckNan(VecEnvWrapper): - """ - NaN and inf checking wrapper for vectorized environment, will raise a warning by default, - allowing you to know from what the NaN of inf originated from. - - :param venv: (VecEnv) the vectorized environment to wrap - :param raise_exception: (bool) Whether or not to raise a ValueError, instead of a UserWarning - :param warn_once: (bool) Whether or not to only warn once. - :param check_inf: (bool) Whether or not to check for +inf or -inf as well - """ - - def __init__(self, venv, raise_exception=False, warn_once=True, check_inf=True): - VecEnvWrapper.__init__(self, venv) - self.raise_exception = raise_exception - self.warn_once = warn_once - self.check_inf = check_inf - self._actions = None - self._observations = None - self._user_warned = False - - def step_async(self, actions): - self._check_val(async_step=True, actions=actions) - - self._actions = actions - self.venv.step_async(actions) - - def step_wait(self): - observations, rewards, news, infos = self.venv.step_wait() - - self._check_val(async_step=False, observations=observations, rewards=rewards, news=news) - - self._observations = observations - return observations, rewards, news, infos - - def reset(self): - observations = self.venv.reset() - self._actions = None - - self._check_val(async_step=False, observations=observations) - - self._observations = observations - return observations - - def _check_val(self, *, async_step, **kwargs): - # if warn and warn once and have warned once: then stop checking - if not self.raise_exception and self.warn_once and self._user_warned: - return - - found = [] - for name, val in kwargs.items(): - has_nan = np.any(np.isnan(val)) - has_inf = self.check_inf and np.any(np.isinf(val)) - if has_inf: - found.append((name, "inf")) - if has_nan: - found.append((name, "nan")) - - if found: - self._user_warned = True - msg = "" - for i, (name, type_val) in enumerate(found): - msg += "found {} in {}".format(type_val, name) - if i != len(found) - 1: - msg += ", " - - msg += ".\r\nOriginated from the " - - if not async_step: - if self._actions is None: - msg += "environment observation (at reset)" - else: - msg += "environment, Last given value was: \r\n\taction={}".format(self._actions) - else: - msg += "RL model, Last given value was: \r\n\tobservations={}".format(self._observations) - - if self.raise_exception: - raise ValueError(msg) - else: - warnings.warn(msg, UserWarning) diff --git a/stable_baselines/common/vec_env/vec_frame_stack.py b/stable_baselines/common/vec_env/vec_frame_stack.py deleted file mode 100644 index 044102eb..00000000 --- a/stable_baselines/common/vec_env/vec_frame_stack.py +++ /dev/null @@ -1,55 +0,0 @@ -import warnings - -import numpy as np -from gym import spaces - -from stable_baselines.common.vec_env.base_vec_env import VecEnvWrapper - - -class VecFrameStack(VecEnvWrapper): - """ - Frame stacking wrapper for vectorized environment - - :param venv: (VecEnv) the vectorized environment to wrap - :param n_stack: (int) Number of frames to stack - """ - - def __init__(self, venv, n_stack): - self.venv = venv - self.n_stack = n_stack - wrapped_obs_space = venv.observation_space - low = np.repeat(wrapped_obs_space.low, self.n_stack, axis=-1) - high = np.repeat(wrapped_obs_space.high, self.n_stack, axis=-1) - self.stackedobs = np.zeros((venv.num_envs,) + low.shape, low.dtype) - observation_space = spaces.Box(low=low, high=high, dtype=venv.observation_space.dtype) - VecEnvWrapper.__init__(self, venv, observation_space=observation_space) - - def step_wait(self): - observations, rewards, dones, infos = self.venv.step_wait() - last_ax_size = observations.shape[-1] - self.stackedobs = np.roll(self.stackedobs, shift=-last_ax_size, axis=-1) - for i, done in enumerate(dones): - if done: - if 'terminal_observation' in infos[i]: - old_terminal = infos[i]['terminal_observation'] - new_terminal = np.concatenate( - (self.stackedobs[i, ..., :-last_ax_size], old_terminal), axis=-1) - infos[i]['terminal_observation'] = new_terminal - else: - warnings.warn( - "VecFrameStack wrapping a VecEnv without terminal_observation info") - self.stackedobs[i] = 0 - self.stackedobs[..., -observations.shape[-1]:] = observations - return self.stackedobs, rewards, dones, infos - - def reset(self): - """ - Reset all environments - """ - obs = self.venv.reset() - self.stackedobs[...] = 0 - self.stackedobs[..., -obs.shape[-1]:] = obs - return self.stackedobs - - def close(self): - self.venv.close() diff --git a/stable_baselines/common/vec_env/vec_normalize.py b/stable_baselines/common/vec_env/vec_normalize.py deleted file mode 100644 index 6ab308b1..00000000 --- a/stable_baselines/common/vec_env/vec_normalize.py +++ /dev/null @@ -1,198 +0,0 @@ -import pickle -import warnings - -import numpy as np - -from stable_baselines.common.vec_env.base_vec_env import VecEnvWrapper -from stable_baselines.common.running_mean_std import RunningMeanStd - - -class VecNormalize(VecEnvWrapper): - """ - A moving average, normalizing wrapper for vectorized environment. - - It is pickleable which will save moving averages and configuration parameters. - The wrapped environment `venv` is not saved, and must be restored manually with - `set_venv` after being unpickled. - - :param venv: (VecEnv) the vectorized environment to wrap - :param training: (bool) Whether to update or not the moving average - :param norm_obs: (bool) Whether to normalize observation or not (default: True) - :param norm_reward: (bool) Whether to normalize rewards or not (default: True) - :param clip_obs: (float) Max absolute value for observation - :param clip_reward: (float) Max value absolute for discounted reward - :param gamma: (float) discount factor - :param epsilon: (float) To avoid division by zero - """ - - def __init__(self, venv, training=True, norm_obs=True, norm_reward=True, - clip_obs=10., clip_reward=10., gamma=0.99, epsilon=1e-8): - VecEnvWrapper.__init__(self, venv) - self.obs_rms = RunningMeanStd(shape=self.observation_space.shape) - self.ret_rms = RunningMeanStd(shape=()) - self.clip_obs = clip_obs - self.clip_reward = clip_reward - # Returns: discounted rewards - self.ret = np.zeros(self.num_envs) - self.gamma = gamma - self.epsilon = epsilon - self.training = training - self.norm_obs = norm_obs - self.norm_reward = norm_reward - self.old_obs = None - self.old_rews = None - - def __getstate__(self): - """ - Gets state for pickling. - - Excludes self.venv, as in general VecEnv's may not be pickleable.""" - state = self.__dict__.copy() - # these attributes are not pickleable - del state['venv'] - del state['class_attributes'] - # these attributes depend on the above and so we would prefer not to pickle - del state['ret'] - return state - - def __setstate__(self, state): - """ - Restores pickled state. - - User must call set_venv() after unpickling before using. - - :param state: (dict)""" - self.__dict__.update(state) - assert 'venv' not in state - self.venv = None - - def set_venv(self, venv): - """ - Sets the vector environment to wrap to venv. - - Also sets attributes derived from this such as `num_env`. - - :param venv: (VecEnv) - """ - if self.venv is not None: - raise ValueError("Trying to set venv of already initialized VecNormalize wrapper.") - VecEnvWrapper.__init__(self, venv) - if self.obs_rms.mean.shape != self.observation_space.shape: - raise ValueError("venv is incompatible with current statistics.") - self.ret = np.zeros(self.num_envs) - - def step_wait(self): - """ - Apply sequence of actions to sequence of environments - actions -> (observations, rewards, news) - - where 'news' is a boolean vector indicating whether each element is new. - """ - obs, rews, news, infos = self.venv.step_wait() - self.old_obs = obs - self.old_rews = rews - - if self.training: - self.obs_rms.update(obs) - obs = self.normalize_obs(obs) - - if self.training: - self._update_reward(rews) - rews = self.normalize_reward(rews) - - self.ret[news] = 0 - return obs, rews, news, infos - - def _update_reward(self, reward: np.ndarray) -> None: - """Update reward normalization statistics.""" - self.ret = self.ret * self.gamma + reward - self.ret_rms.update(self.ret) - - def normalize_obs(self, obs: np.ndarray) -> np.ndarray: - """ - Normalize observations using this VecNormalize's observations statistics. - Calling this method does not update statistics. - """ - if self.norm_obs: - obs = np.clip((obs - self.obs_rms.mean) / np.sqrt(self.obs_rms.var + self.epsilon), - -self.clip_obs, - self.clip_obs) - return obs - - def normalize_reward(self, reward: np.ndarray) -> np.ndarray: - """ - Normalize rewards using this VecNormalize's rewards statistics. - Calling this method does not update statistics. - """ - if self.norm_reward: - reward = np.clip(reward / np.sqrt(self.ret_rms.var + self.epsilon), - -self.clip_reward, self.clip_reward) - return reward - - def get_original_obs(self) -> np.ndarray: - """ - Returns an unnormalized version of the observations from the most recent - step or reset. - """ - return self.old_obs.copy() - - def get_original_reward(self) -> np.ndarray: - """ - Returns an unnormalized version of the rewards from the most recent step. - """ - return self.old_rews.copy() - - def reset(self): - """ - Reset all environments - """ - obs = self.venv.reset() - self.old_obs = obs - self.ret = np.zeros(self.num_envs) - if self.training: - self._update_reward(self.ret) - return self.normalize_obs(obs) - - @staticmethod - def load(load_path, venv): - """ - Loads a saved VecNormalize object. - - :param load_path: the path to load from. - :param venv: the VecEnv to wrap. - :return: (VecNormalize) - """ - with open(load_path, "rb") as file_handler: - vec_normalize = pickle.load(file_handler) - vec_normalize.set_venv(venv) - return vec_normalize - - def save(self, save_path): - with open(save_path, "wb") as file_handler: - pickle.dump(self, file_handler) - - def save_running_average(self, path): - """ - :param path: (str) path to log dir - - .. deprecated:: 2.9.0 - This function will be removed in a future version - """ - warnings.warn("Usage of `save_running_average` is deprecated. Please " - "use `save` or pickle instead.", DeprecationWarning) - for rms, name in zip([self.obs_rms, self.ret_rms], ['obs_rms', 'ret_rms']): - with open("{}/{}.pkl".format(path, name), 'wb') as file_handler: - pickle.dump(rms, file_handler) - - def load_running_average(self, path): - """ - :param path: (str) path to log dir - - .. deprecated:: 2.9.0 - This function will be removed in a future version - """ - warnings.warn("Usage of `load_running_average` is deprecated. Please " - "use `load` or pickle instead.", DeprecationWarning) - for name in ['obs_rms', 'ret_rms']: - with open("{}/{}.pkl".format(path, name), 'rb') as file_handler: - setattr(self, name, pickle.load(file_handler)) diff --git a/stable_baselines/common/vec_env/vec_video_recorder.py b/stable_baselines/common/vec_env/vec_video_recorder.py deleted file mode 100644 index 23478246..00000000 --- a/stable_baselines/common/vec_env/vec_video_recorder.py +++ /dev/null @@ -1,112 +0,0 @@ -import os - -from gym.wrappers.monitoring import video_recorder - -from stable_baselines import logger -from stable_baselines.common.vec_env.base_vec_env import VecEnvWrapper -from stable_baselines.common.vec_env.dummy_vec_env import DummyVecEnv -from stable_baselines.common.vec_env.subproc_vec_env import SubprocVecEnv -from stable_baselines.common.vec_env.vec_frame_stack import VecFrameStack -from stable_baselines.common.vec_env.vec_normalize import VecNormalize - - -class VecVideoRecorder(VecEnvWrapper): - """ - Wraps a VecEnv or VecEnvWrapper object to record rendered image as mp4 video. - It requires ffmpeg or avconv to be installed on the machine. - - :param venv: (VecEnv or VecEnvWrapper) - :param video_folder: (str) Where to save videos - :param record_video_trigger: (func) Function that defines when to start recording. - The function takes the current number of step, - and returns whether we should start recording or not. - :param video_length: (int) Length of recorded videos - :param name_prefix: (str) Prefix to the video name - """ - - def __init__(self, venv, video_folder, record_video_trigger, - video_length=200, name_prefix='rl-video'): - - VecEnvWrapper.__init__(self, venv) - - self.env = venv - # Temp variable to retrieve metadata - temp_env = venv - - # Unwrap to retrieve metadata dict - # that will be used by gym recorder - while isinstance(temp_env, VecNormalize) or isinstance(temp_env, VecFrameStack): - temp_env = temp_env.venv - - if isinstance(temp_env, DummyVecEnv) or isinstance(temp_env, SubprocVecEnv): - metadata = temp_env.get_attr('metadata')[0] - else: - metadata = temp_env.metadata - - self.env.metadata = metadata - - self.record_video_trigger = record_video_trigger - self.video_recorder = None - - self.video_folder = os.path.abspath(video_folder) - # Create output folder if needed - os.makedirs(self.video_folder, exist_ok=True) - - self.name_prefix = name_prefix - self.step_id = 0 - self.video_length = video_length - - self.recording = False - self.recorded_frames = 0 - - def reset(self): - obs = self.venv.reset() - self.start_video_recorder() - return obs - - def start_video_recorder(self): - self.close_video_recorder() - - video_name = '{}-step-{}-to-step-{}'.format(self.name_prefix, self.step_id, - self.step_id + self.video_length) - base_path = os.path.join(self.video_folder, video_name) - self.video_recorder = video_recorder.VideoRecorder( - env=self.env, - base_path=base_path, - metadata={'step_id': self.step_id} - ) - - self.video_recorder.capture_frame() - self.recorded_frames = 1 - self.recording = True - - def _video_enabled(self): - return self.record_video_trigger(self.step_id) - - def step_wait(self): - obs, rews, dones, infos = self.venv.step_wait() - - self.step_id += 1 - if self.recording: - self.video_recorder.capture_frame() - self.recorded_frames += 1 - if self.recorded_frames > self.video_length: - logger.info("Saving video to ", self.video_recorder.path) - self.close_video_recorder() - elif self._video_enabled(): - self.start_video_recorder() - - return obs, rews, dones, infos - - def close_video_recorder(self): - if self.recording: - self.video_recorder.close() - self.recording = False - self.recorded_frames = 1 - - def close(self): - VecEnvWrapper.close(self) - self.close_video_recorder() - - def __del__(self): - self.close() diff --git a/stable_baselines/ddpg/__init__.py b/stable_baselines/ddpg/__init__.py deleted file mode 100644 index 1ce12c02..00000000 --- a/stable_baselines/ddpg/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from stable_baselines.common.noise import AdaptiveParamNoiseSpec, NormalActionNoise, OrnsteinUhlenbeckActionNoise -from stable_baselines.ddpg.ddpg import DDPG -from stable_baselines.ddpg.policies import MlpPolicy, CnnPolicy, LnMlpPolicy, LnCnnPolicy diff --git a/stable_baselines/ddpg/ddpg.py b/stable_baselines/ddpg/ddpg.py deleted file mode 100644 index 5e806f3c..00000000 --- a/stable_baselines/ddpg/ddpg.py +++ /dev/null @@ -1,1175 +0,0 @@ -from functools import reduce -import os -import time -from collections import deque -import pickle -import warnings - -import gym -import numpy as np -import tensorflow as tf -import tensorflow.contrib as tc -from mpi4py import MPI - -from stable_baselines import logger -from stable_baselines.common import tf_util, OffPolicyRLModel, SetVerbosity, TensorboardWriter -from stable_baselines.common.vec_env import VecEnv -from stable_baselines.common.mpi_adam import MpiAdam -from stable_baselines.common.buffers import ReplayBuffer -from stable_baselines.common.math_util import unscale_action, scale_action -from stable_baselines.common.mpi_running_mean_std import RunningMeanStd -from stable_baselines.ddpg.policies import DDPGPolicy - - -def normalize(tensor, stats): - """ - normalize a tensor using a running mean and std - - :param tensor: (TensorFlow Tensor) the input tensor - :param stats: (RunningMeanStd) the running mean and std of the input to normalize - :return: (TensorFlow Tensor) the normalized tensor - """ - if stats is None: - return tensor - return (tensor - stats.mean) / stats.std - - -def denormalize(tensor, stats): - """ - denormalize a tensor using a running mean and std - - :param tensor: (TensorFlow Tensor) the normalized tensor - :param stats: (RunningMeanStd) the running mean and std of the input to normalize - :return: (TensorFlow Tensor) the restored tensor - """ - if stats is None: - return tensor - return tensor * stats.std + stats.mean - - -def reduce_std(tensor, axis=None, keepdims=False): - """ - get the standard deviation of a Tensor - - :param tensor: (TensorFlow Tensor) the input tensor - :param axis: (int or [int]) the axis to itterate the std over - :param keepdims: (bool) keep the other dimensions the same - :return: (TensorFlow Tensor) the std of the tensor - """ - return tf.sqrt(reduce_var(tensor, axis=axis, keepdims=keepdims)) - - -def reduce_var(tensor, axis=None, keepdims=False): - """ - get the variance of a Tensor - - :param tensor: (TensorFlow Tensor) the input tensor - :param axis: (int or [int]) the axis to itterate the variance over - :param keepdims: (bool) keep the other dimensions the same - :return: (TensorFlow Tensor) the variance of the tensor - """ - tensor_mean = tf.reduce_mean(tensor, axis=axis, keepdims=True) - devs_squared = tf.square(tensor - tensor_mean) - return tf.reduce_mean(devs_squared, axis=axis, keepdims=keepdims) - - -def get_target_updates(_vars, target_vars, tau, verbose=0): - """ - get target update operations - - :param _vars: ([TensorFlow Tensor]) the initial variables - :param target_vars: ([TensorFlow Tensor]) the target variables - :param tau: (float) the soft update coefficient (keep old values, between 0 and 1) - :param verbose: (int) the verbosity level: 0 none, 1 training information, 2 tensorflow debug - :return: (TensorFlow Operation, TensorFlow Operation) initial update, soft update - """ - if verbose >= 2: - logger.info('setting up target updates ...') - soft_updates = [] - init_updates = [] - assert len(_vars) == len(target_vars) - for var, target_var in zip(_vars, target_vars): - if verbose >= 2: - logger.info(' {} <- {}'.format(target_var.name, var.name)) - init_updates.append(tf.assign(target_var, var)) - soft_updates.append(tf.assign(target_var, (1. - tau) * target_var + tau * var)) - assert len(init_updates) == len(_vars) - assert len(soft_updates) == len(_vars) - return tf.group(*init_updates), tf.group(*soft_updates) - - -def get_perturbable_vars(scope): - """ - Get the trainable variables that can be perturbed when using - parameter noise. - - :param scope: (str) tensorflow scope of the variables - :return: ([tf.Variables]) - """ - return [var for var in tf_util.get_trainable_vars(scope) if 'LayerNorm' not in var.name] - - -def get_perturbed_actor_updates(actor, perturbed_actor, param_noise_stddev, verbose=0): - """ - Get the actor update, with noise. - - :param actor: (str) the actor - :param perturbed_actor: (str) the pertubed actor - :param param_noise_stddev: (float) the std of the parameter noise - :param verbose: (int) the verbosity level: 0 none, 1 training information, 2 tensorflow debug - :return: (TensorFlow Operation) the update function - """ - assert len(tf_util.get_globals_vars(actor)) == len(tf_util.get_globals_vars(perturbed_actor)) - assert len(get_perturbable_vars(actor)) == len(get_perturbable_vars(perturbed_actor)) - - updates = [] - for var, perturbed_var in zip(tf_util.get_globals_vars(actor), tf_util.get_globals_vars(perturbed_actor)): - if var in get_perturbable_vars(actor): - if verbose >= 2: - logger.info(' {} <- {} + noise'.format(perturbed_var.name, var.name)) - # Add Gaussian noise to the parameter - updates.append(tf.assign(perturbed_var, - var + tf.random_normal(tf.shape(var), mean=0., stddev=param_noise_stddev))) - else: - if verbose >= 2: - logger.info(' {} <- {}'.format(perturbed_var.name, var.name)) - updates.append(tf.assign(perturbed_var, var)) - assert len(updates) == len(tf_util.get_globals_vars(actor)) - return tf.group(*updates) - - -class DDPG(OffPolicyRLModel): - """ - Deep Deterministic Policy Gradient (DDPG) model - - DDPG: https://arxiv.org/pdf/1509.02971.pdf - - :param policy: (DDPGPolicy or str) The policy model to use (MlpPolicy, CnnPolicy, LnMlpPolicy, ...) - :param env: (Gym environment or str) The environment to learn from (if registered in Gym, can be str) - :param gamma: (float) the discount factor - :param memory_policy: (ReplayBuffer) the replay buffer - (if None, default to baselines.deepq.replay_buffer.ReplayBuffer) - - .. deprecated:: 2.6.0 - This parameter will be removed in a future version - - :param eval_env: (Gym Environment) the evaluation environment (can be None) - :param nb_train_steps: (int) the number of training steps - :param nb_rollout_steps: (int) the number of rollout steps - :param nb_eval_steps: (int) the number of evaluation steps - :param param_noise: (AdaptiveParamNoiseSpec) the parameter noise type (can be None) - :param action_noise: (ActionNoise) the action noise type (can be None) - :param param_noise_adaption_interval: (int) apply param noise every N steps - :param tau: (float) the soft update coefficient (keep old values, between 0 and 1) - :param normalize_returns: (bool) should the critic output be normalized - :param enable_popart: (bool) enable pop-art normalization of the critic output - (https://arxiv.org/pdf/1602.07714.pdf), normalize_returns must be set to True. - :param normalize_observations: (bool) should the observation be normalized - :param batch_size: (int) the size of the batch for learning the policy - :param observation_range: (tuple) the bounding values for the observation - :param return_range: (tuple) the bounding values for the critic output - :param critic_l2_reg: (float) l2 regularizer coefficient - :param actor_lr: (float) the actor learning rate - :param critic_lr: (float) the critic learning rate - :param clip_norm: (float) clip the gradients (disabled if None) - :param reward_scale: (float) the value the reward should be scaled by - :param render: (bool) enable rendering of the environment - :param render_eval: (bool) enable rendering of the evaluation environment - :param memory_limit: (int) the max number of transitions to store, size of the replay buffer - - .. deprecated:: 2.6.0 - Use `buffer_size` instead. - - :param buffer_size: (int) the max number of transitions to store, size of the replay buffer - :param random_exploration: (float) Probability of taking a random action (as in an epsilon-greedy strategy) - This is not needed for DDPG normally but can help exploring when using HER + DDPG. - This hack was present in the original OpenAI Baselines repo (DDPG + HER) - :param verbose: (int) the verbosity level: 0 none, 1 training information, 2 tensorflow debug - :param tensorboard_log: (str) the log location for tensorboard (if None, no logging) - :param _init_setup_model: (bool) Whether or not to build the network at the creation of the instance - :param policy_kwargs: (dict) additional arguments to be passed to the policy on creation - :param full_tensorboard_log: (bool) enable additional logging when using tensorboard - WARNING: this logging can take a lot of space quickly - :param seed: (int) Seed for the pseudo-random generators (python, numpy, tensorflow). - If None (default), use random seed. Note that if you want completely deterministic - results, you must set `n_cpu_tf_sess` to 1. - :param n_cpu_tf_sess: (int) The number of threads for TensorFlow operations - If None, the number of cpu of the current machine will be used. - """ - def __init__(self, policy, env, gamma=0.99, memory_policy=None, eval_env=None, nb_train_steps=50, - nb_rollout_steps=100, nb_eval_steps=100, param_noise=None, action_noise=None, - normalize_observations=False, tau=0.001, batch_size=128, param_noise_adaption_interval=50, - normalize_returns=False, enable_popart=False, observation_range=(-5., 5.), critic_l2_reg=0., - return_range=(-np.inf, np.inf), actor_lr=1e-4, critic_lr=1e-3, clip_norm=None, reward_scale=1., - render=False, render_eval=False, memory_limit=None, buffer_size=50000, random_exploration=0.0, - verbose=0, tensorboard_log=None, _init_setup_model=True, policy_kwargs=None, - full_tensorboard_log=False, seed=None, n_cpu_tf_sess=1): - - super(DDPG, self).__init__(policy=policy, env=env, replay_buffer=None, - verbose=verbose, policy_base=DDPGPolicy, - requires_vec_env=False, policy_kwargs=policy_kwargs, - seed=seed, n_cpu_tf_sess=n_cpu_tf_sess) - - # Parameters. - self.gamma = gamma - self.tau = tau - - # TODO: remove this param in v3.x.x - if memory_policy is not None: - warnings.warn("memory_policy will be removed in a future version (v3.x.x) " - "it is now ignored and replaced with ReplayBuffer", DeprecationWarning) - - if memory_limit is not None: - warnings.warn("memory_limit will be removed in a future version (v3.x.x) " - "use buffer_size instead", DeprecationWarning) - buffer_size = memory_limit - - self.normalize_observations = normalize_observations - self.normalize_returns = normalize_returns - self.action_noise = action_noise - self.param_noise = param_noise - self.return_range = return_range - self.observation_range = observation_range - self.actor_lr = actor_lr - self.critic_lr = critic_lr - self.clip_norm = clip_norm - self.enable_popart = enable_popart - self.reward_scale = reward_scale - self.batch_size = batch_size - self.critic_l2_reg = critic_l2_reg - self.eval_env = eval_env - self.render = render - self.render_eval = render_eval - self.nb_eval_steps = nb_eval_steps - self.param_noise_adaption_interval = param_noise_adaption_interval - self.nb_train_steps = nb_train_steps - self.nb_rollout_steps = nb_rollout_steps - self.memory_limit = memory_limit - self.buffer_size = buffer_size - self.tensorboard_log = tensorboard_log - self.full_tensorboard_log = full_tensorboard_log - self.random_exploration = random_exploration - - # init - self.graph = None - self.stats_sample = None - self.replay_buffer = None - self.policy_tf = None - self.target_init_updates = None - self.target_soft_updates = None - self.critic_loss = None - self.critic_grads = None - self.critic_optimizer = None - self.sess = None - self.stats_ops = None - self.stats_names = None - self.perturbed_actor_tf = None - self.perturb_policy_ops = None - self.perturb_adaptive_policy_ops = None - self.adaptive_policy_distance = None - self.actor_loss = None - self.actor_grads = None - self.actor_optimizer = None - self.old_std = None - self.old_mean = None - self.renormalize_q_outputs_op = None - self.obs_rms = None - self.ret_rms = None - self.target_policy = None - self.actor_tf = None - self.normalized_critic_tf = None - self.critic_tf = None - self.normalized_critic_with_actor_tf = None - self.critic_with_actor_tf = None - self.target_q = None - self.obs_train = None - self.action_train_ph = None - self.obs_target = None - self.action_target = None - self.obs_noise = None - self.action_noise_ph = None - self.obs_adapt_noise = None - self.action_adapt_noise = None - self.terminals_ph = None - self.rewards = None - self.actions = None - self.critic_target = None - self.param_noise_stddev = None - self.param_noise_actor = None - self.adaptive_param_noise_actor = None - self.params = None - self.summary = None - self.tb_seen_steps = None - - self.target_params = None - self.obs_rms_params = None - self.ret_rms_params = None - - if _init_setup_model: - self.setup_model() - - def _get_pretrain_placeholders(self): - policy = self.policy_tf - # Rescale - deterministic_action = unscale_action(self.action_space, self.actor_tf) - return policy.obs_ph, self.actions, deterministic_action - - def setup_model(self): - with SetVerbosity(self.verbose): - - assert isinstance(self.action_space, gym.spaces.Box), \ - "Error: DDPG cannot output a {} action space, only spaces.Box is supported.".format(self.action_space) - assert issubclass(self.policy, DDPGPolicy), "Error: the input policy for the DDPG model must be " \ - "an instance of DDPGPolicy." - - self.graph = tf.Graph() - with self.graph.as_default(): - self.set_random_seed(self.seed) - self.sess = tf_util.make_session(num_cpu=self.n_cpu_tf_sess, graph=self.graph) - - self.replay_buffer = ReplayBuffer(self.buffer_size) - - with tf.variable_scope("input", reuse=False): - # Observation normalization. - if self.normalize_observations: - with tf.variable_scope('obs_rms'): - self.obs_rms = RunningMeanStd(shape=self.observation_space.shape) - else: - self.obs_rms = None - - # Return normalization. - if self.normalize_returns: - with tf.variable_scope('ret_rms'): - self.ret_rms = RunningMeanStd() - else: - self.ret_rms = None - - self.policy_tf = self.policy(self.sess, self.observation_space, self.action_space, 1, 1, None, - **self.policy_kwargs) - - # Create target networks. - self.target_policy = self.policy(self.sess, self.observation_space, self.action_space, 1, 1, None, - **self.policy_kwargs) - self.obs_target = self.target_policy.obs_ph - self.action_target = self.target_policy.action_ph - - normalized_obs = tf.clip_by_value(normalize(self.policy_tf.processed_obs, self.obs_rms), - self.observation_range[0], self.observation_range[1]) - normalized_next_obs = tf.clip_by_value(normalize(self.target_policy.processed_obs, self.obs_rms), - self.observation_range[0], self.observation_range[1]) - - if self.param_noise is not None: - # Configure perturbed actor. - self.param_noise_actor = self.policy(self.sess, self.observation_space, self.action_space, 1, 1, - None, **self.policy_kwargs) - self.obs_noise = self.param_noise_actor.obs_ph - self.action_noise_ph = self.param_noise_actor.action_ph - - # Configure separate copy for stddev adoption. - self.adaptive_param_noise_actor = self.policy(self.sess, self.observation_space, - self.action_space, 1, 1, None, - **self.policy_kwargs) - self.obs_adapt_noise = self.adaptive_param_noise_actor.obs_ph - self.action_adapt_noise = self.adaptive_param_noise_actor.action_ph - - # Inputs. - self.obs_train = self.policy_tf.obs_ph - self.action_train_ph = self.policy_tf.action_ph - self.terminals_ph = tf.placeholder(tf.float32, shape=(None, 1), name='terminals') - self.rewards = tf.placeholder(tf.float32, shape=(None, 1), name='rewards') - self.actions = tf.placeholder(tf.float32, shape=(None,) + self.action_space.shape, name='actions') - self.critic_target = tf.placeholder(tf.float32, shape=(None, 1), name='critic_target') - self.param_noise_stddev = tf.placeholder(tf.float32, shape=(), name='param_noise_stddev') - - # Create networks and core TF parts that are shared across setup parts. - with tf.variable_scope("model", reuse=False): - self.actor_tf = self.policy_tf.make_actor(normalized_obs) - self.normalized_critic_tf = self.policy_tf.make_critic(normalized_obs, self.actions) - self.normalized_critic_with_actor_tf = self.policy_tf.make_critic(normalized_obs, - self.actor_tf, - reuse=True) - # Noise setup - if self.param_noise is not None: - self._setup_param_noise(normalized_obs) - - with tf.variable_scope("target", reuse=False): - critic_target = self.target_policy.make_critic(normalized_next_obs, - self.target_policy.make_actor(normalized_next_obs)) - - with tf.variable_scope("loss", reuse=False): - self.critic_tf = denormalize( - tf.clip_by_value(self.normalized_critic_tf, self.return_range[0], self.return_range[1]), - self.ret_rms) - - self.critic_with_actor_tf = denormalize( - tf.clip_by_value(self.normalized_critic_with_actor_tf, - self.return_range[0], self.return_range[1]), - self.ret_rms) - - q_next_obs = denormalize(critic_target, self.ret_rms) - self.target_q = self.rewards + (1. - self.terminals_ph) * self.gamma * q_next_obs - - tf.summary.scalar('critic_target', tf.reduce_mean(self.critic_target)) - if self.full_tensorboard_log: - tf.summary.histogram('critic_target', self.critic_target) - - # Set up parts. - if self.normalize_returns and self.enable_popart: - self._setup_popart() - self._setup_stats() - self._setup_target_network_updates() - - with tf.variable_scope("input_info", reuse=False): - tf.summary.scalar('rewards', tf.reduce_mean(self.rewards)) - tf.summary.scalar('param_noise_stddev', tf.reduce_mean(self.param_noise_stddev)) - - if self.full_tensorboard_log: - tf.summary.histogram('rewards', self.rewards) - tf.summary.histogram('param_noise_stddev', self.param_noise_stddev) - if len(self.observation_space.shape) == 3 and self.observation_space.shape[0] in [1, 3, 4]: - tf.summary.image('observation', self.obs_train) - else: - tf.summary.histogram('observation', self.obs_train) - - with tf.variable_scope("Adam_mpi", reuse=False): - self._setup_actor_optimizer() - self._setup_critic_optimizer() - tf.summary.scalar('actor_loss', self.actor_loss) - tf.summary.scalar('critic_loss', self.critic_loss) - - self.params = tf_util.get_trainable_vars("model") \ - + tf_util.get_trainable_vars('noise/') + tf_util.get_trainable_vars('noise_adapt/') - - self.target_params = tf_util.get_trainable_vars("target") - self.obs_rms_params = [var for var in tf.global_variables() - if "obs_rms" in var.name] - self.ret_rms_params = [var for var in tf.global_variables() - if "ret_rms" in var.name] - - with self.sess.as_default(): - self._initialize(self.sess) - - self.summary = tf.summary.merge_all() - - def _setup_target_network_updates(self): - """ - set the target update operations - """ - init_updates, soft_updates = get_target_updates(tf_util.get_trainable_vars('model/'), - tf_util.get_trainable_vars('target/'), self.tau, - self.verbose) - self.target_init_updates = init_updates - self.target_soft_updates = soft_updates - - def _setup_param_noise(self, normalized_obs): - """ - Setup the parameter noise operations - - :param normalized_obs: (TensorFlow Tensor) the normalized observation - """ - assert self.param_noise is not None - - with tf.variable_scope("noise", reuse=False): - self.perturbed_actor_tf = self.param_noise_actor.make_actor(normalized_obs) - - with tf.variable_scope("noise_adapt", reuse=False): - adaptive_actor_tf = self.adaptive_param_noise_actor.make_actor(normalized_obs) - - with tf.variable_scope("noise_update_func", reuse=False): - if self.verbose >= 2: - logger.info('setting up param noise') - self.perturb_policy_ops = get_perturbed_actor_updates('model/pi/', 'noise/pi/', self.param_noise_stddev, - verbose=self.verbose) - - self.perturb_adaptive_policy_ops = get_perturbed_actor_updates('model/pi/', 'noise_adapt/pi/', - self.param_noise_stddev, - verbose=self.verbose) - self.adaptive_policy_distance = tf.sqrt(tf.reduce_mean(tf.square(self.actor_tf - adaptive_actor_tf))) - - def _setup_actor_optimizer(self): - """ - setup the optimizer for the actor - """ - if self.verbose >= 2: - logger.info('setting up actor optimizer') - self.actor_loss = -tf.reduce_mean(self.critic_with_actor_tf) - actor_shapes = [var.get_shape().as_list() for var in tf_util.get_trainable_vars('model/pi/')] - actor_nb_params = sum([reduce(lambda x, y: x * y, shape) for shape in actor_shapes]) - if self.verbose >= 2: - logger.info(' actor shapes: {}'.format(actor_shapes)) - logger.info(' actor params: {}'.format(actor_nb_params)) - self.actor_grads = tf_util.flatgrad(self.actor_loss, tf_util.get_trainable_vars('model/pi/'), - clip_norm=self.clip_norm) - self.actor_optimizer = MpiAdam(var_list=tf_util.get_trainable_vars('model/pi/'), beta1=0.9, beta2=0.999, - epsilon=1e-08) - - def _setup_critic_optimizer(self): - """ - setup the optimizer for the critic - """ - if self.verbose >= 2: - logger.info('setting up critic optimizer') - normalized_critic_target_tf = tf.clip_by_value(normalize(self.critic_target, self.ret_rms), - self.return_range[0], self.return_range[1]) - self.critic_loss = tf.reduce_mean(tf.square(self.normalized_critic_tf - normalized_critic_target_tf)) - if self.critic_l2_reg > 0.: - critic_reg_vars = [var for var in tf_util.get_trainable_vars('model/qf/') - if 'bias' not in var.name and 'qf_output' not in var.name and 'b' not in var.name] - if self.verbose >= 2: - for var in critic_reg_vars: - logger.info(' regularizing: {}'.format(var.name)) - logger.info(' applying l2 regularization with {}'.format(self.critic_l2_reg)) - critic_reg = tc.layers.apply_regularization( - tc.layers.l2_regularizer(self.critic_l2_reg), - weights_list=critic_reg_vars - ) - self.critic_loss += critic_reg - critic_shapes = [var.get_shape().as_list() for var in tf_util.get_trainable_vars('model/qf/')] - critic_nb_params = sum([reduce(lambda x, y: x * y, shape) for shape in critic_shapes]) - if self.verbose >= 2: - logger.info(' critic shapes: {}'.format(critic_shapes)) - logger.info(' critic params: {}'.format(critic_nb_params)) - self.critic_grads = tf_util.flatgrad(self.critic_loss, tf_util.get_trainable_vars('model/qf/'), - clip_norm=self.clip_norm) - self.critic_optimizer = MpiAdam(var_list=tf_util.get_trainable_vars('model/qf/'), beta1=0.9, beta2=0.999, - epsilon=1e-08) - - def _setup_popart(self): - """ - setup pop-art normalization of the critic output - - See https://arxiv.org/pdf/1602.07714.pdf for details. - Preserving Outputs Precisely, while Adaptively Rescaling Targets”. - """ - self.old_std = tf.placeholder(tf.float32, shape=[1], name='old_std') - new_std = self.ret_rms.std - self.old_mean = tf.placeholder(tf.float32, shape=[1], name='old_mean') - new_mean = self.ret_rms.mean - - self.renormalize_q_outputs_op = [] - for out_vars in [[var for var in tf_util.get_trainable_vars('model/qf/') if 'qf_output' in var.name], - [var for var in tf_util.get_trainable_vars('target/qf/') if 'qf_output' in var.name]]: - assert len(out_vars) == 2 - # wieght and bias of the last layer - weight, bias = out_vars - assert 'kernel' in weight.name - assert 'bias' in bias.name - assert weight.get_shape()[-1] == 1 - assert bias.get_shape()[-1] == 1 - self.renormalize_q_outputs_op += [weight.assign(weight * self.old_std / new_std)] - self.renormalize_q_outputs_op += [bias.assign((bias * self.old_std + self.old_mean - new_mean) / new_std)] - - def _setup_stats(self): - """ - Setup the stat logger for DDPG. - """ - ops = [ - tf.reduce_mean(self.critic_tf), - reduce_std(self.critic_tf), - tf.reduce_mean(self.critic_with_actor_tf), - reduce_std(self.critic_with_actor_tf), - tf.reduce_mean(self.actor_tf), - reduce_std(self.actor_tf) - ] - names = [ - 'reference_Q_mean', - 'reference_Q_std', - 'reference_actor_Q_mean', - 'reference_actor_Q_std', - 'reference_action_mean', - 'reference_action_std' - ] - - if self.normalize_returns: - ops += [self.ret_rms.mean, self.ret_rms.std] - names += ['ret_rms_mean', 'ret_rms_std'] - - if self.normalize_observations: - ops += [tf.reduce_mean(self.obs_rms.mean), tf.reduce_mean(self.obs_rms.std)] - names += ['obs_rms_mean', 'obs_rms_std'] - - if self.param_noise: - ops += [tf.reduce_mean(self.perturbed_actor_tf), reduce_std(self.perturbed_actor_tf)] - names += ['reference_perturbed_action_mean', 'reference_perturbed_action_std'] - - self.stats_ops = ops - self.stats_names = names - - def _policy(self, obs, apply_noise=True, compute_q=True): - """ - Get the actions and critic output, from a given observation - - :param obs: ([float] or [int]) the observation - :param apply_noise: (bool) enable the noise - :param compute_q: (bool) compute the critic output - :return: ([float], float) the action and critic value - """ - obs = np.array(obs).reshape((-1,) + self.observation_space.shape) - feed_dict = {self.obs_train: obs} - if self.param_noise is not None and apply_noise: - actor_tf = self.perturbed_actor_tf - feed_dict[self.obs_noise] = obs - else: - actor_tf = self.actor_tf - - if compute_q: - action, q_value = self.sess.run([actor_tf, self.critic_with_actor_tf], feed_dict=feed_dict) - else: - action = self.sess.run(actor_tf, feed_dict=feed_dict) - q_value = None - - action = action.flatten() - if self.action_noise is not None and apply_noise: - noise = self.action_noise() - action += noise - action = np.clip(action, -1, 1) - return action, q_value - - def _store_transition(self, obs, action, reward, next_obs, done, info): - """ - Store a transition in the replay buffer - - :param obs: ([float] or [int]) the last observation - :param action: ([float]) the action - :param reward: (float] the reward - :param next_obs: ([float] or [int]) the current observation - :param done: (bool) Whether the episode is over - :param info: (dict) extra values used to compute reward when using HER - """ - reward *= self.reward_scale - self.replay_buffer_add(obs, action, reward, next_obs, done, info) - if self.normalize_observations: - self.obs_rms.update(np.array([obs])) - - def _train_step(self, step, writer, log=False): - """ - run a step of training from batch - - :param step: (int) the current step iteration - :param writer: (TensorFlow Summary.writer) the writer for tensorboard - :param log: (bool) whether or not to log to metadata - :return: (float, float) critic loss, actor loss - """ - # Get a batch - obs, actions, rewards, next_obs, terminals = self.replay_buffer.sample(batch_size=self.batch_size, - env=self._vec_normalize_env) - # Reshape to match previous behavior and placeholder shape - rewards = rewards.reshape(-1, 1) - terminals = terminals.reshape(-1, 1) - - if self.normalize_returns and self.enable_popart: - old_mean, old_std, target_q = self.sess.run([self.ret_rms.mean, self.ret_rms.std, self.target_q], - feed_dict={ - self.obs_target: next_obs, - self.rewards: rewards, - self.terminals_ph: terminals - }) - self.ret_rms.update(target_q.flatten()) - self.sess.run(self.renormalize_q_outputs_op, feed_dict={ - self.old_std: np.array([old_std]), - self.old_mean: np.array([old_mean]), - }) - - else: - target_q = self.sess.run(self.target_q, feed_dict={ - self.obs_target: next_obs, - self.rewards: rewards, - self.terminals_ph: terminals - }) - - # Get all gradients and perform a synced update. - ops = [self.actor_grads, self.actor_loss, self.critic_grads, self.critic_loss] - td_map = { - self.obs_train: obs, - self.actions: actions, - self.action_train_ph: actions, - self.rewards: rewards, - self.critic_target: target_q, - self.param_noise_stddev: 0 if self.param_noise is None else self.param_noise.current_stddev - } - if writer is not None: - # run loss backprop with summary if the step_id was not already logged (can happen with the right - # parameters as the step value is only an estimate) - if self.full_tensorboard_log and log and step not in self.tb_seen_steps: - run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE) - run_metadata = tf.RunMetadata() - summary, actor_grads, actor_loss, critic_grads, critic_loss = \ - self.sess.run([self.summary] + ops, td_map, options=run_options, run_metadata=run_metadata) - - writer.add_run_metadata(run_metadata, 'step%d' % step) - self.tb_seen_steps.append(step) - else: - summary, actor_grads, actor_loss, critic_grads, critic_loss = self.sess.run([self.summary] + ops, - td_map) - writer.add_summary(summary, step) - else: - actor_grads, actor_loss, critic_grads, critic_loss = self.sess.run(ops, td_map) - - self.actor_optimizer.update(actor_grads, learning_rate=self.actor_lr) - self.critic_optimizer.update(critic_grads, learning_rate=self.critic_lr) - - return critic_loss, actor_loss - - def _initialize(self, sess): - """ - initialize the model parameters and optimizers - - :param sess: (TensorFlow Session) the current TensorFlow session - """ - self.sess = sess - self.sess.run(tf.global_variables_initializer()) - self.actor_optimizer.sync() - self.critic_optimizer.sync() - self.sess.run(self.target_init_updates) - - def _update_target_net(self): - """ - run target soft update operation - """ - self.sess.run(self.target_soft_updates) - - def _get_stats(self): - """ - Get the mean and standard deviation of the model's inputs and outputs - - :return: (dict) the means and stds - """ - if self.stats_sample is None: - # Get a sample and keep that fixed for all further computations. - # This allows us to estimate the change in value for the same set of inputs. - obs, actions, rewards, next_obs, terminals = self.replay_buffer.sample(batch_size=self.batch_size, - env=self._vec_normalize_env) - self.stats_sample = { - 'obs': obs, - 'actions': actions, - 'rewards': rewards, - 'next_obs': next_obs, - 'terminals': terminals - } - - feed_dict = { - self.actions: self.stats_sample['actions'] - } - - for placeholder in [self.action_train_ph, self.action_target, self.action_adapt_noise, self.action_noise_ph]: - if placeholder is not None: - feed_dict[placeholder] = self.stats_sample['actions'] - - for placeholder in [self.obs_train, self.obs_target, self.obs_adapt_noise, self.obs_noise]: - if placeholder is not None: - feed_dict[placeholder] = self.stats_sample['obs'] - - values = self.sess.run(self.stats_ops, feed_dict=feed_dict) - - names = self.stats_names[:] - assert len(names) == len(values) - stats = dict(zip(names, values)) - - if self.param_noise is not None: - stats = {**stats, **self.param_noise.get_stats()} - - return stats - - def _adapt_param_noise(self): - """ - calculate the adaptation for the parameter noise - - :return: (float) the mean distance for the parameter noise - """ - if self.param_noise is None: - return 0. - - # Perturb a separate copy of the policy to adjust the scale for the next "real" perturbation. - obs, *_ = self.replay_buffer.sample(batch_size=self.batch_size, env=self._vec_normalize_env) - self.sess.run(self.perturb_adaptive_policy_ops, feed_dict={ - self.param_noise_stddev: self.param_noise.current_stddev, - }) - distance = self.sess.run(self.adaptive_policy_distance, feed_dict={ - self.obs_adapt_noise: obs, self.obs_train: obs, - self.param_noise_stddev: self.param_noise.current_stddev, - }) - - mean_distance = MPI.COMM_WORLD.allreduce(distance, op=MPI.SUM) / MPI.COMM_WORLD.Get_size() - self.param_noise.adapt(mean_distance) - return mean_distance - - def _reset(self): - """ - Reset internal state after an episode is complete. - """ - if self.action_noise is not None: - self.action_noise.reset() - if self.param_noise is not None: - self.sess.run(self.perturb_policy_ops, feed_dict={ - self.param_noise_stddev: self.param_noise.current_stddev, - }) - - def learn(self, total_timesteps, callback=None, log_interval=100, tb_log_name="DDPG", - reset_num_timesteps=True, replay_wrapper=None): - - new_tb_log = self._init_num_timesteps(reset_num_timesteps) - callback = self._init_callback(callback) - - if replay_wrapper is not None: - self.replay_buffer = replay_wrapper(self.replay_buffer) - - with SetVerbosity(self.verbose), TensorboardWriter(self.graph, self.tensorboard_log, tb_log_name, new_tb_log) \ - as writer: - self._setup_learn() - - # a list for tensorboard logging, to prevent logging with the same step number, if it already occured - self.tb_seen_steps = [] - - rank = MPI.COMM_WORLD.Get_rank() - - if self.verbose >= 2: - logger.log('Using agent with the following configuration:') - logger.log(str(self.__dict__.items())) - - eval_episode_rewards_history = deque(maxlen=100) - episode_rewards_history = deque(maxlen=100) - episode_successes = [] - - with self.sess.as_default(), self.graph.as_default(): - # Prepare everything. - self._reset() - obs = self.env.reset() - # Retrieve unnormalized observation for saving into the buffer - if self._vec_normalize_env is not None: - obs_ = self._vec_normalize_env.get_original_obs().squeeze() - eval_obs = None - if self.eval_env is not None: - eval_obs = self.eval_env.reset() - episode_reward = 0. - episode_step = 0 - episodes = 0 - step = 0 - total_steps = 0 - - start_time = time.time() - - epoch_episode_rewards = [] - epoch_episode_steps = [] - epoch_actor_losses = [] - epoch_critic_losses = [] - epoch_adaptive_distances = [] - eval_episode_rewards = [] - eval_qs = [] - epoch_actions = [] - epoch_qs = [] - epoch_episodes = 0 - epoch = 0 - - callback.on_training_start(locals(), globals()) - - while True: - for _ in range(log_interval): - callback.on_rollout_start() - # Perform rollouts. - for _ in range(self.nb_rollout_steps): - - if total_steps >= total_timesteps: - callback.on_training_end() - return self - - # Predict next action. - action, q_value = self._policy(obs, apply_noise=True, compute_q=True) - assert action.shape == self.env.action_space.shape - - # Execute next action. - if rank == 0 and self.render: - self.env.render() - - # Randomly sample actions from a uniform distribution - # with a probability self.random_exploration (used in HER + DDPG) - if np.random.rand() < self.random_exploration: - # actions sampled from action space are from range specific to the environment - # but algorithm operates on tanh-squashed actions therefore simple scaling is used - unscaled_action = self.action_space.sample() - action = scale_action(self.action_space, unscaled_action) - else: - # inferred actions need to be transformed to environment action_space before stepping - unscaled_action = unscale_action(self.action_space, action) - - new_obs, reward, done, info = self.env.step(unscaled_action) - - self.num_timesteps += 1 - callback.update_locals(locals()) - if callback.on_step() is False: - callback.on_training_end() - return self - - step += 1 - total_steps += 1 - if rank == 0 and self.render: - self.env.render() - - # Book-keeping. - epoch_actions.append(action) - epoch_qs.append(q_value) - - # Store only the unnormalized version - if self._vec_normalize_env is not None: - new_obs_ = self._vec_normalize_env.get_original_obs().squeeze() - reward_ = self._vec_normalize_env.get_original_reward().squeeze() - else: - # Avoid changing the original ones - obs_, new_obs_, reward_ = obs, new_obs, reward - - self._store_transition(obs_, action, reward_, new_obs_, done, info) - obs = new_obs - # Save the unnormalized observation - if self._vec_normalize_env is not None: - obs_ = new_obs_ - - episode_reward += reward_ - episode_step += 1 - - if writer is not None: - ep_rew = np.array([reward_]).reshape((1, -1)) - ep_done = np.array([done]).reshape((1, -1)) - tf_util.total_episode_reward_logger(self.episode_reward, ep_rew, ep_done, - writer, self.num_timesteps) - - if done: - # Episode done. - epoch_episode_rewards.append(episode_reward) - episode_rewards_history.append(episode_reward) - epoch_episode_steps.append(episode_step) - episode_reward = 0. - episode_step = 0 - epoch_episodes += 1 - episodes += 1 - - maybe_is_success = info.get('is_success') - if maybe_is_success is not None: - episode_successes.append(float(maybe_is_success)) - - self._reset() - if not isinstance(self.env, VecEnv): - obs = self.env.reset() - - callback.on_rollout_end() - # Train. - epoch_actor_losses = [] - epoch_critic_losses = [] - epoch_adaptive_distances = [] - for t_train in range(self.nb_train_steps): - # Not enough samples in the replay buffer - if not self.replay_buffer.can_sample(self.batch_size): - break - - # Adapt param noise, if necessary. - if len(self.replay_buffer) >= self.batch_size and \ - t_train % self.param_noise_adaption_interval == 0: - distance = self._adapt_param_noise() - epoch_adaptive_distances.append(distance) - - # weird equation to deal with the fact the nb_train_steps will be different - # to nb_rollout_steps - step = (int(t_train * (self.nb_rollout_steps / self.nb_train_steps)) + - self.num_timesteps - self.nb_rollout_steps) - - critic_loss, actor_loss = self._train_step(step, writer, log=t_train == 0) - epoch_critic_losses.append(critic_loss) - epoch_actor_losses.append(actor_loss) - self._update_target_net() - - # Evaluate. - eval_episode_rewards = [] - eval_qs = [] - if self.eval_env is not None: - eval_episode_reward = 0. - for _ in range(self.nb_eval_steps): - if total_steps >= total_timesteps: - return self - - eval_action, eval_q = self._policy(eval_obs, apply_noise=False, compute_q=True) - unscaled_action = unscale_action(self.action_space, eval_action) - eval_obs, eval_r, eval_done, _ = self.eval_env.step(unscaled_action) - if self.render_eval: - self.eval_env.render() - eval_episode_reward += eval_r - - eval_qs.append(eval_q) - if eval_done: - if not isinstance(self.env, VecEnv): - eval_obs = self.eval_env.reset() - eval_episode_rewards.append(eval_episode_reward) - eval_episode_rewards_history.append(eval_episode_reward) - eval_episode_reward = 0. - - mpi_size = MPI.COMM_WORLD.Get_size() - - # Not enough samples in the replay buffer - if not self.replay_buffer.can_sample(self.batch_size): - continue - - # Log stats. - # XXX shouldn't call np.mean on variable length lists - duration = time.time() - start_time - stats = self._get_stats() - combined_stats = stats.copy() - combined_stats['rollout/return'] = np.mean(epoch_episode_rewards) - combined_stats['rollout/return_history'] = np.mean(episode_rewards_history) - combined_stats['rollout/episode_steps'] = np.mean(epoch_episode_steps) - combined_stats['rollout/actions_mean'] = np.mean(epoch_actions) - combined_stats['rollout/Q_mean'] = np.mean(epoch_qs) - combined_stats['train/loss_actor'] = np.mean(epoch_actor_losses) - combined_stats['train/loss_critic'] = np.mean(epoch_critic_losses) - if len(epoch_adaptive_distances) != 0: - combined_stats['train/param_noise_distance'] = np.mean(epoch_adaptive_distances) - combined_stats['total/duration'] = duration - combined_stats['total/steps_per_second'] = float(step) / float(duration) - combined_stats['total/episodes'] = episodes - combined_stats['rollout/episodes'] = epoch_episodes - combined_stats['rollout/actions_std'] = np.std(epoch_actions) - # Evaluation statistics. - if self.eval_env is not None: - combined_stats['eval/return'] = np.mean(eval_episode_rewards) - combined_stats['eval/return_history'] = np.mean(eval_episode_rewards_history) - combined_stats['eval/Q'] = np.mean(eval_qs) - combined_stats['eval/episodes'] = len(eval_episode_rewards) - - def as_scalar(scalar): - """ - check and return the input if it is a scalar, otherwise raise ValueError - - :param scalar: (Any) the object to check - :return: (Number) the scalar if x is a scalar - """ - if isinstance(scalar, np.ndarray): - assert scalar.size == 1 - return scalar[0] - elif np.isscalar(scalar): - return scalar - else: - raise ValueError('expected scalar, got %s' % scalar) - - combined_stats_sums = MPI.COMM_WORLD.allreduce( - np.array([as_scalar(x) for x in combined_stats.values()])) - combined_stats = {k: v / mpi_size for (k, v) in zip(combined_stats.keys(), combined_stats_sums)} - - # Total statistics. - combined_stats['total/epochs'] = epoch + 1 - combined_stats['total/steps'] = step - - for key in sorted(combined_stats.keys()): - logger.record_tabular(key, combined_stats[key]) - if len(episode_successes) > 0: - logger.logkv("success rate", np.mean(episode_successes[-100:])) - logger.dump_tabular() - logger.info('') - logdir = logger.get_dir() - if rank == 0 and logdir: - if hasattr(self.env, 'get_state'): - with open(os.path.join(logdir, 'env_state.pkl'), 'wb') as file_handler: - pickle.dump(self.env.get_state(), file_handler) - if self.eval_env and hasattr(self.eval_env, 'get_state'): - with open(os.path.join(logdir, 'eval_env_state.pkl'), 'wb') as file_handler: - pickle.dump(self.eval_env.get_state(), file_handler) - - def predict(self, observation, state=None, mask=None, deterministic=True): - observation = np.array(observation) - vectorized_env = self._is_vectorized_observation(observation, self.observation_space) - - observation = observation.reshape((-1,) + self.observation_space.shape) - actions, _, = self._policy(observation, apply_noise=not deterministic, compute_q=False) - actions = actions.reshape((-1,) + self.action_space.shape) # reshape to the correct action shape - actions = unscale_action(self.action_space, actions) # scale the output for the prediction - - if not vectorized_env: - actions = actions[0] - - return actions, None - - def action_probability(self, observation, state=None, mask=None, actions=None, logp=False): - _ = np.array(observation) - - if actions is not None: - raise ValueError("Error: DDPG does not have action probabilities.") - - # here there are no action probabilities, as DDPG does not use a probability distribution - warnings.warn("Warning: action probability is meaningless for DDPG. Returning None") - return None - - def get_parameter_list(self): - return (self.params + - self.target_params + - self.obs_rms_params + - self.ret_rms_params) - - def save(self, save_path, cloudpickle=False): - data = { - "observation_space": self.observation_space, - "action_space": self.action_space, - "nb_eval_steps": self.nb_eval_steps, - "param_noise_adaption_interval": self.param_noise_adaption_interval, - "nb_train_steps": self.nb_train_steps, - "nb_rollout_steps": self.nb_rollout_steps, - "verbose": self.verbose, - "param_noise": self.param_noise, - "action_noise": self.action_noise, - "gamma": self.gamma, - "tau": self.tau, - "normalize_returns": self.normalize_returns, - "enable_popart": self.enable_popart, - "normalize_observations": self.normalize_observations, - "batch_size": self.batch_size, - "observation_range": self.observation_range, - "return_range": self.return_range, - "critic_l2_reg": self.critic_l2_reg, - "actor_lr": self.actor_lr, - "critic_lr": self.critic_lr, - "clip_norm": self.clip_norm, - "reward_scale": self.reward_scale, - "memory_limit": self.memory_limit, - "buffer_size": self.buffer_size, - "random_exploration": self.random_exploration, - "policy": self.policy, - "n_envs": self.n_envs, - "n_cpu_tf_sess": self.n_cpu_tf_sess, - "seed": self.seed, - "_vectorize_action": self._vectorize_action, - "policy_kwargs": self.policy_kwargs - } - - params_to_save = self.get_parameters() - - self._save_to_file(save_path, - data=data, - params=params_to_save, - cloudpickle=cloudpickle) - - @classmethod - def load(cls, load_path, env=None, custom_objects=None, **kwargs): - data, params = cls._load_from_file(load_path, custom_objects=custom_objects) - - if 'policy_kwargs' in kwargs and kwargs['policy_kwargs'] != data['policy_kwargs']: - raise ValueError("The specified policy kwargs do not equal the stored policy kwargs. " - "Stored kwargs: {}, specified kwargs: {}".format(data['policy_kwargs'], - kwargs['policy_kwargs'])) - - model = cls(None, env, _init_setup_model=False) - model.__dict__.update(data) - model.__dict__.update(kwargs) - model.set_env(env) - model.setup_model() - # Patch for version < v2.6.0, duplicated keys where saved - if len(params) > len(model.get_parameter_list()): - n_params = len(model.params) - n_target_params = len(model.target_params) - n_normalisation_params = len(model.obs_rms_params) + len(model.ret_rms_params) - # Check that the issue is the one from - # https://github.com/hill-a/stable-baselines/issues/363 - assert len(params) == 2 * (n_params + n_target_params) + n_normalisation_params,\ - "The number of parameter saved differs from the number of parameters"\ - " that should be loaded: {}!={}".format(len(params), len(model.get_parameter_list())) - # Remove duplicates - params_ = params[:n_params + n_target_params] - if n_normalisation_params > 0: - params_ += params[-n_normalisation_params:] - params = params_ - model.load_parameters(params) - - return model diff --git a/stable_baselines/ddpg/main.py b/stable_baselines/ddpg/main.py deleted file mode 100644 index 3e123278..00000000 --- a/stable_baselines/ddpg/main.py +++ /dev/null @@ -1,139 +0,0 @@ -import argparse -import time -import os - -import gym -import tensorflow as tf -import numpy as np -from mpi4py import MPI - -from stable_baselines import logger, bench -from stable_baselines.common.misc_util import set_global_seeds, boolean_flag -from stable_baselines.ddpg.policies import MlpPolicy, LnMlpPolicy -from stable_baselines.ddpg import DDPG -from stable_baselines.ddpg.noise import AdaptiveParamNoiseSpec, OrnsteinUhlenbeckActionNoise, NormalActionNoise - - -def run(env_id, seed, noise_type, layer_norm, evaluation, **kwargs): - """ - run the training of DDPG - - :param env_id: (str) the environment ID - :param seed: (int) the initial random seed - :param noise_type: (str) the wanted noises ('adaptive-param', 'normal' or 'ou'), can use multiple noise type by - seperating them with commas - :param layer_norm: (bool) use layer normalization - :param evaluation: (bool) enable evaluation of DDPG training - :param kwargs: (dict) extra keywords for the training.train function - """ - - # Configure things. - rank = MPI.COMM_WORLD.Get_rank() - if rank != 0: - logger.set_level(logger.DISABLED) - - # Create envs. - env = gym.make(env_id) - env = bench.Monitor(env, logger.get_dir() and os.path.join(logger.get_dir(), str(rank))) - - if evaluation and rank == 0: - eval_env = gym.make(env_id) - eval_env = bench.Monitor(eval_env, os.path.join(logger.get_dir(), 'gym_eval')) - env = bench.Monitor(env, None) - else: - eval_env = None - - # Parse noise_type - action_noise = None - param_noise = None - nb_actions = env.action_space.shape[-1] - for current_noise_type in noise_type.split(','): - current_noise_type = current_noise_type.strip() - if current_noise_type == 'none': - pass - elif 'adaptive-param' in current_noise_type: - _, stddev = current_noise_type.split('_') - param_noise = AdaptiveParamNoiseSpec(initial_stddev=float(stddev), desired_action_stddev=float(stddev)) - elif 'normal' in current_noise_type: - _, stddev = current_noise_type.split('_') - action_noise = NormalActionNoise(mean=np.zeros(nb_actions), sigma=float(stddev) * np.ones(nb_actions)) - elif 'ou' in current_noise_type: - _, stddev = current_noise_type.split('_') - action_noise = OrnsteinUhlenbeckActionNoise(mean=np.zeros(nb_actions), - sigma=float(stddev) * np.ones(nb_actions)) - else: - raise RuntimeError('unknown noise type "{}"'.format(current_noise_type)) - - # Seed everything to make things reproducible. - seed = seed + 1000000 * rank - logger.info('rank {}: seed={}, logdir={}'.format(rank, seed, logger.get_dir())) - tf.reset_default_graph() - set_global_seeds(seed) - env.seed(seed) - if eval_env is not None: - eval_env.seed(seed) - - # Disable logging for rank != 0 to avoid noise. - start_time = 0 - if rank == 0: - start_time = time.time() - - if layer_norm: - policy = LnMlpPolicy - else: - policy = MlpPolicy - - num_timesteps = kwargs['num_timesteps'] - del kwargs['num_timesteps'] - - model = DDPG(policy=policy, env=env, eval_env=eval_env, param_noise=param_noise, - action_noise=action_noise, buffer_size=int(1e6), verbose=2, **kwargs) - model.learn(total_timesteps=num_timesteps) - env.close() - if eval_env is not None: - eval_env.close() - if rank == 0: - logger.info('total runtime: {}s'.format(time.time() - start_time)) - - -def parse_args(): - """ - parse the arguments for DDPG training - - :return: (dict) the arguments - """ - parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) - - parser.add_argument('--env-id', type=str, default='HalfCheetah-v1') - boolean_flag(parser, 'render-eval', default=False) - boolean_flag(parser, 'layer-norm', default=True) - boolean_flag(parser, 'render', default=False) - boolean_flag(parser, 'normalize-returns', default=False) - boolean_flag(parser, 'normalize-observations', default=True) - parser.add_argument('--seed', help='RNG seed', type=int, default=0) - parser.add_argument('--critic-l2-reg', type=float, default=1e-2) - parser.add_argument('--batch-size', type=int, default=64) # per MPI worker - parser.add_argument('--actor-lr', type=float, default=1e-4) - parser.add_argument('--critic-lr', type=float, default=1e-3) - boolean_flag(parser, 'enable-popart', default=False) - parser.add_argument('--gamma', type=float, default=0.99) - parser.add_argument('--reward-scale', type=float, default=1.) - parser.add_argument('--clip-norm', type=float, default=None) - parser.add_argument('--nb-train-steps', type=int, default=50) # per epoch cycle and MPI worker - parser.add_argument('--nb-eval-steps', type=int, default=100) # per epoch cycle and MPI worker - parser.add_argument('--nb-rollout-steps', type=int, default=100) # per epoch cycle and MPI worker - # choices are adaptive-param_xx, ou_xx, normal_xx, none - parser.add_argument('--noise-type', type=str, default='adaptive-param_0.2') - parser.add_argument('--num-timesteps', type=int, default=int(1e6)) - boolean_flag(parser, 'evaluation', default=False) - args = parser.parse_args() - dict_args = vars(args) - return dict_args - - -if __name__ == '__main__': - args = parse_args() - if MPI.COMM_WORLD.Get_rank() == 0: - logger.configure() - # Run actual script. - run(**args) diff --git a/stable_baselines/ddpg/noise.py b/stable_baselines/ddpg/noise.py deleted file mode 100644 index 181cad37..00000000 --- a/stable_baselines/ddpg/noise.py +++ /dev/null @@ -1 +0,0 @@ -from stable_baselines.common.noise import NormalActionNoise, AdaptiveParamNoiseSpec, OrnsteinUhlenbeckActionNoise # pylint: disable=unused-import diff --git a/stable_baselines/ddpg/policies.py b/stable_baselines/ddpg/policies.py deleted file mode 100644 index 19ac6463..00000000 --- a/stable_baselines/ddpg/policies.py +++ /dev/null @@ -1,262 +0,0 @@ -import tensorflow as tf -from gym.spaces import Box - -from stable_baselines.common.policies import BasePolicy, nature_cnn, register_policy - - -class DDPGPolicy(BasePolicy): - """ - Policy object that implements a DDPG-like actor critic - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param scale: (bool) whether or not to scale the input - """ - - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse=False, scale=False): - super(DDPGPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse=reuse, scale=scale, - add_action_ph=True) - assert isinstance(ac_space, Box), "Error: the action space must be of type gym.spaces.Box" - self.qvalue_fn = None - self.policy = None - - def make_actor(self, obs=None, reuse=False, scope="pi"): - """ - creates an actor object - - :param obs: (TensorFlow Tensor) The observation placeholder (can be None for default placeholder) - :param reuse: (bool) whether or not to reuse parameters - :param scope: (str) the scope name of the actor - :return: (TensorFlow Tensor) the output tensor - """ - raise NotImplementedError - - def make_critic(self, obs=None, action=None, reuse=False, scope="qf"): - """ - creates a critic object - - :param obs: (TensorFlow Tensor) The observation placeholder (can be None for default placeholder) - :param action: (TensorFlow Tensor) The action placeholder (can be None for default placeholder) - :param reuse: (bool) whether or not to reuse parameters - :param scope: (str) the scope name of the critic - :return: (TensorFlow Tensor) the output tensor - """ - raise NotImplementedError - - def step(self, obs, state=None, mask=None): - """ - Returns the policy for a single step - - :param obs: ([float] or [int]) The current observation of the environment - :param state: ([float]) The last states (used in recurrent policies) - :param mask: ([float]) The last masks (used in recurrent policies) - :return: ([float]) actions - """ - raise NotImplementedError - - def proba_step(self, obs, state=None, mask=None): - """ - Returns the action probability for a single step - - :param obs: ([float] or [int]) The current observation of the environment - :param state: ([float]) The last states (used in recurrent policies) - :param mask: ([float]) The last masks (used in recurrent policies) - :return: ([float]) the action probability - """ - raise NotImplementedError - - def value(self, obs, action, state=None, mask=None): - """ - Returns the value for a single step - - :param obs: ([float] or [int]) The current observation of the environment - :param action: ([float] or [int]) The taken action - :param state: ([float]) The last states (used in recurrent policies) - :param mask: ([float]) The last masks (used in recurrent policies) - :return: ([float]) The associated value of the action - """ - raise NotImplementedError - - -class FeedForwardPolicy(DDPGPolicy): - """ - Policy object that implements a DDPG-like actor critic, using a feed forward neural network. - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param layers: ([int]) The size of the Neural network for the policy (if None, default to [64, 64]) - :param cnn_extractor: (function (TensorFlow Tensor, ``**kwargs``): (TensorFlow Tensor)) the CNN feature extraction - :param feature_extraction: (str) The feature extraction type ("cnn" or "mlp") - :param layer_norm: (bool) enable layer normalisation - :param act_fun: (tf.func) the activation function to use in the neural network. - :param kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse=False, layers=None, - cnn_extractor=nature_cnn, feature_extraction="cnn", - layer_norm=False, act_fun=tf.nn.relu, **kwargs): - super(FeedForwardPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse=reuse, - scale=(feature_extraction == "cnn")) - - self._kwargs_check(feature_extraction, kwargs) - self.layer_norm = layer_norm - self.feature_extraction = feature_extraction - self.cnn_kwargs = kwargs - self.cnn_extractor = cnn_extractor - self.reuse = reuse - self._qvalue = None - if layers is None: - layers = [64, 64] - self.layers = layers - - assert len(layers) >= 1, "Error: must have at least one hidden layer for the policy." - - self.activ = act_fun - - def make_actor(self, obs=None, reuse=False, scope="pi"): - if obs is None: - obs = self.processed_obs - - with tf.variable_scope(scope, reuse=reuse): - if self.feature_extraction == "cnn": - pi_h = self.cnn_extractor(obs, **self.cnn_kwargs) - else: - pi_h = tf.layers.flatten(obs) - for i, layer_size in enumerate(self.layers): - pi_h = tf.layers.dense(pi_h, layer_size, name='fc' + str(i)) - if self.layer_norm: - pi_h = tf.contrib.layers.layer_norm(pi_h, center=True, scale=True) - pi_h = self.activ(pi_h) - self.policy = tf.nn.tanh(tf.layers.dense(pi_h, self.ac_space.shape[0], name=scope, - kernel_initializer=tf.random_uniform_initializer(minval=-3e-3, - maxval=3e-3))) - return self.policy - - def make_critic(self, obs=None, action=None, reuse=False, scope="qf"): - if obs is None: - obs = self.processed_obs - if action is None: - action = self.action_ph - - with tf.variable_scope(scope, reuse=reuse): - if self.feature_extraction == "cnn": - qf_h = self.cnn_extractor(obs, **self.cnn_kwargs) - else: - qf_h = tf.layers.flatten(obs) - for i, layer_size in enumerate(self.layers): - qf_h = tf.layers.dense(qf_h, layer_size, name='fc' + str(i)) - if self.layer_norm: - qf_h = tf.contrib.layers.layer_norm(qf_h, center=True, scale=True) - qf_h = self.activ(qf_h) - if i == 0: - qf_h = tf.concat([qf_h, action], axis=-1) - - # the name attribute is used in pop-art normalization - qvalue_fn = tf.layers.dense(qf_h, 1, name='qf_output', - kernel_initializer=tf.random_uniform_initializer(minval=-3e-3, - maxval=3e-3)) - - self.qvalue_fn = qvalue_fn - self._qvalue = qvalue_fn[:, 0] - return self.qvalue_fn - - def step(self, obs, state=None, mask=None): - return self.sess.run(self.policy, {self.obs_ph: obs}) - - def proba_step(self, obs, state=None, mask=None): - return self.sess.run(self.policy, {self.obs_ph: obs}) - - def value(self, obs, action, state=None, mask=None): - return self.sess.run(self._qvalue, {self.obs_ph: obs, self.action_ph: action}) - - -class CnnPolicy(FeedForwardPolicy): - """ - Policy object that implements actor critic, using a CNN (the nature CNN) - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param _kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse=False, **_kwargs): - super(CnnPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse, - feature_extraction="cnn", **_kwargs) - - -class LnCnnPolicy(FeedForwardPolicy): - """ - Policy object that implements actor critic, using a CNN (the nature CNN), with layer normalisation - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param _kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse=False, **_kwargs): - super(LnCnnPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse, - feature_extraction="cnn", layer_norm=True, **_kwargs) - - -class MlpPolicy(FeedForwardPolicy): - """ - Policy object that implements actor critic, using a MLP (2 layers of 64) - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param _kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse=False, **_kwargs): - super(MlpPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse, - feature_extraction="mlp", **_kwargs) - - -class LnMlpPolicy(FeedForwardPolicy): - """ - Policy object that implements actor critic, using a MLP (2 layers of 64), with layer normalisation - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param _kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse=False, **_kwargs): - super(LnMlpPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse, - feature_extraction="mlp", layer_norm=True, **_kwargs) - - -register_policy("CnnPolicy", CnnPolicy) -register_policy("LnCnnPolicy", LnCnnPolicy) -register_policy("MlpPolicy", MlpPolicy) -register_policy("LnMlpPolicy", LnMlpPolicy) diff --git a/stable_baselines/deepq/__init__.py b/stable_baselines/deepq/__init__.py deleted file mode 100644 index eda0c1e0..00000000 --- a/stable_baselines/deepq/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -from stable_baselines.deepq.policies import MlpPolicy, CnnPolicy, LnMlpPolicy, LnCnnPolicy -from stable_baselines.deepq.build_graph import build_act, build_train # noqa -from stable_baselines.deepq.dqn import DQN -from stable_baselines.common.buffers import ReplayBuffer, PrioritizedReplayBuffer # noqa - - -def wrap_atari_dqn(env): - """ - wrap the environment in atari wrappers for DQN - - :param env: (Gym Environment) the environment - :return: (Gym Environment) the wrapped environment - """ - from stable_baselines.common.atari_wrappers import wrap_deepmind - return wrap_deepmind(env, frame_stack=True, scale=False) diff --git a/stable_baselines/deepq/build_graph.py b/stable_baselines/deepq/build_graph.py deleted file mode 100644 index 51453ec6..00000000 --- a/stable_baselines/deepq/build_graph.py +++ /dev/null @@ -1,467 +0,0 @@ -"""Deep Q learning graph - -The functions in this file can are used to create the following functions: - -======= act ======== - - Function to chose an action given an observation - - :param observation: (Any) Observation that can be feed into the output of make_obs_ph - :param stochastic: (bool) if set to False all the actions are always deterministic (default False) - :param update_eps_ph: (float) update epsilon a new value, if negative not update happens (default: no update) - :return: (TensorFlow Tensor) tensor of dtype tf.int64 and shape (BATCH_SIZE,) with an action to be performed for - every element of the batch. - - -======= act (in case of parameter noise) ======== - - Function to chose an action given an observation - - :param observation: (Any) Observation that can be feed into the output of make_obs_ph - :param stochastic: (bool) if set to False all the actions are always deterministic (default False) - :param update_eps_ph: (float) update epsilon a new value, if negative not update happens - (default: no update) - :param reset_ph: (bool) reset the perturbed policy by sampling a new perturbation - :param update_param_noise_threshold_ph: (float) the desired threshold for the difference between - non-perturbed and perturbed policy - :param update_param_noise_scale_ph: (bool) whether or not to update the scale of the noise for the next time it is - re-perturbed - :return: (TensorFlow Tensor) tensor of dtype tf.int64 and shape (BATCH_SIZE,) with an action to be performed for - every element of the batch. - - -======= train ======= - - Function that takes a transition (s,a,r,s') and optimizes Bellman equation's error: - - td_error = Q(s,a) - (r + gamma * max_a' Q(s', a')) - loss = huber_loss[td_error] - - :param obs_t: (Any) a batch of observations - :param action: (numpy int) actions that were selected upon seeing obs_t. dtype must be int32 and shape must be - (batch_size,) - :param reward: (numpy float) immediate reward attained after executing those actions dtype must be float32 and - shape must be (batch_size,) - :param obs_tp1: (Any) observations that followed obs_t - :param done: (numpy bool) 1 if obs_t was the last observation in the episode and 0 otherwise obs_tp1 gets ignored, - but must be of the valid shape. dtype must be float32 and shape must be (batch_size,) - :param weight: (numpy float) imporance weights for every element of the batch (gradient is multiplied by the - importance weight) dtype must be float32 and shape must be (batch_size,) - :return: (numpy float) td_error: a list of differences between Q(s,a) and the target in Bellman's equation. - dtype is float32 and shape is (batch_size,) - -======= update_target ======== - - copy the parameters from optimized Q function to the target Q function. - In Q learning we actually optimize the following error: - - Q(s,a) - (r + gamma * max_a' Q'(s', a')) - - Where Q' is lagging behind Q to stablize the learning. For example for Atari - - Q' is set to Q once every 10000 updates training steps. - -""" -import tensorflow as tf -from gym.spaces import MultiDiscrete - -from stable_baselines.common import tf_util - - -def scope_vars(scope, trainable_only=False): - """ - Get variables inside a scope - The scope can be specified as a string - - :param scope: (str or VariableScope) scope in which the variables reside. - :param trainable_only: (bool) whether or not to return only the variables that were marked as trainable. - :return: ([TensorFlow Tensor]) vars: list of variables in `scope`. - """ - return tf.get_collection( - tf.GraphKeys.TRAINABLE_VARIABLES if trainable_only else tf.GraphKeys.GLOBAL_VARIABLES, - scope=scope if isinstance(scope, str) else scope.name - ) - - -def scope_name(): - """ - Returns the name of current scope as a string, e.g. deepq/q_func - - :return: (str) the name of current scope - """ - return tf.get_variable_scope().name - - -def absolute_scope_name(relative_scope_name): - """ - Appends parent scope name to `relative_scope_name` - - :return: (str) the absolute name of the scope - """ - return scope_name() + "/" + relative_scope_name - - -def default_param_noise_filter(var): - """ - check whether or not a variable is perturbable or not - - :param var: (TensorFlow Tensor) the variable - :return: (bool) can be perturb - """ - if var not in tf.trainable_variables(): - # We never perturb non-trainable vars. - return False - if "fully_connected" in var.name: - # We perturb fully-connected layers. - return True - - # The remaining layers are likely conv or layer norm layers, which we do not wish to - # perturb (in the former case because they only extract features, in the latter case because - # we use them for normalization purposes). If you change your network, you will likely want - # to re-consider which layers to perturb and which to keep untouched. - return False - - -def build_act(q_func, ob_space, ac_space, stochastic_ph, update_eps_ph, sess): - """ - Creates the act function: - - :param q_func: (DQNPolicy) the policy - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param stochastic_ph: (TensorFlow Tensor) the stochastic placeholder - :param update_eps_ph: (TensorFlow Tensor) the update_eps placeholder - :param sess: (TensorFlow session) The current TensorFlow session - :return: (function (TensorFlow Tensor, bool, float): TensorFlow Tensor, (TensorFlow Tensor, TensorFlow Tensor) - act function to select and action given observation (See the top of the file for details), - A tuple containing the observation placeholder and the processed observation placeholder respectively. - """ - eps = tf.get_variable("eps", (), initializer=tf.constant_initializer(0)) - - policy = q_func(sess, ob_space, ac_space, 1, 1, None) - obs_phs = (policy.obs_ph, policy.processed_obs) - deterministic_actions = tf.argmax(policy.q_values, axis=1) - - batch_size = tf.shape(policy.obs_ph)[0] - n_actions = ac_space.nvec if isinstance(ac_space, MultiDiscrete) else ac_space.n - random_actions = tf.random_uniform(tf.stack([batch_size]), minval=0, maxval=n_actions, dtype=tf.int64) - chose_random = tf.random_uniform(tf.stack([batch_size]), minval=0, maxval=1, dtype=tf.float32) < eps - stochastic_actions = tf.where(chose_random, random_actions, deterministic_actions) - - output_actions = tf.cond(stochastic_ph, lambda: stochastic_actions, lambda: deterministic_actions) - update_eps_expr = eps.assign(tf.cond(update_eps_ph >= 0, lambda: update_eps_ph, lambda: eps)) - _act = tf_util.function(inputs=[policy.obs_ph, stochastic_ph, update_eps_ph], - outputs=output_actions, - givens={update_eps_ph: -1.0, stochastic_ph: True}, - updates=[update_eps_expr]) - - def act(obs, stochastic=True, update_eps=-1): - return _act(obs, stochastic, update_eps) - - return act, obs_phs - - -def build_act_with_param_noise(q_func, ob_space, ac_space, stochastic_ph, update_eps_ph, sess, - param_noise_filter_func=None): - """ - Creates the act function with support for parameter space noise exploration (https://arxiv.org/abs/1706.01905): - - :param q_func: (DQNPolicy) the policy - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param stochastic_ph: (TensorFlow Tensor) the stochastic placeholder - :param update_eps_ph: (TensorFlow Tensor) the update_eps placeholder - :param sess: (TensorFlow session) The current TensorFlow session - :param param_noise_filter_func: (function (TensorFlow Tensor): bool) function that decides whether or not a - variable should be perturbed. Only applicable if param_noise is True. If set to None, default_param_noise_filter - is used by default. - :return: (function (TensorFlow Tensor, bool, float): TensorFlow Tensor, (TensorFlow Tensor, TensorFlow Tensor) - act function to select and action given observation (See the top of the file for details), - A tuple containing the observation placeholder and the processed observation placeholder respectively. - """ - if param_noise_filter_func is None: - param_noise_filter_func = default_param_noise_filter - - update_param_noise_threshold_ph = tf.placeholder(tf.float32, (), name="update_param_noise_threshold") - update_param_noise_scale_ph = tf.placeholder(tf.bool, (), name="update_param_noise_scale") - reset_ph = tf.placeholder(tf.bool, (), name="reset") - - eps = tf.get_variable("eps", (), initializer=tf.constant_initializer(0)) - param_noise_scale = tf.get_variable("param_noise_scale", (), initializer=tf.constant_initializer(0.01), - trainable=False) - param_noise_threshold = tf.get_variable("param_noise_threshold", (), initializer=tf.constant_initializer(0.05), - trainable=False) - - # Unmodified Q. - policy = q_func(sess, ob_space, ac_space, 1, 1, None) - obs_phs = (policy.obs_ph, policy.processed_obs) - - # Perturbable Q used for the actual rollout. - with tf.variable_scope("perturbed_model", reuse=False): - perturbable_policy = q_func(sess, ob_space, ac_space, 1, 1, None, obs_phs=obs_phs) - - def perturb_vars(original_scope, perturbed_scope): - """ - We have to wrap this code into a function due to the way tf.cond() works. - - See https://stackoverflow.com/questions/37063952/confused-by-the-behavior-of-tf-cond for a more detailed - discussion. - - :param original_scope: (str or VariableScope) the original scope. - :param perturbed_scope: (str or VariableScope) the perturbed scope. - :return: (TensorFlow Operation) - """ - all_vars = scope_vars(absolute_scope_name(original_scope)) - all_perturbed_vars = scope_vars(absolute_scope_name(perturbed_scope)) - assert len(all_vars) == len(all_perturbed_vars) - perturb_ops = [] - for var, perturbed_var in zip(all_vars, all_perturbed_vars): - if param_noise_filter_func(perturbed_var): - # Perturb this variable. - operation = tf.assign(perturbed_var, - var + tf.random_normal(shape=tf.shape(var), mean=0., - stddev=param_noise_scale)) - else: - # Do not perturb, just assign. - operation = tf.assign(perturbed_var, var) - perturb_ops.append(operation) - assert len(perturb_ops) == len(all_vars) - return tf.group(*perturb_ops) - - # Set up functionality to re-compute `param_noise_scale`. This perturbs yet another copy - # of the network and measures the effect of that perturbation in action space. If the perturbation - # is too big, reduce scale of perturbation, otherwise increase. - with tf.variable_scope("adaptive_model", reuse=False): - adaptive_policy = q_func(sess, ob_space, ac_space, 1, 1, None, obs_phs=obs_phs) - perturb_for_adaption = perturb_vars(original_scope="model", perturbed_scope="adaptive_model/model") - kl_loss = tf.reduce_sum( - tf.nn.softmax(policy.q_values) * - (tf.log(tf.nn.softmax(policy.q_values)) - tf.log(tf.nn.softmax(adaptive_policy.q_values))), - axis=-1) - mean_kl = tf.reduce_mean(kl_loss) - - def update_scale(): - """ - update the scale expression - - :return: (TensorFlow Tensor) the updated scale expression - """ - with tf.control_dependencies([perturb_for_adaption]): - update_scale_expr = tf.cond(mean_kl < param_noise_threshold, - lambda: param_noise_scale.assign(param_noise_scale * 1.01), - lambda: param_noise_scale.assign(param_noise_scale / 1.01), - ) - return update_scale_expr - - # Functionality to update the threshold for parameter space noise. - update_param_noise_thres_expr = param_noise_threshold.assign( - tf.cond(update_param_noise_threshold_ph >= 0, lambda: update_param_noise_threshold_ph, - lambda: param_noise_threshold)) - - # Put everything together. - perturbed_deterministic_actions = tf.argmax(perturbable_policy.q_values, axis=1) - deterministic_actions = tf.argmax(policy.q_values, axis=1) - batch_size = tf.shape(policy.obs_ph)[0] - n_actions = ac_space.nvec if isinstance(ac_space, MultiDiscrete) else ac_space.n - random_actions = tf.random_uniform(tf.stack([batch_size]), minval=0, maxval=n_actions, dtype=tf.int64) - chose_random = tf.random_uniform(tf.stack([batch_size]), minval=0, maxval=1, dtype=tf.float32) < eps - perturbed_stochastic_actions = tf.where(chose_random, random_actions, perturbed_deterministic_actions) - stochastic_actions = tf.where(chose_random, random_actions, deterministic_actions) - - perturbed_output_actions = tf.cond(stochastic_ph, lambda: perturbed_stochastic_actions, - lambda: deterministic_actions) - output_actions = tf.cond(stochastic_ph, lambda: stochastic_actions, lambda: deterministic_actions) - update_eps_expr = eps.assign(tf.cond(update_eps_ph >= 0, lambda: update_eps_ph, lambda: eps)) - updates = [ - update_eps_expr, - tf.cond(reset_ph, lambda: perturb_vars(original_scope="model", perturbed_scope="perturbed_model/model"), - lambda: tf.group(*[])), - tf.cond(update_param_noise_scale_ph, lambda: update_scale(), lambda: tf.Variable(0., trainable=False)), - update_param_noise_thres_expr, - ] - - _act = tf_util.function(inputs=[policy.obs_ph, stochastic_ph, update_eps_ph], - outputs=output_actions, - givens={update_eps_ph: -1.0, stochastic_ph: True}, - updates=[update_eps_expr]) - - _perturbed_act = tf_util.function( - inputs=[policy.obs_ph, stochastic_ph, update_eps_ph, reset_ph, update_param_noise_threshold_ph, - update_param_noise_scale_ph], - outputs=perturbed_output_actions, - givens={update_eps_ph: -1.0, stochastic_ph: True, reset_ph: False, update_param_noise_threshold_ph: False, - update_param_noise_scale_ph: False}, - updates=updates) - - def act(obs, reset=None, update_param_noise_threshold=None, update_param_noise_scale=None, stochastic=True, - update_eps=-1): - """ - get the action from the current observation - - :param obs: (Any) Observation that can be feed into the output of make_obs_ph - :param reset: (bool) reset the perturbed policy by sampling a new perturbation - :param update_param_noise_threshold: (float) the desired threshold for the difference between - non-perturbed and perturbed policy - :param update_param_noise_scale: (bool) whether or not to update the scale of the noise for the next time - it is re-perturbed - :param stochastic: (bool) if set to False all the actions are always deterministic (default False) - :param update_eps: (float) update epsilon a new value, if negative not update happens - (default: no update) - :return: (TensorFlow Tensor) tensor of dtype tf.int64 and shape (BATCH_SIZE,) with an action to be - performed for every element of the batch. - """ - if reset is None or update_param_noise_threshold is None or update_param_noise_scale is None: - return _act(obs, stochastic, update_eps) - else: - return _perturbed_act(obs, stochastic, update_eps, reset, update_param_noise_threshold, - update_param_noise_scale) - - return act, obs_phs - - -def build_train(q_func, ob_space, ac_space, optimizer, sess, grad_norm_clipping=None, - gamma=1.0, double_q=True, scope="deepq", reuse=None, - param_noise=False, param_noise_filter_func=None, full_tensorboard_log=False): - """ - Creates the train function: - - :param q_func: (DQNPolicy) the policy - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param reuse: (bool) whether or not to reuse the graph variables - :param optimizer: (tf.train.Optimizer) optimizer to use for the Q-learning objective. - :param sess: (TensorFlow session) The current TensorFlow session - :param grad_norm_clipping: (float) clip gradient norms to this value. If None no clipping is performed. - :param gamma: (float) discount rate. - :param double_q: (bool) if true will use Double Q Learning (https://arxiv.org/abs/1509.06461). In general it is a - good idea to keep it enabled. - :param scope: (str or VariableScope) optional scope for variable_scope. - :param reuse: (bool) whether or not the variables should be reused. To be able to reuse the scope must be given. - :param param_noise: (bool) whether or not to use parameter space noise (https://arxiv.org/abs/1706.01905) - :param param_noise_filter_func: (function (TensorFlow Tensor): bool) function that decides whether or not a - variable should be perturbed. Only applicable if param_noise is True. If set to None, default_param_noise_filter - is used by default. - :param full_tensorboard_log: (bool) enable additional logging when using tensorboard - WARNING: this logging can take a lot of space quickly - - :return: (tuple) - - act: (function (TensorFlow Tensor, bool, float): TensorFlow Tensor) function to select and action given - observation. See the top of the file for details. - train: (function (Any, numpy float, numpy float, Any, numpy bool, numpy float): numpy float) - optimize the error in Bellman's equation. See the top of the file for details. - update_target: (function) copy the parameters from optimized Q function to the target Q function. - See the top of the file for details. - step_model: (DQNPolicy) Policy for evaluation - """ - n_actions = ac_space.nvec if isinstance(ac_space, MultiDiscrete) else ac_space.n - with tf.variable_scope("input", reuse=reuse): - stochastic_ph = tf.placeholder(tf.bool, (), name="stochastic") - update_eps_ph = tf.placeholder(tf.float32, (), name="update_eps") - - with tf.variable_scope(scope, reuse=reuse): - if param_noise: - act_f, obs_phs = build_act_with_param_noise(q_func, ob_space, ac_space, stochastic_ph, update_eps_ph, sess, - param_noise_filter_func=param_noise_filter_func) - else: - act_f, obs_phs = build_act(q_func, ob_space, ac_space, stochastic_ph, update_eps_ph, sess) - - # q network evaluation - with tf.variable_scope("step_model", reuse=True, custom_getter=tf_util.outer_scope_getter("step_model")): - step_model = q_func(sess, ob_space, ac_space, 1, 1, None, reuse=True, obs_phs=obs_phs) - q_func_vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope=tf.get_variable_scope().name + "/model") - # target q network evaluation - - with tf.variable_scope("target_q_func", reuse=False): - target_policy = q_func(sess, ob_space, ac_space, 1, 1, None, reuse=False) - target_q_func_vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, - scope=tf.get_variable_scope().name + "/target_q_func") - - # compute estimate of best possible value starting from state at t + 1 - double_q_values = None - double_obs_ph = target_policy.obs_ph - if double_q: - with tf.variable_scope("double_q", reuse=True, custom_getter=tf_util.outer_scope_getter("double_q")): - double_policy = q_func(sess, ob_space, ac_space, 1, 1, None, reuse=True) - double_q_values = double_policy.q_values - double_obs_ph = double_policy.obs_ph - - with tf.variable_scope("loss", reuse=reuse): - # set up placeholders - act_t_ph = tf.placeholder(tf.int32, [None], name="action") - rew_t_ph = tf.placeholder(tf.float32, [None], name="reward") - done_mask_ph = tf.placeholder(tf.float32, [None], name="done") - importance_weights_ph = tf.placeholder(tf.float32, [None], name="weight") - - # q scores for actions which we know were selected in the given state. - q_t_selected = tf.reduce_sum(step_model.q_values * tf.one_hot(act_t_ph, n_actions), axis=1) - - # compute estimate of best possible value starting from state at t + 1 - if double_q: - q_tp1_best_using_online_net = tf.argmax(double_q_values, axis=1) - q_tp1_best = tf.reduce_sum(target_policy.q_values * tf.one_hot(q_tp1_best_using_online_net, n_actions), axis=1) - else: - q_tp1_best = tf.reduce_max(target_policy.q_values, axis=1) - q_tp1_best_masked = (1.0 - done_mask_ph) * q_tp1_best - - # compute RHS of bellman equation - q_t_selected_target = rew_t_ph + gamma * q_tp1_best_masked - - # compute the error (potentially clipped) - td_error = q_t_selected - tf.stop_gradient(q_t_selected_target) - errors = tf_util.huber_loss(td_error) - weighted_error = tf.reduce_mean(importance_weights_ph * errors) - - tf.summary.scalar("td_error", tf.reduce_mean(td_error)) - tf.summary.scalar("loss", weighted_error) - - if full_tensorboard_log: - tf.summary.histogram("td_error", td_error) - - # update_target_fn will be called periodically to copy Q network to target Q network - update_target_expr = [] - for var, var_target in zip(sorted(q_func_vars, key=lambda v: v.name), - sorted(target_q_func_vars, key=lambda v: v.name)): - update_target_expr.append(var_target.assign(var)) - update_target_expr = tf.group(*update_target_expr) - - # compute optimization op (potentially with gradient clipping) - gradients = optimizer.compute_gradients(weighted_error, var_list=q_func_vars) - if grad_norm_clipping is not None: - for i, (grad, var) in enumerate(gradients): - if grad is not None: - gradients[i] = (tf.clip_by_norm(grad, grad_norm_clipping), var) - - with tf.variable_scope("input_info", reuse=False): - tf.summary.scalar('rewards', tf.reduce_mean(rew_t_ph)) - tf.summary.scalar('importance_weights', tf.reduce_mean(importance_weights_ph)) - - if full_tensorboard_log: - tf.summary.histogram('rewards', rew_t_ph) - tf.summary.histogram('importance_weights', importance_weights_ph) - if tf_util.is_image(obs_phs[0]): - tf.summary.image('observation', obs_phs[0]) - elif len(obs_phs[0].shape) == 1: - tf.summary.histogram('observation', obs_phs[0]) - - optimize_expr = optimizer.apply_gradients(gradients) - - summary = tf.summary.merge_all() - - # Create callable functions - train = tf_util.function( - inputs=[ - obs_phs[0], - act_t_ph, - rew_t_ph, - target_policy.obs_ph, - double_obs_ph, - done_mask_ph, - importance_weights_ph - ], - outputs=[summary, td_error], - updates=[optimize_expr] - ) - update_target = tf_util.function([], [], updates=[update_target_expr]) - - return act_f, train, update_target, step_model diff --git a/stable_baselines/deepq/dqn.py b/stable_baselines/deepq/dqn.py deleted file mode 100644 index 8deaf5a0..00000000 --- a/stable_baselines/deepq/dqn.py +++ /dev/null @@ -1,401 +0,0 @@ -from functools import partial - -import tensorflow as tf -import numpy as np -import gym - -from stable_baselines import logger -from stable_baselines.common import tf_util, OffPolicyRLModel, SetVerbosity, TensorboardWriter -from stable_baselines.common.vec_env import VecEnv -from stable_baselines.common.schedules import LinearSchedule -from stable_baselines.common.buffers import ReplayBuffer, PrioritizedReplayBuffer -from stable_baselines.deepq.build_graph import build_train -from stable_baselines.deepq.policies import DQNPolicy - - -class DQN(OffPolicyRLModel): - """ - The DQN model class. - DQN paper: https://arxiv.org/abs/1312.5602 - Dueling DQN: https://arxiv.org/abs/1511.06581 - Double-Q Learning: https://arxiv.org/abs/1509.06461 - Prioritized Experience Replay: https://arxiv.org/abs/1511.05952 - - :param policy: (DQNPolicy or str) The policy model to use (MlpPolicy, CnnPolicy, LnMlpPolicy, ...) - :param env: (Gym environment or str) The environment to learn from (if registered in Gym, can be str) - :param gamma: (float) discount factor - :param learning_rate: (float) learning rate for adam optimizer - :param buffer_size: (int) size of the replay buffer - :param exploration_fraction: (float) fraction of entire training period over which the exploration rate is - annealed - :param exploration_final_eps: (float) final value of random action probability - :param exploration_initial_eps: (float) initial value of random action probability - :param train_freq: (int) update the model every `train_freq` steps. set to None to disable printing - :param batch_size: (int) size of a batched sampled from replay buffer for training - :param double_q: (bool) Whether to enable Double-Q learning or not. - :param learning_starts: (int) how many steps of the model to collect transitions for before learning starts - :param target_network_update_freq: (int) update the target network every `target_network_update_freq` steps. - :param prioritized_replay: (bool) if True prioritized replay buffer will be used. - :param prioritized_replay_alpha: (float)alpha parameter for prioritized replay buffer. - It determines how much prioritization is used, with alpha=0 corresponding to the uniform case. - :param prioritized_replay_beta0: (float) initial value of beta for prioritized replay buffer - :param prioritized_replay_beta_iters: (int) number of iterations over which beta will be annealed from initial - value to 1.0. If set to None equals to max_timesteps. - :param prioritized_replay_eps: (float) epsilon to add to the TD errors when updating priorities. - :param param_noise: (bool) Whether or not to apply noise to the parameters of the policy. - :param verbose: (int) the verbosity level: 0 none, 1 training information, 2 tensorflow debug - :param tensorboard_log: (str) the log location for tensorboard (if None, no logging) - :param _init_setup_model: (bool) Whether or not to build the network at the creation of the instance - :param full_tensorboard_log: (bool) enable additional logging when using tensorboard - WARNING: this logging can take a lot of space quickly - :param seed: (int) Seed for the pseudo-random generators (python, numpy, tensorflow). - If None (default), use random seed. Note that if you want completely deterministic - results, you must set `n_cpu_tf_sess` to 1. - :param n_cpu_tf_sess: (int) The number of threads for TensorFlow operations - If None, the number of cpu of the current machine will be used. - """ - def __init__(self, policy, env, gamma=0.99, learning_rate=5e-4, buffer_size=50000, exploration_fraction=0.1, - exploration_final_eps=0.02, exploration_initial_eps=1.0, train_freq=1, batch_size=32, double_q=True, - learning_starts=1000, target_network_update_freq=500, prioritized_replay=False, - prioritized_replay_alpha=0.6, prioritized_replay_beta0=0.4, prioritized_replay_beta_iters=None, - prioritized_replay_eps=1e-6, param_noise=False, - n_cpu_tf_sess=None, verbose=0, tensorboard_log=None, - _init_setup_model=True, policy_kwargs=None, full_tensorboard_log=False, seed=None): - - # TODO: replay_buffer refactoring - super(DQN, self).__init__(policy=policy, env=env, replay_buffer=None, verbose=verbose, policy_base=DQNPolicy, - requires_vec_env=False, policy_kwargs=policy_kwargs, seed=seed, n_cpu_tf_sess=n_cpu_tf_sess) - - self.param_noise = param_noise - self.learning_starts = learning_starts - self.train_freq = train_freq - self.prioritized_replay = prioritized_replay - self.prioritized_replay_eps = prioritized_replay_eps - self.batch_size = batch_size - self.target_network_update_freq = target_network_update_freq - self.prioritized_replay_alpha = prioritized_replay_alpha - self.prioritized_replay_beta0 = prioritized_replay_beta0 - self.prioritized_replay_beta_iters = prioritized_replay_beta_iters - self.exploration_final_eps = exploration_final_eps - self.exploration_initial_eps = exploration_initial_eps - self.exploration_fraction = exploration_fraction - self.buffer_size = buffer_size - self.learning_rate = learning_rate - self.gamma = gamma - self.tensorboard_log = tensorboard_log - self.full_tensorboard_log = full_tensorboard_log - self.double_q = double_q - - self.graph = None - self.sess = None - self._train_step = None - self.step_model = None - self.update_target = None - self.act = None - self.proba_step = None - self.replay_buffer = None - self.beta_schedule = None - self.exploration = None - self.params = None - self.summary = None - - if _init_setup_model: - self.setup_model() - - def _get_pretrain_placeholders(self): - policy = self.step_model - return policy.obs_ph, tf.placeholder(tf.int32, [None]), policy.q_values - - def setup_model(self): - - with SetVerbosity(self.verbose): - assert not isinstance(self.action_space, gym.spaces.Box), \ - "Error: DQN cannot output a gym.spaces.Box action space." - - # If the policy is wrap in functool.partial (e.g. to disable dueling) - # unwrap it to check the class type - if isinstance(self.policy, partial): - test_policy = self.policy.func - else: - test_policy = self.policy - assert issubclass(test_policy, DQNPolicy), "Error: the input policy for the DQN model must be " \ - "an instance of DQNPolicy." - - self.graph = tf.Graph() - with self.graph.as_default(): - self.set_random_seed(self.seed) - self.sess = tf_util.make_session(num_cpu=self.n_cpu_tf_sess, graph=self.graph) - - optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate) - - self.act, self._train_step, self.update_target, self.step_model = build_train( - q_func=partial(self.policy, **self.policy_kwargs), - ob_space=self.observation_space, - ac_space=self.action_space, - optimizer=optimizer, - gamma=self.gamma, - grad_norm_clipping=10, - param_noise=self.param_noise, - sess=self.sess, - full_tensorboard_log=self.full_tensorboard_log, - double_q=self.double_q - ) - self.proba_step = self.step_model.proba_step - self.params = tf_util.get_trainable_vars("deepq") - - # Initialize the parameters and copy them to the target network. - tf_util.initialize(self.sess) - self.update_target(sess=self.sess) - - self.summary = tf.summary.merge_all() - - def learn(self, total_timesteps, callback=None, log_interval=100, tb_log_name="DQN", - reset_num_timesteps=True, replay_wrapper=None): - - new_tb_log = self._init_num_timesteps(reset_num_timesteps) - callback = self._init_callback(callback) - - with SetVerbosity(self.verbose), TensorboardWriter(self.graph, self.tensorboard_log, tb_log_name, new_tb_log) \ - as writer: - self._setup_learn() - - # Create the replay buffer - if self.prioritized_replay: - self.replay_buffer = PrioritizedReplayBuffer(self.buffer_size, alpha=self.prioritized_replay_alpha) - if self.prioritized_replay_beta_iters is None: - prioritized_replay_beta_iters = total_timesteps - else: - prioritized_replay_beta_iters = self.prioritized_replay_beta_iters - self.beta_schedule = LinearSchedule(prioritized_replay_beta_iters, - initial_p=self.prioritized_replay_beta0, - final_p=1.0) - else: - self.replay_buffer = ReplayBuffer(self.buffer_size) - self.beta_schedule = None - - if replay_wrapper is not None: - assert not self.prioritized_replay, "Prioritized replay buffer is not supported by HER" - self.replay_buffer = replay_wrapper(self.replay_buffer) - - # Create the schedule for exploration starting from 1. - self.exploration = LinearSchedule(schedule_timesteps=int(self.exploration_fraction * total_timesteps), - initial_p=self.exploration_initial_eps, - final_p=self.exploration_final_eps) - - episode_rewards = [0.0] - episode_successes = [] - - callback.on_training_start(locals(), globals()) - callback.on_rollout_start() - - reset = True - obs = self.env.reset() - # Retrieve unnormalized observation for saving into the buffer - if self._vec_normalize_env is not None: - obs_ = self._vec_normalize_env.get_original_obs().squeeze() - - for _ in range(total_timesteps): - # Take action and update exploration to the newest value - kwargs = {} - if not self.param_noise: - update_eps = self.exploration.value(self.num_timesteps) - update_param_noise_threshold = 0. - else: - update_eps = 0. - # Compute the threshold such that the KL divergence between perturbed and non-perturbed - # policy is comparable to eps-greedy exploration with eps = exploration.value(t). - # See Appendix C.1 in Parameter Space Noise for Exploration, Plappert et al., 2017 - # for detailed explanation. - update_param_noise_threshold = \ - -np.log(1. - self.exploration.value(self.num_timesteps) + - self.exploration.value(self.num_timesteps) / float(self.env.action_space.n)) - kwargs['reset'] = reset - kwargs['update_param_noise_threshold'] = update_param_noise_threshold - kwargs['update_param_noise_scale'] = True - with self.sess.as_default(): - action = self.act(np.array(obs)[None], update_eps=update_eps, **kwargs)[0] - env_action = action - reset = False - new_obs, rew, done, info = self.env.step(env_action) - - self.num_timesteps += 1 - - # Stop training if return value is False - callback.update_locals(locals()) - if callback.on_step() is False: - break - - # Store only the unnormalized version - if self._vec_normalize_env is not None: - new_obs_ = self._vec_normalize_env.get_original_obs().squeeze() - reward_ = self._vec_normalize_env.get_original_reward().squeeze() - else: - # Avoid changing the original ones - obs_, new_obs_, reward_ = obs, new_obs, rew - # Store transition in the replay buffer. - self.replay_buffer_add(obs_, action, reward_, new_obs_, done, info) - obs = new_obs - # Save the unnormalized observation - if self._vec_normalize_env is not None: - obs_ = new_obs_ - - if writer is not None: - ep_rew = np.array([reward_]).reshape((1, -1)) - ep_done = np.array([done]).reshape((1, -1)) - tf_util.total_episode_reward_logger(self.episode_reward, ep_rew, ep_done, writer, - self.num_timesteps) - - episode_rewards[-1] += reward_ - if done: - maybe_is_success = info.get('is_success') - if maybe_is_success is not None: - episode_successes.append(float(maybe_is_success)) - if not isinstance(self.env, VecEnv): - obs = self.env.reset() - episode_rewards.append(0.0) - reset = True - - # Do not train if the warmup phase is not over - # or if there are not enough samples in the replay buffer - can_sample = self.replay_buffer.can_sample(self.batch_size) - if can_sample and self.num_timesteps > self.learning_starts \ - and self.num_timesteps % self.train_freq == 0: - - callback.on_rollout_end() - # Minimize the error in Bellman's equation on a batch sampled from replay buffer. - # pytype:disable=bad-unpacking - if self.prioritized_replay: - assert self.beta_schedule is not None, \ - "BUG: should be LinearSchedule when self.prioritized_replay True" - experience = self.replay_buffer.sample(self.batch_size, - beta=self.beta_schedule.value(self.num_timesteps), - env=self._vec_normalize_env) - (obses_t, actions, rewards, obses_tp1, dones, weights, batch_idxes) = experience - else: - obses_t, actions, rewards, obses_tp1, dones = self.replay_buffer.sample(self.batch_size, - env=self._vec_normalize_env) - weights, batch_idxes = np.ones_like(rewards), None - # pytype:enable=bad-unpacking - - if writer is not None: - # run loss backprop with summary, but once every 100 steps save the metadata - # (memory, compute time, ...) - if (1 + self.num_timesteps) % 100 == 0: - run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE) - run_metadata = tf.RunMetadata() - summary, td_errors = self._train_step(obses_t, actions, rewards, obses_tp1, obses_tp1, - dones, weights, sess=self.sess, options=run_options, - run_metadata=run_metadata) - writer.add_run_metadata(run_metadata, 'step%d' % self.num_timesteps) - else: - summary, td_errors = self._train_step(obses_t, actions, rewards, obses_tp1, obses_tp1, - dones, weights, sess=self.sess) - writer.add_summary(summary, self.num_timesteps) - else: - _, td_errors = self._train_step(obses_t, actions, rewards, obses_tp1, obses_tp1, dones, weights, - sess=self.sess) - - if self.prioritized_replay: - new_priorities = np.abs(td_errors) + self.prioritized_replay_eps - assert isinstance(self.replay_buffer, PrioritizedReplayBuffer) - self.replay_buffer.update_priorities(batch_idxes, new_priorities) - - callback.on_rollout_start() - - if can_sample and self.num_timesteps > self.learning_starts and \ - self.num_timesteps % self.target_network_update_freq == 0: - # Update target network periodically. - self.update_target(sess=self.sess) - - if len(episode_rewards[-101:-1]) == 0: - mean_100ep_reward = -np.inf - else: - mean_100ep_reward = round(float(np.mean(episode_rewards[-101:-1])), 1) - - num_episodes = len(episode_rewards) - if self.verbose >= 1 and done and log_interval is not None and len(episode_rewards) % log_interval == 0: - logger.record_tabular("steps", self.num_timesteps) - logger.record_tabular("episodes", num_episodes) - if len(episode_successes) > 0: - logger.logkv("success rate", np.mean(episode_successes[-100:])) - logger.record_tabular("mean 100 episode reward", mean_100ep_reward) - logger.record_tabular("% time spent exploring", - int(100 * self.exploration.value(self.num_timesteps))) - logger.dump_tabular() - - callback.on_training_end() - return self - - def predict(self, observation, state=None, mask=None, deterministic=True): - observation = np.array(observation) - vectorized_env = self._is_vectorized_observation(observation, self.observation_space) - - observation = observation.reshape((-1,) + self.observation_space.shape) - with self.sess.as_default(): - actions, _, _ = self.step_model.step(observation, deterministic=deterministic) - - if not vectorized_env: - actions = actions[0] - - return actions, None - - def action_probability(self, observation, state=None, mask=None, actions=None, logp=False): - observation = np.array(observation) - vectorized_env = self._is_vectorized_observation(observation, self.observation_space) - - observation = observation.reshape((-1,) + self.observation_space.shape) - actions_proba = self.proba_step(observation, state, mask) - - if actions is not None: # comparing the action distribution, to given actions - actions = np.array([actions]) - assert isinstance(self.action_space, gym.spaces.Discrete) - actions = actions.reshape((-1,)) - assert observation.shape[0] == actions.shape[0], "Error: batch sizes differ for actions and observations." - actions_proba = actions_proba[np.arange(actions.shape[0]), actions] - # normalize action proba shape - actions_proba = actions_proba.reshape((-1, 1)) - if logp: - actions_proba = np.log(actions_proba) - - if not vectorized_env: - if state is not None: - raise ValueError("Error: The environment must be vectorized when using recurrent policies.") - actions_proba = actions_proba[0] - - return actions_proba - - def get_parameter_list(self): - return self.params - - def save(self, save_path, cloudpickle=False): - # params - data = { - "double_q": self.double_q, - "param_noise": self.param_noise, - "learning_starts": self.learning_starts, - "train_freq": self.train_freq, - "prioritized_replay": self.prioritized_replay, - "prioritized_replay_eps": self.prioritized_replay_eps, - "batch_size": self.batch_size, - "target_network_update_freq": self.target_network_update_freq, - "prioritized_replay_alpha": self.prioritized_replay_alpha, - "prioritized_replay_beta0": self.prioritized_replay_beta0, - "prioritized_replay_beta_iters": self.prioritized_replay_beta_iters, - "exploration_final_eps": self.exploration_final_eps, - "exploration_fraction": self.exploration_fraction, - "learning_rate": self.learning_rate, - "gamma": self.gamma, - "verbose": self.verbose, - "observation_space": self.observation_space, - "action_space": self.action_space, - "policy": self.policy, - "n_envs": self.n_envs, - "n_cpu_tf_sess": self.n_cpu_tf_sess, - "seed": self.seed, - "_vectorize_action": self._vectorize_action, - "policy_kwargs": self.policy_kwargs - } - - params_to_save = self.get_parameters() - - self._save_to_file(save_path, data=data, params=params_to_save, cloudpickle=cloudpickle) diff --git a/stable_baselines/deepq/experiments/__init__.py b/stable_baselines/deepq/experiments/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/stable_baselines/deepq/experiments/enjoy_cartpole.py b/stable_baselines/deepq/experiments/enjoy_cartpole.py deleted file mode 100644 index 90991234..00000000 --- a/stable_baselines/deepq/experiments/enjoy_cartpole.py +++ /dev/null @@ -1,36 +0,0 @@ -import argparse - -import gym - -from stable_baselines.deepq import DQN - - -def main(args): - """ - Run a trained model for the cartpole problem - - :param args: (ArgumentParser) the input arguments - """ - env = gym.make("CartPole-v0") - model = DQN.load("cartpole_model.zip", env) - - while True: - obs, done = env.reset(), False - episode_rew = 0 - while not done: - if not args.no_render: - env.render() - action, _ = model.predict(obs) - obs, rew, done, _ = env.step(action) - episode_rew += rew - print("Episode reward", episode_rew) - # No render is only used for automatic testing - if args.no_render: - break - - -if __name__ == '__main__': - parser = argparse.ArgumentParser(description="Enjoy trained DQN on cartpole") - parser.add_argument('--no-render', default=False, action="store_true", help="Disable rendering") - args = parser.parse_args() - main(args) diff --git a/stable_baselines/deepq/experiments/enjoy_mountaincar.py b/stable_baselines/deepq/experiments/enjoy_mountaincar.py deleted file mode 100644 index dc0513f8..00000000 --- a/stable_baselines/deepq/experiments/enjoy_mountaincar.py +++ /dev/null @@ -1,41 +0,0 @@ -import argparse - -import gym -import numpy as np - -from stable_baselines.deepq import DQN - - -def main(args): - """ - Run a trained model for the mountain car problem - - :param args: (ArgumentParser) the input arguments - """ - env = gym.make("MountainCar-v0") - model = DQN.load("mountaincar_model.zip", env) - - while True: - obs, done = env.reset(), False - episode_rew = 0 - while not done: - if not args.no_render: - env.render() - # Epsilon-greedy - if np.random.random() < 0.02: - action = env.action_space.sample() - else: - action, _ = model.predict(obs, deterministic=True) - obs, rew, done, _ = env.step(action) - episode_rew += rew - print("Episode reward", episode_rew) - # No render is only used for automatic testing - if args.no_render: - break - - -if __name__ == '__main__': - parser = argparse.ArgumentParser(description="Enjoy trained DQN on MountainCar") - parser.add_argument('--no-render', default=False, action="store_true", help="Disable rendering") - args = parser.parse_args() - main(args) diff --git a/stable_baselines/deepq/experiments/run_atari.py b/stable_baselines/deepq/experiments/run_atari.py deleted file mode 100644 index 7e3fb165..00000000 --- a/stable_baselines/deepq/experiments/run_atari.py +++ /dev/null @@ -1,50 +0,0 @@ -import argparse -from functools import partial - -from stable_baselines import bench, logger -from stable_baselines.common import set_global_seeds -from stable_baselines.common.atari_wrappers import make_atari -from stable_baselines.deepq import DQN, wrap_atari_dqn, CnnPolicy - - -def main(): - """ - Run the atari test - """ - parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument('--env', help='environment ID', default='BreakoutNoFrameskip-v4') - parser.add_argument('--seed', help='RNG seed', type=int, default=0) - parser.add_argument('--prioritized', type=int, default=1) - parser.add_argument('--dueling', type=int, default=1) - parser.add_argument('--prioritized-replay-alpha', type=float, default=0.6) - parser.add_argument('--num-timesteps', type=int, default=int(10e6)) - - args = parser.parse_args() - logger.configure() - set_global_seeds(args.seed) - env = make_atari(args.env) - env = bench.Monitor(env, logger.get_dir()) - env = wrap_atari_dqn(env) - policy = partial(CnnPolicy, dueling=args.dueling == 1) - - model = DQN( - env=env, - policy=policy, - learning_rate=1e-4, - buffer_size=10000, - exploration_fraction=0.1, - exploration_final_eps=0.01, - train_freq=4, - learning_starts=10000, - target_network_update_freq=1000, - gamma=0.99, - prioritized_replay=bool(args.prioritized), - prioritized_replay_alpha=args.prioritized_replay_alpha, - ) - model.learn(total_timesteps=args.num_timesteps) - - env.close() - - -if __name__ == '__main__': - main() diff --git a/stable_baselines/deepq/experiments/train_cartpole.py b/stable_baselines/deepq/experiments/train_cartpole.py deleted file mode 100644 index acae9b92..00000000 --- a/stable_baselines/deepq/experiments/train_cartpole.py +++ /dev/null @@ -1,51 +0,0 @@ -import argparse - -import gym -import numpy as np - -from stable_baselines.deepq import DQN, MlpPolicy - - -def callback(lcl, _glb): - """ - The callback function for logging and saving - - :param lcl: (dict) the local variables - :param _glb: (dict) the global variables - :return: (bool) is solved - """ - # stop training if reward exceeds 199 - if len(lcl['episode_rewards'][-101:-1]) == 0: - mean_100ep_reward = -np.inf - else: - mean_100ep_reward = round(float(np.mean(lcl['episode_rewards'][-101:-1])), 1) - is_solved = lcl['self'].num_timesteps > 100 and mean_100ep_reward >= 199 - return not is_solved - - -def main(args): - """ - Train and save the DQN model, for the cartpole problem - - :param args: (ArgumentParser) the input arguments - """ - env = gym.make("CartPole-v0") - model = DQN( - env=env, - policy=MlpPolicy, - learning_rate=1e-3, - buffer_size=50000, - exploration_fraction=0.1, - exploration_final_eps=0.02, - ) - model.learn(total_timesteps=args.max_timesteps, callback=callback) - - print("Saving model to cartpole_model.zip") - model.save("cartpole_model.zip") - - -if __name__ == '__main__': - parser = argparse.ArgumentParser(description="Train DQN on cartpole") - parser.add_argument('--max-timesteps', default=100000, type=int, help="Maximum number of timesteps") - args = parser.parse_args() - main(args) diff --git a/stable_baselines/deepq/experiments/train_mountaincar.py b/stable_baselines/deepq/experiments/train_mountaincar.py deleted file mode 100644 index f20e934a..00000000 --- a/stable_baselines/deepq/experiments/train_mountaincar.py +++ /dev/null @@ -1,37 +0,0 @@ -import argparse - -import gym - -from stable_baselines.deepq import DQN - - -def main(args): - """ - Train and save the DQN model, for the mountain car problem - - :param args: (ArgumentParser) the input arguments - """ - env = gym.make("MountainCar-v0") - - # using layer norm policy here is important for parameter space noise! - model = DQN( - policy="LnMlpPolicy", - env=env, - learning_rate=1e-3, - buffer_size=50000, - exploration_fraction=0.1, - exploration_final_eps=0.1, - param_noise=True, - policy_kwargs=dict(layers=[64]) - ) - model.learn(total_timesteps=args.max_timesteps) - - print("Saving model to mountaincar_model.zip") - model.save("mountaincar_model") - - -if __name__ == '__main__': - parser = argparse.ArgumentParser(description="Train DQN on MountainCar") - parser.add_argument('--max-timesteps', default=100000, type=int, help="Maximum number of timesteps") - args = parser.parse_args() - main(args) diff --git a/stable_baselines/deepq/policies.py b/stable_baselines/deepq/policies.py deleted file mode 100644 index 3a2dfec1..00000000 --- a/stable_baselines/deepq/policies.py +++ /dev/null @@ -1,254 +0,0 @@ -import tensorflow as tf -import tensorflow.contrib.layers as tf_layers -import numpy as np -from gym.spaces import Discrete - -from stable_baselines.common.policies import BasePolicy, nature_cnn, register_policy - - -class DQNPolicy(BasePolicy): - """ - Policy object that implements a DQN policy - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param scale: (bool) whether or not to scale the input - :param obs_phs: (TensorFlow Tensor, TensorFlow Tensor) a tuple containing an override for observation placeholder - and the processed observation placeholder respectively - :param dueling: (bool) if true double the output MLP to compute a baseline for action scores - """ - - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse=False, scale=False, - obs_phs=None, dueling=True): - # DQN policies need an override for the obs placeholder, due to the architecture of the code - super(DQNPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse=reuse, scale=scale, - obs_phs=obs_phs) - assert isinstance(ac_space, Discrete), "Error: the action space for DQN must be of type gym.spaces.Discrete" - self.n_actions = ac_space.n - self.value_fn = None - self.q_values = None - self.dueling = dueling - - def _setup_init(self): - """ - Set up action probability - """ - with tf.variable_scope("output", reuse=True): - assert self.q_values is not None - self.policy_proba = tf.nn.softmax(self.q_values) - - def step(self, obs, state=None, mask=None, deterministic=True): - """ - Returns the q_values for a single step - - :param obs: (np.ndarray float or int) The current observation of the environment - :param state: (np.ndarray float) The last states (used in recurrent policies) - :param mask: (np.ndarray float) The last masks (used in recurrent policies) - :param deterministic: (bool) Whether or not to return deterministic actions. - :return: (np.ndarray int, np.ndarray float, np.ndarray float) actions, q_values, states - """ - raise NotImplementedError - - def proba_step(self, obs, state=None, mask=None): - """ - Returns the action probability for a single step - - :param obs: (np.ndarray float or int) The current observation of the environment - :param state: (np.ndarray float) The last states (used in recurrent policies) - :param mask: (np.ndarray float) The last masks (used in recurrent policies) - :return: (np.ndarray float) the action probability - """ - raise NotImplementedError - - -class FeedForwardPolicy(DQNPolicy): - """ - Policy object that implements a DQN policy, using a feed forward neural network. - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param layers: ([int]) The size of the Neural network for the policy (if None, default to [64, 64]) - :param cnn_extractor: (function (TensorFlow Tensor, ``**kwargs``): (TensorFlow Tensor)) the CNN feature extraction - :param feature_extraction: (str) The feature extraction type ("cnn" or "mlp") - :param obs_phs: (TensorFlow Tensor, TensorFlow Tensor) a tuple containing an override for observation placeholder - and the processed observation placeholder respectively - :param layer_norm: (bool) enable layer normalisation - :param dueling: (bool) if true double the output MLP to compute a baseline for action scores - :param act_fun: (tf.func) the activation function to use in the neural network. - :param kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse=False, layers=None, - cnn_extractor=nature_cnn, feature_extraction="cnn", - obs_phs=None, layer_norm=False, dueling=True, act_fun=tf.nn.relu, **kwargs): - super(FeedForwardPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, - n_batch, dueling=dueling, reuse=reuse, - scale=(feature_extraction == "cnn"), obs_phs=obs_phs) - - self._kwargs_check(feature_extraction, kwargs) - - if layers is None: - layers = [64, 64] - - with tf.variable_scope("model", reuse=reuse): - with tf.variable_scope("action_value"): - if feature_extraction == "cnn": - extracted_features = cnn_extractor(self.processed_obs, **kwargs) - action_out = extracted_features - else: - extracted_features = tf.layers.flatten(self.processed_obs) - action_out = extracted_features - for layer_size in layers: - action_out = tf_layers.fully_connected(action_out, num_outputs=layer_size, activation_fn=None) - if layer_norm: - action_out = tf_layers.layer_norm(action_out, center=True, scale=True) - action_out = act_fun(action_out) - - action_scores = tf_layers.fully_connected(action_out, num_outputs=self.n_actions, activation_fn=None) - - if self.dueling: - with tf.variable_scope("state_value"): - state_out = extracted_features - for layer_size in layers: - state_out = tf_layers.fully_connected(state_out, num_outputs=layer_size, activation_fn=None) - if layer_norm: - state_out = tf_layers.layer_norm(state_out, center=True, scale=True) - state_out = act_fun(state_out) - state_score = tf_layers.fully_connected(state_out, num_outputs=1, activation_fn=None) - action_scores_mean = tf.reduce_mean(action_scores, axis=1) - action_scores_centered = action_scores - tf.expand_dims(action_scores_mean, axis=1) - q_out = state_score + action_scores_centered - else: - q_out = action_scores - - self.q_values = q_out - self._setup_init() - - def step(self, obs, state=None, mask=None, deterministic=True): - q_values, actions_proba = self.sess.run([self.q_values, self.policy_proba], {self.obs_ph: obs}) - if deterministic: - actions = np.argmax(q_values, axis=1) - else: - # Unefficient sampling - # TODO: replace the loop - # maybe with Gumbel-max trick ? (http://amid.fish/humble-gumbel) - actions = np.zeros((len(obs),), dtype=np.int64) - for action_idx in range(len(obs)): - actions[action_idx] = np.random.choice(self.n_actions, p=actions_proba[action_idx]) - - return actions, q_values, None - - def proba_step(self, obs, state=None, mask=None): - return self.sess.run(self.policy_proba, {self.obs_ph: obs}) - - -class CnnPolicy(FeedForwardPolicy): - """ - Policy object that implements DQN policy, using a CNN (the nature CNN) - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param obs_phs: (TensorFlow Tensor, TensorFlow Tensor) a tuple containing an override for observation placeholder - and the processed observation placeholder respectively - :param dueling: (bool) if true double the output MLP to compute a baseline for action scores - :param _kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, - reuse=False, obs_phs=None, dueling=True, **_kwargs): - super(CnnPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse, - feature_extraction="cnn", obs_phs=obs_phs, dueling=dueling, - layer_norm=False, **_kwargs) - - -class LnCnnPolicy(FeedForwardPolicy): - """ - Policy object that implements DQN policy, using a CNN (the nature CNN), with layer normalisation - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param obs_phs: (TensorFlow Tensor, TensorFlow Tensor) a tuple containing an override for observation placeholder - and the processed observation placeholder respectively - :param dueling: (bool) if true double the output MLP to compute a baseline for action scores - :param _kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, - reuse=False, obs_phs=None, dueling=True, **_kwargs): - super(LnCnnPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse, - feature_extraction="cnn", obs_phs=obs_phs, dueling=dueling, - layer_norm=True, **_kwargs) - - -class MlpPolicy(FeedForwardPolicy): - """ - Policy object that implements DQN policy, using a MLP (2 layers of 64) - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param obs_phs: (TensorFlow Tensor, TensorFlow Tensor) a tuple containing an override for observation placeholder - and the processed observation placeholder respectively - :param dueling: (bool) if true double the output MLP to compute a baseline for action scores - :param _kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, - reuse=False, obs_phs=None, dueling=True, **_kwargs): - super(MlpPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse, - feature_extraction="mlp", obs_phs=obs_phs, dueling=dueling, - layer_norm=False, **_kwargs) - - -class LnMlpPolicy(FeedForwardPolicy): - """ - Policy object that implements DQN policy, using a MLP (2 layers of 64), with layer normalisation - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param obs_phs: (TensorFlow Tensor, TensorFlow Tensor) a tuple containing an override for observation placeholder - and the processed observation placeholder respectively - :param dueling: (bool) if true double the output MLP to compute a baseline for action scores - :param _kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, - reuse=False, obs_phs=None, dueling=True, **_kwargs): - super(LnMlpPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse, - feature_extraction="mlp", obs_phs=obs_phs, - layer_norm=True, dueling=True, **_kwargs) - - -register_policy("CnnPolicy", CnnPolicy) -register_policy("LnCnnPolicy", LnCnnPolicy) -register_policy("MlpPolicy", MlpPolicy) -register_policy("LnMlpPolicy", LnMlpPolicy) diff --git a/stable_baselines/gail/__init__.py b/stable_baselines/gail/__init__.py deleted file mode 100644 index 0a4c7ac4..00000000 --- a/stable_baselines/gail/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from stable_baselines.gail.model import GAIL -from stable_baselines.gail.dataset.dataset import ExpertDataset, DataLoader -from stable_baselines.gail.dataset.record_expert import generate_expert_traj diff --git a/stable_baselines/gail/adversary.py b/stable_baselines/gail/adversary.py deleted file mode 100644 index 7c6cb63c..00000000 --- a/stable_baselines/gail/adversary.py +++ /dev/null @@ -1,164 +0,0 @@ -""" -Reference: https://github.com/openai/imitation -I follow the architecture from the official repository -""" -import gym -import tensorflow as tf -import numpy as np - -from stable_baselines.common.mpi_running_mean_std import RunningMeanStd -from stable_baselines.common import tf_util as tf_util - - -def logsigmoid(input_tensor): - """ - Equivalent to tf.log(tf.sigmoid(a)) - - :param input_tensor: (tf.Tensor) - :return: (tf.Tensor) - """ - return -tf.nn.softplus(-input_tensor) - - -def logit_bernoulli_entropy(logits): - """ - Reference: - https://github.com/openai/imitation/blob/99fbccf3e060b6e6c739bdf209758620fcdefd3c/policyopt/thutil.py#L48-L51 - - :param logits: (tf.Tensor) the logits - :return: (tf.Tensor) the Bernoulli entropy - """ - ent = (1. - tf.nn.sigmoid(logits)) * logits - logsigmoid(logits) - return ent - - -class TransitionClassifier(object): - def __init__(self, observation_space, action_space, hidden_size, - entcoeff=0.001, scope="adversary", normalize=True): - """ - Reward regression from observations and transitions - - :param observation_space: (gym.spaces) - :param action_space: (gym.spaces) - :param hidden_size: ([int]) the hidden dimension for the MLP - :param entcoeff: (float) the entropy loss weight - :param scope: (str) tensorflow variable scope - :param normalize: (bool) Whether to normalize the reward or not - """ - # TODO: support images properly (using a CNN) - self.scope = scope - self.observation_shape = observation_space.shape - self.actions_shape = action_space.shape - - if isinstance(action_space, gym.spaces.Box): - # Continuous action space - self.discrete_actions = False - self.n_actions = action_space.shape[0] - elif isinstance(action_space, gym.spaces.Discrete): - self.n_actions = action_space.n - self.discrete_actions = True - else: - raise ValueError('Action space not supported: {}'.format(action_space)) - - self.hidden_size = hidden_size - self.normalize = normalize - self.obs_rms = None - - # Placeholders - self.generator_obs_ph = tf.placeholder(observation_space.dtype, (None,) + self.observation_shape, - name="observations_ph") - self.generator_acs_ph = tf.placeholder(action_space.dtype, (None,) + self.actions_shape, - name="actions_ph") - self.expert_obs_ph = tf.placeholder(observation_space.dtype, (None,) + self.observation_shape, - name="expert_observations_ph") - self.expert_acs_ph = tf.placeholder(action_space.dtype, (None,) + self.actions_shape, - name="expert_actions_ph") - # Build graph - generator_logits = self.build_graph(self.generator_obs_ph, self.generator_acs_ph, reuse=False) - expert_logits = self.build_graph(self.expert_obs_ph, self.expert_acs_ph, reuse=True) - # Build accuracy - generator_acc = tf.reduce_mean(tf.cast(tf.nn.sigmoid(generator_logits) < 0.5, tf.float32)) - expert_acc = tf.reduce_mean(tf.cast(tf.nn.sigmoid(expert_logits) > 0.5, tf.float32)) - # Build regression loss - # let x = logits, z = targets. - # z * -log(sigmoid(x)) + (1 - z) * -log(1 - sigmoid(x)) - generator_loss = tf.nn.sigmoid_cross_entropy_with_logits(logits=generator_logits, - labels=tf.zeros_like(generator_logits)) - generator_loss = tf.reduce_mean(generator_loss) - expert_loss = tf.nn.sigmoid_cross_entropy_with_logits(logits=expert_logits, labels=tf.ones_like(expert_logits)) - expert_loss = tf.reduce_mean(expert_loss) - # Build entropy loss - logits = tf.concat([generator_logits, expert_logits], 0) - entropy = tf.reduce_mean(logit_bernoulli_entropy(logits)) - entropy_loss = -entcoeff * entropy - # Loss + Accuracy terms - self.losses = [generator_loss, expert_loss, entropy, entropy_loss, generator_acc, expert_acc] - self.loss_name = ["generator_loss", "expert_loss", "entropy", "entropy_loss", "generator_acc", "expert_acc"] - self.total_loss = generator_loss + expert_loss + entropy_loss - # Build Reward for policy - self.reward_op = -tf.log(1 - tf.nn.sigmoid(generator_logits) + 1e-8) - var_list = self.get_trainable_variables() - self.lossandgrad = tf_util.function( - [self.generator_obs_ph, self.generator_acs_ph, self.expert_obs_ph, self.expert_acs_ph], - self.losses + [tf_util.flatgrad(self.total_loss, var_list)]) - - def build_graph(self, obs_ph, acs_ph, reuse=False): - """ - build the graph - - :param obs_ph: (tf.Tensor) the observation placeholder - :param acs_ph: (tf.Tensor) the action placeholder - :param reuse: (bool) - :return: (tf.Tensor) the graph output - """ - with tf.variable_scope(self.scope): - if reuse: - tf.get_variable_scope().reuse_variables() - - if self.normalize: - with tf.variable_scope("obfilter"): - self.obs_rms = RunningMeanStd(shape=self.observation_shape) - obs = (obs_ph - self.obs_rms.mean) / self.obs_rms.std - else: - obs = obs_ph - - if self.discrete_actions: - one_hot_actions = tf.one_hot(acs_ph, self.n_actions) - actions_ph = tf.cast(one_hot_actions, tf.float32) - else: - actions_ph = acs_ph - - _input = tf.concat([obs, actions_ph], axis=1) # concatenate the two input -> form a transition - p_h1 = tf.contrib.layers.fully_connected(_input, self.hidden_size, activation_fn=tf.nn.tanh) - p_h2 = tf.contrib.layers.fully_connected(p_h1, self.hidden_size, activation_fn=tf.nn.tanh) - logits = tf.contrib.layers.fully_connected(p_h2, 1, activation_fn=tf.identity) - return logits - - def get_trainable_variables(self): - """ - Get all the trainable variables from the graph - - :return: ([tf.Tensor]) the variables - """ - return tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, self.scope) - - def get_reward(self, obs, actions): - """ - Predict the reward using the observation and action - - :param obs: (tf.Tensor or np.ndarray) the observation - :param actions: (tf.Tensor or np.ndarray) the action - :return: (np.ndarray) the reward - """ - sess = tf.get_default_session() - if len(obs.shape) == 1: - obs = np.expand_dims(obs, 0) - if len(actions.shape) == 1: - actions = np.expand_dims(actions, 0) - elif len(actions.shape) == 0: - # one discrete action - actions = np.expand_dims(actions, 0) - - feed_dict = {self.generator_obs_ph: obs, self.generator_acs_ph: actions} - reward = sess.run(self.reward_op, feed_dict) - return reward diff --git a/stable_baselines/gail/dataset/__init__.py b/stable_baselines/gail/dataset/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/stable_baselines/gail/dataset/dataset.py b/stable_baselines/gail/dataset/dataset.py deleted file mode 100644 index 676b8875..00000000 --- a/stable_baselines/gail/dataset/dataset.py +++ /dev/null @@ -1,371 +0,0 @@ -import queue -import time -from multiprocessing import Queue, Process - -import cv2 # pytype:disable=import-error -import numpy as np -from joblib import Parallel, delayed - -from stable_baselines import logger - - -class ExpertDataset(object): - """ - Dataset for using behavior cloning or GAIL. - - The structure of the expert dataset is a dict, saved as an ".npz" archive. - The dictionary contains the keys 'actions', 'episode_returns', 'rewards', 'obs' and 'episode_starts'. - The corresponding values have data concatenated across episode: the first axis is the timestep, - the remaining axes index into the data. In case of images, 'obs' contains the relative path to - the images, to enable space saving from image compression. - - :param expert_path: (str) The path to trajectory data (.npz file). Mutually exclusive with traj_data. - :param traj_data: (dict) Trajectory data, in format described above. Mutually exclusive with expert_path. - :param train_fraction: (float) the train validation split (0 to 1) - for pre-training using behavior cloning (BC) - :param batch_size: (int) the minibatch size for behavior cloning - :param traj_limitation: (int) the number of trajectory to use (if -1, load all) - :param randomize: (bool) if the dataset should be shuffled - :param verbose: (int) Verbosity - :param sequential_preprocessing: (bool) Do not use subprocess to preprocess - the data (slower but use less memory for the CI) - """ - # Excluded attribute when pickling the object - EXCLUDED_KEYS = {'dataloader', 'train_loader', 'val_loader'} - - def __init__(self, expert_path=None, traj_data=None, train_fraction=0.7, batch_size=64, - traj_limitation=-1, randomize=True, verbose=1, sequential_preprocessing=False): - if traj_data is not None and expert_path is not None: - raise ValueError("Cannot specify both 'traj_data' and 'expert_path'") - if traj_data is None and expert_path is None: - raise ValueError("Must specify one of 'traj_data' or 'expert_path'") - if traj_data is None: - traj_data = np.load(expert_path, allow_pickle=True) - - if verbose > 0: - for key, val in traj_data.items(): - print(key, val.shape) - - # Array of bool where episode_starts[i] = True for each new episode - episode_starts = traj_data['episode_starts'] - - traj_limit_idx = len(traj_data['obs']) - - if traj_limitation > 0: - n_episodes = 0 - # Retrieve the index corresponding - # to the traj_limitation trajectory - for idx, episode_start in enumerate(episode_starts): - n_episodes += int(episode_start) - if n_episodes == (traj_limitation + 1): - traj_limit_idx = idx - 1 - - observations = traj_data['obs'][:traj_limit_idx] - actions = traj_data['actions'][:traj_limit_idx] - - # obs, actions: shape (N * L, ) + S - # where N = # episodes, L = episode length - # and S is the environment observation/action space. - # S = (1, ) for discrete space - # Flatten to (N * L, prod(S)) - if len(observations.shape) > 2: - observations = np.reshape(observations, [-1, np.prod(observations.shape[1:])]) - if len(actions.shape) > 2: - actions = np.reshape(actions, [-1, np.prod(actions.shape[1:])]) - - indices = np.random.permutation(len(observations)).astype(np.int64) - - # Train/Validation split when using behavior cloning - train_indices = indices[:int(train_fraction * len(indices))] - val_indices = indices[int(train_fraction * len(indices)):] - - assert len(train_indices) > 0, "No sample for the training set" - assert len(val_indices) > 0, "No sample for the validation set" - - self.observations = observations - self.actions = actions - - self.returns = traj_data['episode_returns'][:traj_limit_idx] - self.avg_ret = sum(self.returns) / len(self.returns) - self.std_ret = np.std(np.array(self.returns)) - self.verbose = verbose - - assert len(self.observations) == len(self.actions), "The number of actions and observations differ " \ - "please check your expert dataset" - self.num_traj = min(traj_limitation, np.sum(episode_starts)) - self.num_transition = len(self.observations) - self.randomize = randomize - self.sequential_preprocessing = sequential_preprocessing - - self.dataloader = None - self.train_loader = DataLoader(train_indices, self.observations, self.actions, batch_size, - shuffle=self.randomize, start_process=False, - sequential=sequential_preprocessing) - self.val_loader = DataLoader(val_indices, self.observations, self.actions, batch_size, - shuffle=self.randomize, start_process=False, - sequential=sequential_preprocessing) - - if self.verbose >= 1: - self.log_info() - - def init_dataloader(self, batch_size): - """ - Initialize the dataloader used by GAIL. - - :param batch_size: (int) - """ - indices = np.random.permutation(len(self.observations)).astype(np.int64) - self.dataloader = DataLoader(indices, self.observations, self.actions, batch_size, - shuffle=self.randomize, start_process=False, - sequential=self.sequential_preprocessing) - - def __del__(self): - # Exit processes if needed - for key in self.EXCLUDED_KEYS: - if self.__dict__.get(key) is not None: - del self.__dict__[key] - - def __getstate__(self): - """ - Gets state for pickling. - - Excludes processes that are not pickleable - """ - # Remove processes in order to pickle the dataset. - return {key: val for key, val in self.__dict__.items() if key not in self.EXCLUDED_KEYS} - - def __setstate__(self, state): - """ - Restores pickled state. - - init_dataloader() must be called - after unpickling before using it with GAIL. - - :param state: (dict) - """ - self.__dict__.update(state) - for excluded_key in self.EXCLUDED_KEYS: - assert excluded_key not in state - self.dataloader = None - self.train_loader = None - self.val_loader = None - - def log_info(self): - """ - Log the information of the dataset. - """ - logger.log("Total trajectories: {}".format(self.num_traj)) - logger.log("Total transitions: {}".format(self.num_transition)) - logger.log("Average returns: {}".format(self.avg_ret)) - logger.log("Std for returns: {}".format(self.std_ret)) - - def get_next_batch(self, split=None): - """ - Get the batch from the dataset. - - :param split: (str) the type of data split (can be None, 'train', 'val') - :return: (np.ndarray, np.ndarray) inputs and labels - """ - dataloader = { - None: self.dataloader, - 'train': self.train_loader, - 'val': self.val_loader - }[split] - - if dataloader.process is None: - dataloader.start_process() - try: - return next(dataloader) - except StopIteration: - dataloader = iter(dataloader) - return next(dataloader) - - def plot(self): - """ - Show histogram plotting of the episode returns - """ - # Isolate dependency since it is only used for plotting and also since - # different matplotlib backends have further dependencies themselves. - import matplotlib.pyplot as plt - plt.hist(self.returns) - plt.show() - - -class DataLoader(object): - """ - A custom dataloader to preprocessing observations (including images) - and feed them to the network. - - Original code for the dataloader from https://github.com/araffin/robotics-rl-srl - (MIT licence) - Authors: Antonin Raffin, René Traoré, Ashley Hill - - :param indices: ([int]) list of observations indices - :param observations: (np.ndarray) observations or images path - :param actions: (np.ndarray) actions - :param batch_size: (int) Number of samples per minibatch - :param n_workers: (int) number of preprocessing worker (for loading the images) - :param infinite_loop: (bool) whether to have an iterator that can be reset - :param max_queue_len: (int) Max number of minibatches that can be preprocessed at the same time - :param shuffle: (bool) Shuffle the minibatch after each epoch - :param start_process: (bool) Start the preprocessing process (default: True) - :param backend: (str) joblib backend (one of 'multiprocessing', 'sequential', 'threading' - or 'loky' in newest versions) - :param sequential: (bool) Do not use subprocess to preprocess the data - (slower but use less memory for the CI) - :param partial_minibatch: (bool) Allow partial minibatches (minibatches with a number of element - lesser than the batch_size) - """ - - def __init__(self, indices, observations, actions, batch_size, n_workers=1, - infinite_loop=True, max_queue_len=1, shuffle=False, - start_process=True, backend='threading', sequential=False, partial_minibatch=True): - super(DataLoader, self).__init__() - self.n_workers = n_workers - self.infinite_loop = infinite_loop - self.indices = indices - self.original_indices = indices.copy() - self.n_minibatches = len(indices) // batch_size - # Add a partial minibatch, for instance - # when there is not enough samples - if partial_minibatch and len(indices) % batch_size > 0: - self.n_minibatches += 1 - self.batch_size = batch_size - self.observations = observations - self.actions = actions - self.shuffle = shuffle - self.queue = Queue(max_queue_len) - self.process = None - self.load_images = isinstance(observations[0], str) - self.backend = backend - self.sequential = sequential - self.start_idx = 0 - if start_process: - self.start_process() - - def start_process(self): - """Start preprocessing process""" - # Skip if in sequential mode - if self.sequential: - return - self.process = Process(target=self._run) - # Make it a deamon, so it will be deleted at the same time - # of the main process - self.process.daemon = True - self.process.start() - - @property - def _minibatch_indices(self): - """ - Current minibatch indices given the current pointer - (start_idx) and the minibatch size - :return: (np.ndarray) 1D array of indices - """ - return self.indices[self.start_idx:self.start_idx + self.batch_size] - - def sequential_next(self): - """ - Sequential version of the pre-processing. - """ - if self.start_idx > len(self.indices): - raise StopIteration - - if self.start_idx == 0: - if self.shuffle: - # Shuffle indices - np.random.shuffle(self.indices) - - obs = self.observations[self._minibatch_indices] - if self.load_images: - obs = np.concatenate([self._make_batch_element(image_path) for image_path in obs], - axis=0) - - actions = self.actions[self._minibatch_indices] - self.start_idx += self.batch_size - return obs, actions - - def _run(self): - start = True - with Parallel(n_jobs=self.n_workers, batch_size="auto", backend=self.backend) as parallel: - while start or self.infinite_loop: - start = False - - if self.shuffle: - np.random.shuffle(self.indices) - - for minibatch_idx in range(self.n_minibatches): - - self.start_idx = minibatch_idx * self.batch_size - - obs = self.observations[self._minibatch_indices] - if self.load_images: - if self.n_workers <= 1: - obs = [self._make_batch_element(image_path) - for image_path in obs] - - else: - obs = parallel(delayed(self._make_batch_element)(image_path) - for image_path in obs) - - obs = np.concatenate(obs, axis=0) - - actions = self.actions[self._minibatch_indices] - - self.queue.put((obs, actions)) - - # Free memory - del obs - - self.queue.put(None) - - @classmethod - def _make_batch_element(cls, image_path): - """ - Process one element. - - :param image_path: (str) path to an image - :return: (np.ndarray) - """ - # cv2.IMREAD_UNCHANGED is needed to load - # grey and RGBa images - image = cv2.imread(image_path, cv2.IMREAD_UNCHANGED) - # Grey image - if len(image.shape) == 2: - image = image[:, :, np.newaxis] - - if image is None: - raise ValueError("Tried to load {}, but it was not found".format(image_path)) - # Convert from BGR to RGB - if image.shape[-1] == 3: - image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) - image = image.reshape((1,) + image.shape) - return image - - def __len__(self): - return self.n_minibatches - - def __iter__(self): - self.start_idx = 0 - self.indices = self.original_indices.copy() - return self - - def __next__(self): - if self.sequential: - return self.sequential_next() - - if self.process is None: - raise ValueError("You must call .start_process() before using the dataloader") - while True: - try: - val = self.queue.get_nowait() - break - except queue.Empty: - time.sleep(0.001) - continue - if val is None: - raise StopIteration - return val - - def __del__(self): - if self.process is not None: - self.process.terminate() diff --git a/stable_baselines/gail/dataset/expert_cartpole.npz b/stable_baselines/gail/dataset/expert_cartpole.npz deleted file mode 100644 index 263366e3f6411218114976a4c837b373096f6c11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1636365 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

CSt` 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 `2DX<^=X2u_ zDgU(_&ECxXAN#!U**JIdeBxs2m1PStiT=DwP9U+~ej6D+;m$EyV~b2#zDqh6-^lwuR@jG$`oyCD}Iu*Gpxo{Ps52~?K!$l{4r;E&=mS7 zr4Z+rV?|PHP0+vUba)-VjTHUnL|?4a(V@g*=sa9Ox{IPw4Cn@nXpbf1b(UNt8c+`n|WYOgdbQ?DkzuM&w-?W~SHMPccnZFWt-6jdi zr{0il3KB@#RTrDQE5v0XugMGXdAM8O7?*$YMW5uKvK;q&*hAL@57dpPtKQ!v=Tl~5 zPY(k;Sy}_%W;xWwowxDX@y3{6Qcrr`)sS#UZJ0U75Gz%eQY)=PCf2N(R4cl%xFN*L-18 zAed)M;f;Hm=y;0=UYq5YKP(u5A6OWPiY7l1*k=W>%&9^2YV83UEMCV2f6InzmwVCV zuX3V*E*ta!?*ZxlCRB21lE|BJLRz?N=vsLkz3cr=e{Nu&qz}8n!Dk2Bad5n7Xw4&J zQJn?tFdH>x4p81}6z;9v4NBDr%_#5?IofOEpvWxvTrv_>kGexM4DE68uHA5UVIyZ5 z?j)M1;D>J-WWkbsdfdk`ZFJ$^SbTW>ZWs~p+{@*Zz3BeybZn%S1utwS@Qv0jRB_Qd zJbCkOn7Q;Q|9!cG=;Z9}c$0G$+&V8sLLxe7R%{VIaCA4&i&kWDgNsOP@(HY$l?6lF z63P5^59xuBGuV;$1KrE($h?QzbRe)6i@(YO*}t1eTE|=ZKA;hQaPx=BqYsgSq>0oh zxCQ4e$_9zg$4P1CNKw|L+gPc^A5Pt_BTpT(XztV=T|X4PhLc>F!` zvhD{iGwi@|GunyO5`7%p{RfYnstJ4lG?6PcRW?Eh~UUB95!Vvy#B8Xhnh5z3V}E= zO_PDT^E2?r|E`h5y!qIL>Bmp@-^K?_2syZ4M2=U=!?Uz_eE3HL*;Hl6g^p zozRB&GxccCl;b31+#Njqp%%FPvP7Tb3dsY-W^`FW8xGm&(0y^+*}h+hyZyDG(Z>lX zN97Q;=Ba34jTY?j(V~LL6=Yh@NxYcXWclG|Y1G+xB9zvIwC`+xxl@DQy68ZX4;Nx{ zS9KWbIYVPLG?|`U5k9A@!lgOtY@c+OKe1;6wmPQ*@8+GMU9RQ4g1QVCd{BaS7uDz+ zEkoWzd=+-HR|21R6Hw04Bf^3iK17hB1gbe|^v(dY*al?by;X{EFy9y98`<@K_Tl8_ z5Yw~GRil@VjS#A8EyF?VJ$KdnqLPzdf=xdn$gW z2o}gMp?~kF!Lc+)bUVG)OJU6dbdBjp98ELu-z#Q&V!Z z>U@3740JDE8~jo;@NGSD{=DWgdTGB7tRL-+0v)4x&kjE{;*Jhvh%&IRt1s{UZYA}X z)q_zhT+lJW7QR2j97*}TaW%TGJ8m3!@A2vg@S#Vv2TcnOc4G<1;>{C*=q^3`G_Ff-aK zjpdOh3YOunV#a)4w4c5hFb1t6mOmV&NhAvn@NPyX@G(lAdJSliKVR45oLR<@DK-H~ zWR4*VzS$9vBgU{ROpW$@mL&1xGx6<5MzF8X4-Hhj=IyoDl4d<)_&HCNE>ro!7mkm| zn`auqh#8ZnBl zbTowTTa@VWarL}N#|RIyc~o=M6tsR)F@L06fv&DMfJ<)`>F$-a{G{b7xaOZeys56F zT}j_~Nbt+I+{ZGEVWBUjNF!F*d3Mx` z;dvU`@M0l*y~6p9=+|)x-copMe<(N%HwOd*_#Q`l^wp0yX>M7CLSI%*Jt2J=3P!+lsN1>;Vt=!x< z()8^=RY-4FqSrdka}Q6MWAO>9aK9!34VQFqhL?YkC3*kf4=K|ZC+oReeQvnCRRxq^ zh9RB7``n}Ehr~%%6^^^8(0NJMxJ@+^@v1NtsQ(y@@|<6AF=q8dd8Z0Ed{?1%VfVR* z1<^RMi}@k11R&)bKe$7(d&w6i6`0trO4ruD}7b1b>ZNkwjvv*6@&!7OaAGMI8lMubeqKmto@9LZasl%6bmC8SCOjsax$EW@>z2;UP>LK_v0AbqblS|0V0znnYFUts=(=p)N!3M~!rrP9$PCj3M`@D&4?ok^jCXV@X-|??nMf##w?~4lg7tLX6=#%ZDpc zmnCDIqw(E*Bj}wGf{r$P9wQC&e-u-OPTQ&N3;BE6gb{h*j{SqBbY%k*%%3iOA81RvV^0NrK#uaD0w=*nl!!W|b|ag(AJ*uIpf zZn3YuWLMopg)y4&t*?TXe$NuT9@UDAO4LFBw>*t)1};eVHVPh8V|;-MTC_c$>tEZB zB^*`Zzc>Xt-Lsl2-rbMJEoaX^S4o3Xu5uclU3jvH?N7xO>C^5}sIyQEpB=;Y5zN0} zYAlB`$MxVk=9jr9rbN%XJEAgYHGGfF6DRG6M0W)U?R1l%y?59=KTMfcEO0^v(#|-9 z`Imhn!q7T04vBBMLr%mpeLwU6C?OB@4kqC_2j!sbV*nC=;g9-kipUst{~i-lqwAW+ zBl9gOc(g9#xdcx@&mKmhifUJKH%<*e@klSW`B=w2Ui5*kT&@Mjng3XER4ixs%9iRgzNqZfI}v5MT%%9jTbH|M_v>%;@2jMo^m2i?3~8 z!jE-+Lp#rzfR$q!UMStfi{;tV%`Z%$q@ov(F?`BjS@Mx)YFhyRF%2g=sgvi9s5fhu*?jUie!@wi0Yj^&*Pqf2srB+k2rD6)A#*?VPrEi{y5{~CvD4%osC z-w3q&5hlAezmR{AY=N#ORwy7NW@*y(Nw$z@tVm@>_!A48 zQJ9`)d662G^ypedoMUfd+pkveKqOE9i_#&wkDHM#wt~MiXQTXJ6(SuonI7I?1^H!i z^s9?0x%6xw8rf+H3M}7#zPdiEM{01YmIY|9k)<&TBS}JP5Slc{oaJSf)9gRL_(H{U zEX({^ulC5$jGayVaNrkC^AF=2;}n!%*1!kM*i5Gcm_qu1G(GcSh+nfRgPXX=1Y$~9 z{^P3Gyhp=6JZ8WMs!PR1DTnI#2cK17r;`B)y~}9V4i{c*$qwwhMi0Jj5*MxK&I*rv zD?v)9HYgdFQB}KZf{?atI8|Q@DmIIY_T58VUYHW>Nl}L$pE7zcpXXkl*nuYyRp!?b z7tMR{n$uKMh3nGFAbGru#u}O;n^8r0bqxFbsmV}!5TU322RZwb3Si?~PUD#kU48f@ z4*DbqGty=0(SaD$uzn)KNDj{ZW&WeS>FB>vwRlw?(>sikr=h0*A)EcBXffl5j*6X$ zo`1|iHs8n7SFDGzyrV$70@G1j!*`T7LmHlNQ;{rQftrtM)4F3!zp+<|mb5NL?}Lo7 z+N-fpAqYnwAFe>79u5*|YiZD%szO6@mY{6eKx~;j77kbjBAdHwQ2nI?BXn+(EC`ozXkg(4B$gm8 ztU1p3#`a5b08Bs^#kSMik6FHNuNxYeZi~SF1sAO)54n#suvLXU+LN6_uTNG0r6-Q4 zQb!xr>BXb!tt_vrdI=6Vq>m;K&!r_-6=7VwEm~+Siv$)&kL*ixL12ahPD%Ahb> z<)jRm-j-TROvS$!DRT+W)oEg~HWWYa!IO_Q3F4!l z(8hxuh~M>{Q#sG0b~l@;62j0haUti&-6h#uY$42FnU?t?61mz5f9_y@=ZZ)q`PYtwUy-0Am2JW5w<67a z=t-LHs$#RLHXw5=2HoqkCCjZ%X!jw;mp`vSrNji}%h+L5!hZjpmlbrPpCehL!1(7j zR^U31<=eI>kagSY(7y~z$UKmMs;5g4C8Jn+msmo=962h_@;9utwxOMDpQO=QPHk*d ziN(um91vj+nPIZ@u*OGzw7(ZhI%EbXPAx>5CkFXQSVwO$J;QC)%TX8T+|!>-Tvr!r2J2x{u1#XT(62l9Tz{rGVdCLMeSE2>CW+43{ zO+06V419*kXuS49PfH)o??|HYEI9nx%nvK*JrUy6QyIZ6FwWTCtdqmR{b=v&89 zK91!}tU9-pDBhX*0bVV^E~A{${i=m@H=Fm&`eBP!TNt44hYuj{V~X(nd^(n!ZH5kv z2&b>RmEdfcB|1>1ie@U_L>dapaKA7O|N5wl&YO79NxmxZW==1zcauj^1#jraEHxO) zNyW+1w>jhK1~k5k&9}bv;Gx-d-27WlY4#IMXl+}}vO#BaOD-zV1Zo0bM0KU#$jMx8^=Rb{>M3>tkeQ7vidChsx0B<2Weri6-Wf8;VL<2V%zFSlNFi1;(!IZ>F3S(SNBl7pA8&1 zl#a=14>DIRjJ{pTcqmEr@pj{(>i(`D7kB;26&RJIHu5qn6?Qcjl6(w)?1UwL-^`xJ=+6l2Nn=~6Vi*a0F$ zigbtE9FkqGfQO#jgZ9))+VNiui5<9uFWK0^19Ju1u+W`6?0txwGi;$&D;^b<+mYbJ zV9GIm`^zVCbn|E+GRu#mSjMX#`c+PQb3KSh<3(J;@+Cx@WT~g0HrbjUik327melNW z>Sm@+lopg>{}&dpJxzv+seR`MHurG3PK=NLyo`Q4H_Q+3Ka6)Xf9cU3(p2nY1HZLH zjQh}T3UkBKk@qPPe`WV>nyqC9^vPH{e*Jsic1ORkHpvto>y^>Xr62gcIot5nT4Ojj zm+@t0UEzOBkcXoZhOk3eN;_wS@wWZBxGGv7LVd+WDknY*v!j_-qLl6Tc9+r( zO4i_#?^-~;#YMl6^!^R`rqh0Ip;v%MJiW3(F^tNzCZ1=gI@%W1V zmeN_7N+_jnGk)%&1Uu@+(ha99kkKo1K9cb~KWt;?XQw&R*V&6F+?5AbvrvVH zI4h=apX*pogC=@2Wy1-)Jcaqyf@Nvz#W(XBvyic%@MtEw%<^oiZu`>KU1Q-lyI;nbEJ1co!)RxZ6sXltMKO<7pjXj) z^o_w-h+VEkvz${=!BGR8I!6jTYQmA9>`G*-{hn+oWjt9=6?%8Y60|$j58rw%2|JDk zqSKewAo<~9Qf4g$v$C@=H)16U+i;%#T`(5zO!h&q{AQt2KLfIw@oE;fvieJTI_hdI zrWG%wq2N1*JY#&&q6>$G#>O&mcG6OOYIr;{NZmmf&5(u0IqoRyzBO`9@8EQbWFc`> zCjRl#7A+HBOY6JjU~MLIGHYp~7w)Xjm6nGG-Ai!wR9)m4y?}o8QGf~Jc4%JFSR|4> zfKL9$c&Y8__;b4gTCFgdrc^7!sGpYT!kvGd+u7^r_A5mwz0LS6FD1~u1OKDwyyJ3u z-#Fe-Xz#uEPFv4&?&~V0JtR~pdq>%ugzS~Q``TF{q@Hu%Pe~Cf5h^4jvSqLM-M>Hl zabD;3@Osp_&ow@u_lK}_D}7uR;6y&n?i3zjCt1tqNvmFEL&iuYa(IF(d&B+RK~@i8 zN8u~MbznQ2Bs0R&?%8lWqCm)dZpe;tmhj9f&ToiaDP-+_#3F3D-!CT%6fP?XUfyc# zZZgmR-thpQ>7SC89BF2Mx&Ll@LKfKfNR}D3tFVMiRv5A60gMZf%ar;zv&pY*FfKa_ zW}lfT7T)f`URl`T>Cy*~BdigRZFtDWCpzGq_AF?<)gVs#%zuu#j<~JIL->{aN|cX( z#x7rQMp~2&Cp1iH$W#Z;wROSd+=npD--&kXddE_DzW3AHQ(<~k9KCsnur{tQn`rM& z2G1BmyX(owA-><$9ylE;ekAk$FoT(2_Qbw1J|wAr3@zz1h1~n)iSTj;WU7y#3m)XK zew^39s)I;o;Y^;_Kn3e8uAk-eEx*d?v~uufMvwQx-{rt}`OE3tZj;5UFFD`c)RRM);5ooPS??PDQx=Er#Ww7kPhW z6?|E|O1kWH4O)JY|9rT`RtL?$=L@ZaPQiM;%d`q`N+n-f@iK=bH5Do#;m3(kGOv&z#DcRuMprcd)90<)mDH3ib|fAsccvE2KtkK%OMbwOv7Sk24`~cV;GL zD=83(+HLk^S2A31+<@ciM8R;RkK8ABBFqTO#P$tFLMGI(*6|C$!*~PUw>d32RqG{x z=d>F32WR5E-_c@^)mPc$otr^wu>rg89}))@dCRLb_CrBRCYl{mqwzOxve!AspkSE< z=Ztr!0g9jK!*4~v_GaQvqX260t%=o7E(P_w5*$>ULjT?}U_W1!L*n;LG`TQ}_FB=w zmW;R#h7u{3&R9lA)d#T)tqtHZb~1jfTSH&o{mo9MKY%9}q`30Seri!Qk~Kbl3hg>- zJj1h)+TN6qf-xP?J66CME=OsngzJsoeSkLpj(HY)jwU~=mYtaU6^dR8xN^-onw@rp zY4zv==Q#e3Y?0IGZF8wKUJ=)47eiv&Wx8rtJnS@4#`52sA!%JkN5p=k{n}M+POEExXDzw@%|Hc?ihwqY&j9V%C8ife9?Z!B7L>xObJWsTB+zHDc z8{wztt7QtzP3%ACxa51Y5$^AbWiR@!O^eD;IJDb3wLLbKspD)X{x-VUS z;fKsn)JOfsSf=54TS`KL+=Zpd=f~| z0v%Mn5dtkakA=i_S*&ZCF21?(R#xXxDny)GMV3#{#rrxToLhKBI5=+@OCP3(v2luG z>68LtZ`o0zGEfgArXbvEJ|!ehPhy%e`uMq7O)MR>Rv4vwnRJ3a{%Qpf9_xMnif*#PZ^0ld1jPB7JxFemP(z4_WqT=#OAP(JiMsn9aS!EXp; zsVo&@4SKN_MI)?vU@Oi%7cW?pE5OSyhPWk%z*(*jmOpl4vtJtF&i*dqu*IRmlER*# z&|-wD76gv2oh(p)E2e$Z7$?p15+}Wt2qsQ?V8)EmP$s~;GZO@PvmrZGWP(rU`-|>0 zSa>_x49I^b7%@ZuRhLP^@9mmwU_Q_KSR@foHWA^^MLU?d)D*pbNg@38RN+&w3R9iI z`8-!EAU!Hl@Y1=*%tu>b+*T8<>iKZ!j!CXgk9F;133}jzTva zuiGgrz6|t5@dgrJ;KunsA>geXOiwPK#sapx;{o?-S5)SSs@+IujBSbGSe>})Nn*Jv`=$EJO4;Y%Y6%4m-v`IpU(YDQzO{MYDd~W#T%aR zdBWna-y~TfE$p+7H#vc9pveNT*RC}5cT%YfR`$DVP&J#xTZC(q6<~ZP|j|TFY z6JB!OeE^J`%jI@|=%L`Y62?&fb~olDJ|u z7%Xz$!%+qZi%QU(?EG)7);U2BukHNXEQEvKG^-e zvfR34viSU1!J$YKWAyt#{a4O6)y-q;k7}Xa;5yl~TqNSb7R!HP`V_kbNB z23T@l3U}@-?^E0L}}rd?*1IwE|(3YctK&Fu@}43Me|h zUO4yV8q@u4il>t#PKJAO-@_g!Io?pvU`t^^kTHoQ2+>LR_$ zMOo`Ultb~jS7pM;N_Mu`8qXR_;6QIPaa!LJ`usl|9M!D?Ca(z+eZ8xg@NsTNF!^DQ3f+lxom zy3zEtO3+Q8^CNr#RLpJYiG)BlN0sv?0(8WaXT0d$?hWMqFP=v_3c+uH6a9XqAA9w| z9VagODI3fCvu8=W$@_M9OgIn%Z|izdKf6q}~d6|Y0G=05|ddCE4SwTjR0?Bdw3`N?$c{%xGwu9Slv1Np6U9$5 z545}#!|tvZsK=K)n0<-+vvPE0Hs77-d2b)O{(?K!&WL9HbKU4K&e1(v?1sH6SC)O_ z^R3vc>uB;hH+-KM#j0;x(Cp)>@b0WDy3YC+G;^Uk6%rWz&aa<@MzUUJ`qX_$D7-%B zg6}@(NkR`O(@`_t(D3svSQr+;5;Zj`$#jPW7oG7OXD2(H`YV?EsWZb;XDmzT%cjg# zql4m%V1?*}GiHJG$csN>fvpW2RPKaLL&N{?Tc$mxD#G6@j=1E8^K+XQ#f(_U0 z(Nb<8Kly=)X?%A0>y`~RO|D{b%gx1k7S~|IeJecvx)00W@u2MB`^!Y9)e`;Fs@Rl4 zS-~y+s-fk%IR>=%VG|3Lgnxf4$f!4FxNv+GTU=}_oIG$9R6dztHRJKuAwz8H4 zb3NpLyQ`SL=YPUbotu!#^U~{z!*oir&M;^@y+>_zhzLHFbxFz%_3I%~q2 zTC4^6o}~iIH1%-o)M|F`yA!#)yA_u3JY?;2ecAJ^G34bZE11Fk1nN~MC9d%)WG?+d zy^OTc*E^Ew42~zEcM*b(weZ*rlhV3#LrK-ri?j#7o>m;iTE+|{_fkiIy^$vV^lmQu znmLY4Nf=GP^L*E#Q8BE?!;vJ}H5b%%H89P2ploW!haGaG1)>O!>1o7-ydk9`!@jgt`8AnBH7qm+Gu8KB1Ulyd{E5` zBIW1r6ux&@86*(THdprbBIoa?Uxs-FUc}tz8C%8q*dc=iD2`AgJEfXDkC*2e-Kv0` zFI~d9H}_ceDqg>il7gRCsW5ZfM|yzI^EXYdfN$>)3t4V?I-R@ zailBLOhLE688hA^YbeTV9087ni<%e-I>Gr zJm%VBk4QJ#<3}wS&Uw#wry{)SX-6M7C$Y&R-7q8ahph09FU={~NfxEL;mTtnu>7g9+I zh2iY-E@gUKu?Ot&=RDM|Dt2O8r#N#zU=^K8w1yGOp~5X9O{+ z+DWg@;rl!8k2mZdLNwH;fWvG}91@@*3(!j@<97F^gJy7k^TimZG9r;=wdO%{jQ^%y6tG4p2QVJ2@ndxNW>BL=Dr#+>778T zJ#raxz4XUdO)|Y9!Nk32D9Pu%9T*q_Kd%rHpFf6O<~x$iCyHX)ICr8sy^v%`v@xBp zM3;K`5@q*j*5Sqd?e`7E?M8OQb$J_kYsd4l?-4kq>rOPrda+lAy7>E{i}=^llH6RR z#{KHLd|xNP2wxYHns30`f9hh=+X}uHvLH$6%`D}$KF-UP!eyP$!pB!%>EIRv{4k}0 z^I{$g-)GgaH8nij@00`{^xrFtGijg;FB#)YlM2|nW37<=x0*E^F-2uZ2`Jt(6;5m^ zrG{HMf9@q8Fh~E8E-Jmu-f;ci#P(pww)j>uV9#mVnr(^Ko6F%*>a()DxfN_nRV+ADMI4Yjg zyvD+e9dY4x37oBeDRy_iM~A37;q%26@SyXDc%Z$WUHs~d21leYO0=Xa%>U4r?Jk)2 zuL6EFIMee#TG(ptzY3@qK>a}sJ;sb#&^32lQDHAu{~bgF)+vLf%pKF?0Cvuaqi+g& zvvXYE6nbA>yg`OgnQj%yJ?McO>kw*(BvYqvX-s9OCr;k@LU#1VXzCTVgxuV~^$f#8 zL8)LEZOmW5l2&+O%ja{llE&%uuR@35lH-NJbK}^x+^JM$>MocvkMHx$XUiVmOr?2R z2I9h*o|x4f!-lO+<9yVWaG&$)KX>TME?o$tJ>GfJr&BzzX+$*Z-7AvH#$|)$WOuZ0 z7+Y5Q#gFFn+DgAoa>uG3Q7rRqFnzzhKfIabh95uG1<%oUsrbZw-<((T*=IGo|oSM<*Rx~o5I*txed8v`<4v2sf+ez)vU_Ljbs|%hh7cZ zcw4nEd$T)^IC$y6-$pGgIjJC(Ii!-gKh)T!`&xK1FM{n=jVH5WePBkjCO%rPB-s-% zgeV@qL(NKnXFP+?SmE{;FOrbMzTV&Wi<-Ze0H`@pvD2 z6f=lbCXmx})XCX0O%$Y|kg+Y4)Md_P-Op*^u+cAN4hKBR*Th^> zbxaEl-XW}R@+B+R4P{yTwDI$u?&3Z_TQa7(l;m?iM|=rD$pII#q%M^E!*%d=A)o)) znvx@R??^ws-+Q}>K=C0vGHRg<`!-n@|DN#>ySo{Z4_CCoX}B(C%@iQ>xD8SLtj&fe z>0!US6_Da&NbU~3&$fjcVCG;cc#dr6?}PVrEZ5@(X7K(i?6&Yisg`Bh7~|AUygw`4 zD2$4}Nu}C6Rb8tBGLmwH`|8zfdY36~GmyZ&r;5T6dXXOB^>5kO&*bj*V##7JN=_@mDBhpNb9?M?bqCryCy+Js{_IDKwmANfFMXnUi=_N^!^fEj z?~~l<@2n)2{?Q$q+P=#Id7f6A@lGwFm2LhKNuNu3 z&K&R0#%ppWu2VQ2P`;e=Nj!1p;R0EYb!oJ?Ay;VRdaQ|xam)@<>9N4AaK6F=)q*l) zX&E6jp>)02hkD?s^)amUMktMRT@HUr-Erz46T zzQF4zv$V4LX_ho{`F6VZyc=ffMlsC^_B1Ox8CLLlmaW;2;1^5u=zFc}w1Z!N{T9J~ zZ8M`v9TE^Oy5OPhMH0J%>h#xwpR}vQ1-HNE_0L{IT3c=p$I6_sqs3GzUDkunUarqX z>WtId!`bX418ObRgbNi;I8wiwX{q$2V{`Ap0iHi^^~gY;JEm3)%<{wOH*K-yNEPd} z3=mVh*TSsZ)~K8k#$0zq%BptVC6k-1@W$FIRPkwYI%F#K8-Q>@z~Z0)Frq;E#}S1p{i z4ty-Ap8rBd{x-yTt7AWTuJlERFbFonr>IuLApGW74%CaqvIpNPeU6W#&wkr z>NAXxkfU@H-`}ffMYA)TQVF_GfZl3aSf$cU*429w@%bJ`w{+J+=fW6vIDQ;)OU(n1 zZd{KwbBb*A%>|_GLzp=3p9b!>3WMzp^GVW~P0Zz|Ch9kwk$L5gCQ42Z1;bC8cyMAU zR9+ZMst)md&{tYmN7`lfllt=v%|&EEn-;EZMmV`Nh4-d|nHJZpTYpd!J^%G3qZVBz zAFp%&*a(2@)$wG`bO|fqd0vBm*@_Vlxrahc5l)=d!Tj$6XnIEzKQw1+xSlFX=`!r7 z6i7tM0~WAFAOG7dh0!NW$+?d|Xu>kiM;liGa8a8)@8IVP&m3u6DuJOZ9|_I>YN*>t z&VT<>4ikpe3IpC>VN9{!<+lu}sbG5}U~L zPG0JAKI3p5@uTZ%zT@M5tekSlnC~QBsxM{cmmGK=c`ytq<~**++vwoKj(DQD9IVA% z;$~#*M7}fU)dh3!@qO_|`zg93#|8iEUIAzG+C_!sRji!npASAM0eQL}-LBF=&!)TM z5SE z=Q|Z2Olj`}zut|Y%yI*3IkQ=O{!2qxye>g}pwx?WM&^s7>VVbE2@!Sb3L(AzjHuDO zl0DykRHoEsg~gE{#KzV7@@Y07q?w~8;IbAcTDh#Re3ny#5HNig678`xV%=p%5G6Qd2bxhmPNee4NWev5C zAfLSp2A}SvCk*<)#^3JXm9~_8fBlLYt*nHGSWi$$@@DfQTIg&b;CtN_0&aN1zVo-~ z4!a6a3HO9PiYsYgXeBMG)5YeO?%)=-i*>#|K{soKp}*(|j-z|ZCzPzEhI}VAg_*&m z>=<_4X%cn*5{jK?jUcb7jhPvF(n*|2vAkFliXS%8kFkG6m5(8~BVQdpc@{H`hFtN_ zfN6MhTsN3<#YFzczmN3QZ$!xWNcN?yWYLbBh0d8%@ypD1@>N?!Zq9Y1Me{e|CHGt8 zNOpu==ks)ue=ZyMO*%tEGQsPoj2i&=X*)!%pm#k4|T-bA{(cy&LIcfYT4$& zU&-5!jR>K`NpYly{Ki9F7*>>p+BUA_lS3KL8FYkfx)Hafs1ws24ssJ;0c?*JqF(AL zp|UJfuAhn1!9K@5HY`r`f)5TloxrBhIeZqn}b7rHR0oMQ7OUEqeqCOw4g4Kp>p2>EQrn@|0 z%hor5${WC^x)*Ry`#U(VoZjq0&jt(^bdWL*>xk+(3(h{Dhe*ni#UNH~5Zgpla%?p}12M zvw3}`KeU=^84RJLA8TXkR4Ke(dyURD9{~O9`MfavGJMb}r+d4T*{@@U+XgAGtWDFel`jgW$&X-x(DgK^_;)>QdK&p_&*xci`Pw?OmWPNa5hqT7wtOL0s7la z@L<>)srlFyv}S}B9Nuk$-kE)v<@qIaio$KUcEA|7p1mqvUpIpOv#cRi$Bl8p#Smsy znMOT-GB7=FgnliRtl3{mKPfn22{XW@k;v{Cs?wV8r{M|DZyRwVOm`@rS5E{P_Pp|@cDphr>ih{EtPfr&X#iT4qBQLmSr!Kt-HAm7WnAk zvI8E%nm8dif_419+}J1YBg|NFGb;43g4GM&mu+lHLz`VA~=2Q5N_Ta%ixJ7 z_KoY1Zc*a?zL&ens@Ix0;d}zjnSV$Z5f)T1FQ9*1~p`1jvt| zg6iW4=A*2G8^?*#x*2jMrNwFd`kg(nMCpor%^8^^`L=7@a)t+HX>T=V7JnkOB! zZke##LKn7p>tn>#Sg@?xEwuJGWE1@j@M3MI^j6zaK{m?*oPrJTNmwl8zuF_5{@0TY z;Jm+HcVeXuck={t*BQo#8sb(K16zvz6E3NA(Kq2nxXPvmil(j;`aNr4b&)3c+b;%^ zHy8+ejN55Jj49sza1AEbKbD?8TFX@9&3V3IG|axZx2(9ng|11o!1?XhAgX<^tXKI> zc0b7qhxLqs)0M&E8TlhRZGbgaD%3zOq>J+{>X|amQ> zK5r{UknVs-bz&h`p&MPgPlZWFaQ$#$4fHsxMZ>Q?Vhgz6YodA_=zIFoTXE*> z_(aaP`>;p4Zzs9;KveFF`>OV<${EnsX)~_R)`EF=n)DP79^L_T#8Eo7hcWfA{BN#qQqx&-~ z$mgT(cza_K%(*;>K0C6S`JVT{^%}0ikT3?_e{bPV^Zlqqj?b9>4s_rLxnj};j|`w8SPYZ$77Mf?B(WY`uAuW zTr+gT$du_qyjyR2P`#3dxVqtxjv%(_JNLsRNuindj~~V@6QY0jq9daJ(w@n#*nLMJ z^KzEbi7{5tZ-NUhYi4ZJLN7XX>LZ{zPS_eBzznq2DP_D~-r$tWUE%kfG8mU+ig9hej168UOqcE;*_kHT zb0%f8R&Er^7c-c$!U&&a_%Vk?wZaL5)8roai;lTMd7kqFL1S1I^x*m&Omlzw=X<&ZuzGnQDO%b^4yfv2znhHRd=^4#!yZB}&hs3* zB#<@Pjwaj2Sin|)O{`nGRA@PrP1<+-qy^mHQR&f}zh}mh=EzWZ!iTM=-7|%B>sjRY z_##@(=e^w?2QxSGEHdcoSa_JLj)}Sbgo&g`>!8(nCa*+cWR^L zYdlOl>dXDSec8yLI(RKQCt1z)1Q~m>$v0n)HpaQ5FM!f!l>6tN+kcV-q}L zTLX?tONDvA8W=G%!)uZlc+lscR6FbiHL*0ulV7jF&CM62_nqt5I%`X;>k$L%cR9$u zAACez?5xo4<2BHg?39I`sAcONY_P~a2JVr5VrleK8tZI}SvobaecBAMYt}8M;>LLt zYhpn5UKB?;f1wec4%jxR1{7xB5+m~OvGcv0aCb;7q;6EBM=tkdt^Uq<_(~0&+GZo#}CKDTHe2`DF#*&=gu=G z8>E&yW9gUeGGa2&9Y3ojg0o3DwOEzT%riVNU+^#&<2^7WrytyF>_;b5 zEo45^J@MWVV?obu4878)Lr7liiI%enTTnlehU@KyTWdYg`LvHv`7fH5X*`m3-_7~v zol+)U7en_-R>Q30?$~uLN*JEyPY=17)4Vd?uWgaA##KQyWymZjzTt)oHm3{OjrR0( zXC9sW$PJ5AgIT!5m1?OE0dLMPY}lDCgq=60+L^c!~t`k z>&TZpY!N$nwqR?6EtZ|5>|NDBvG{f+z*}paKhBS>e||=GFSm&7R<*`W8!7j1OqFFk zD2M(${~@!lA4?8hAf0irkhDm-KZM_(HsQP!`J8Vf&)1$h-jCHD87LGM6>+AwDNZh? ztm87zuYFVr(QAxx#VtSfWPOS7;b;Z1=6M5?e{jsL##Q0R{TjH*>#w1U{n_6JWs=|g zm{i`^NB0qo1yyU1<8N=n=#O0AHz$CdUhYMz`TpC2?^8~HU~HCeFgX_c82VXj0N_UQw4j?v=zG`(3_-{Hhpbduck^F=Zp0NVTv&&qV04FM@1e&?@Y!(ZUPc`@zopQRLd) z#cUtv5fofh6ikNulS59E$=_COd?zGAqE#?C@Mr|<)4}z{YU4nX?M(ht@nCOM^zlts4fH-`O8!~3 zGZl41)HxOl_j)^Hy?aQ`2mEh`QKl$c$N5i%N=&x-2tbz#6X^Z zt?2Vsfz9=HM5Ejq@V)y)T%ORv2KhN--~F*LwMm~ke$Ztdd`%I z8(u1j10ADqTH)iyG{f9+%(?T@!^KH-Zt^n{8RO3L{u1EM?kIZ3I)=IR_dwO0XVU&x zQ)&N82T1r357a!82)cdyQ`0XKnbsIj%(qYzUh9mZ7vBIe=X~(CfFu};Bj^Bm9&4ZP zg__+Rgrjw{sEHK{-Bx*_6~~&X@_b>%>ziQPc2At=5F+H{Wl-B5_rP3HyC= zIJLgE2#%I`VAqK>K{GavKAt{@>ehJRlPTQy9F|1Yb<*MD19#Monkrn`jP%5CO1p8r z&nv~=?5|TKjap4$finL-*Ov-`T|xBb>t8hA#2qgj3S_%f`_QXntl_$s8)iLZ%poFx zW?p;*-VrWnoe;oo+|;G1)rw%5!RNCoI|Ri^-D$T#-fzxw#@Kj&7Vz4T#)jP|M>ja( zf@;cM$7|BILsf8x=P7Kypd)V_`atY@<%X}X*kaKD%GQ4wBF0~mfuzkEy*KH|)&ILH z>weA|)&FokXD`YcPqa&4tiJ@M#^%^`(wDveJYJYLbOY(;$KO{eyb^l8SaAC(gSZ3} z+-c#*s!c?p>hJ;5bAmC>-cQ+0^BUp0=VjQn)DRcc`LWsimC3Oo6=eEe13cD)vFSt9 zNmT3&_;yhbRjd8k@Tcy?()umQuh+#HTNw)*5J0?g@58B=+BmF7AX`|ULPFo`!YQ6F zpw;ZLF_&h;27JnWrKqWzZAog?^ux<$f<{hUbNPg?+!r)lu{cBqi&zL?CI@R zgnQ;*_J>KY7m&#HJ6YofO>8!F5UNv06YWMKeA%OkXMK~PB6bXEIhx1H_&(^@*PcS3 z@U{Nr>eDaQ9uGzhD8#8_gJ>S zP6yXUlt^2Zf{6C1$K=ah9rSIEgT${$LQOrH>qA`>`SXJozQpjzbLRVm`|(%A!i_vl zvj3?zD{1F?y>T_5+D(ZFmQ5^?^I8UPh=HGvnE)@o&~0yd9;adrWJR42u7=k$_YbC6 z{VE!MzDg1{!8I`W?mO|0Nh8~XY z>Qyj-^da8pTiOp&J%>?g`Vy8I#q$!(Ed;Z+>GZlziSTMbFRZgBY=-(Yx?;q3xI5At zC)^Jbp50EP@`737>Z#tiWRa9@)*3?hCoPAyOT4%qrk`-Pv@Z=C8c9R)z3_mtgl)JO zO@p3H0Ov!VsJmmFP^=I{&G#Lkr!RWql*7GQ#}Yzs6~w~8>mK;$;R0b-kS9%#dqg+3 za=+K$Aa+hSkOrH0L+fXE9G$;XxUB6$g#tBpsiy~SH4kJBPJZ;kYJJ#m!}AXIGv<`$ zOzp-t!GFCu5B;$}n^xM5DvtU{ER$UDfWvN~I_R5t@Frm&ct4c&)sOv(QKJituaRv_ zxxS`=GPM{bx-$7PIPP;qv%@;_N29C7nt86=D{6;!y(v4~;wNqnDFxTNHVDggf^_I{w!y%Kbfulfp}Hv;iCT-eWYGV_)J>ooX*FdIvW;oeaX#fgexW0B| zo^WwnCV5iQjpg*z!2`8H>=5SxU)Bx=!AcunjGrbHS7#Ha|H^5Bk2XG;70f*Kc>PhG z4$^SmFO5kNtZ&UD-_$bc?14NVxZeQSYCMaqa4uw$G1};+E)`U|4PpX$Pu7art( zu0N?itc!~~65)4lFXD43o4qg6!yBp}rHA`i66OAz$jVYZ+QerNgU*0pU2Ih`-5{BGuWFtRW;_3VtD4)_PsUGu{p8jgZS*SHY2J4oI zFK@FmKWwmmT?`D?(Gllv{6fF}w#7K8feSuC;`;H8%;BFsu504=H|-bmsRFyEd2#rlX0}Sz8B3Q z9g8+}M=!Ob(&fW~=`zc2^wgTIjHHo^7SqsY-ao*6l zNa5Fy0sOu`ox7fYezk<1dYeL%*3X3E{hVL?e3)=1GMx73tl+(8J#nmlFw6W9P2-&g zLdg{mTv#wmuzK2?$}MivX-yueUmV0F8lm(~X&@xNbH_QRd4j?eUux5!%&sVT;Dq6U zZ0}EjPG4*a$)-GyMr7>Q*`U3be!0TPj53%f{XfIhm$`nSLfoW1WXvEFys?h5g4x%Fe#gqeeyS1Hp73Kj z+TF<85i;Vs#t@f$r|jW6z8`6*fu=+H`2L_ji)eBuC*cJ@`gq>mGRA&u29UEo@4*ZH zepY%Bz<$Q1kd@!HK#%jj&8k-lAHF%W|wB9lf^d%fGKL>hTR#$<#|&`!RuADqn{SOKPzF2zl|pYzs-S< zyk2oB4HMwW0&@EJUvbA&P3+W9hS-7gNWr|_?CN4I<)c;PRp{W>iiKRO9| z8IB}_Z>(f4JGC)QswtTG#*x_vJ;}^N+Bo4+B3PeDB%ak-Ebp`q{+#?qx^{s;29#_k zoh95)Fe3r1*Y_dO1^rk+xh^g`BbUy6@MNI3wK!YGc(Ldje%MdPvOYOH?;VLIZFOrgGpK4h1TD7EcBHnzSE6? zy*EhkU;oGSj(M@BpL4{0;SN z*JpeDGbsiV*BlY2SG}j_zd7K zCavsA=S+OWG?m;C|Hi`JuO4)ovl(;k?v8y9?~~{hb!b zObk5Gr?gUfKaJ4AE9=Nxa}UH#3GkWwPg4|<*#Mq*(nI0BH1tPbs_(OfG<$mD;n#^! zr4~Z<8+bl@kQZ9^(G-dklBrv+Cy5I4!s@gn7<4a@-Va;JLK3}ksHdY)esB!cxacU% z9_o!=dj)o|el*RvxCzuId2xL*3VjyG)Bk+y#I$*w52Pn$HX9P@$|E`Oe6=U;`Y=e? z^;1HvV$PsX=&UUI+)LIGkJfmxZR)j-qaU{ z+;zvJqjH4CYYudnVF!Kj${lw*1hI5oFB(3^4d(KEmW|r0g~BWwI;2#KZRF?eoX-L5 zNQ*l))6;*Y(KJ5 zy#Lwo!jJX1r%Y9sRT0aLPWX8@Wu2|xMWas@P;%S>7ar1)zpg74ohR`u_iE112&Sy! zvYBW$tQ2HVta0KB9r?F~I)!Sfd>JD2SvJepquYfQ~C>3}aw&Dty|@p<>b z74GEF^(Z>fqChz0p+R{)L}XF(*r%LbLivmpaAl!BQSf@gmNZuh>p5%q*4tLWy}(Ys zQcIU8D5v9$Gm{1Va|7h{S5t^$##Y<_YO+7??Bu#NBXFIfeeo znn6Ei*@L%LKj@z}olcyzlr7om498A!?{BYV^z+Q6^x#=v@b10`0vqyZprbORf9MUz z|K^kE{3X=!(?K{fP6F0)JC^!tJWX>}#_>);&`WZa37tS6r~e22y||Wouaq9McBJ~R z710B{;Nj2>%)#utXyfdM_PH+5t4vwWrY;j(N)#~thb4IF`7vpqYcl8VzPNmp85nG7 zWG;*TNnZ{bg(XjQA=<%3t~Rnk5O@ZeM^-nmNj%I3CEF6k@guR}&~MUrww`=d^#t-< zk27Ebo)am~Wg*&|$fC_7Fq*WG6?6WvW~U2e+`3gHC8KKC~dRb`zU zp24E7;Rv7hQStC|c7MZL_#Z`Q9adG>L~%io?(XhXL=?`RK`~IV1w^p`NwFow0L8*Y zP_YFAL?vwC%*Ix16v4(8yY;od{r$;vp9`1s+%sp-%v!%CMf%_eshU2P1n}VnpW#;8 zFBrG>7%e}!pWWE_A1wUkgS8fi>CxON{K?LL5Pa%4B-CNU!JALuQ3ZgMn z*Yekol<}VBUl=jJfzq#kmZwcr#hiZ|VRG#S+I}Ym*bg-vw)`LT>wki7Im$Fu@c4A% zH^VyZGZa|i1viAhWkq^BG_&ONYq|w5*rSU*&TN4X!%kEB!AC5E>Ej<~1&q2@PdB|s z2)>FT9&p+Qx@qU>&X7UODcKlL-BQ3|v1e)3(>(r7(F|X$+77qpHB$5pZ@Jx8b3Fa# zE1UPek^WPk3vodfsG?N@W@pcd{HP5g=)w~J9Qnnj-o8L7oIzxk6+WG{1JZk(qWylF z{I-=1`tNTC_7BdJLh4_(@}v#UvtCA-=T4Dd(`m>}vO$x%?IBt9kkB9JuqHiQ47$0H z_D`**{Bfn=CEMU1)edk$YbPbo>mX5rEuK=$p(96k(C@X&!PCeVCyY^r1sO%uyVa9w zPTAsb-AvN;+eqVb6QIKkTeO-spAQ#9-5I}rgORfhK3+YA=ErA}!N9Iye%l&{WasdY zrO8xz?*$aDu)^Palc;rNFN!zUhs!;Lo}99I#e;6t_jNOL`(c6P7e_@|CX`tDg85Zh z;4-Id?hv3&vn$2kBGDW*6vvU@)4Q_6@EVpT@`QB~=JCC{m*tlY^|1W5DIWhXnj)%K z$wn8~v*tCX=-n`vZ(hDY4*Ylwj)a+@iNYxABkRid^yjnU4q`ttaV~#z>w8_d4~O9U zaU<-kF_QZJr%=1^(h@ub{=AliBn42IxL% zF8|L|Pom$4AW-CW?o%E`-_qtw7y8U+jv^0y^o6mI;{l_s-wARCKU!y6&@Vs=S zYCRj!qKk!{bfKwBlXT)iB!9R{?DyNo(uIB15_%nD-9q)SF@~8)EuP&Pm?s z)wHF;2wgsufrUklG>&m@D)JCCkE=oW%nWIuT>&Kv{jqI%89aV9PO5P~#yi!U;mKiY z@Xf3_=-u>e`Z>uQm*QzVcxy|{a8ZNbJzmvnmQ1A&mo3q9ZW-v!=uuZP z;t=mM#~OQfQ-hDHj`DGamq2K%lngBf=N(Rm+?TiemC)3;4%pst51j7!O8#*0B%dng8*wkx;T0NE zlKoj?gPn0p!c@BIX-Q{lB>1D~jBEaAz+nR|x@7!~ypA}dw?``Nd2LMR!<`^BS@?@o zwO~WF8XZ^D=U1#V%^YV$(pGH|(GB78~opt-D$TDab#6cfrl4$B~7n6&<^Hf_12J!9*8b*pXsHKR!k9yhK+FiHoL- zTb$|DynNQ)-W6x}(SwHE7l&3B;Q|tq}3F}KCW}c8#;3YH`A8}=E%hA+ z3+|d?(z#aNcri^1*w_wtZZ*bUKhnAFq05rh#!(=RH^K#ag1gu9L3(B!ogbA?Y*_^IOhljgbJ%zsCj zyw6eWgNA4E2$NoH?58#G-(zjm&=^8}Hb%3OTXvGcb}=tHq7PG(Mzhd6i}?eg2XY-5 zNw4>)n+-kJ-SC@^nzQMF&O<0XExd zFz?hu7Y9s_p`3CrrWn)2>V61+TRzyEY(9 z3+68E#KL}>@NedN=$bK+{)}^G3A5~=pU|7F(bEK-Fh4e-><1Oj7ys|ZJ+N9Z7Q3ol z=BGLvp!E&GCC^c1_B&3}%;$oSp|b}%A8W^K)K2j3>y2>xLp69;eo9I`S47mu7!&uD zfzq_20_t##FZgbPfqrVxTRl@Mshvr7rGgq4TL$&xCrCl22Y6?(pFDp?6{cK%9`x(y zAnL7bf$O9)SheU((6Yl7{M$iGJX@#=`i+BY1C5XxVyv*OlX(5$<67$n`}tTs8w}j4 z3U4-R$i`7U2#(vJQtvYGaI=upaw~a<$#%Hokt+P)3+1I7qbSH)_@&ayK$^Z%w%&V? z&%Nw`AI7S|zK`eR#p~x&_#8*9JyixB{p$^|m$oYZb{rT>J z?4?@N<;E%AdzCBtnrgt@2c8tP@d^#@?uHXWrjWV4KW)tD0+YVDV%{iCFkR|Q&0g)f zahb@=8OcWVc|&%23wrVX*m zE|lodjqA=6`L&D3lk!b}+8lI&J?$d)NgBG~%DrgPy5YQ+$ft{)5lx@#ff@tXu$nS= zTpOtetDbiy#U4}nsTh%uYZ^(peql7jTrjn)Jh1laY?0#}N@qsyfbctRXgzocS*#WP z?3!-U$n|d6BP)xqDfObkTMA)jxGV095LtTkaV;kky77E5?7SiB zr&=iG#w*Z-2x}@Xa7N9DOzxkrM4|PWkR|eT2lnqtr#&CZZEvPfxselIOv~W6uD+7D zrN=`_iv#|r(4AhqKO0e|7iOzeAbeC3+uA3sF_*OHgeQJtS{ zh{0#X>wXS0aap5z_fovjaPZ(lry9*{PORN_JDeW5}Uv31b<#* zh)yrnps4tww7$niN)>$k6MM@bs$acyHR>4eW^RHDJFCI)uv}?Or!>0NV1hGZ%3%5P z8B*VW)%<0K8U9zVD)E+&+qtIi(X3=QZ|0A^NS3kZI7+-UAHp$)SxE2&Z^*{`L;Ms)Th2P zGG)K#gD5K44&O{D167TM^7TFk`1JSoI6O!V&YEy}@R|&=*yez}E6c!1?Yx}1{TTl+ z&bM-8n^QVj~35&>xb$voIBI*x2MS_#uXn2O{LbY z-gNJ35WE%l*H05om|bK;n-2UWJnxFnMEx$_=0<#h9TdzKexIINaP^=i4eVvYV~mwaJT>a ztLE^PHGwq6yd2(%dZ+Sv7}?IZp|cK+l0~&EKJPS}*Ct!hnw-thU+81*r3@lAPKgQ< z3j$wzxZv7ELnsYZqLGOk`JmcCQ?9pj!w9PWmKo{+UZF_6oj@QwHCm_eXY~ zKNjAkI^bB|%IgN+mT&fKhYlkDX5^rB?iR3EHhUKagYJKPibU5WS7_|5%3((Hdd;E|FUS|_z~J;Od zD62MzZG3AEA;Mo(7ODwJHleI?s{+5lb#Tz$J#gtbW1ZJr;aGn>^f-4&K*8O z-|Y4An)V(ry=ce={XEX=Zx~?wWi^;~^R@JN-deI3{v}J%9~@|Hm6Ycn;Ya<9(c_mY z?9SLFJ(>|iT2GAe87l)hX|wdt`v93UQN@+V9~JiXv}jfGPwZ&68WI zo#{%IJu}-BH0*8=k(l6#a-Bk5Co+qXlt*vQ(#{<6f=kpQvQ}82BrRl=)ac;DvWi)^K!UJdD8c7DWL9}s7HoI5sf%$cMaObx_ z?Ru2S#CQ}r|W6{}Bj?bXqs-0X-= zu}F#AugDh*E9hL2BR=hw&Tp>2C%<$JgPze2=oTUB%iB8n&cg4o$kq9)T6t+NE4kO? z&JQ@$%K%T#PUizJ+p?*j2E%LNhj?Yxo$_)!vY|URkG^|MjBYTq6MA4< z4LxW~9L~(HB=d%JZT$6WG%0TH&itZF*co4K+^|6h3amq!?W2CYuuU8Dm&VejCjsoq z_=oKDHf^j8(uUCc!7OZ_C%+M{gOy_D{Xx@@b-t?w{YCv**QN8>hQ99k*DE3 zi9FtRV%8trVajwJ+^}8)er^b6;rpJFm9wtc?+G8>i~zQdo#WdCFViGg9Wo0{Skmx4 zw04O;YSx#*(#yK+s7Wnf(^cq)JE}pn_H*f<%}nxYGsLld%OEuPp2#n&TO4Yl2N1GEi!`|4klQEc6mbOW|W|PicU( zgC81bfn8>(z}@DfL79<9W#iu#xOiPDD0%J)8j!G^TZ-?`js7a2QnRvHfId7%{ggwK#|@9pHJ!hd<;uL^v9T_Jx-)1caTC#=#c1B2{C^3Vh2{F9*z z4lP!NJe${Y>5>q-c}nEdOe}*dA3w?d_YUyCf^T;_OAVAvjOkP6V)|k4j)9_n^`CD+ zqZSb#eZvE_3e+L!W;gPzI!cu5iII-esFQbhYJV>nx(9e7d#eFcj(4P{n9mgb$`cjt zO{BxKgD7>s1LSY@L^)6kisHPOe`1KRwtyi2M6^qcM!8Wq*6ooYxy!Qkxe#c<6!q zC8XgqQh8vBHzrg>QsBj*#MOeB|7f89YXmBJJUkN(Na{i z(EF^+;`@vIs7HqI4;6agv-~icP+>t2(v##TLp?BN%q%Y5wiG?V5=asK;Wcx?5>!{A zWo?!eb6s4&;hFr6mpUo$$^=&6iWB^LQbO_@`L6nOnlW7P5mPd_tHU>WP}T&PW$c1C zj|bDblt$Tn`8K*Fc48McrE@Ev2XepF!{FW~CtR?XQAW5dA6;>R+{ZfMriW>KTH{6e za#9GmIXL1{msUPx#XcG4e1<14?2tOA@#tPmKDWFx@O`#8>-7VEWNv#oBKRHXO|!<7 z*E6~PlhVMj0B`6QV1@Rr5BSiG4MA2OZ-IWBW2u5TKP`-t%$3nVi}P(fvp=UJbu-Y$uo``E z3rt`>3QM@^RpCdN6iG?xL)gJt{>(H_=!0DKV4Z0=OC6WWpNoDE(ngb|MGv-P$QGvZ zN4)=t4rs@RvaZns_^(4cxWgot`urEbBGT@%!4rkwdxSQusSjqOY<>6w!LzAIPo&>+ zC)O6H0XE|E#wlyTxhITue5S{XMSWgdlS(ZComfVaE369E#YKlT;B^(UIV~?K_Os~E zChURn5nY(l8lm6YrH>ECs)G_5GsDITa*q)C09QqS6s*H;AzPufvkKdnpb?1A1d|48~Pfs`fyMBb@DPDjS~42KPJ4o_@ngHoQ=W;smGsnF!ctkRN>eiPQTr-06f^VbqLJK%!q#o(SQ#^$K{9GKh zrT3%l?(dlYV=o*TrUOPFgUQmpCokUMjUJ9;X-Uao>e*Jwx(yY1L$$i_|G-e~6R~`j zhL7OmN71gvQS@j1820guH?9hs!@rM?q}0=8a4g3Q?G1-fkI@pT>?@bNguZFj12Nw$ z3#1<}i{Sh(4{TpEfPVSf(}rX1<<&wem z+m7^ML;MQxP{d97#+aP?A79t7&H1$$pUx;=bx3{Ho-6F5VG&k(WmC#@oBE*P|5%UX zsd%Ak162#%N%u;9$jK7gioScvEp;0AT5StSx9)@K??W`Cxihs+c7uwX-k^5z2!;Ml z4 zvTN@h?2I8r>hMKn8#f7wln$81V?&SUeq?ju3i+&RYl8zkW7?{pdOY zd#%34-j;mjuWa(!-k4>$%~}1JT4L80#o_zXt*m=+GjHton5{5ghWfcHn6$#D zerCK1B>s!V&v#lwper;ufy(M+0VD>^?=>S z@&tqWg{1t&x_(#42sjoOiyBEeQpTDcynIG76z|N#RC{x&U#dktACe9J17dLo`qgcj zvyBf*S_&n_dD!?^UtajsygnhJrK z%`_DAx*tk7sZTxS#ti3ug}%-3!fpr_`|q$vV^~kYmpfFhjQf|Jq0r|`_)bF;d@bhd zvHRU;5;2Co*xHi0j4o>X> zE_W?3#cVGe5@&}8eO0(ez7_6#t^+#X&(f|GB^ce;8lTSD2L^jj(5_!S`A0=tj28E* z_woi(N?E}Ua*_AyHIS?YpMI*?6CRswi>`}};IULgLA76ltR*{K85Kgo?~aLFhCJBx z#}<2aN#`YZ_fz*AK`%TZ{Fgr6XoAQ_OYR&EuNK;1@P`?Ep8qO3H~%|K2(!k^7kugS zwKO`t*$b{4SYwsmbUx;7B2{dA4Au86(c`Nd-7D`&509(Bz}=Q;``ZeNuXLl0I(~eS z;InngaimLjp>)6B4fZ(53Vpq&aQ6zN)U_vJhN>lQdudHd%WbJ^##*-VrUkBfKZ#Gv zH>U+B55cJ&=J>?uF4ycY_=SG<_+pwVI)6;%4zmm7>*Bgb_AtQ>xh6DeY@obgqYAsD zXM$fBr1D;ieB=#ZcEZg^fYb(cvQ8_HnycwOA!VMeA(CnP%)Pqy4w7ZWE> z;$hFvNf|bkF!G-^cKK;RV?O+o4jLr0DVGJCA;K2Qb}O;QxAA=6MjcE$XhZ2EpGx;F zx3c^M9pR_6fi3MmN~sHm@%A|@=Jq%lJ363|;Ns5vIcgqz#(uv-b(z8l>hqf?6@RAoj zw1D8Y25C{M5`SP|fO<9^N#WQb>9xHN_=h*m zVA0BXQrKML@3I6B3C!SqpAM4pnnE%X^Qn@wD)^;zKWJxp4R301f!#Zp!5cm0+US>g zbnu)7TBKA#cI21Z`+JV@;UbUQM#l`g)Edf{rYN*-&o-jc&2UM+d7!|F%Uo{mS{VP4>9=v8ef*?#O4qRM7#EZ|Og?{GUBzQCR)_*Jnx3S$1PVhd{N z7L?>Xj#poC#V!{uY5N2(iVm2~7H)RMX?}LlXQV3yE6w6}lf^vfl?iPdDfG|_br}S@ zp{-#m-E$ox{)b>~9ny@6ev)dl~wzj7^m3w4^*M(F%TjXJJ)GB zhyf?1KAqa3T^A#?%TMIFp6cxPjcAyrX^5MQmC2yRf^8~XOm~HU$!<#$uS+&&jbEli zlkkISr>W7`cW!LwE^oS(r!Q=($^6t5XZB~!B8VQNhjT)->CJyZ%qn=PeA8DC2ezNc zS8oVpHaUerLT~M}*?*0UW4SJixxx-HpDH$^!Wzal#B^b| zriy%%N?V8<+ns4NOyUbs4|kf`kX|ouHf7a%wpml``^VdWW_V{7|8NN3dQ13M-5lv` zo&)k`Tre~`NGev&diC>m5cbf}SeQ(L* z6%6pwS}&TTXTj1ATELwKee8SF0&tNFJHDhnAChl?%{kSO+RlotYQ4tgNWquhXAWQ7 zzDpNdZqP9+V>D@B4M_pdC4>8Cc);Q6Ulpp<4S-RNG!9}0h0>_=1hveqSN>CnZr^Qe{Z6IDUl z*W$oFy^eCrEE{xrVhYDiPu5+3kV{v<7RzI+VD6STbrU-rfo8XQ^pZL&Yk>6l2%N4!| zy|CI0OPJ;6O5R=cc)(Y8)P3PjN$33N`X^0T#KpX~+6o%7UFpgOPd;vm$ZvS>M7sxd zp#i#2SnpvTSn<&sas#~x{X=<;wI_DDZ%gNZ(Lw#a3}1Vog=7nV;=54Cnm8VH%oD3t zSr8lyr5N4uEPs*kpKq{(*PX<9U}6qW3iracXGUUdEeCSD(bK z-G%l~JTT_=QioM%M}a%#qf>y({z} zO62jB%x&gwMr(tfyb!@Cg(6=*cmmJxi;@Zo#GZPRndsq~d3u*zY1`>XFs82wT31Zq zF*7eo{zg_X&cPT-aJ}cPeiFY~Z;>i0Gt^hvHOe z=k`SAIKDSkbFmZ!EzvvJ zfN{6stexX%o^?bU!Q3pgxGTr`7{PP>*xd}yH9eEcdaV_6 zeIslhQU#SyZcBUC9O1A3pVu_g6b7enlX9QNlCFlBH~+4L>Zo;6i(4gMci9YQyfA^y zMUs@E;71)+n`7(gO2OmtmM)Ac=YNM-;-o?o(4IR#sCJw&DH&Q}&7Mkdxj#IpNTG}$ zxheFinI@1J6jj$#Rf{&P7k*OldaU z>RZ7#^Kd%&#+oaJ`(RC-3sK{E`lkM!h1>Yxs1j>X{t!w1)4KE6S0ev!vK`qZCs5tI zYF2y12j6tFg(ZW>k@4<0-nc;IuYNG69-F37eflsa4fRFcZK-_OxJjg)x*H7beejoo zA<6Z_XqNkA>A)v3k5-w;H?9~;8;=)4;b|`{)YPWK#{;S3u{E-d@Vockn#>1vm8jlv zAzVxL#G}=!bo`YwiTn}K4SI@vpd?;U?@k-WOoFk79%wDj7iadH(9nN{>XAV*FGFR9T)k|ZGYuIMVj=w?hLsVx#2CR1m2KiNZuXCsyAS?|x( z6zYnn9pm{seH|J$)&;=c1s9!sCp%Uu&^M7At?}C#n>;3PGgmF@_CgO1H9MhEU^8zw zTS4fZZbRq+2kigJvR-vI$to{8IC+!baEy>X?!5x$PXGV@#_}(n_e+0Izh*HCrnp(5nJ>^gE_L*5g2nfZaL`Io z_kSs{M`23v^OzwvCp7cBt2Nna_4{B}sE=U_CvbY_!{STDb8eCz)_rT{LK?;X&3Fk4 zp*k4d7|;JJ7|%Y(b%9m3+8Fx$ubk*Hg=MRprL*6)uqHE+ufs%kL}e6o7JTBf-W_Pz znM`)Le>(NtA^60;$=u_{40bOq8*PG)l_uamyN*1*_9cHsMS3M)P~pMR>=#Hqy=bXzByUEChSoR(^0te!3S z6pdq9{^Pl7gcjERu%otuf$U)PQRZi_gSd z*_-`-dx?J){<&A4=Fl?BiK&Vi#lTH^xUHfJRz0?2v1OcZ9&3Q3mCa!C$-k20tvs6L zV2IgXRq$f>XKB?;q0f76gwyRzVPm&iX_`hK>bl1m4K9iL5pqB(QQFIUq?qF2Stj6a zkS>^NTIAwohFca_LiX_#$;@OIpD*_JsA&S$ri#-0XIJDqm7+fyQwd*7J_otZE9MtP zKfmd^G2E{x2vl?}m2Y*lM*o48&=MmBCR=ak+dtW0!2+LL{@_4 zgp+l@pKj;5GwiYan=xd1gvtgg$K~Vx4yc}43C*_$$#1Xi;NOJb?9VV0kVkBmM|EmP zdyY9_=R=i{ky$J&zboTuvs`e*GZW~vq(xp5-ie+{La(b<1rg;BaIjX9{5x0wS4;XN$^746ZwpTLA1_hI5Y~L$E&k{WRE&` znxb}zx)gh&($jdJ^RyGGz6*eTnI2f)zJ+h|a-~RGp2uv<<$xb z^izJzVm3Nq{~b5^{J-zy`&O4AGu;7u?6IuxwST|tQRIzd!fo+HubccC|6cd<%PEKz z`m_P7EbA>a&vb3==ZTl~EU-S{CV!$oMlz~D3E$tF;@YMdu0LwO^e{$d+b)}6*NmII zYpN_I4?ho%dyVjAW-OPM{FaWszs3F&`M|pOZt~?HJ1{MguQNyZC*~!_@s;CU*>yt& zunX2h{|U|9;czFW^5h=$7W%->yC(2*%?LI>!&2xYweUaJud+{m40FEti_EWxY{`HG z-Z*yz8{>%Jyjv4rKW#^e4GHXu#u0ikTN9^TP2}Bk#xdiB7-$=+fv)i?^lQsBHaRw$ z3SBgCSw=E1@}I2k3LyL$^}h)k!JxXmJMM4M*gH+!D~F+w;HUMgoys|5+56> zgL^E^!Ku}rz169s5=&h?Us?slu@+2Km-E(#dU)!GDGdAiLketJLKQpp@xE&nG%3E9 zMra@8yAur2)!Y?nXGjp%Sd`?3dy$mh(|>jB#GN34~0TB!#DHl2l=W zs-pf4af_91tL@@zC!67KQU7k}e-27XxGKN%HOGvxmC!NkaZraX#r*L{3k+#7hLdkC z1Luw|m%kmb#3e&2VRj*Q+bZ+}XQx}^@FtNPH~d_k&?Csroo#SsbS30mYO1?7vY4Ox zYK!UZO<+s;5E<^A7mRm1%*n2V$b(Vx*_k`}hzth|m|y~IR38bc4_oME+{Hy*CGge~WX)00ic-0qb(&I30xzB!JJ?ze{@2fguT zu;?E{Bj}w*H!j|bD}LKkZ{rChZ#>Dy_w&KlCL35ZU^Jz_8O6UF`{IMumbB{GB-%43 zo!x)xgOAlGah1qsEF38Ajnh(Kt~XNFM6R|aj5?g%0E2xKY3A(p|i8rF9CA+|ik|%JX2sPr)y^q)w&Nttr!1kIb%kp!6z<9~x;#_4{T) zRf#*626mvwVOn(L!%ULX-SJ3sA~)-*PreUh;NSp}4{f7Jm3r;yaGx^L5&1jk?k`L{Hf;>L zec~Il%dxr*g_HQ+4d~b*;^P2gJyKkik^;S4|K_9nm6ZL(IIV*T#0q4cM=i|?2Zf)$s zMxA*HljrK7_L+D-c1{?x3-t%hNRfAS=a1as??{$;@*++07Woi;68WN*p-g2%1Xv5+ z?>{YNnxh!Uh8rxQJkf6+YEI$?`D54}i%bZt)WD`$8gzZ`G?vvxk=6@d;?6lK++MI) z|7%(a?&0buF=2_mu%_V)EK54Th6wP(ZI;#)=<+Ui8(v=g-yRw9)!}PF42k)<_g2eV6*__roen*`5o*y&?yD$3e z%&trtEb>?VMgR8xs}|!fmHdXC;I-~G0hiV%lErLm`u0Tl+eH29DR}d*&3Ey^f=B1_ zz!>fvD3fZuD&^F86Wr`w2_HJ{l9o={!k;<|{%|j2__=+8G_FEJW-rXJ{rd{IdNW2c z`LLerm0IApdqyz0NI`mRk=N~6yvP?mTLFm`3ew`qg?xy!HSR1nf|gqKpl6-;1>JsT zjdu@LfV5RFNdNj8ZoJDD$K@M=ImFkk(7GM8B+d@|AE|(>Rio=7RSNh;2M6rB*9f%c z7|DMx<_C>^;(*1M#ot#kl$+Jp@&_eO82a7_UL;SK_1BixHi&-J>t_YHHcyv#Jt^X~ z!oMYtF@{qu<#M}S-tyMP3*Y}0y} z+jKT#Ni&U6QQ^9*t)x|dAgV9(kBq}bwqiGAi}e-$OIe3i8}NMJVbmpAtKL7VmK_xP zap;vz*Eb*Kt70Fr<+I(f`0GmYc68%a<-geBlZ~*WW-Z--8s5KK2WVAin6_*uT|MQ= zACEACD)}cA%-BnpLe5B&#@RroG#d;u$|?2XXn2(32>JJ$f^>?CY5crK_^`qe+L@&C z6*pJYo$gVfcFhJX3h%OJ$0hVO@G7_}+C$)W6~54JGAXo~;)(t?u+xU~seVAie_Vnm zRVMK4t2!M{u%bKHO;GutG1TX+;Ke&{%X#j7u{c~0CcaUsx4YO;CZVw&b+7|;yUV!R z=;?v+okFqS3q=TXe8Ao77E3FNGtpY@3)`sdQy*P#znu6Y_H>8S%4qwZ!MOCxGz8QFB%uXhUYu9hr5ro-Sg?PGX1>3!F zXnpi3C755Dj`=qt*?6W{Kg7cnJ{&B>Vb0#H8T49F&d~4R@ulT3@++eF(fM zEX2k!E2Qo{Lh98Qjsi88bbKkb4{B0yUAI%AYAT(b+XiY&`(WMr5~?kz=Ss6a!1t#@lloft z(cvDw&-ezx1?S<(&?D5bw=F!%`Uw}77-PlDN*Z*|nePv7hg$^SXYSe~RQdKQOX#JD zyFEcd>tM-|EbbB*Y?>!n$3_MNi^0!Jw*5=q>;h1z`!6~X*v{E;dHe7Y$YsW358@Kkt;g#n2Y`_sdq{n1hoNR%LvMGL4a^%|=G5UCS zJ?OqNLC;l(`K&-EYEltwZZl&XEVxT)qu$65Tb9DdP~k7uJvY#>yQ1zc3 zA2p%B>@+S1bcDZK`RXD5&i7-T+9q}My{n4`hwXU3KCwaBQL~}5rY>IaF%?;GYLeT> zuJl6E#rQ{deEf>9K?cUza3EC&S9CXF5y!)%F)5B@wpI9-Jngy429z=eE`Z!C+W5TL zh&eSbm7aJiQ@Y>{&Rb{CC(X%~#tZ-2Nbx)$&}P6!{;ZS+Ssj)uM+@Gcy#v=6wNGmL zwgMh3*TN1ddhGc5+tP@o+Hyjj7A|XY;CDyel0Fo#g@Z3O@y%du_Q+a^eeBm>5&$#| zc$N(B&nmH_)0gwM5N$lSSe>bFz9*eK+9t6n+GwVl3@bw(N!y>z=a)8#JeLtFEOXpZ zX;5h(vplDR1_P7eN(+}1YiDx$DE94pmDsIC>m`j{Gg(JVJ+wNI2spA>(hN!D8ol+g z-DE|!VSI+vKC6J8pR6zPLKDI7&tj=kWik|1Z_Qdmc0~t zg|!ai{nIR^SxmrR8T{l~m`=IG+NzUYrfyacY5?JNwk# zEBVN8<=Nr)CGpU(GEA;t-j%--{Ho#}EwJLs0{MvD7yj>-Bi4M5hwE<}Wu=SV`4*8` zu(bPcY3=(Da)st8_EY$irkqHC@53L-`g5qt6~2 z_7Su6N%D+)o;ZJ!Js;XTlunLV1j{r%@muHrQFNAJRW)50CIsp3?(UE{duEZ+U}1|z zE1+VF1=wJVfq{iBpeV}OGf1bRQVNPKf*oLhuitz>_Ybd2E;#$lto1zit%cUqyO2ja zyoe8C{ycSKx_a#x^6yP5R!n0&_F4LZS(DJ~6Y*WvzYsGp zL5`_fM8>#@TxIvOYc~w&NR|=lnCFeRBGxZEV1ZhWD3g5)he_uW8`yAMpU%6WORU39 zu*L;z*!a>0ZMmXA+|tx(?K5lOcIwe@Cw0hy`!aYg<1v5_FfyKCzg$3)6F3vyqK<3|HcP4mtf^$mKXgiU6JQ>n-|6#!>*4;Fy(y_ zb!jx^4X0he?zW8Q|4h1~>F6w>Ns|GDCh0-+!y@|okt!GKa1J}2(}BakH0iglb(~7H z2D72ApoTBL^tYe}D@6xpBfD6y<&HywLqY0KF#gy-<<`yk2!6o_ZzHg{a zJI{=8dTJTyS{KWYTrH-Gv&4~?e>wA?slsSk9XiLx7(Fa0L}MaVV6AHjoz!88)>qWx zeOr}ay@xK9EP+Gh^Ud?!ihYPGx zcwPkZ%U7V4ET6Mq%Yc^I`=Nc$>~QQc1^DpM6xoQ4Ll=U3N%sS`@7iKW|L6yy_Uv$c zPC@}H3=Poc)l<-T`{TsdQvno3jhRmV@?e{}DHGOYTQh_lxipv5awsaU%Tj9x2- z&Lqep<8OOW^UvJFjoXVfk53YJpeliw!)&CGI*`+}DPSuAh>rPy?{jk97 zLl14wFa)cmvG~!zdf|7*`}ARc^hB#pJniZup=C=CT~})YtMg-Vv)C#=f3yPC8!%-& z%1->*dmn!-;u)=0uz+06I6PR?%^$4PqW>7LdB^Ea+->xopR(pHT{X=bA_wB|&>{ok zJz_&^SifADH^>nKJCgaW4=J9rfe)Gq_;8mA(Gm%yPuRTSi1|Ox=7Ki89}pbWZvxdVK8D~%TJ3Mc8) z#n3_4m+1MOjKzP1khO`qbY`m~Jh`rjH22RT*Ax`Jr~YL=Eh$r4xOEP3lgz~z>>Qy> zPXmSh3Ly=XWyy8MKf9G}Om9|(lRaBk;vcyV5b<6YRXp<~ld3n7#}&*UYGOoJdtq|w z?KJ#?&4ca68Z$Pg9T9zUhh$hdz|JlMTCvfML`_53c7{EekGDWCXP6V6%wJ^wZhP=P zs!#L79m!)86I@tl2if+vNO6)0*`%sTQ~uh4OQIgtNp>J(SWm{woz0Vn9Z~fjQ{r>L znQlw5gCbX5da=%#NcTTRFA8m0pRsmbFg*DU7bJ>lD^k6V;}TA?oBSS&WKUzvHe^F;!lwM50u#;+Fds(D*}>I=l7rBMRy$ zjQze-E*8-a^orm6;55z)Hv{9V(iQg~T;=1~?)KsiV;GJsqG~Og{G@03_<55d1n!lt zXto?D+@PlgSu*-?!=s44zM#P6^c==NLUfrARJ!7W@nX(_xq&jaX@OvV5k2kN%{dny z!|T}HD>Fuu8c&o&#T%y_5<>g?fZ`o7}C855|F%YGXrz>%PstSw@VQkvG# z(WWXey=oLn=}|+D4e2N=LIt?Ri8xQFjSO4nQRx+`@GMOP)#r^y`ui>*(*ji}NMh%& z*$T*8CY(-fVExz6zqnsoBizQA4rKpD4SJWx<9P=p(XsbqsI?~h{k-VJ)8BsPW(>Ti zen<-z<-}pD#50`ELldetUmLnMcVfvI+qoYjuV~;_T~HN^!>d}vxTjAwX#5pD7@XRP z2W8F*2LC>z#t#i(?1NamE;?OE&#BN+j2E3hxf8R2nD9*fGkS~d^MyZS@$%u-{K;W; zde_I4?bAE4)Y=35;qX_qKh7Ndm&M_EUcLOzP9u7J2g?Vxbuu3IPu}d{0Nu;_<4s}l zcy*RB`5Wg-r#-TUJ>|c+olhOfzhj-qT*L-;u1~~TJTRjFxlJc4%#!f(Pxc^uX@Iz$K}05}kVLZiGaqe8 zuXsd~+^}FggUx@{u9%@y&X~Mf_Lj&qUgN$G`ZOmgh>X&=#_uZZ;FG`x>Av(L)qToz z-VozU=IT*kyswOA8T`+l49`b zscNLKpJh?6Wa-1ejUxKqRD&xPp20npx)5=PaYOg4=e$0Np=1AaK$`U;PfBd!#BQC( z(MTH(dT3DRyR7HV` z_Mj-bdaDfAII?-~J#Bhx!~i`;N73tKRR~lop{F==v{b$t?`3?ST|+u_WN`rMj%`Jr z&y+xZp%c1J!jUQS>Ri@ThUc+*v~Ute(IKPp+9>AxYPLb+EJM&kS#@f*Sqbc$^yy=7 zgr@3PU^|}iUIpgpbT->Bo%ulI7$0MuqajU}_eF-E0&u9gBG?`@L^=1yq1`jCk{MH3 zp6QqoHS7pMMcZR>?REudV4wB#`ZH1CEXFw#GQNFc3f@>g1^t?Ko<4rB$YkfLsJ)3p z=kK28<#n0w{PzO9&QgGKR~(|+A{=s@Y{KPH@@82i)2ad=3X||Q4JFjHdM(xeqYA|d5@^TqpIjefj@&a-gHhKLacH~< zx}KCsFGMo_*IiNc?Pw1dv;GKjS*Z>`9w%Uh-+kPt%hB{_fd=GT{N>&?)N(p%6s=@_ z^idiKxa@B`*I5%l{l99$jNqS~QsxbA)uLY1rlkc6^WyPw#uxjG-Dw$U!=(OB+z@e* zb6o#{zK&x&*xPaV10b%v(1L#6p$E6v`KtTK=4RJW<%mlvRmNA`gVhYb_C!Xz+#XqQfM@@nmpZG%@PAj_0 zYb)B)v{VcDEYpR>6#DtG^FGsW`>nvdG#=Zw>kz?QjskBD2O5Ssr?=K*;+)g3;> zbHEinVZNKNImtNt8%HiwZ>CRfvGa$HJX)SPf!NPCEIcjU0Y+-I(Swd?veA7e*?GnRw(K;bp=dhk znKU2EcG*ML7elmNKA0S~yGFcZ7#~*Ikjgqlk%~or_!#SZsoXI~eJ5C6aojg@KArVn z3-zhX_z<#3*%Uv$z}`R8ZBcF@^OjAYv~95(xj3^5C$RkD&w6c|T{6JG)W}D>MJ-`z zxfcov>E-v1O`!ic=BNLuMQzWD5+&PIA`4d|8;bQ^-l*A zOX$i|QHU;X!W;Ln{cxi$&68y3nIGSgHoO0*EV4tT4XcocmjMkDRfPDh`ZUBS1&!Ha zgikZx&*qKn_w#cVTHNuO9A&N3` zOMi0uvmB{1^9L*tcH*+Q9&YUZceFlB2YiC#aQm;_TVH8OW+t)s$L%!EB<%&Y zyvO=Ht+6=$4HfKPr9!2?8$bc;fQd%>35v{nX^y5bcwddh&MrdX<&%okk28V0!JRmE zmn{D>ua~yXF@r^~VzH-KE?+NDqjxu%!@8B7`04F4{Hfb7>Enx*Af6V79fLmdX%R+r z^L;A_VdtB?<>JKe=m1^K`l6l_p(j=w?6^j zd+$KR>!WC1iap>PqKH-W$cJ?$*vCV3x_v2y_CQT6Vr!Ig`wB&!cAP&QNWmiX1jB zC8rAZ^V}(C@YFD&7ym9J*G^>O>W5BXYNLb3Y0f1ZU&gW?kTV!38&S7QapZ~D99%QT z32e_9AqC+?GEuFZ*d;r`!bb))({2X&oQ-fd%NsSfSRhMr_W%3xmw30c``%=Iy54p& z>G#&d9WstErP>blT?!#{Ul~#Z_I@ks(WS}DCzD9=pXm5%2RNQmLPZXQllkwPa02rU zYRuB13-s;C`d6js!6#c-Sk2A{FU-h!Qyxdy*npD$>!(lkzYLXdkKoE=_OI3 zIj0zFpJsVccD^|BritG$Y>WJ#TR=b^ppBzy__By>dP?6C+Bay@`_n)10+(*?#taK^ zO)H{>fBSj)TgUOCBW7@I7khuWmhqb3G?{D07($easG#4LPg#|R4RqKtZn1QQw8ueV zUz9o|OxFjQAFNj_*(Y!vy&rEr!p_%Ar7J{zCUCNu>QLRS1%I`QXl!c(Ckh8~7UN&t zsnnpW+<$XEJw;I#NU@Z`MZB zeq6*SRaKyg*P^GMyP;{e(~;3QWhmTVOfMiWv{2&~R?A`M5jH=1RWca`wHKnkI>ze> zDWRS*v(TKzdMqo-?o)?#>FVgUs38A6dcpEAp(A!ker^^z8*EIu#d2^eO`nSQtU~)1 z7~ryVvLGxrM?(KBl>PoIAx~sslb<1V?an}{b#+*^HjwEg-x6W#JUd zomN?8p;ubh>E)$zkWsIJu3bn%^+r16{Tb#rJ+=_<+8>YFPM)Am?0vS;QVETgi9p|P z{w#kl%KTj_3vk@aa1^k4C%x~W2(A$_=%Csdg#P=+DKp-p=Jh0eF4GgOJiU&(vGdwb zB?)xi)Qsg7Q&1!0C3Y=K#4}%5Ayx1BG`d?EQlmsr<#i2|EpiFPiL1cv2?_ZAc6}78 z8A{jMvb_3(pWNTs@+fFyo3NC)}INC}Bo!jd|dsnH!yE~oO`q^moTc@9%WTuF6QZVcVmar_TxkC@THmh?zWZbGDzy;KB2k{sP|$@A?M|H1uFE~x z)lHYVu+JtU2pZ`S$0J=(g2HU=$dO8y=bSJN8S`TgMqs zMz0ee>L14&)ppZIRi;pKBo;4PewCN_BTtw0F<$zNPJGwCmN&%D=@>anhzW?pFIGsB zxU+inva=Ob)pX+j{;81SdHrqtUN@(}#816R2ueDi5Au@WqzIVKJ;^m{Zqt3H#M ze6mA|kq!{PBN^j@sif_~RvNV05ze|Ppg(IazW{${FRRZ^y8FZ z{tIaDWy~(|7s5K>i_ul(m@rkqzG4Llm{aM zAl6E&D&`%=Xz@lKj<484Ui$}CsGP`0W#10LrfKKMj|1uz2X?n0-^di$8C*g7B^&68 zt>2LFp$+JUv=URpP+I#*60ebH#~m?UWVpVO_9iLf!3GTDviivLzY)~@iUC&Z`G+sw z`AlY)%JO>sRybxL8>{JjA;#m`y3X4Ho1G!t%{}jkvab#x?(E5Wc8T5PVvCp zY#XfhZxqWxJs_o?l(FOOah&aAa{NdYbIK}#=Mx+J=+IUAbK@oQs#S=mJvYUn{hsCf z)*K~PPKr?Y#1yZ&u#_I$yNUc<=>x+*4RCVQ589p^K}r=A0K2H;eh)>Op=Ct+5&(Wq zQo+H38Y)#%%Wte*1UuKr;Jd{}6}qukg@4#O%F}lkott}*W^d8s%%7&gN3+jprH)*M ze0?8RcX>C2mOnxR3K11bYsMifl{CeBRouJ6qxxm3 zpsKtXx!rg~jXPeV>1w;7Wmys`d*EE5xKax57?lc-cRHb`BA3 zYj?q@p9R7NU8WV2Lb5Q)Pk|lUd-#JVuF*wJIat`b3ugN@@dfA1E3Snd!V1+XP++P< zq}JZ1bMKwR#vgWp;DHCpKWkIbKmH0{rI-o@3sZ@~qdHpHbrYLLb8yCB3)y&efY{BU zcuHm}jJdyq3^jMt%z=75=^+QUuc$tIL@Ko&Gs zIN)rT4$?m5EPle??|SU-FZ5SES)T4(evbK*yyiIL`Ty$4!|&O+#FP25y$RkllaP!Z z>xiMgGTZ07VXJo)#HKkM7qRzo?g5Hb%F4()ubFT%W8B4<7p9 znzTH!@4+E*aIOv*WS0wF*BvHJm&Rg~={hiRSvbA7V-JZs{sE^ z6Bk8k!>sQCI81*r`7hg&HiYTG;I&`nTG{K!WXBgMJVXZq8-l58<}xy?sTzj`YlBM% z<4!qDCYc?Ua66dwtE__P`Bg@w?L-N_8=?U|j`h?=VHEkEX#}sr)L^B-SZXxyBwwOf z$b5dP(D7i{yC!2QzxL;S?*2Ho|2-2(zZs3=E2|4|$3zuKbI}lNUj0xgGn~tHO;&-S znSr$0pk7#9bPRh;XMON~V?o%jE1plL&fu2LQihvj18Lv0GA6k>ioeWJg6kWN1vy&n zg421kI9qm~aGeuKj}1N%{CjW=Z(;kSBZle%^^A#}?)TkXW-{|*T?nKx!PB_z;R3ud zMFGCM|Mvc4S-=$>Xy^W=F<-jrSenG>Mv7(5;-;RYlUUp3(fhchdqzT24fTc4kwepfDSBEgr8-1Zk0>tbG7cf zP&0eZN(sW3))jIgA7@deWlD@qVOzdqB$KnxIgi|zD#6P)V{zQd-P|0n3AA~MGOWqj zU(Q{c#bx_Y6vg<2ix!W?KXfy=4*Os_p6%O*OPk6=@Q(9^h=mnaaID5v(8n`9>gicMaei#XM_Dhs{GOLMo>Kcf}%)Zl(n zAU50U$o*ODOs!_C!x0fv;e~x41*wU{=*Xg1_JO-MHMb=l?A;$P7@++e1&rRZwt0)OW`Ms*DqQcfX7Xd;;L(n>6u_H zu=0%*J}|!^Sb9_rX9s9O?#2LIw?~xQu~47Nvi|wWjOjwx`NsuKj0<|1`Imaf2jEiG zVL{e7Z8|hY2f`iVh39`95)}5R;h8QvaLY6R=X(7Tq)t|+3+#2l>-1uwYT+Tlp?g|5 z&q^0Q4f^BXi~k4$W0h&LsUB==tHq*m#{|=&p3-i80|=`3Xa4jx!qQptbcvQBJbqA% zeP%oozPEfzpQ;$c_)q@$e%UHMk}A>j@+L6jPc1$)YCnJX;&Zx2$_)CF18{VI5C0-d zm%b4kY}>9(yXu_QMhUa5+k}C&Q92QRZ(;xRyE= z-Kc8w2S;L^di1*EtKt4Go zBO!av84SkfzIhY9*X!xvPa8=2`oTMbF;EAa-f)xt*uWmUKq_SzL4H5T$KU>1!_bXM zf>Taz$-Qk>qj$GoZK zCvqg(91ithx+eYufAWhhj+|=-FK?-H4`1Eq+rLWD;1n~Msf4NO-M749vJMtmZ3=~B zO*mhzd;D=<9Xh<3&EtX*JyiFWpXMQrukAMhgXk*i@$f#c{-^`HpEiQK5~>w?u{r#~ zYF9|VrVk>LRrDYqDwO+j58q+);|v#$%4MAvp@S3yxi$f#x-wB-2^GD3bT3L$1+C_w)iB z6DJQv1?L5=@`;S!E+F~~Ss!)0KMjtGMG+IWU|r@fE%itg$PcYTCKs*vJIh&KHzO2V z8>~Wmf9$58R>{Nq!ymkxKFmcaVQ;zc40-t55{##M$0E;z8LZ!`00++`d4))fL(5Dy zqGRki!Y2q9I7XvW;nV5)3`GdAI9=X-%O4GAR3phXiZId~h|g^gL$l4isoP4{uU}Ay zmltyATk!z3TB-sb@c}qXTN6!TdxqRJRap42mN9x{(Ce6|^mmdvWY6-)MqBT3y%D3R zOsob3#ns|(GjDT7FWTswSz0jXq95LCxPWWD)K79IYr_j8_V4*XF8A|Y>Jp_3^Mm|w z-Lou#MBXFvEJzQG#cQ!kz#nh_Y0cEj#{dkR{jkriTH(=(cGBd@-VZXhIO6Rn-b%cM zdN97PV!R*j5@zv=Z=Mo48xyGYsKt&*jPl#um66JhVtS)B-eeD4_XtyRwxnV{} zOId^DL>*xkF(VfX2GQ41*06st5QhxtkSj+Joy0!R2TD(s&sDb}4??QZb+*3}H3-5d z15JpZ{S>F&nu&Yaczw~L5fT0>wmT&m7M2oVd6^^_Bfz8 zQ9IalIs~(LDoI~M;k~m{F8vy<16o?jfIpf!i2iOwypTKFsL=^kD zjVP^P{^Wf=wEJr)TKRW8-p%@%65_3bbUFjoAKptIZB=0W20!ZmA{tc*((yvZf3Dtk zOmKB_5{fyZM{eiI!@);k__0Wp2Dc|5!L`9kdX3oKRqW$WUCI5RU#n z-$@%zDZ;r!ecrQoxT7`FA35!_jFjxopu;~!uC^os;|mj7s{bg z3m&7qlPb`b8HjfosH1VWU1`E`=IglPDttgB5tk*7TaTzh_xb?r;;)Qi=IPT(d1|2Z zvKIej8A-XDz4YB~4fwUuAE&8SaW;!bQ!AEFT)(;&mnU52{H}M<(rj&5((Q-u%Z%eL zfB#DK*Xe)`SBqCnvgRI*z0daTdSI5#_9Dhgf>{c$$SAfy_+eIylTIEiQ}w?`ZzLMR z$2ESqF=7;Ne)a`9JJ$%L+-k9Vq7^@GcPq`9ZUV>e_~F|p^7vU0XTlW85#XsgC6Fr zVZ1m9C+u?~T5Ct+dQWR8T^NY7cysdOfivUZ*ub`y7v%v%u4Jv+W8~#(19Iob;+P;? zA|)9?H#pmZ^-HmGpQ{2gx%wn}>|_h*a}aKEcPFp?l4!M)9k_``djIVWB1w@^sM(qA zmqSDF{@eb!9|599^w8m5v>VQ0DEG4@bV8$c%;Pa#X<58`BRJ7`?7NHEfe ziJ8S@-i!6i^`rf%_8%Z->07W%pe>aAJ}ppfB^c3>PlJb0*qA zLTIyKUYrh@GcA{7&ai>k&wXf%oDrFIY$`5@wT68jp9NcPDG=K?lsKna!><;g;WIRd zNsA9IUTFoc)1Mi&U=(@H zx8i+mrV!MlQgMEIJ>O;Q1eabheg@AqN3eI@Z8U7g^4)orlww(qMAYJVcWs!%{L*WyvN`E- z)hIDg3#@A@>Dqbwxwm5*aZI!ZJpE5VwVT^Hj}4EJFqY-b)!F&R`7L*6)_wdeT@^eU zIl3rK4XH05LEf1vV4Yh<&ule7fj7Fb{ca^#_yW-nn|;yEr5f1ym?DI_s&f9jBT(;A z3EIc_6WbzyK6~bec0YB;(xnPeEBqx`y>L95=-5I=hyoZ_{igb9-u5?Gm)5Ov80haG+ z3dXPIdZKHt8FUrfkI%e))2qqN4CPcUN1xd9+ngZmW@e3|o9EE!@0ss;Ty%M|l_t_* ze9VvmCD2P6i?2Hypznu+sLwmbgBAZ({?tnWEk5%c)xA*$mnnhRb&Mu@Gvr8PUa~xn z6bREzq>&(%ag%#hK!02SR{o`m;sdp5`(st;YpBJlH%24R9Z#rLyE^<1_s4Es4P4xF zF=}>C17^q6;tg-Fb5DZWXkxtzCiOneVAhg4j=t+djAt%4-Jw@o6Vtj zXD$A+X2h< z7SxULoE1vcg{SseGDqb%t)7b)ff7tAqi;dLK|4voLBDYY){5GRv?!J%wOXf zgxBscC(D;lqb|v|pceJp!|3Z6=04blIQIN+Sun0iaVCY&meMxHuh_o&ym$SmK=Mq- z1Z6I?gC|WP_->sqnQyg?-b=Lyih&l>=Jv1{RyD+zfLBC;XPPtg&n*c z*dqAv0L%MatmIc_*un2kKia@prOU)Jv1*nrX!Tzgp0#H41Q9NvR*lR;T_mZ9-3PsZ zPME7t5{%vOnR0f2e5cI$Fb0j0P@Imdvw~lim}+NgleO#g@Br&up6)Q=bpFbbF{--s z>oZHR(?wJ!PMds+lE5!NT0n(u6}?xkKn_fKi0_TC`)!{}#axSSeo){Hg>oiv^L8aY zw`e>+WnKfmsb>VK%LO!b{wZPJhe}k%{An)_RnkcpgN0+Z)?y2!4>P9PGwY4ezXQU6Yv;+ zyrm3=x7g3u?1?;Is9^OvC9s;P!I|y|Kq~#xRPQ1Ce5wHzW_qE~Z=CSfr;2cJn+Uh{ zLJ-Qj+(qv9DMC!T50#Pzbi_3ZuV(%m|Ml&HO-G}Up~VsM=Qq3W^!ifiB_ZhS&Q#pS z_C?YU&I*dR%tXIaUCA;j1-5_kr+>dpMc+I2n2PJ?3s`DX{KRFg{j26+N_GPhV;)!r+T)uij|^$Y}pk zG)G4fwxkDPJsg4(i(}|zZ6#Q9CcAu5iU<1g@fMn@r39cp7VEcRG??Z?U#qkEQiG;Y zB-Ih!c>W#rs3*So_y7HRo`cG^g`P~qst-;Da8IL)wma;7mq~G_&d#$(fLwYr2@eNb>{;>xC ze0-1>-O)%7TrmgLNq#tH>LdPBS2vkZXaSRbYjJRQKd)VTpN5^Vf-+-&JY$juSv~td zqIB3A#+27$(~U-C*tdtmKDK{C0r>L)f3l`blcw#o1B(!Mq2}!0&F6;@K*iZnG6x#t5J!*)c@x^adQpeU7Zc|VLwqiV(Hc^gBr%NI+#cq^&OC7eDR?#1}is;n72RN%< z6=whAs7I+2>iH~&4|S-3VJUlm+6&M%qh4(JN(rWhVQO_N1|2SBKC91);C)AiySH`$ zYX1A3Tw(nP&5uB%g>#WSn*)eTC_?dv=Yq-e7o)H9E)g*WMc9?+OQ&p2M)EAD>%ra+ zZ_Zt0!tJ%_@+%)AtIvEn_Tktfa22Y(aGJ)ND8j$9^8}gdvr$FAH2=Xu5ny8|{u3L6 z2K4t(V;d!iZ2Rr~pIs2D`_RS}*eStmu@Jl|ECdbaZlLe&l_9iD!u#WGH+04+5#>23 z!;8WoOk%vyZPoeI%z^nx+k(qo-7L}O`YXuPUIiNC#^O>-2jn&_h-$F?^->2Bp`5z` zdYbzRZMIT{`(xPoCdv|VuJ&}0<^Aeh>afyMZDdvUhE6rofZxgixFfEg%K3f>a7W^TUg6{5;=VC;&y8D+zj@H`Qrhd`+UM3cE0L1hae$4UrD~< zpN{RJliQikMKu7oA5tgZMbzjx)~DLx9VYz77+ix_WHB^bfth08-UAi^O&n=1Ej38|L-xdCMfGg*(_lMhBn$08E%lr>1L|a+D zNW)?3oVd!4GHb1hYoIP2y5%o;^z#Hv>GP4Gus!($Xw4{?jGp+(_O(OOj-SWs3#UM*Ft5Y769Je}5p>&jc?^p{%N zlBtAe9pgYevVo*e8q2u$hIszXVf>D}PXg_Bl-pdg#%I24z_P*jN$fX&oZ04pU%>`0 zXK@4ZT~x#7RE~K0``I+3{1(|L3)tY24UUN%Motu%LPd6^d6Y@UkADw8dY&5ItLZ}TLhQeO3{TE zzv$c7*O&)z59}W(Kpr2ULO%8d!tskB#XS?nym(3zKZ@f6@_XRaz#KGjk6T5(i7vkV zD-E`qSfaRVO*Agr0mr`F4a%jGXnwz4#gnW+Jfk!XLg;bMtC~`=lBt+9?S|3u{@ko` ztBRtYH0*US4HWavlpB`ZraoC4@sHZwkew{cS3k3?aM#MkUIl4D%}e;2Kq38eB@dUi z?PfEakNm?Bn+oZGQ&_n*4fc<=CnuIw(Z;H4As6`gQap7LF)AlEM|5IXF|?OVXmF-0KX+gS zsl_m)a)fBT_)Smkdxo`V1FTiLO4j~`UGa-l`acl}WRBL{UH6Dg(r$95TO9VO z3GwG856EgCU%cnG1h_EamSq}Eol{Pzx0^Ie0@uLSsC{zFpdlWx zQ`1gum|KtWp!a=pC|V3pZqk8wj4L&HR5NLv6--Ae^dPas7i&nhk+=m}sJ~1f7980r z^h~%<{y3k-?rh((?@|DkaH=Ld)6U%fcEtcPr`;=$a;+wU+)en!B?Gv#I0)Ni-y$vY zD~RnSLud`%=6!OcoQQ9T!aFV-f>SViZx&r6B6gp!M6m%#mnI98Pn{s{9qPEO)Bt?@ z+5PMEVG?wu4GV;fH+qQ|oG#r;!n+$#eU(0__WIDk;%w5^&*OK@50b05w?vdB^mcFS?}!K~@RjEP(D z@EBD%(#vrhltlzzq`vZ+%;&vwG)EVRUiZGCvjrzdt3a|Q$4x1EEWpd&@yi)sE6$vw zM>OgMKV!GzQ|ZcZK+lWi^t`#)!}a`P=G#3J&r$zw7w!`CXN2xi0?n7Moa66J+~Lo; z{M8dmFu#SPt4y-Ep~Jhd#8pMO6k*3jXq0d@k^REELUtaRis+^HMO@$c19(xR0?Zm? z!Zo)()fB@)2PZ?8MrZ#_|lp?Tuj#lded124vno69IZIc zO}}*qt?^P}@0JLhZF7}tl?bG#d|02=r%15!%ucT4TQ@orqzaoPBJgIb0xn^vCsm15 zgA?D53A9gUaw9F@(ELei(6S*MpO??$iuCNM<#ct3>CYAXxv`WRw{#S4XZ!M$QQ>%e z&MvNIz6t%s_D@xd*9tBhFW?@3P{1JC%aCT1Q($uxF zQo1IHXocZ-c{yB%m;#ktp#}aE8gT%>fa_K4rirU{pz~xX9-ekb(0EUr)~(fr9=k^D z@^^}0(Y;RExIrJ5uV?$Y!9rnwmk1rsVtpy6M*KASxA2%&7nR&%1S3~Najat&FZ@1= zE@ORj?U{{OZ`mRK{p)V}HP;k2JB8s78+!Q;b0sRd*9>}#8?on}LEhfyC7qsU0d|t% zxO15KF;AG#4Q!rS@b0i+>VLK*;lM9+;iM&ayG7u~awf##GDjzzw*pzOJSx(fN>2L`-TM{%99h;+&lOPN&H!@%-$opzYXiJ6k{haYBs)E3kjJ*nhwSZ5 zr<=KvhvlpXhOFU<;(Si5$e3&>K1(a44JiX6?w~ z-tkIAc9uS^Z()7P>+baCM169xOboleHis|EC_Ub*LL6V-XFrcA{FPO%SpViFe`J9Z z467T1j0mOsf6wQ;^Xl+^M?)C?&y}WDHVOkJ%aLP<0Wg*bjqu(nJU_D<3(}dz)se>q{ben1&m+_?;&mLi)CmDBYbV(c~TfReQ)l?y^kkWZS zp6z-RaM6!{qsQGB-FV_4d zu+a8KDM{Jr662BX%ZbFYae!{Dnoi}}{N>-DD#4`zdvxVx1?o0p`!$Hb`wqIJAd2W- zOJ%5-cSLY1$pSrj@e@_B`_?Y8aQuCu6S_OoguZZ50h|4exO%cF`uO1)eLqGG(po}s zuEam?NX}@wfl10Gl^gNW=zeZnb~_ayO$hiHf<-5trvW)gyf%k=rZyKBkmU}JFG-hj7FMEs4W1}YJ13SEms@Tr00e5PL; z=?yc3OVtgSdr-tn)ZV3S5v)Hf6N+D4_{yKU@{ufJeLpLcMqD#lj4T=IV7@$Su=^5< zuk1A=t1rk<9hL`9JJ*Q+?@B$q^#z?g!w&K+!g2JSi6kk@oEFZp2c=DC1hW6lAugH& z$UDIvnoA?_V8Il!`FRlCn(6@KsyhXXjwg_;TW6SG&jDP*qwuxSb4i~30=i;@Bg8J0 z;0|=8lV3-@km(Lbs2LiE!Eh0&|FMN0%X5O&62_e9mrUYxU=+9Rv=g*Yj#}ntlD`vo z;kPA@@b3xc@`6$cDHA8Qm5#9Fw>KT`UqtRDufSao9H7K~I``aQ7V(&oOTu3{z|?3j zI;(CT$<>~SRfgug(e3oURWsIltHlEPKUrum#^KavW3$>sx#FcLI@8K3dJA$;gXhI)P=%jOf+_;WA zc=k!QztD7}`d3wuQ#wW6lhk16ptib)$wOGA3f-n#XWno1nsK&A4TUKm-F|AakRAe-f3^8 z`FzfOTkWB!WM>navNMV@Lx~XamC>+E>G_=Vm?TLk?Xh*QpaozwU+N=VHDeG8qbGw&RKO znoX>W@2~6k8VSKkVWj`bor2+EO?MvMgeiSB zz}L&0!T#qZp~s?5_WFkrvaWClys%t&9;eK<|1rkj{>^};V+4h++f4jtieodvA?WEo z$rorquVBghJ;Px_f>e5S_AgrA+X`o!HA5Fw5K|`JWQ$a7 zFm+Wp)H~#hL+g5SeYp?z3vY%eFSd)*Mz%9$9XlMS5dm}Nbcw_Jsk2Y|_L#b>8TxAc z5Z~T>$jnR}arv_d7}LXw_lsLHQ%fiOq`O)2hw~LKKKM&a?VJz{q9AsU4NWo#WIOqN zo-#_5Ovvj?duuck2fm-qj*N!lg-&$V-8kkaaY4l&k0sZ00%_=!LJ~jN1z&9#0!Q}u zqdhv(m_oEGF8HV@OnVbTwaojHYl*Hn@pTMr9zU3NP0VMKNp2Xk!CY`w9Z7AU#0a<2 z+_1rhu;zb>G<6L(nk?quKh;+lHE941cvvAOtaC+`LlQ;|2T{41xnR1(1>3ho3SL_7 z^uNhN==_5&7&G*n4`5V*W4ey)quS*g}EVHCHeah&wYtATh4qz1z?C8@$L*UV4 zCwvi^DLe?*r%v-*>4@)6xIopPS)4GZ8|L}Kc~vLOPRyektrryd9%)%1floAA~K2h z4X<2J*}?b};mrdP%%hF)Prf&sz5TdwYwcbVGtCeqZ&3ES{Sqt^FkxVzPf zIL&{-4)c9;KmLA^O_e9bu0~AKsfVhm&5%ClgOI!X9(&ehfJytpVbr|}p)63IMLadc zY@KEpShGpcEN)}UFN{&j=Qib0*2355_w@KH6RhiOg16iQ`dsfCd;7)=t8RpW?J?_y zPQ52|@OyKVZ*79F*zXu)?JoS~i{$$Ix5s*Ka#4d>jtt<#JSIl`^a5eq7h0W*DI2Jx*-i5_=nVLIHQM06et<^(1>7xCF;AN z&gs*VCw7CW;@;E5i2K*9^P}O%6oGnv8No8`T(NA=TS?`uD7r{*1^MFcitug-yv+@z zhrZ5ZrU7nf(Mv)6T|cMR_7AY7KD(a7uD{GRZB zU$-oQP3NB<8n1<_nQoXcYoPGp+6a1dj3M=3ndo@aLE{p4zV^3$)oRu5WO_5iJ&29YUF>eU

5L@r$q17A^Akt|O#&zyrc-XFC(ryqOwv=0fn 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

k-^tXSRxF>~gbP|N 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 z z)z@Zk?%Uw2{XCa!s60KoNCC`vzcga~TSECONhDg(Y*-fzU9M40F)~VCVY7iq8oU!7hDURNBjg5D36bC0?1od)b4E5BhyCIDd zMZTMR#rbK0i?6Z2Sq{Q{zw@wWw;n!@3S%+>8-=++l|=m~Y%(p{V&1+}WUw zA0C9UJ~5Akj=fh&Oaa$74QOILlRgPG6PuwZM+5z;!`b|&x}-MjJ^9P^fhsGT*xbqH zBu={%{>)HC+4cyQ(KM9Q=BvQ3WEC7@-ON4&Mv^e6=P-6WzsC=aV*PsNkO|o?uq09u z`}kOks@coQk*znV>kxjQSBYl&`xlbwX0b59O99^m3=#jn%Oz^@%V-+snOeMzVYTB{ zkR#8Q!V67#Ojt5mRNuOeObDqK?@7ty_`SZc@#I<(o4tv-e3ZvEoy){8;xeLGQYjR7 z$>Zs>-tcqRauPRc8JlxS0neAL7gK67$ZY*ZWYKX29QxH0lq9o>^y;xpf0H6U<*)A# z(Fvq_bt8GdND*^`J>dA1G?KKD`|Kwxp|(DS#k?N>+5Lj87^Z^cs2gZ2_>diERM|UQ zRXmU=LeP8%lHT6IycE=NS+Xlg>&lVLtk<;9d#)e7D}e<$|Ab=xIr6+k6I187z=kp= zxE!nFxuaURa*hPt!Yc%?9~ap8LLF3YaR$Y#1fjWcA2rC(ML!P-!1Q3jHB4l&Vfx(9 z?hKvnyZ!S%Z=hQp4RD2q1i}Ln{HxZUV=EMl&@R*&=3Q7I`N($+rEj<%PE!KI#vPHo z+kTF%ZZyH#>CWIXKST_RE2b@nP4Oe|f0`aAh=VglrnJf&4R7%Nj2;)C#gx$-DHf

o}Z=f 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%0DU)+h@e8BBMAv@D`ry!TFnuEpcI00zTB_ z#R=!{Y-mIuVB=#wTR=6=v*&T~dRjIJ@8_JOL!<6OdPr$FAI+6nt%24XA zi!ytlT0D=taWK9X5QX!$Rq;Yx8Jx}2 ziH}1R4(`~%;xbe~=k@@4wqQ8kVJwN;wy40ZGpWRoGpBAGSj2SCabNrSkErXDGyXX` zA7A17kroNlNd8|B9K1T7C2&5*+x^ec5I1xDPo)mevR8*Jn-mhYzz$E_KZ@mrYJhTi zC-*?=Vd*;`*t|JfFhgQ0xmWxQsp;4=sbX#T>Do!Y$F(Afpl7VPRu?>clgXe{%h13V zT^4;;4?aKbAeYm^(Z9w%mcY-C_8Up0H?7F;&uJBw&d-mUrVb+6TIQ=H`+ynwn!u)p zB+{ApL8SCSi7CeLegC!&@}<;DxFgZa9xO74TfdV?e(!E!Z?Oh5{m%kc%5;*XMU_I$ z(Z_5N=b343OC}MLzXbI%Q?~S>H7KWdlEwGssK4xM*2eddUoD?XGICw$iVQC%Yi$n= zj~*k@PfV|b+`^NB?fJfT3TZy#MR(bUGjCp>3@mz!{$!7#c9*wf@9hq-&OVhy%^yxD ztIlTaB1brO_y_7f5kYN}T=Cu~eE(=q8fmc{PiMVe#gzHHSS?HvEB8;M&!Sz?c`s-9 z8)MDFC8yE5vRg?TKR-_0m&M{EfHObeEO80h}~WMZT32*&oBxIW*BYHFXMTShy=10!>`o9}Dxbs9rdavh*{ zs2+YA>m2MBm#%9?wf=&2zN#HQPx&r6K4gR3dE&{Sp({QTHhWx_seaG*Q_c^;x_=5AJC@gn(+rtgnG%(4*n|xWt+`*hlFfQ4L*MDv zkh_8<{AKduAh$b$?r?L+{bmL^>6I+LCYJX<%E?$)Q;^&%FHUmq6P?j8fy0?bux})P z{*}-AReF|^?jr^uvqxTRCLe&Je;b2WALo}$tz^giThLR@a-yrJ1MedZm{9o-4gN6# zkK}xZ;MPj^=bRMYqg+i4)@g#5zag_vG{tA%t-;zCHQ;<$72CxbY5J=e*~|GcWR?-z zm*|g48pV2UYH;au71R3?f@8(k$gflt*mmETZK|7r+13nlY2Rdgz~LZk z)K-NIIce-Nz?BUJ%R~{JM=^3rIteW!c&XiHCdyQU0LOo5CgBnp~+$noDZmdNkdz5kzY+ipiD2ld#1 zl>s>N^JSau0+d_T$Nr5m0>jzZX<)G5gKo-6V2ZM?s3`YEaO(-6{fEXAT^FwB{7i(M4%E`LA0 zxZVxbmsv9FfM8m=J`5_$U9tGD9+^&u&}E4a=)_)E+-GdTcBS~!ZfSS0GIYhUvrI^L z^Z;6VOp&b)b;Yi0X3Sz9(h+Ml;oou>Y^<;(@s*y`{e>OVIM4O+bW^5i??;y&d`0l3 zGiF~YV~4K}rZwlT!+tX-d~amJI#21*zvd-m1=o|`IhV1G`RepfRy9oC%JWDn#_UPR zGqHEl3UcI{9d;dbC+)HwV(pxCX7kSub+|8Rj7A^Yq2o4~#<=ke?@M@kmJO`(6EEo`$wG@1K(V-zLV_k{{Wc~{n)0|qEQKg&+g>iJRs8eKrI(gW`fa)5#)3GVb&g?j<3x6krZ`zlJ$FAby_n2`RB}l zymM|uu3rxOx<>=|8%U88%k_!NzDnWqB@Ijsm=0H?4M~LA8up`C6SI@Q3yOpLk)Tb4 zWUKS@nk2%?J_=;fu~as6ur^-0@LtHD@LKpbkuwLmUUqftG-!|dCLG%z%bZs0VDH^t z;q&7=!jkY3GMnH3r>sqYg}sl2^g|)+?QNb1+y6um##|EaoNOj;A9YcuE*@SOGz*_R zeHhi|^G;W%plN$f_%-Y!(e~2Ew>t4KA?=!Qpj6Kr4*-SRhPqf5FaY8llsi zIJmdmPq-Cj!qy)$MmIjc9I;gs*6n}79!t1i*E|kT^+QE;sV<9n%=uYU=eYIL)?u~ik{@fmxIm`wxXUD-`?;24UZ_YBObAEqx zD_nTeA?7r^WQAGwSQ#1*y3tzvzVFTs7CB%~#3MnHX+d)*bdi-!4!Axs0Uqzsr%C^Y zvyLy0cxl8-VRVr_?Rs29Tn(LY(WYr2RbxRl1LK&KuQS(sKMA^>o>VxMN?JL8=3-4E z)XTcjIP0Zs;8qt@Y5z~K3ksmu@AM%B7hSMgYX+nj`_fD1TUcc`_osZ5A*uo6sMF$) z-k%kCzIxqEm}NYU2HWSdhXdTv!BCOx_M1zOnMzUBsqT1Tk~Pb2o=0!mE`-xt-7xL1 zI!XFIiJCZVrfSp;hm>0~x;=pgY>ecb4c@<=qDK->Mp7a8E(c+_VT!E1%iR z$^CQx_Lz{uPa~o@pzz8GgUwBu z`~fE#q|-@`@$)D&uZ+djThbL@ufoVE2dsE!%zm58&<|nxWX=|QYzcEAOS^xF1%u;Q z&lP*L>}Sl1H>lEg+RKRRAD)NID`j=ZP-A9=8+;Tc+3T*0+PsTI zdLqAnC!A$!Pe+M?>N{cHUQ;|~peV`ne^Nd5E!RFdKPeB-vhT@zeH@=|0~bw0JguiF zS@?lG05QVAFH^F99#?`DS*;%}~m8~fT3o7Uyz!#!l@$136L7pBZTb1soN|CfYq z51hEsOo0TdS7Oeol@zLc}5;joKhrNgEx?}<;t|< zfjllqo(Y|e>&Wqu2ieKKium=dG|9?MCvm?&`D}Jo#Nh|0gVK-;a>#fClOCsp4UfMI zy{VJQg-c$fa2fyie3}OLtl~-hv{_6lkMk({y%yeujV40uadP0MGEU^rU){YZ;_5Jh zeSOFMfMu=F=TaaUU;UBEY4Z8)Er0$s&B=gO+y^>91Gj3l@;*OJa;~6+X7K=RS@?+V59fw;tbuXaAL@E;mVPJbWXV*t{>9^rjb!Xz>vG_ zPaEes7EXcr!w>m9(0faBzVZHb&lcEq*V>1SZ({X2CYYJc{Ubvws`JM6QZmpKhYe`~ z#Zi64ko!$+{TOpptC<4&nX5%vosZNj-2yL6Yk`cbyTyjm7WQ?A75?*|3e#HK#i(K# z7IOao`-2uxe(_$+_|(B3w%Fo4?Ks$KZA2|@=rH_dhr0&0f|I!&^`p<3y1pZ(c*g@O zh0<0pH}=Zg2_LL{EZkCyrmsHVBmX8jVL){P%$*%h_a%>J*H$}YOxat(+#rrlIkA&8 zoOZ?!L5U!5H<4%JxN;TI%0f#zA44Y!cK9<!^%yHZW z-WSF1Un3wvoaT`a+3(G8&U(K8S^TN`eY^<(jqQp~X zh*0Hjg2jjRF~O^p6&PI>9>tu5e>{6x`=24ZG47i%wab#^YUyJCgQYCH<3FMHPcgg; z>!^Hv?zuyc|r8*n3@yp?)EfX_1zLoG?M>>N^EVZ&T^s^TYEb9Vm9Wb$2CAI8_I z;Bab0R=l4@%og@xu0K`Kw7`P>*fEv32MFNnsDfV{bja@GbBSq475#653f_;fVjtXQ zl3VYlz`G5~s5euUY;#>g;wDd~D=sSIjPxXUc5yy2+nUezKjFNZFgeopB8JQn*N87v zIPb512FUM>CVs*$_H?is?pE$YqR;u0&YEn&Z7S~vjhYTqt%j1n|JJb3EOos0{+n>V z!*1|_tAWpNO;NrtjsQx^7v z^BktM!WBPt`gr;)w#Cp9Ll(z_Z0$h0uy_EgBu-e}@I;6kJd`R|G!dCNC;WLQ0Svo* z=+{{htalxsXKLRHS?5A&n$J%1ne&@YdL_b%tATWJXev8)*9EHre+qN8qG?9716lLi z1!c}phY4q+sHZ{}GvNK{7aFC>xZK(F@&_5=>qs}09%#!lzRaR$W4FPeMXo5nRe^YS zjG@loUx?m$uDCeYnyI;rqb3WN!diZQm=~z=t_*)VXjGrH??5$YVs~~#Hhx?e^ zT(BophZGMUM6aKyrgJ8{;F{YO%&wA9eOH9YZO+(wfZrwNxKiT%jn-f0`|K6w%r3}_ z-db-7F+9KYU!@t@5a>j0V)WQTJ7)yJjE#&NOvi4Pg_AK(IN#+Qt2yLM9jlt*%Qgqp z|8Bzj36CBV@^4-%OOD)RSNEKyz zJ-Z4%&9cRmUq)>4^iDA=d@%_*VS~N*+{xgCJ7Q&N27AK!eTxSgu?OdVibG}(B2kCc zsp$kKYFOo3U3YajJ)x{khwq=q5`HFEH=JAu)){tmvpo@@0L7nxgSi2Z!(u? zzwsAJnjT!NoG|u(Y`koYyL^I%EU;?^Ukm29=2<@1R ziCHPsZeloF8j%myeX?+~^$IGs$w~fg4l&MO- z`CNnMdsEO>`Xa5_xsyeEH-Z3esQ2tL)j8E6-V@s3`pT*3`?rSLYLzj0|898nj^AlW zGxeWPN_U4mhv$Ri5O1{50X5A`ef)bESnQ65InU^26C)Nl^BW9`{R_*kzNTq~E#%Ph z-_X9o1COkELA6{G*pbjaXf7>7zdKIO*ac=pFNnxCL z=TA%HclQqZAkm8@B&y@w?xR3*p3t9_x#UJ)O>6@hES}j-P2-la+7sG1Xu)yVw)-U= zk|-?*LAto~rxX|kyrjeCt%Ha+oNs2D2YD;IXwdpqRBneps<`)s&nA!QpQK^nBN$-Q z`IC^~^?>d^EXV#mH^hw5a^RBJMJ>PoBc3~raK`7w^w_!wREVgBX8}eyI7JcCpWmSS zijs)lS0jAjm_pBPsiU(O9E0prMyM*gl1bK7-Uhlf%i3yilJuhtLQx6D7e3#_p2UX%3`;r(>LMYz>W9)q#KQ)26iLq zx?oor^^fQ2)G}G_K%_loPoYrM!H)DWYI4Ys%Jor${fl)l=Kf-q;G#w&tnR_uA=-F! zKrk&{^+3Gv_Z?~G{;;QC7BTgNYvOy~dg!juL<1p+mRwjP<~ueJ(?yyHlNYh;$uq?4 z%h%xb5Dh$?K8!kL+^KF_Q$@sI>iAA`5!-TgcQr|^h1b=bPt!P*{<#t8qn2=ve9Tls zP+7!EZy)rz;a&@Npo)`+4x^JILIl})6-4fz3cB-LqF?I_;m((<@J6DHx_1NVpjysj z&%Z%JS14o3-9^m&S*;Lo^%ku4Rl=f`BWRy3(j;l*3!*5cgr1+YVPm}#8NJ(ul`}JtHB?#k7pW!=%MABcqXL~-b0Qs>1H8YK1drUG^xVHO#_77MtvIkRvQDn z3&AGBUNCjcXD5zxzvT*5I65xF$9Ly1Q7Kvvz0C{ZC64qd?mfZG)eTURs0ueRI*YPlnfoj&bZ&=v;M}Y;Zq32-c$4#lFxwW7owU~ zK}|1PRCY9=Do0H56aV?<58fqCxmC#CMVX`QI5p^WzbzgK3ZgSqEzt8)A!ItVi1WoV zrptK^lXTRf?u;xgU$Ta-S;qS-U5a4FFD0tyA+q4XHW;g}0aVwKK5iF#BYG;*O647IYwqnTRp_?j`DKUIaP zaD8qg*V1Ej?P=RZ4QR==Md0U%MY1t1_+rcSC)%N8bTEy(;Xvi1K9Fc5JABum1LK^{ zY4lNFX2kn14;~msXYO*N)ssci&F?p6ee__yvOPuR7|uc9dFk`MG<*9Hs*mf)GR{Md z3ebl~o&)Iq&iO3ii9L2L@u3Gk2T>(rK&G9v$JcK%xW8p6b$W9I4$iW}pyq+}xE1f8 z%X{RL>|uxB4yCh)I~?iG1>0ft56(Y-?@qT{YtdiPhs8394GvhA#@343bnNf7Aj|df zm7glX{t1S=6$uV_~#FI?+|hZbDd?L4*vRUPxUta z6ZXAWMz;z&IC}X!);0dC(9n|s_OjYozulSok5?tR-`(hY?j5@{H;skeRU~z>Yhmmj zO?yC;+;vF_;f`&yO(52E}G^*hYjcNS`DOMjtwM=1>ru=UaOHik99xrut8173Is|gvjdnJka zt%i=WdLaGEpRC*+!wN;tm%2KPJ{Zrlb8d`GUCN)=b2>1Q_x(&B1?-=ofq5T;X;YO0 zx#|0zsQjmn*Hg5iJKd70RB7P3x1;EZBevv|g&wR~z@KkVEodw6Po~((vG<-_ z|8hD5JumFY2d_KK_q`U5`mO;k!(_>je zu-;xw&zk6A3l_nS2WNzh63X&;zh6*-IyCyn2^ZzI(*@ZE*!i~*lAZ+%15GN}wICxj zlvamG^8%kQ`YWlClrawLDumNbD}0uWxWIHPOz>H^8hoA~R-KVJpW<9oeAHP8a;LUd z&v3ZF2HTtCzu#)Gb(oL%M0o{W^T-_ie-*;=no;7`bLFgVuO)^@se?wrF>%GQY`P)b z3MGSz;DTMTnEhU4iHbHD@_~PU?kll(U;%wyYlBHUih%h15cR%YVdb33`0};}*c~;Z z&%>H%l$Sm3IzN_rf3u?X@|=tJ*$$t7(1en39r`k&4^!YgxDzCtk^(b&X{sq`&#^~C zC2iRGSCeYw8?YU`AHl6Fl*WxP<9%$h(D$W1mRst8=4Nd=q}GGI%y+1^&-IBQ2w89oum zcWU#%U=~^MSh~FSP(HyOsQrMcb2yx*)Z`kK)hGiE!*a)gCZdU&YmVHcc@6r@@pd@a{ zPR@zm)nJ6)Cp*~XCuu$bhu_0+&c`F0Q`nR-QNkw5InguqapKhu7Ot~FNQw9a%7b;$ z{dWqBI?^h{jtA(L(LrzRPS&mcMY!+s6BagU;=@~WSyQhCsZAOUz6Uk1y~{qlzc5 zxl=Wd(IjQ-Npbo{RlIsWot;@1MzZGY0M~F8OfMZoBTN#>A4Y@Tek%v^Uu1pUu#Em7|o07PHOBJ_{3ZMap{mBfu<3x)0Eo7iB zoUtB3X3P&};ZIa?`PbnTKY5XPlO7Y9W2#u%tqro@{7A8$Guu9e_vOZh(HxHfqB)f=@SW-pRmCskQ|hZ@!uMA9zT0p#j+C&=geTkv2_kbdh&{#|`S8za>5d|nYe zX!jz&FI;0clr=H*p*rNN84y7#pAO>wzcAMvLc06 z4AQ}xU4^ixty?HCEn&aj>f+2_s&M^wz9180NB^AA!>>Xis2Lp{GSR_Yh0YHOJlUD)9Z!<7##94Wd+}1$sO# zfTulgs>duo%+lq#KB1-xw^vORBgG;ynDO&Ru8_ZHlVSChuYLXpo-aD;{5H`>R?^ipRU|;n&vNZ!GOXdn3y(%nwr(I z5>L*<^U{Q=qb5+>e^2Ore)k%n5lQdH$I<6|?IDck0fyCU!I$S_X!0CwwseL&vc^z) z>Dm<9M?n@o+q&bzi8^pWC5pc58pJH0yW_L1f%HXj0$up`8rgf&9lyNSg#ncl>4&lj z?ACM-ykqN2i>;EWyw3^}=IDX8ALp}u(lhC4p$NSA_rIGngkDPkD1+)gDiJX=#7@NH|qJ8eMUWLOPrMvOnD-yBR*ox}f?}SNe0MF)b_a zM~xeuank*H?4YX|ttnXw!#EFP(=P{V+@nYfg_-oxRGu%r!RLc5YBV1cA;H-Z_kXmZ zI|F`+9u`Mw@OKCFX_?DvcF53hlW>r$wa0sbmej56nTR`YP=joH%=(DA^VuPOs_T;I~$*Uprcb%amJ_aP~d_sg%F!|-~xAQ;O-T!ud9{kOBo z>^$LMc_#$%eyU8ZWVYD-ji45x4V$!eFw~}l-T&H$4Bht>*7xxF=4&#;EL*}muHkg4 z25J>{u*cs$iKq7m7`2@Hmp$gPJ=3GfL*D@C3{l0Bd)72gHi_(Bd4?M6@%?grDm$YS zPqw!u!hX(kSeE2OVM_+tePaZb6ex4QSsK$@lS&f)tp(jQC6t}mpN219O%BETi89_w zC^y&;Hve5k?zrZ#8UK{<p;ieG%+-fK2C3w%+!Cg?p7TLVed)8l zu_VKO9ZBTfZHsT~LJ{wi(YX-CIUXuFQ!9ur7#L0t9=%PL~j1oAFz0K1&U z?|YnWF!*aQS^q)~jE1Y=gG*YF)iRdo#%VEc&YzfV7)dP@gUQVc_Hc&#qjwI|gwa{! z$d9mR^aamzN*^nN{;^@CW8O7(e~>zkyP^*Cpeu2r$EeK*b!_-r2*HN-dyYAQMIliRX54U#Kx^JyC|f-H&{Jz-Av=B@@&NDFCfAJwBD2x3gc&6vK*@p=8n# z@5tpUocm*jk9-OsNxIzotxpcSZ)<@|PbkBAo6Xe&6pVzfb_)#jD*($+YpW~Da#+Py z?su+L2J|u)|KxW2Jm>u~wlM{8D>+{!=H!a$|`W@RHpb(X|VU!LR);2RREZr zDQ14(!z`!Rqtgl%Aoq*KKaaFTKOF~*Z76`oh_j;6lU%murXyZASB3repNJ|KE5y_l zPAKJA2$36~i_#5w?C>BLeDP5g*45{*jsO+SEByZy&%$%CR)J|`tpY#qu_UM85=xBesbY&*(_HYoV=?%mIE7O>2 z^in!KcpY5q_QYfS`CI*PI&Hc*f_9wp#I)>YAPiQ_}il@`O&dcm4#LvEm;L zM|a%lG?&3He&;*o4-b{x@RO1mJuYoQkA}XbKkmEYweQJn*9u4aN8cXw@?G%OXhZr@ z#e{z6dc}nd7yNX44qI`|o~{X3g-Gt#v|8HEn$d&?d9}e`9Y-8~d^VGO`YOhFyd?TB z?D6Q|2kdKbkJ!j_FmjdL&vD;Wa?bylxPGWBvQ1Vv>f{4f{px0Q$J$!Ro@9YtmrNzi zGpKj7n=>+=KcA4xxlCH=LfxerIN8@2-=3Jo>SHQ|U%`}jY#U1>AQ+@B^6L!S~0U=+dmkWXFr4)cBkV=jo=gsD1Ov z!JF$KW{EONSN5m5j;BGINO(xqgf5 zal!g9{n>ny#(9?ITUGEwtRL0Yjwf4>ZXs=)$LVoE7ZTVEGGRdk%hgathqrt;&^wOw zQ*9&1n^o|#v<`e*FoleAb7PaYsp6{vVbmo(f@GDca2|mwCe7CZ>zlFU&39#HrKE=8 zgU^7`>IjlO{w~Y8#(8G1HDGF)JE^|dN++!3`u&C?_-tcOJngSAc^@sTIjasawelo6 z)wD8#9LU2uxCQIBa*rp=Ro)y(#+r1mY?Z70up5Hg`@%eB2!b`$XqY`$*NFNR5 z)p&k=gJ7!WOds;RQb0%{eA}{8IFxsaP0cdI>04Ey(OFNJuP03(pb=IY7s7@s%7WaX z6YSYnW85F23Y$)<_?$Fr6BUX~@Una%XkTyhmg_mjo=i2vXrc<@?fuotBX5hJ^~`aj zY9ZXQF0A&BJI*@lE%0cZD)hJFRYua!MWZ#A_}rxsRz(Ggr}a*WGf=lGm*^p9q8uM`z_%%84epOfMG}4gfT5{oCEjP)HJ5dI_n~o85uERAhb{{(saoeF@xZ(~>M`C92T0FllBN&hlm7sI zTiarjwHfX4yCaUZctce`*TQj%G8 z+A{H@U<|`!EpSwy4mKt|RNRvK7>+ud;X~PEcBFW2b%hI`vw!n_S5G_3aSpE{54vFA zEuI(oHiuPh?jtO#)&S`PhIsu$J2Q847rOs+!`dW$eBhJJzFj#iOyC*UT|@M+)xLv8 zsZ|B=$DO&XwYEN)pX=4hr==LPKW!}(` zs*dgFEopv(KRGLPl~SUP{cTd>y+L%y~R$DR6(Ktv%iE6-t^PZ=gf(s^Yq=dEA#B zNNhgLhvtJSc=Wjo9kL>t3~JD%PSaG-wO=~hxosS|*0l-lIxC~7H-Mi0IETC$V_xm? zna^{N4IqZiA-Qw6Foz0djDPG+e;JP>#jlmf#7xcu3)F|nFDDS)&;=|IRdBzWAFVVG zBw-#K$+A8w`1+PEH0Os9+dWZiHP5@Bx)n(KEcGT8nK#JuRVuh=h7Jgu{mH8rgPFCz zDjx6&rT1Dr36n^}4JlO&(c=4=5Fk!zhAe`qqWkJ_I`4xA8Pa10K})zEP^$@_s(=){ z|3$61KOyFA5yX@ZAn@ciYx$^-mUA^A{G}F&4ZlSH6mnkJ_#*g^dyFUjkuc9`THK$k z4o*@X!u|W(sgkKS-haVCV!n++soOdS>t8C zpR3#TNIaS`pT6Y$;y?05urBqL2(pzdqQjQ=d8ot0yPDKA^)Ow((+*2{PE%=s0bP<% z%dEm2Fuzs(W}athvh`5Z{9pw#Gdh@M z^ER5AoPp5}MzFNhQL;{-=l1^Oc-(!O2d6|=l11PD@#Imy*dNZne*^-?rLhX zsF5AcEr;iIz9=<#C%sZ6&(1|kz~k3E+)})c(xhkXhSCif6z+%83Psd;xEG75Yl2mq z(|G3V9JPD@mxZit=Ut(GXk1@MRmxHr33>wOr>Nte_+}cv=AKZf(hGM_`}53F6P^8S z59@dDJ@}ex;F|@Vbhm;LmCySMg`N^#L8x#wQeb%7cfxGM+>L+?=8tJ?5qm?rwiUWcI*Zc{C< zLF`Q+*DKZrgU9i^l=$Wo+h83u>bKdaE4Yc)8We+MlnxrM7|HpqHT0j#X5nU(E_Pjh z?$fv6GM$;l`(&o*qN@LBc<6tTE*j}d_ay0|{Sy;GyH5r6)`|nK1$t<=T3{OAifLT= zcX+dw_q!em6xys0(BbJ0(6mbzvpv1pk=UJdbJs&yoUem=sl2!&cNI0i?TL4*v@l%o zVwq(j)agzg^l9Y%Lkg>e=1M2(apV-|pYcAq-a$<7w>5pETL~pUx!+ht!tTV%(QaF7 z+{5+S8TSXWK426w;*n)hW;@F+0Fx_M6=uZpgc|$8TJfA9J$JWE!^xjF;cbdB@Xme)>z@p={1nXy}Fr1QNyavljTTrb|ycOX0EQ|q0r zcmfvjK20>+E&Pn{BY3wz7nU`0K7rjp_TsRjFl|d7>%eTD&fnw9erD#7vy}L_tC;MdQ2$&tqfqI zjz8STf<|bi07RdeyYhV5ztO^k4@U%6VhHy^1KYNbfv~fcLfrvH_AyKo^$dfA7psm7 z24n4^i|dD@K1agsR3)DX5N0iDVplSCFf1$*X0IG2%Hfr8&h9?fxL!Ym?qSUwsmig8K zL(3u|_P=g1W9>Vd&iexNKh?ud{#iR<6%$G`-M5!EbJVC6=(I47k60&8u# zzxWYzceckzXU4+8@?ffFW5vpd0|wb92~AhV(L<3RNb+djx5oc}y6nQJp4L$IAl?zn z3|9(^@5NHt=V!>ug^swqbUa*s5=H0IX{>vT6FOvX5n2Lf(%mG2tUcj`lSf2DqS`ci zKXVOx%k!yg*nUCZe=%)vS}B}uamFF5Jz3KCg|w0FfS2!_@Y8>%ge#F#so%Cr@w0+6 zUTyJUjjr*u*kmO{avpHPiwlC+x-j}8VHQme;C{ehcQ)52lFqQ60(Ja;VbXG0=rhuf zepppbZ}NG>rQMY|oET2?$N0jpBMum?Sugnb4WVzgex)}rJK(a#E=-~oK)?U60NP`Z z4S`i`i|HWx^h+0X$#P!2r8C2MnpD@bFZVrgKGw{~LVcGUZD{S!4)A`RDdtXWyo)Za z|Ik6UrSU!pw@PL=RfVpqzXqB6tZ-P8swB?3Lwvo|3Bx(h$edNMQP-kHzsDj>d0~pb zhN()@uh&-h<=Wi`Rb$lOU%@#ouYF1-l@P;u8LBHCSWx_Ip~-tENr*MTVKo)J7jKm? zg7>t}SfhtqJ~^ErKNa%r@@@Fad30q*omgsLS7JWm6B+8Ofi8Wk*t`pa$zY2Ippl@4mc7nQCoP(+ zn4|-eb*lLGK$GB*m`I)-?aRzgsp7(wuI#~$7;^Ni7hLAN@uIp~VdS~wNrO&Wb@rGn-cVqwsh6oN4Y>?Cr(aq}r*X2=*) zTX#V`&3SyxXdsf%*idT$JeDz0DV_`vT@dYW^q>oukP3&%v`{E8mrcj-@O{RDsnu8T`?d7 z*2c2Oe>72{XStB0Bu}C&&y#50*Ecg{99a9R5rfJ=_RdBdH@!;{cAx(%e71Z<%>M6( z8WRQS;qt^g*@G?M`>3hiQ-lflML5&i7cye`{cgrsu(;Hh$mp4{!^yf>Jh1`VV?PL% zTHUO7nLd`U90S{bpAyI{nBUHkvnX*Xo@%Z^FO*Rr)tvbcXZkja)Wcu7_p*I5dFk zfBP%hjt)!Ot<}VN{to#2fg>y5)`!+yYb15c?D4SIYr$#NC(-BONS1Vh_a%REU~ZKP zG%w&3>AuPLA4e*f{aXZ3!3 ze;;hm#wEQF*RLZap5F&=wwAMft=(eN%TsW5hb8)4QIU9EKP^tNF~PT#cPM0*v$iBf z(bn=P4Cpn%3#U2%%TcBJOM@ZyXc}SKjB@t4(^A-&bQofZ0lqz}B56up!)FyE?47QQ zANH2BKd)a1vrim{XF1xK(PYQ2TdNYY+5ARWt%Xji6>OKD1_`--2441P;GZ^ocJY}r zahFdfx0N(-=AjCfa>|1Q466cX&ckr!TnDZBqsWp`#Ux{bD%OWqa{gcx35ve~dc6O@ zcCQob%%4wWJ3o-L<4Wj0s9mtIS;0N%W-Rua5;n)Vu*@xK#7xEmxstL_op@26JP6SQs4dmz8Lrm^~A`XJX!ue10$%KK)KC8|vqWd+@1%w5} z>T?#`cv}f)TIUF>oTrkm6ON>|M+r>~Ccwbm31m@SGRym^jD*im(wX6;rSTxSt*V0i zHjabZ%j3wCs8CkQ{QyBGbA_ifg2;xO-Q@W|?hjCpg4Gj8ljS8&>_w0oI&5lyX-E7? z2DotmFDU zpI@xTGz!9yTTI-khu3Q(Ks|J;5H#^BU2}}{8|~_W^j#`koOp#@EHT8E;SsR@>|Y;g zo3r$h$oIGZ-GEr%&VDLkK0W+> zXd40ZN?b&6ETBU^@VMcLtuShidsgw1MB(ZVqrn!{3qc(c6;xI{v2SL!I!Q zQv-AdI@7x^+S%Jk7mRZr3ovpNJ@ZSC-AHi7z2oDAx{Mgw_(>X`&3DD)rBQtEH<}LK zHiVt$=fSM2i-q8p$#ijA4Y`u*hPuLdFjg5)6A#9)O=a$!Z6`YXOaJ{{`L#vWKkA2m#d=v5xr ztye3sbF*pM9!7JHdf=b6t}HQ<`+r@BfD7*rzj3aLJy zg8@HV4RF=$a+bmQ8%J*+2Gw{y{4m3gc}@RMsG8j^T;qA7J$K95&J-y!;o>Q9xu}ga zoS(1BM&y)&FRAL%!g*sV*wA5Sq^a{9+?UnFkW>ejqAZZWQ#s_Tiw1UmtYF`}{YcO9 z%dnj5Nq_1c*@f0Ar1E(^=~|?U!@M2~R+=-3xTZgQk*kVNQk#KrcJL`n}q#5MF0CwF+9EaARKelgXRw z;jk(|8Rd3V3AwxG61FLu-|?04Td)T^e=muw8#y0l^StNJzGsC0HZ3D9;}odTekB~S zU?SYSy@V*AKFGq(D`U_0L&ERsII?L>na`PeWsKl_aTC{g65Ex<&OcMZeur{|zGfrI z(n&T%>W>Pp6DGj^L_TRC^)*zo1C*B$Uekz-gBHLZnZ^O z1FL*zhUXVYg3n_I(X{<3P5NVwdFAyWvph_kU){u1l&!G1DH7Th3&i{9KT{VYYh3@e z9=>H!F-yOVCG-2joAfa-UbYWSRFY>?yg84C_YQ3ARidSjy4Z2fhDn2J;K)} zTl~)N&-3b4fArkXxv%m0ygz<)it11{ocl@74PGtu^opc5+3QFjDL>xz9p?-$MoX3*VPn*)cN@cT{4 zlkI(&PU)6>aQ1h>iV>%T>nh1KvR7|fm&|#i+3sv+@eq2d{{q;P>5Reas)U*?rjPUZjN}Cb_gn`ooK~Z12#L!5sTHG*kKKS8s6R; zyyiM!(#~oYw8w=;U2O&3y>@8Tz4?GRvf3O6oiW85uPWIXrzet`3%O2>&-3R!QI^&ejH;f!*A$g{8Def{ zCHvbpNZ330IE;4C$IWk*rK5N4=6UyKSj9c;k=j+vp6A6>jy?l(7inSQEjzYyyAk=s zGj~T6YGT!nDyA~noIKrH4cD91`F`J?bDojBx>rmFd{)C`pK3OtaUfBi(g;SJZ*e-+ zk&&|#$!NDO(kQ6lm6P{{F+4A7(GP2;&Gm+E{hV3!zOiK9FJ0Kj_c0Zjt-|&CX(VV` zFLv#SGM+!>!fZ3flct#h_+8?DaJLIW`jS~>@}X)P`Ai8LQ{31_^$c=i(pcEsO9_{4 zEfX5_7ZbBbBWSjX67EeO39rx0BRTd(?2*4RJ_tT0eEBev6l`4}&QIq0$XcF{aCQXA zJiCq6O;bUmgS!N^7op^1>n>pk?>A)!rb65FF!DZpC9B%U_1Q!6g`J`9#nT~Whyy_LehC7clzvX8`azF17fP#E82NA&)3z9G-+`w}`wIB%^- z%;wx63jHSR}HFL>gpi4hA1gWdomzK=Iy7DNl* z54#4*n^eiHrw@5fvkvD$B|~@19U=T%KNdDp7js{=z-#XdLTKMxY|>PHR6d;qc{+=P zk@@dv%0dJ5<@bxAHAE;AuQBNwBg_g;f{wf+fxm4#seOSlwl8S`tJZ+Py|Gig*cs)E zj#pdRL7pf6@M;pg-+f(l)%rpu?`=@=PYbvzKNp?O+-Ayu?J#0nGIWjBqU-7vn5~Kf z7SFl{pXZy>*FPV#ViP`};q##%^Fru8bxY>J{oxObrU?62#?uq0Kaozp4=ynt3b*ct zQJMR}%zFs0mojsN4Ks&Ov$ZAULOSQ|>_~z2LwJ2PYCP*%>WU-huNSmekEOu@qsZJH zt~kyt6~eSf(r@RNvlFM?aIw!W;nCkr8me$aaA|PEV$qW=9yycpA{k70znA>$nD8Sx zg>KT_Al~}L^J;i~ihXtTV3o=gfW< zdvkrIGics$!t3cb1?MJP>Jp;FUVe7MYqd_SwwEWZdZ!MJJl}799Op+3w&nUFTju8P zgwmCc?1tz?l?J~fM@Kqh@1$zB1{|s53%)B@VUKPh4(!!O1sZ+1oP-~@!{&x6Hs@p? z`lX6O&~+QU6lKru9=sx+(p*P2a6MMc%Wpz{j#Rv+Je{eS+TiA$b_{mD5P!?3kl=7@ zEd5i-dVRSsN^7sAtvJpYU-OM}ZR zYx?arLR-#wU%0iBZC&Ipl$ss^4?P1M(5Nh(@M*nJF`WD7gLQFjV&6+C>dq6k^XlGs9|Bpw6|mQ~N@0=XIaX*(=Dh&Q_Bsp?m1#2i!!A}7j zg#Mj_NJjl&GWx6vPA^M=wdOHotL!9JcZt_SN0tfoH38(!-4kT#T~#cP8w!z|1`r3Y zaHjW84Rbe76ABKx6T`YLVj#o$LOp{aw=;k|lW}0ZH8gPI`fG4^fHS!j_l(tBXrZ($ z8SI|Pkx5&XnY<_8CGz>vC{xaJvbn=1^Uv$ur6d>~#xp%DKhe1fdU$1j3-tSVSjahg zjdgN9yN+!V=pGm#gw4H8&3O-RG=a~zV@-uU>zmm7g~mAIb|O5_{TwiI&1KrM#ssTl zTj1sXr&ST>8rg)MW_YzV5dyaK5+9^B(txApc%09-6&IL`X}>PB@1>R)qmcx*%9};| z7j4wC&I<2rYJrHiheX{eEo@vXe}4BT!HS}1Vvgw>8q9fp{a&}gt?X~&M3q}?{5yNp zotq4viNzbs)i9qv z?%4_o*WK`Pd$C~8`5s>S6{5-;o{x3coeh37o_0kqgDL&p(DO>U;1(E1e_5o{rB-e@ zDaMU`f1N}hPaFg7oCmK^S0_Y&8$iG7SJL*euGrP-!UjY{P|JluuyBh7`TR{obb9C} z_RPK^jJj=3=C#MO!Hez0hi-=;&s?3{Cs*0wqU92qa|XEM;cMIT5>@ zmI@j2kXhCM!E;>U_L?#6EKm&kues{@bc2 z-SS2x_jYCCEF(*L{BsLizx5e8o9TiYYN1s1_F&ey=pT`MxeGHL2UDfpt;{c54x&Q` z;I(nt)MmvnmiShe?{Rx!&GQvBRppR4HP!<3rmlu3r7Nj{ygS%b+k)qYHbFyJNDY)E z@DlAn%RhzfiycW9B|5>Kx0XP5_klUNarAk06&%gCf$c{hQ_b)0)a|e`zjLi%BIg#( zE|jGkCs)91FJo}N-(O7r@0xgg1>ZTz8N-E+CG5kGDdLcJg7zPEA@|5H*4IWYAZEHE z9(b(`o#&02_QF7+u~k6V3kop0@hY3S?Y8jCdpZVf?hT%W*3#K4eaV)Gf!KcNKXP;E zVODuKi+meCjb~ClAnoxQ(w)r*$lsY8@k?L>nJ%9!jVo;-dWWXso7h4!Ozb5+n*W8& zu-J&7*KZ_i-wu=-ol%2dI#aRx;%MS+`Gy53{=1=;z#Wp%sqJ%DDL&gw$+v5bhmHxR_#tODa^nI|7P*S&)e*(GoSfg_Q!@BpycvsMR1Gm!Q!%|Qgi?6NCcnP` zW}^e}XX6z5y#UzVaaZ8a%Bh&ve?Hx){g<_N+=T9{0XXc=Ci=W|0y~<}3C3pf=-;!8 zIu9nKwdFBXBnM)iUIG2szJ_TVL356H>;I74roEcF>75Z_`<@$bTU40(1E}o|Os#nFA9u+WmZ4G_+j6Yii>L{;h11DG3 z(Dif`+@7j|8LKKeGyg1&EKH-vgSAj`j~z(WO6kWv$*{mc8y9o#)S->X>93Q|Xzmvs z{G{#(amHupogQOYd`%a9dey*!<|4Z7xh*?>LLWygb%yiH&(QYy*9pxtz!82Dh#7i< zrj?Ck{nCuE;Ik`i^gd7b{0t{TgfVVo=fwlwCH(U^2n(Ey@yJ3C(4SmLKUQCod{8sN zo*4&4pGcd{HfSFaKVrz^6tN?3VL|Uxi!g z)q}TaK&dIlzyh)EznydhwFB?{rsz0m2)pmFnc6iyfOqRmaL3dXarE6K^fmiJ_AW5N z)RD<7U4ITOOTP?FoS(Ynzd&)Q++aHWaUrSYHOCrhBI`9XmNsWrz~2}n{Pf*Y)IxWf znLdy_4l?4I6A3IX+L?YGTLhh6JfkM;Doa?YLD!n`d9*#B_Y8<%VQe=HHRbu( z_nMikut{7wQU~X2>)?T+ICfm7mdn7l!D&TpTs8lPWI)~iDzmOL60w&yZrU8j)Z?+b z)o?2)ald;(>JN!ZVnv|s<`RkVdrdrZG>*N#R2q2p=T=C1u7Q(Q_DDn>KSA@<-x}9@ z8rc0Tj?c+LOmS=I`s(N)C8xzkKHLe%peD^>X*C+Q@P!ccC zVnXh&QqV zr-r*Mt;LIruM55Eqlobm?l09RFtV^iI6HkN_wn-idZfEJz^PP_o3NVv9?N;}69rJ| zMTLTwW0-jo-+wg)ir-{+35iLC#4uC?dtC{HVGhTHn5-nWz>Di4UWJN72d@;$=TlN+ zrOElHfpB&4R-w5poTY1N;k1|0VzK6AVPo!1(oa?kA2bC(^PH7})o{X$zGz`iPm;JU zDO%{O`jXf_)xxGx0Z;(5jSs1-X2jdF;Ves`tp+nJ%{o{Fivvy1rPb8QKy{{<3p=@20jrRvP zt5yJZp6{f6ffXz2&i+2_p3MwsTFt?8Z-XGxy#UEpZ0XO@ztPch_t49i* z^DTw36?fRDdq!v{=Lex9ngf=vkm2kUV|0Bbg^!^NYqaj)VofEc__VJdXl>OKhbGFf zA>6MP`CAHZM+S(Gm)~Knc^3FN*$={a*2Hq||E-&CiIqOJ;E^T~1neqF*X?cXrlQ2gA)A{sst{9e4qE$AF#3)?MiWA4&3kbaOx0|a|P(EH}6Ov zK0p8ag0oj{_NBjXBLkj4_ik61xYmjLWkW8I)bFvhO$oXwS7`#SIp8 zZQu29I?oP2pSd9!Jz9w-K9`}9Id(Ytb_|RDqC%4mbKu52TQrO=k?6ka7JK`q(wa=p z4|^WX_8#sL{~MYC*_`*Yu4S9#)2}6}#dFf%Q-;Y*mbqEUrH*c6Q&Urb$*jKQxkE{a!1|`T4`e zI7>Y8%0v=4_=qUVbkiNtmN>X4f=#(sA!c|uf!%T5k?q$|!@>nv>{u!taG{&!%5zHs5Z(wn{9_$V=!t0AJv-R$Ufse;O zh16gJ42B4{=Fd3cZixY04ARHu1DDw*SS#pGeZke2y68|6!EP1b6l4xt!9PIG@3c4Ig{>->D}L&zg54 zgXj%hMW*t6t4ZEGcV&kz`O-FmCG$*?xF-X|#y5RQnnyWlJH+$E+yg;yR3=kLhOudU zUpcZMLCoCsOUPLBm=x#mHw^^9uke1PaiTj@;(2_{8Dqp+=a0gI3R%$O`+fBx{&1_T zH_0Dk%#tE?P(r7RO9S5uR@r(G!2QWDX8D1Ad~fovNuDKI>f(#1Qdqd{z0h~nEw({L zADi-h;c(Ciq1o{*UG`HScdnAcz2Q5B6FDuc^%>u%{q_Mn4@aT=avSY`%?MQzq%doq zybyTrGP_!7g2v@OF#D=XK)>A$^u!^~s}GXGrq+s@<>`%V;5u^*sq%q=3v|T&HjUJF zjs*rKOJVU)AJM|3iFJ>%!gyIcIfb03OS+-_YmG@Pvjl&*djmp_RE5H7b&oQ-yHDY_zdxgh70ZcUK8A( zIpElH{yb;Kf?jj8W{xk*JPvEuVfE;NjVrew*z;S+DI;3v!J>4 z?`f==Beu3gu*Ts|wBE-S{uw*qp&?~8!fzAW-Js6gjT|uVz#vvv=s-0sm0_ZxJ8o|O;5g@x7|#l4Eu(&k>s-3XXd@e3<`5Ndru(IMFDaOfH|BZL+ryY6&kJpG zuO%L)d_MH0fw`ahE?z!Z3s1}~aa_E%)IhFA?9IKi6RgcJdUFFCu4E*ZDOZ82y$O1G zYD*1e^(C<`HfZN;h~^6$nCToB;ih>7D7x$8^8jt>&E=bgpB*;%$4dt) z2ORNJ!q<{v5{;OJr22X@9mMB3jY`o>#wLq&cc*~9t0MLaI4U_3w4B6$UPu?)DWcY$ z7#2U5^IXGnK-OFVZ!12Q)c;*W-aRT6mGu-bxEA5M{u+`{znv{nR>Vh>RK-4I0SWqC zB=qgAh=-mN=>BgZv3BPAl&^}|sO%&@$H`>2_bigg^_E+l1(4C3N=n9#U~U~sSX~t+ zZqH67k1H>b$jeIDwJ`v4g2s{mj`%U%N@c9q9V4nQOd@AT%Yyw;Wz_BE4_X?d$O|tW z_G7aO=KYbvUFAfg)qRJ}=6sP0*}gC_$Ca$}c|{|5KK!0oDXj6aAr0-9nOveKt_L4j zqScS&4=Saxfm(Q{fdPHdBV19WtkhBmAH{it&g43wx9%F+ps0&m#xhtmqe8gHb6{=0 z=;7BRUXYSAU(kOvgpRtWkKKk08spN0-GOJAQk@}+-d^x&_ou-9oo=+M$Ozwmq0kX~ zEAZ*X6YSpx6Fl3?3pSp$tFCx$LepmRe&7}5_urhF$?Q1WoNA6&`g(!KkMENE$!7E) z&sdQELE&7hoY-!3k|o$$@p+;bG$v+?RWH4$BHzz!v1HIWak)qy^E|h18=O?`1tr64 zMEBPtsNsEET#~_{&HbYIMX#J~zi5vg}kaOCYCwb6`wBk1!av$8h-0FO-yvdmw);FHN%bh&FK7XrJME6=ln+Y&o{yyFGPyLO$Q_FnquHCj@$~$)6fivOhELro6&52nbVaSu2$pUXOrMQ1guB~$ zzKGLhHua1*RV(d;wCzsV_gy$ES*<~HGJcaBo>$WE(vd9SN? zNf+He)w4COuY@t&hdrW68|9XTvi?I=$>1}C$n6#_{5Gk9txVM3 z?E6Iros%-xqMJ)4;WTzi2CJH%jaJgLpKl~Uf z@%)=h8g*J|_H_mPsS(YrpD!bh>xKa~%j0H~V#$@AYe{gw*);c(JWlu>!*p!($ezc` z;DIQIPGXnj*V-+_rh9{U_`Dpd&PNElwVB+bTUb@GJi3-?iM{n!5yKr%g`0cjF>Nsc zg@DyWZRLD6dZPjsPW2T3E?z*MF4;h2mnooDVIa)b%pq5{#xsvhMU+X57h&!U(tFSY zk~c;Xb)NWxL&7|=YmYsf6RU(Fqidl+noeXkK4$L&RPd0UADq4sMtU#q!-{NF@yi}5 zG)D`>ZDT8QQddW_Mjvp{H6(MMG*R>4>Ud8^3a|QT5-XhxO#iti*Q0m?zI`dUdhMpC zu4>`EH4JQbbPCfhR)XBJ=j3y2#R^-T`OFK>47(-5jj2>Q z!wx6rF*w)uP&}}^lHEvjz#AvL;bM~#9eSgH4hwX|x?c?TcWKbq%j#ILl{20!@qx4V z-D$3O12t4}!R8H8NV(!qQwCgP3xBxc{vKc0cqNs}?f6IkK6At2cV~zf`%I*NoDHCb z&%2#=_=EkK6zZm6$x<0-JI)>=`c_Y*uYKPW4}RY`IS0ahejnYj4`Y}2df?$}f{02} z>5TD3NPPNG($Yl(y&0{ku{c{@3)Em6+FQNvwewL8~~uDi@WTPM(rKhMC@jq~|=eR72F3wIMGnBeM+yQ`pjd6qdH z(BQ;u`Ppp(uWz`XLH6-8@}7I(XAEp)i|uUay1GWV>h6F6PGM}JM?YH8bDCIs+2aA) zzz)s-E8hDqff2r3?@0!-u%rv(H_1x!BESY)e)tDIDXSFaUd?3tzy=dHg|f*(55=j^ zVo0A5YwY+{&kSX6i~X!mg6kkl{KW6Kk9a`L8exKlv1a(^Xg%{Pcqze4N5CxE1n*0= zq$8VLYw86fT%Br&^LEy=LH`6{@QTAwGKSZ8Oe)2q@521B zB3Ln13+01DSzM$JIrqtf#Aa$@Mq~q9_E4WF$d$sGIb7d4bRavK>O*$TT0^wvbG^^g z24-Rey`@Xke2xL6s>b~mz|LF335=T<1DkB#THk$7dPwJMIDv^W`zUIZ4vvkw-SmT&HX2$fL+P zz_JP}Nk>`=OqeN$oqdWV%BAaxs>xhhF+~pVeT`w${nwI5h08!|Tz_=j+9g?Au#LpN z$QL_P`lD7h!r>=d$?St$*t-}xT&<%mR@&qdzm_gRCRh&pWf8E7T|-tC&SOixe5xpre4Jixb4=S6L+D*JCoFuL3$X`orc|i^#C? zd|&*9^ZVm!Vb01KX6R%_s|Mc!cO&@Cvv-bAfuYT^@K9}V5|O8DVc z&JGUM#_xx{z;@>u;p@&J^bY9YepLn)y^aYH9;ewvYdy5>?*(riMhXu1%;+se{ybc# za4I@p*mkjqUHD{xFA6)GoHHB;tHOBt)J;8QndQHFc zkHp?bOwjKrg;gzLP06n#EQjYGH7xT4mGv^>W629~;B<3bS3zO5C@+qif0TVl;`%D) z2{(>pi3X4Q)85>#-^K6G?Bz?urGCemp_vWtar1&Jlgq`$4!o!2ehpc^4qrS)6srfF zWgFhvVcA_TxR}!|u3J8Z_i*+Yx|YGqJG>rjs$^}VBhIDXa68F}{!`mavyM6;$H~Lj z%@%a!s|##pz6;hp_JK)t18D!T*XXW!oPTsu3RS%$Y1#AZ+?U~w&m;Wc@AM3=XX?is z<2>+N|8%j;HJkHoHDDIMU-Wwgfb5cVS`_ER@_2oidn{J`5;l(xF7F`!^gU6gIuJVd z%%G;?}EDyWdm z;q3Rf52L8P)B|l#Mzip&@pR0AN#I)T&iCyrBxW)R)ZptW`tiIw_A-fLK5w`lKQ0^$_-x~j$r<+2~=jQC9FTe^Qn_AGym#Pdc^t>R2+B453Yll zX~4V#5UXDrd^ ziauuY`YkZ;mvC=#8F=x1OYrQ0EYIA4Obp8>**A31`b7hq-eyYnjgdlRJLl1F4P%%I z#PXVym~j7o^@>I|*f@-Ym~o#4=iQ(C8qT6VOd>{xJ!HxqHIy5-qDEgelPpLxVEVV! z(62CpwUtdE3(i}@zniM)RqZ6nXyN(v&;O%qudAX?LKHJfOC$Fx2SLae(e{--YCx^V%~IsT4gL6dP%Z=^Kw$z%Z5&p_f7{b=@eZs!#LE>2(Z<1|wnJh@) z-qh^@U}ZE5O4@Qb#Q(efOz+RBg=ZV)M{NZScA9uG=*HvK~GT zJ zK*u1mK7x)q)XX%-6bhlXrr0wqojTvvl|C`gsweG!)J?Q?b5QBOzw~h0HMZfs z3b@TeJXXP(p2AQz5>23ToeZ9oRboRfY!rX5wu74*tKifaCH7j|6J9)b1{t+hp{`ku zJ^NfPrcZH!ky|C;6(r9V`nrJof8Ow}Pk->a)R!GzUJdj1`2n82N}Wpn(3PK*alvLj z157>6oPNKck3UsFY_ls&7#}5Mr`(}KIkR|zk{j%PI*yIHRZD-pBS@D!!dTDO>|W+! zI%^Tv$hcU*zb$WQj@f!j8w4!5X$opi%#_u)#a3eMz{7D9v1WCJ}6bZ8&r=s@Nd&F0`%VbuX zlD{4KXqeGNzRh-#+J0O>S`QUr>ax>ht!k!psnL1ju__;zeON^n95Iz@RXrw8Mi*g5 zQ!3e{F;RNnQjyOl^08&1I_dLMTiW!>9E$ylP~*=9Va)H5QpXbl&(CcbC7A=pX9V_>+;(Z6fDLWs_C#2CY$Bm=|`<#L^t{E5`vVrD5 zKgG6XltV?1KicT+q52VPsrelds>?Ib>Ha<%VsnY-(>H*M>I86_}eM=Q9TEHx7 zDvpXQrNI^t**W_=(Ccgfo>09+qhC9-9;2n#>AFuJg}tVqpwdXd=WAQ3W%3U8!D7wa%jlwpfQ>?N)_zl zRPTpFAJAv!n_waL^U3>HaUIPK8u!P}S0kO&8`+J2K>D;&Y6fg0FeSq-&yS2*MC z0ng{=^Lk%rnD5+5e-s#k&krqBbCQ5<_hq`a+l7t3!}~i!Hz@tmO3k_}$dxKxe75eK z_%regn+|SPN@6mu8T7va*J08tZ7lh7l{MUtpu6}i z`f#Tv#x6@>b9FW7%HIs;a{sxJx2AYh{iQhJ-3D^*q6W^|7SDcGbc*&BWl&zl^XU@% ziQ3N&iTA6L$+y$$xa4IVyEbN*_=@|_JC5*u@V;M?6)!?Wr(YK2#x6BnHYbkJP9M>K z5YNNf#Ql_)KS-M6cSt_#^(ALksiI6^9Djc=lPs1Vg=vdbu)FDvWK@_<;90wF;cu1- zKK71dCPQNa@8=$ci|NXEEAzcXd7!b7p4N*5j8(>ziE%9HfUU4{OA%Zcs)SVXUE(%l zjX>lL$=w(w{I4mFT{yf^;K3{KBt#L9boCL3A8Qbd#)gw*e?=TKF`mgBye4E6mcn+P zXGIpOif%9ZkQ>D-h=HX7t{Da})?S{>i5|`KMHLY{O~hFR?}bp+Gel8A5wFf5;FkMG zxL_K^a{q8W;4>#NpznP_y|$f{yjR5d0s&GL-U(@WeE#}a2@^i~i_ccH3VF3Zi0=(0 zoZk`%$?4C8m-4o3H}_}!9T6r@J$G3+mZJ<}i83lH1j4A~N5Vii9cFz<1y$!Iibtax zg+vb%h})!sDiHxNX76J`ZbM&Iw?q|(Z5}0BK(k=~)CE3IRmJ_e{xIDCrO=l4nx?0! z;kIw-qQ!=GVe4;%{o$O?RpSRN^o!s&r-5qld@U8lT1cMoOeiV1z{*TD@#HgK=rK7e z9Ev|gwH39Hlu9Akw?K$}Uc+vF)y5TxzF^CbIR z+u<^%mSuvkO?+Xq{%Fzm;u1P%q$yTyl!E@kEb;S`O4b=}jyu-)g3tCcQPQ-TUiRR; z=XNQ4fm*Tg24xS8t+0=mAAJ4uM;zyMmL8So`)vPO*qYOqv#1*w{mS)$=KipEpf$}8 z?4adOZ85vH7H++9rW+#Km<`Vd^d1@jo}0Oz?r}eMk~!ed?nrUv@KoB^PYb4>alrP@ zK=`mCmU>RMW6$?H;#=w=-ug3~+Pl0UJ2yFE#Tc%iXiKDu-y+!G+BIP+Q^|0~&>|Tzdd3X;Me0p1jp2EGA7dH4nnC+^9EPVuoiJFn zSyIdr=vwQ4ffwRRT(Bdye2rp~dx3Oo z`!d*19Ppm`CPs~N!6tz=lZ}N7hBX**QkC`Cr5KW z%CM>YY?K+!wrOb6o-3wc>1u;Yb)y1gBm2=W5xOkM%?6`qhOzVs8r0#aJOp`gKg8Vz zmN~XR-QL^|?%tMoE=XHia^i}Z%4a*W{$`jzy@B~vxQV}}H-j88!6GwlX{kzpfZ$Q1NG6l??9HuHUI4!+sXC_J#<>%z)l@HA$a_4ff%l@AF^v8 z+qeF$Fv|8l856IK$*&q%uigKIC%(=18GgPG)%LlB)1p^VnkqS>mx(}-gK z)leP6{a0D%Bxdo;NMxpsctTLZC$R%y_lq3Tl)H%;cqwE0m^YG*C)0^_!e`;E1K(e5 zM0l<{jWi5jz@D1&dVH@MXJZc|FJG-930f-n`!jz&vquq~<3m_he^tC%YA-fM#E?p> ztK{)d6`Ux=s4>=$ z_Jh?cKh&t6s-UfICOE{P7D7%=l_=e~$mgSGXgu2w(iZ!Pwr(}FRL&g#dDp_p@FC(f z?*>-aZGqUz^*NhQh}mzOXxtM^{5ZQ77FX4XO2?a-%r$FVHp?GUp8pnKnsm|85*yCj zs)ao^{b^-rJ5%9$`fplJ!5O#FFOr_Ci8R|&jf^(q z`RXr&;LLw7mbrSC%mXREs4CzTj>Mr9J6C!Y_$IB)Om_>Gbd zu4fK;Buk+WpWiNvVm3Vq^ibJ+sQc@P@3K+i(g)~ikCpW8FGswr9m$?WhtT-oR2cBX z0So`TR`cn$JMI0lmb&tN{kytBEF|BbPIxVV?^k>LcKJy4uuKPf+wvE^*3I+$7KgLT zv%Kh^E;GpHe7?N6Mz(CLEnVO55%_<%!9omUW1jb+#?$-4+@IE1bz3HI_KeSB{Zcok z_{SP&rwnA%hxDg+|2-v{|E$m}se!#-!Skt|nxLkSC2sqtC6!u=V%#4m?36RZ*bnvG zA8#NkX4itXiU|&SswMq9r>90{f&<>yG~|5GdUh{8Kw$eAjL_G|yK14V%xkxxlX-$n zG|@wAjRux_r$`t-{~`?L`%UG-P*yOZi?eSplEb#zIC^RWD^vX@oQQ0Olic4^v3MXm zlW#~`vR;!XydRzMAMgKPSdj|<+feMThIlxPy>tvGv7AFbnfuXaO}*=%oR>(B?NDZ4 z_*p}55ZmPyPUZ)@K)a_3rmR?5GsAi?d2;$5UB>g%l{Q5%`$^Hnpez=0+?3I0g}Ef_ z!w4e2FQ8%0%6$G2#WHRTAunxb!Vr6&S2J(9q_uxKxxdSfnpi2}BR-$mT0Dtts#*h< zCW;uauu^iMWDyaTl}N7gdZ)x_0Q3!7M7|BpXTOz|(8%zUw~r;B>Y6O?h$iE3as)6y5*Hj#j})7sAV@)b%LPgE>2u6;iv^a{`hd}hL~(!AC~CUM65U7h`JdGU zG4}jsfvYqSDPcYH?l$CKtQn z&r$)xR}Z8!KL@anyWFt(zO~rBFqwL6uOlbdyJ3YLzzG^npL-5x8a$iJKutyb5H^aI z)Ga0Dv)wWOG(xuhFgoJ$BBqk=f$#pjmSl~aM*ANAPbeMZf$Dy-?23E_Re!u2#1wbD zqEaT&4^E`3)q5m)3GV#+7tPe3C(@2_YoH*?4RgM(kkq{5_{#}aG(OA?Px?i%X&ymT zGAs++x&J}?o||M(jT8M5luwJm6<5EF;LnK%)h`|b?t%-pgw)lTpgH}xwVr#(xPQHJ z5KFMJr?DRcA;sSrGlm|o9&BttKkWZW-*CN7$fj_XrEf(K=UBi(e|NefEkVVU5Fx|6>JlxpbFxw~B04?byn7eA0KRj{G)7oU){U)9d`1<`v#88nUJ&)YsNsqe7znsGC&@X17Dd>dcSe6I%z_ARAQJJk?n z{{^#L)15-xf^1@!Wx)Bo^=$UDo!8BX9$%iEC{Z^9;w~vYAa}@EMWB~jfw~FKkZD%9rDPefWL&*XD z_g8D27P4k2Vclzlvj?(ChSoA>zMtaGlw7 z@=R(Qf9ROMN9fnpL9H(9qGWI_Tr^!PjQD+-t>pby{Q*BH+OH{$tgfTC4;tVt>spwO zuLGC2U1H*TBa9#K2N?^rYtBVg(%N~(SgT(Pmrff<|JJx^m_N*Y z^HEf|`GmgfZG+>RYQcF)FY5HCjm`OJiw_8|pMorD>JeFX_n{q+I*t=J+;^sL-s(f> zH9I_$83=ak&FOV#Q|8X~zOs&jXf?=%RxAA@R%h+esZf9!T2^%HUVpaxAosW5w-YbC z^Ps)zn~3gK2ki5Jz>!V|`f*n>Gg-y&zZY6!<%2*v?DQ7mwSf0)mI(BpH_g5=lRcR3 zgf3hDNlHT^XzdL*QaFLfuEv}ilf35RM%v%Bj;=?kM3@Btmst!R>DF8AYi$0X83 zzAt}X8_E0|JgLvmG`Q;PfUViul6My7bc6LF+RFJNS!*Mh`gU7-$vzft^M0(NW?Ri& z9bKCGp`8wM=X{^ZgILTSQ+i$38`^n))@R|cs+A_{^wNjk>;gacO$=xH1%~v#kueus;{#rw%~-KnP%~=+^CVq-W5oNfM>m9y;~nHC=PwQ~Y+z5k zo(b*x*C8fV3%5NV$bz~w$T+*-L}sKWx*Iey!_P+KOX59<9<7cae}=K+kC9x=*M>cu zb?I^Vso(B9QKaT*KUT}n|Hchs{WJ!UyXU=N0MD;6>^fG{x+;!Xv|gh-MyaB3J%Z^B z2q!cBk|AV-3X)Ja$%w!dGPyRN(iEP56B)&}=O&VKFJ{9k?k8`&nJ3XQot@d<3%@_A2^*kv*1i!yExLD+h8B1x;wVuB^FfBI^3|3V^ZSK3PAbyX106By#1Lgw2fFmnY} zY#Zq;ew-gpGKJeD^s0jwyVc2`=XaPwjTWYq`$MJaL&2@+6P0p4<+Kg8aQw;@!T4qiJInbz z`d_&I|6QK&#ppWC;PcDlLA6ktKU0`**T}X{Gr-x4{UF5sX<&V;gui1Au~e^?HzUUa zf1ka`a=5;HOS~Tl4R#VsjWRlw^Z6~cYGGCHe96>^i_FT{45y|0fpSlXxO+_%^^iBm zOpjV9Uolq9dR5Q-zH%PR6+c*@b5300*hK4ifA%t~7G}ECii+Es*$m#F_2;^=rsFcS zHn5Af^8W1T-C7v)NS@A^)XtXi{w#A+07P^;(&ILAOs~Km9|ds#h}4HJFVlt#ygzd~ z5eVn&9jJx675l;avubre@yZKd+Uvp>0#kUt#5)1XtzBsQFJv0S9nquEQk=bv(8@6q z@|*W({Cb1(-agcJ=Lj~J^Vb*6R1qf?httygIYh&U>(jO)&m;||8}}?=(T<#N^X!8p zdczRvkk^-#nLFc{C9!PZlO($2-aeS1?}Y8HQptw{0kkqCvznA}=sPjGuOnLAj$(U5Y-pcpIWS(v0c-bkA}VIhRXzEKHA{I*Ge_RxSyf+!3SFKf%6JKgtPx~bl!0_zwaMUY1e7* zz4t&F^}g>*lk~|bA<~}q${tx!QV1b?MP>uh`@S+V5*eqg1`^paL*jRTe}8(U9v#lP z-q(1&p07J9U1GoyXL{n39q8L{8+2N168r8~K@FalxZ8LLn!o!j280+=FV4T0F39&; zxc;%|ea93JezE0zr(jGv_(lBLSAjnGW&?xnU&C!KEux2E1AWqE1<(BTs_*@`UEF`A zFC6GL=kww`a2N@3Yaq*+U-@Z#h#qx$qh)9zNxJW!5cfq-YFL zzCn2Z*mz<7;}&vI#R#VDx`x-CmkMoj?odyO0mK#uq3`@l!mbsaq>q+9$h_k9=S+i; zR^3SDxZkKfE*Mqw)X1BmN>pE82M$DX{al6tIW_$$y=kBYlO_*A6K`Ll5otlQ4K<k(SaNUbBBm#iz`^68c&tx2@gKW{#w+vu2Kg;j26IzL%&oWLWI1(^ z9pX=WnI)0au0?40hx2;kYpWz7p=9@($G$4x)FHomFb!@9<$1(8c=@da);#a3iaP5} z&a5>dkDf`uEFS2|`vXa{<6OMc$oIw1G&$Sej{I1&h77!^0o$x8by@FBHXR&~g-jC$ zsoRPZd0v;+6p_q3tqH7Kpm(-e5+hGPoVZ^L)VjRIa9b^6-uQvsDd6?F-Ity(HYRyi zPB?OvHc0e_i0>@aNobaYCeGpg;X@xP%`zn49&6#cL>;hDxkPK5)JWx_M|gge9>~`X zqSC|$AvNJU%K?4Zwc{ckfBB*?`CB~}xf;S9twB`KS|W@|ZDdRNyuKj(A|3dCyfF3j z4SXPP0xgFI(p^6)e2cDKW}aV6Aj{(-bqbp5Ygc>~JzCA6VC6s>5uH_K(jv0xo93{X z_ctoHE?4!cx{4FeT7v7*fz;zmtaxm~6;`$13OYw$r0QPF#Qe4!Xq;~Y$Mgr$thQ=V zEARo6Tg?3qyDrkx3irewhdXGJZV%GigXr8N%1rL{clK$F1GMqiw{EEpGdTJPErXoE z<-QO7?%1EHWN4uuf8KjG2a50O{8)3YDqUgg48cwU{kX3`D^cToWjz%#EufOPgF zwSW#lo(I2Yca_urQOv*MjQI4NEA;;riV?FT*fQA_w6@Fz>a-?SSstdWX;Unlc+v&( z)(yk^<^gP0dJ;9^`shVpdslsVW&InmOa^xJL7 znm1~*dC~f0rMx{J$TeY&Hy6@zy2?b012)nZE3(*S3ZPW^P*AZ|uV(F);+ZqULGAiN z;jS!H?@hj6rTc0f*lO1f!p<4hKA#s03ye!4NuyBYC&TIwn>|TnKrS3Os>EchW>(*E zT}^5ymBYLHk<2Rvs!O&aX*;+9T(h&8!A=%6=MZzR+HK%dt)L|*?%Wy-1=i}c;?;Gm z8~nr9;P*V(Y9mkA^jKGmfz3kK-XPHL*GZa7ccOWm8}T=p2fvTLAU>c`tvh=$`8|9y zY{6S(e#OY@UnftH3*+a4;`n3aQ`8?kY}7~+dkWyGQz3EJ^sip*BTIkO@&rPk8N{Wf z4Qaa`mAza5>;v~_EE-Uqy4HuSI$fzlV0tespV50W6>WRB$ixtaiLHj^?{$ zK<3qG;j!&?q{&mLM|J_MI&i^vNUB@4qs$6gVUz*72V}%jOKe}$j=@2&V_g|DTD=Zqlsakd zAszTx!I9eU+vL)wBG$ zL3CNG91Kz8%-Gm#towU!-1Arg_I6#PuTIyo*>B}(_X8!kby*K~L|$X_?E~>rBj;5n z-JtI7_3Y~W^?XKF2it}GrWaMmbRRB9ug98T`ly!v5*t}#=S|=DEu2rDA4ZiHH?qya zYpCi=9q^8>qg#*OWFAXrvqK;Bz%p|r{a|>T#rTKOte^V8>Tgl)7d1TV^*3wmZ3K(Q zMNpj=wM@xcLMP~O2I#IMsV z_xz}!nRuFAcT1vQk6A#DM+{x*U(A-M*RZG?mT+?-6T;k&u}yv4>7iGaP+k~E^ZOrU zlY$J;Qo$Ok)9(re0VQmA=NB^H!5ZRbxZ?TLL+t$48hUY<6&zprLfCp@3%h8NO&q3M zf$BhKEc~>I9eI9?25qr~36sAG86K-yS@KCCUbF;L;)p&YSFwnfTd2}Y3z)q69G*Wo zgGm;1?Usf)IL)%h+%$g{|9Lre@iBt|SI(mTZa22;ry|dOH32yrI~;8y%l6+*q3<>s zgNN@~Tr~8l_()zB(k^m7c(5(zXyuBP=Q!v0BhR;ba|WFgM~j*t{?Hkw`q2A<4Qgl% zt6I|&LaR6*U$}J!^S{OW?2P(NM=#KUowsf9z&LjyIVgl4E!KvO&(GkMi_?V4zJI7H z*Oy&%vBf#MH-!ADqiBbmCb(;>lRaDC2$u^EGBv*6UjNw^^`jpX?Mjdqj>lS9c^(Fx+{d}in@x0XR6xw9d zpX8ga#}y|e@Ze>q@FCxV4EfhBs5eO9et0rf(X%G|CN9IRzcgU@nGV6eSe*<@P9#Uo zHDMx6qLcb*lcS4L@vgrXG%b2644wE-_@}XlY)s*N_rOFtQ&oY~bdJIW+1gOj>yc2o z?5!{_>;_Rjt_^2m6X@I3zlC8g6zgtt-k0t@q0q2duv_tw0MA!e$d0Gf?US(cunT_F z(1R(fZwgb+N`-%8lxd_V|Np3pqb;Z22xT2c*fT;OcB(hfHyZZ@2dh?mG|dn`cg9l9 z?rb4&suC_)&;8`pQmQgMO;{ZM5H}n%0bCqQ!~TiBnm7NjeYK{re20`4d5`nGXV!p` zoDa^%$I`6S169}G|6o4ymT-2Ll|PkVDt$6V(p+&k#o__o`}~ctDxLcdnhnzpvwa~#p1B1D7(uM^dHAj|7H``f2Aqj z75O}}t%2^3cVvUC-lC+%1*9?wwD4gV(>LjlWB{gsD;d3rQ+cu`AQ`2A|a>O^`o zax^=5U@RK&3^-Tgc0q4zGCP2)$<{QkpEXFP*+LxCNm_`~_1u4{`dL^PIEQVL{1TEX zJmBV~6#D(zOjcNwk5`&JA*$oAurY2G``p=HmD{@y1b(td>CsiJaPb=2>h1~cvWmp~ z@N5=(B!KCR_XK?_J8a9J$F6m!&@)*cklR~A#_1)qXs#!4;6Fcix(&`Sn8IJ5AN|(m z4p+HuEo^5ryCnaC+UvOS{3$DJKGmO{n`=gu0{Q)ap)rv$aAp-@rZ_Ld6%y84^8HMI zR#VoCelK=`$q&l$*#OQTjJ!h&nw;Rj5DT2Cs>(=m9XYMx1PlM!kmIjq*_LY~(K*lw z_J^Be%1#}2uyrq4xxf(uZkC~;n>xE^Q%UcfvWIQM%y8D!r{b_3DP-X*J6O5Xh3I%a z5M9_pOyd5{6)Q|}T=-vc?p`ZC!`Ok#`%(;P>JlG+KS(#Px8YeZD!jS9B7S>s3?Hvq z!kjgwII9uFmtH&R92pC6KejqA5$<+EydXFw|$LMx6}XT@OsX_-sksF zLEGAp^9v0iJG&G&Ke;MIrS7D)9eR+s&jejNx`ekq#lmJwJ$U@F6o&UnE&euFlAo>GSQN0<;j?bGzzbxl~X+YFB{8bBsKTu%D^)qsr(RkZG<2sb9A9gR>8F9ci|X*Zc~9m3t2MOcOHofJ0)&W1gB^CjUlmWMNL0xUKNp8i| z)qA(;!he-=cty<&CS8-#ER9)JvM(RvYiA2se=C-%oemajgXJ+Mgg<{@NU6q{nWEi{ zCs?0q4T^o@=)#RCc7IpLt64VS?#y)|LmRnA{~5kLWCtm4;^?f65_aL08Q#8X55YRO zg}{C$EOCM?-TBHMe1FB$ysMhbZLBvoasI^K{f$EU5DV74ppmFJJHjDJBAvwa*`B~K zJpLcwFE4HthC4a1{)Y~dpcziE%rl9ODX?UNhos>6&CWm`b_mn|^<}>m63DFc&hRif znYt}>XIe`$QRk@(Z20(D@KFw6lLKE0weqfDbT);C;b6A1cRv4Ix`B>Nk1%}iSZ4h0 z%Y}kSH*k${K-cSInVCy29k-10N{{p=Pow-;698W5inc^J;6R6I^^}fp4@N*v#1-&@7AcI0;Zd$E4v1T+h`hifm)Q1PE4n|6--`PSOOifv{1 zI6{^!mX_1IJTKeRO0{~NX`PtqV-53vSc0cV86MskES4TAp`+X_pyZ!QbxmnmRdx{1 zE=e(k1W6e#QhDjCeV6kCcN>FyFV*VP?1>YGGzFF}FY~ELf>EHOAxw(RtEY^WrKg{seBYTpiw2{m&(}t@q<*0Jlm8j%i zq&GV_U(nS8YvzQKzJ=F_nyDt7m}^1Cq(qRAuLDqLgeDv=wnU{k@J*plG@Qti3)#4s-`hXj`Y0?_&>=sp^hnt`El@E{rs}f#M1JQ&{MO9%_ak2k zo4)rV$yaBQ`d*xOYL-Ov?<$a2g-Ljm=UYTpw+bKC-w55N2gtM#T`(M&NS7G@5LVqE zi9u8J;Mc2%f@NugAhg^dck}e1BPD@KFSiR1uTtE3S|2WMyC+-~t_eF2yd!q^^}*<1 zJUy!aSeW_K4ZFS=fOb{`Z5Ygi>SeD{fzK0*-^Nk-Gs%Mc2Qz%v*8~dv8t5sPeu80k z8-|9Pf&BV7I_aX4Z`Bh$tej~MJDnQnDu}+Ydge21+Q4}^YvX8bnwdClwjTPQwgN@c zKyUkoiAyZnaO)i#&}fRIuYR2r+lx#w^^+}JThu^zDBTbXHg;gNh6D7^il^hXlvzc( z3o7w@%$oXp!i($r?CsXKWXCA(H_1()rOE0nSIZx_&gObMyC=ec_oi&dCXp=J>I5pg z5-Ew-V|6)E*vRXRLwlQ$dBdK`hUXHSR%htXlIR{6E4C$l7QUC|JXOE|hpZj&OqmbAJd^^MhGupXEa4TsM#(mP$_t2C=x*EttF89a5gl zkRaEItfzd2c$44%g^N6QBQA!GpSYSveQ^Wr{)*(HatO=&J%sHxbBAcK!$ZnpY|`v> zYCOyhWM$RKrf46w=jQ=7Xr3DwG}++(cZ1oM0cR! z7%8z8Cq#O165nT6nxVmcsW@j)7P-9F4sPFdBCdM1qG#g_G=69Y<=v)uYS$;RCpMHg zaX!Ep*D|zR)FDPMETJmFHclk}vD4!BM>L(NUjMDlhf@$l1zH63Mm zG|hwP9=kyM%+rKE#pbvzIE=hobBdT9*MK(#<*4-EXtHi+EluWn9A8^YRLPq|gp|)@ zl8!n=el;dPy_b?g3k&=gs17FYtk7c7Ok(xTf?|dm{B74EKZBQ&Aiqwgbw~|fpR~ct zC3DE;Z^1NA%6S#FYUI?g6(px}A1jhkgI}_f=s2^bWXiE}v~^X73$x^jZcIF}G_zul z#;Akps5I(k7sGj_d$E5ezjs;itgo~{^00GHRV&Z`Noq`?<75NLgY*qJhWnK~-hL5W zJ6uWe{5yhI7uQ>6CDZ?YyOXxJ%ki(N7Fhj$Ej;%$COWB+B#6&zCF7H5W`;S*`<9Ly zQnX>K>NCL*Rf+nqB9fk?4Jx6D)W4hebeZ8e?t~7Qw>=cxZF>>NzcJ38PqGJ!_9 zE0f_(0&e`Q3(diI1xq`gzw_k_Y1h_+%0&M8z9~l%<~U+fKhAp_-#~BeeJ?cEwPWuH zLkL_JN9)rM2p=nSF?N;_ERt!U*LJTH=6`KQqm3qT@mnnY*q|)@he~+mlqoFW{ZoUT z=o`@d2z%F?LwR*9?QZE?mEznRC%w0TKXp>tOa5fl^tea3ONH+vT4L$ZCGq0xD+-*y zWdre_r1b9aEOFAzCamPV-h$zAbnBX1V)QCaY)G+(zrGE$7w4e{8nmH(mLoLj#8VF$ zeHLH9^D_@Sfl+w__4{DW*3Wp4SFX80Kp$RzFAZf%LwqpgwJX$^Jr-(@@O~xnGEq=< z1L^TZ8qhX^O;DbIv)$c6x$jHCDlMM1$1Nik5$-TyKr$`-FPeQdS%RzPdqCRj&q7e{ z4EF8gOJUF+518_V=kmfdHm_s@p1bA=75V>!&1Eatn4KD8(I>9oX|cy8l9g=xxh&e- znDb3}1^%8lgN=DQl>Hav2~K);IJIC7bMH*1Ju^MvlCy*ib5CHsnohID{O5m4v%yfm zbk^`;FdbFz4!)JT#N>VyEBE@v-t@SGX}uNxs!e2Jv(4x&{`lx40U#~zJk{5vImnMQ`As+F1~LLCHEWb zU~r==S>F0c)WuA+QnLrGex|sN=Z$FgS0H@??O^SdQmiTaBPwLb^>~ z;s*;OXyf;avC*ZtRCBnPy<{7G*va#owy0Ehc0Q_#ve$(}G+dQ_MRKB)mn5D6Q56`Eg|!mhMjiMxUe$LP2V-dWBJP(CQ6hbY=8#K2V>zQ&8KUo}QK`yW60qSg7Tr^UQ*&jA*Ypgc z+Z`&N{jCD~dQzy#q&Z{{Y{GbJHPHF`MYt+Ak<4$b7yLrhz-DYR4bY1vhdwUDJJZzR zMbInZYSA##95M>5#>L?}5y$okL=gg%kL%t;A!v{ew1 zBY=`W8gP#_(3%Es;=lX@9yis7YE90)Z_prhqpa|Zs@?`l)7N@;Upu`v1BLwvf;5XR4nrArlpgiyt9)^^qi#%D|E#AZ|Beer#q z++YHetzzldh|@j}8XuU#7gO-ckW%jfOD`0^x{DJuEa0a_EWNo!Pkem$J^Suz3IEne zY0Uy(aZc8KT*!HI->1Y<6O(=7T=U;-Zki30Uy{;wW@p4ZSr0Kk%MJpSaU#TGnLR`QxJCVwt@Ma5Njm5Spu5c;fg>dvsFf;ov zhtQ3#@Zm)gT{g*&1wF{XL1*1SW$s6T=tVN}%aFu3yFpWA3YAj`XDu&t&|A&}a=14) z2-29I`7Ym37Y_*A>44{+q_W}9^XSFVoL|9ncBB4|WEP`(#P3Vp;k~LoKFEq-f6W)s zNhNNus$H2ppAKyKw&iTy12>4>Ws9A=1KHr26X*l3r`|tJgIw0^#|~5>6FJ{&zz`d3 zDfMCfUlPjVTtTT=m(*vvu=cS(+3*dna8kw^A5HgWd(K+X&lmaYJ#9q3Epucw-wn{> ziwn%UWQm4HyqJ@#0-a#%0*^|}34QOxVrKS3tFb)4aJdEg4jIT6+BK3NInGcxq8xW# z^kA*!SLlaoM?O!QmWu2wC zZ_Pg;|Gz^tuTdL1bNHUEzcJal(w4ZZYs1Ht? zf`uC3pjM6@zbVOi!f5}~>Tvm=Iga4_7|BB3v0Iz#L`LYtMSpb!QQK&`%lKOwwtL@j9Y^yv3|Od?qmz5);Z zQG@Tz9m45V!%3f8@dT~Zp_g0|y{Z&J&g3NE_8~d( z8A^Jt`C~ob*Wb9?!0XvS;^XiMck#UQ9Itq4-(Q=kOt!^mTwnCR{-RYPPv&{HVc&PU zu)sTx4i_&8>tiJ7p~C$(4N}_ltwgAFd5rV8pYcXsES>#+nBe*4AKMdb1kbig>8qbs z!bYhShb5Unq%YqO`AB^#b3QZ06{c`>xs={)54f=U_dQ&^#~joL#?n6fw8drJoy?0_ zz?lLmZS)uL!M9gU}Y>d4cRNY>HcM%KY6{nC8Y;%04zexcXhQoh zalukGRP1jLL);ta3J)bV?aMRlAL$6M)Z^(GH&^CtVueF8oWRNQj&M_R5UZN?i%jP8 z+0%#wI#ZwL$qXcDUg->uDUXG-gDCqdUL+k)oZ;u*M5@E{Xrw=)Fp%r7A1k#B-Cu{W z--=n}lC>)&_wfF-(4Xb0&d25K-pm1gios%EI?iuBx*%qE( zIICOe{*}(o85#OUF?SfY!~sXtrn3z>>uLNtb5haxS16fwQdp>eO1xxXMUMJ8;((7O z!u}C?v}K#DgoA%b%xttHhJD^19@YjLnSdZVD%e{gl=%tX>Fs*vAR z`}%H}BdOMQ*iTlEPlJTR%Hr@S(WR%@da@D$?fF9dzf%ucF1neWA+-+%CW;p&+sE+x<)-6bHJFQMiA<7uTA#+ za2j8xPv7|K(6B^hamc$m8hy}+E`4#6t+#JJe=5WPx^^1SzUxk6U5$?reYKVz*r!Qz z2A5SW__|AYHdr6bS8LL!L79Ah_$yrAGX#v2RO$TFJy`yUl0-i}h@idb9uo(wD4RyK zOM_wV?QWteO7V(KAt|(*4>m1t$y|Tu>Ly+z?mh^DuswIk zE`Q%MQ-i9_R^(AL#knxID^yI#`i3*2w$T8KK1X@7FxFKn%4qz? z2$d50EHn@{ZPQ{o4>|Xvy_7DAoeRZb*6h{SUe*59RrK%1K!|@4$}TyiqwUTs^nB@D zNX?01iI&RM!xrAAAHD=ahxclhoW7dtWgDsDU_PU^<+G-$zQPOIL@Q?mLGAQ>=IvgD zCv0EPuFISm^SFpjk5Xcn)ZfsMpF!}c|1Rcrq71u!cG8ujbisGUF?RmmVOHJogYHSb zO2<7q$qMuYI{C?OYX6CQw8M*;SBElQN|k}=o!98n2gljz;R>{Gk}Nc5>w(9-ViuAN z*cdMlm+oDsIu@tcsV)0RY`h}Ox6_9!FOIQyLIzqSs6di>E&W$^hE)~Z6YeIdLCsZu zvp!tGHYM==d>Wsh$K0fQPhMo3ihqcgr)hy>+;BSX?Io6>FqOWWs|~ql>!{cCN){e* zj!or!*CXnqXrqzH@^|&2a=CgiR{1tn`&YsK^V7%I+YDgeu?Tv!R~57L{X`xWbG`l8 zdU|W%S>|Ir67?#LA$!;uTC)z>MKYJf-86w~E0+mLdLrA|evsa4HG!4g<7j;QNtRgq z!)N_BQ|N)s!hyRd+3m?|X)xcnFP%Suimwi^nd`VG!_FLfO)C~2D;#ER#S`csFo#|D zCei}3iw(88&)!V10Ih51g@rTsu~kiu^uPkH@70f^@uzn%3HN`@+h)m~5p@E4xtHDg z?<3JXZwY&h-0+aqPBze|hAwNefM2yO!s}_dEO#{Lcl_n|Y*`mPQj*PHb{(e%wmkpy z&; zm}Jq6D`xOoIEVSILzxd}F~#uv!e|+u%l*uh^{t&mUl^G{?as3}(oltU&69-`{yd5O zYKw)ThEUY+EP6iKE!te{rqaFo@FLt6H*PT%A8ik!OY6B-;_n&kTXCT( z)VPao{iDP4xomOD*5$r^O9u0NW`4iz=3JxpKfZVF|DYw~c%EF4Eq?OK6Y6FJ(v&Ps zD0VuFwg*lK^8CH2$^A?JHQM5v*F8enn~_xKxjMM_Rv|ql8e}-x$Edml3~$-ts{zVn zmRAau=lNABy%fmO{U&5uS32uRREMqy_PF(%KL7hmXjGmW9NF88eC+Q+>c=Rv2A;N1Kk-p0yk$?? zkCzLldH&6o-pMq7nnNr&V3=c_8HE8s}G7xW9iha9O2n1bzH4v2sNvv^vRi2 z;a}%t>}_uh=apk=$(%}Gi}C#!BY%HWSB z=8%^xr6vV3Vt~~{v?;QL>Bh12pXF-tw4pqnt+WEaO;Wmd$_`PbR})4)uz}0FV(HA~ z&&1)gG;zZ>TX@$Yr9XFdi34V|p^AcZ=f;AUc9D{B zNAN!sPv?8suxtMjT*~*qUIkJilJk81b1su{Te#l8If0T~XLieF99}r*3_5FDgehF_ zCvIIwT$`L>D9`9n_V3TaqUWIJKNkSQ*FsKx2-~y4nnc*T!t=~z>YW$NrVhzQeZHTi ztG^14+;6VGNlQ?l=>}WZI->OE1h#bUMml=CD-^2Akdjq_tnZ^+V%TM_XO=ji*2Z9# zX0n{lfA0e4PRWypulukS-xAnh13s@*+ToK~{aL@=Nz{txrFS=|kjsv?EZM(=CVE@r?qW+8p>9CSd7iQCHbbJlNtb8$S>f6oC$QjsS=JmYwtI3987Vr# zCpj~cIm&>sj6s=FAm%w zc)dGK$0`~^s;)VHYP=yFpFf?*5Cd>DFGq_>_XXp!b2MX?9;DtiN3vakd~n-F+=_Lf zBc~kmPN|V6rk7}L6TgSoS>Ws~E+l-{6(Xyl4Z{s9a9vtI(i(G{cKK;SoErc42^>vo z|NbV@*&2}FXh6;lk0FzLn_)W7dw9Ri8fB_Sk+l^TG=%G6{+`exS60UmE0rItLskRK zZESJW$Fxc;VpGX0Y?ket`a!Y%Xpydk_2JPm9}_`m*S$}TPN{GCXxFWQp= z=?wI}#Chy@n|Z#m4)I)+Pd4zp3<>}I_zyB7cYx~ zczS%J29d=0;g1kKxJGUXD~x2woR@FO!AW{>p*fB|TB=MY_qgD^9DXm<<@fXXUBdm* zuQ2hbA=rG3rKIMBAUn|jd*3jEIcKCaC3lNpsolzT112zWd@QZ}X)45QSHU(pu3uXr zrP1WMuhRC%IL?aaf11Y9NZZB>ibLe_BejGn^QAOkOHP$==@EuTTf?Tlu@vP-ilm}SmXZoWfV9apfK7Ee801KIDQftcTq=UqL!FZ}5YXX_SS zBmeRHbinfjnk5s;A`Xnhih1s^?qsVF6dBFL(A6Zei0?xZl4!WhSl07l0UoRNfDEH| z!t=kA*w9(M$k3PEZ}}&gnx&<&Lx=OQM3wU|r~VX-e3!8gC3#ho`t^Z+Hyki^>oTSy zWYgkkPZ*jhM~3W6XIc09vZ^f4|KG1Pcui$D6{pZXWghT(fC~8#KAz3oa)3=~^?(gi zZBd~$j;RhDO24Ukz@i*YlJj^Zi%NLIynQ@ieH*`TdyHpbVo%SdyMy1S3e0}_A3Lr2 zjArfNd3teHC{=Z0a_4%}A9XHpOwp7`r_9doK2 z>w|6Cf$=r8A;}5W^|C;_=H6^o$zBr1dBO{o?Z~5+KjN-q$!Ny?Yq|XMy{TT4-QPW( zT$OW#Eyv67oSYhq>N!Cta^7Z(Bd;&xpNUPJ<=Q&ahV#SAaGXkp7%qR179F*MC|T8N zcP%wBzS0DqKQ{+Ee&6osJ=OPB|GiYh*bKh*s8nCMX(dEN@LgWGF*rDs;p?yp;Y0F% z8kJ)R0~$3^{*=ErX(F$ao!vodiCS_+s!0(yEY8iRF3mH2a=WdFVTwIn($EG5~qC~OD3JW zO`ghVLeVo5(&ZLMilh4BrM{duQ)q?H8b*N zIC#J)qMYVJdtc#x_Dve3_(Ke-Ki|rJbV^`ei7kHaJ%;F}g;7s)&TAj5OpeV?AwNHC zXEwtmFbwQ*YG@p}9zBDO%}|GZO|nEiYc{dmW6K8YQHKZHQmLo!3}U}_FCM+l^YY$w z3H9s7knBl*RS{etGn>CZ--L}J6OQNM89hz-Uh+p=A4fOKSYr@CF z9e60j2+ml?(SuqG1j$nq%t01m6SlIv9M&45TQf zJ+^-bMci-2u~#gh{sg}-9aRw5T-U~{wv@V$^cGL?e7lx^*6`tbEL|~Szi8Xr z5Z9X9!c4C3F*tcaoTB&=M-h7%yd{q6{OQFebDidmXa@+K+(2_dgY~-kf#*1KeN0|F zO$_yB>nHl+F#dd>F-0ou8yd*Urd}cD)y{DF72l7{6WA>6C|v*C1u|1w1>MFlMjEq- zHP^>{3QOYL)S=8>Z$3_Ras#EmZ+L$h&DNHvliNHGyy{jmt(zUi`f&f;mpSh6W8n{> zhc$n6gO_vdF?n<}YxT~c zwMK3bAE`tZpB>7Mp3h_HL2mG(%NGAm9?o1$N7KQxT;YYSg#4aOSWt64V>}-sGT#P$ zx&L#{FE5%<&-bs#bjVW}z*OJK;{jeD6uhi)70=VF`=?KPbN!9!!3vbLc{A-*k7+@y z6SOy5;tpLMR&wkMIkwRe!fu(7BeBXXwVI$a-+${ow!qWt4cW`qt0bT2;pnU@$E61} znF;52f8_huNwwyvnDIg!@N+9U#q(nvkJu5{_=lpNMmm;mv4h`#%`ouTAFQ(p=GF%=^|E#9HNGN-qMh$R zUXEu7zwew?A}$M^h}Ifi7;vKubB)!Af8=SJz_h_T*c|OgITGL0Oj7qn3yemWILE$b<^5E$bvL^m5^BJKAvodY*`m#Bs zy*Y&Ic~oK0DrM3YzJfS?Dq_cus6uX^bn2A8l*A1zLr19^bh*fqfS2)P#56s2m+wpO zEls6vuVcvcm_2A|CxPK>yM(D}L8M)==R(zg5?I}f&sPvcRyXIN4ezf$`o9;(Cb^Sp z)i=Uto}X2BDv5ShdJ-A`Ogzf{QxU#x!m@s*WVu%&X?o7E`2{tz7))_hm!9@Co`O}$6dC-Xd=De-jqIW=M) zKM=RA(}ix0TA|@%x3F!-A9CfGE*LC`qbZu4)sbX_`gNRd$@O&sf4&O?`2BbF8v~e~ z8%y8rKOqe4l;BZCBiO%6N}X!93Q5h6(caDkoPNg89wTevu9YmV_cw)cBc;^lU8k?h z$VObr_4aGe#n6x?nHO|Te{l`11?&ry(rd?Kt8|7n;Ee57@acLCJ$VDf(68NW`&nx^ z7svI1hH3nH_5jaIZ2=u)sq^JZ(Rr)_#(cJeYX_zD;^2C5=ALGB)8P5RO|evestW75 zs)uLYoZyXC1D%zo&z2j#!kz!Qz=O6p8ZpS1t>5H|^Z5Pe2CWx%Du%FsO3%o=_5A)5 zm_V0k4Q2~CpUvQu8)#-c7G{qc$#z)pCvErK;A&|i^=J%XPj^ki$nWkj-|?kjy(5|# zXa#V7t_KY1n@p3+$FZ2Vt1$*VL9+j|u*q^7TWOXoD5iLVZMh?cbx&b$#}rV*JP&Z| z^G_I(7Rd(vtrXv%<==1YfX#km*`-6vsnTJ%07c;thip3|nLs_UTW_ zY_MyEHzUs+Y1t=N=ygbsB*-|j+}oPC#lj8F)L7xyE&bSo70qv-t~#6J(M zN$giU=ng5vhvpq($?QY)tFtZ4;{A)FTbUR;)&#;6t)PSJkMFHC6K_QCqK!os@amaL zwNL-Vs?SnGxYl3_GaE|L;GT-GfELlU>L#%HrAl?M>olR!#|Yws4Z-7IDUNV>EWGR5 zP0uXVhgVxnQAUp6&VzY|_F1m4pIU~-&Pqfl^9c7f>p)ws89uYH;kUrSU zh;Dn5>&JPAQChI*0>AIy4G|7{Tjj$d43y#RcOPx-|_TU zf*x@_7Kle1bwG9KZJ}SWJo)PSk}UtB1KWSb(eL*p!^(nPvP2tL}1L9>jZIx&|1==KnrQ&rJ>g9)tW_3Kfr z9M4&OjAbXxAj2${7Ny8sI59>Zht`?H@wrl}d~H~j<&H_GdUY&H)M`j<&8* zWBaF=W85-Fp8wuJQ@o5=(DJufyW1J^LgQ)WdCKy4dZTl-3s~&ECs_K0vEOmGNyRfh zUsNPeHI*RdRx=u3$hyH1qZT1kV+^~ikVgXS-9W=7iQ31HWUfXTIBJ+XoV9-=T=|p8 zCjZnYd#3X|luF(ob;YqYe$Tn}U7h?gAZv2oH|+Vs*L z)D2`w&Yn1C$~^;%H9R0{x;=&!B(jt(bLec&yOCd~M0{jNvTXH@%r=GR54^C&O?M($ z%-C?MU*HB^`4V!YJCIFT#+j|W{-{m0!BsQE*c_$4bTzL(WnsD`wI8r))0OeJxf?8! zvqqi1!&tafo9^Je!n12C&|o%YTl63Dy_qv8?XpB&Wm9HyqJuP-JAuhtb8@yuoB6yC zz_YKMVE$SQ>_5|*h5b24Rv0_MtBK{BxG+D z-OKr_r-Ci8F2lq@QIPX1+R!jWKO z;@)>O8L+?^V~Y8Ht)^ACv8I z?US*@`1ovkri1ec6J^Qgag&Lpk1?C3B>_dQA6^)cMw&P7!J0uD&@i=2$gCPp;_f}X zFd<$8nz{b;=eFS_X>=ZzuhE3mz3&8j=>T%rs!K>Yp$R6Nl4yOX59#-N3I4pN1zwWp zLey_N?va>5y1#2d{-{Jc=7uwA9g=`w40WJs`a{9wq#+4*KS3t@>cDH~1iG-uf_#23 z6yHSa!nsxT!q6NIVi4a-zAe#()%x*t)^xrz?D0gc-F)8V`rgW56*7F_YxHIYpr;;3 zyU9)Ag_1G;Z88K?K0j4%D;1tMw4(ZNV^|RzOV4c{EpXN={xsluuuG+MkG`W274R67 zyv<>*67Qczz4n=zC5O+#E#Q4B*YDMgypTNlA?nPqf=j*m*PHakd~Z3-UT+O+7fR`- zM}x(_osaN+i7k+bSlasVkZAZ<8L!{4gJ*nyr24)}+^5%ymtQ%+HLefb!Ff3~-wbey zyc0YyZlEQH)!B!~uP~kKJ^HDMlNsES}6JHyDr z&+af!Etz`m8Nu=bSK(28Pk80rDLlWC#PYvx67-2D4BnnXPmN4u?B(QN;BmterAF>7!}Sw+?!x(d*twYJPZ+Ybw4 zT;bm)3mnngi|v1Oo>X5RB*s=ex!~J)MEp3tAK#Puh*P{mu&#KY*!}hhO)p(2mQT2W zI$mSN(>!ZcZ7vht^z^IW{)@QqZGS4yXL2pIxDDQtFXKI6(vgR( zr7{e)9pvb&3C&dY#Zz`OzYf=SsnU)zfB5Rs$#yOog+FpkXzp4$uwMU@ZLRSaYc%cY zp!{{TR{0lO^2|XD6E2briEr&ai`hF8m)wXB`*S)5T!~5s+@_?nXsr z@0>%2Ad0PsVvB)Vtn`frgu zHJFRO_>N4;>?sS4rNV=V&6sI)k2EidlKCr0$dZ9ccxcsmGT8bf%Q=ukdVJc13FHtF z-%4b;C(B9r@j2M!wvreexx?O^Zzfw#Zo=8lGf7sYw=AItp!3IbU z$&WMTgNZ;AHsO(5+0r=%wz8JUWl(ryHtHs?78ia#&hAvLfwPI5P3%wO)Ek~cx&zH? z1q?V;&iOB4>`nLs==;7WKFYg5&EIS!d+$Dhaxa1w>>ORMvWz{R{tEJUs-yFti!>o@ zv=IFFJv6uQLB*7dRBh!xHgd;z5JNTamU=yfbpoyQ`3tX7&O+9^20CQNScp$lz*h>I z*vGq;>OOc#2T7E$`q4RrAudSn9HFKEyP7S=nH&dMvO*G`)b0ITD3t6}a#M<1T*WYY~frB}pwvQB| z5~_LsU!Sh_)WyxV-Y~7DhGtKh27h>eq~JdhJPSqIaH@tje$q$Q?h8|QUgT_Q7pQLL zKGv@k@~&T?1Fl;#EoOv^HuQy)ju+{t%=;vz$QYBNWpI&7>0;lp%x$v??#BLLlu=F3 z=nf>^mT-Ubgaq+wY89^^?FX%yrg*Xk=X=w$RCT+zn8x`?cc1kYM|qy3=3|$`^MPg< zxQ~F}ol=^6cs1QaIRCm{Q*7RRoX)a{f?!{Bd=fjDeM&B(E7ae@GiNiLZ{8pcUbKy_ z7-k5Et<5mZau9P_zJX4icN=<{nxcNhdZ}mkg|u*SBUxf#isvATZ9Jb$6L-sCxQ+>4 z)w{wPwTDvMyAHTRlmCB;BH7X|b83D07-Xm$p;7W>Hrcxy9b0UPV|p6kyut`pdS|aV zETa(CsOh8G5Ut99ld80fynI?%rT>YHY2keQK|x^aSSJk1a$}k| zb+9l%D&2FoRCxPU1vX#R!7~Q~VMF>QA^W*Gn_Z=gXU%R%U&b93T1FayNu@3>>I#6y z#EXK*Q7vXuu7}oVpGmjxEEb-wwTIt4&u=*<0LUx3kTqR_dGFUp=dC}b_2W+n8t;6e z&vt!W%yWY^|E>vhwmhYqIp48uqZ~Z0T@VhJUS&S~d>!-`py^SH;96fzkER;qiby%! znLJe3T2#$;O*6r!9RTjS#geYir|8+ zSt<_Xj0;6QJG9y^hnIoZ#FAduSa}Zz6e|!eTlJumdUw!XoELnzOAgluYSWElZnI|2 zx6(Zq0Ea_-s8gmY%jtAR=ezaN?%o3Z^vVFjA30;0QV@8Cac)Ym1KWSk1^b5{lFBj( z4NU()G;X@!gxFx1^{6*B(g~qdsn%Omo`dv*U7x{T`mR1-Hw2Y)>gXk2!b#RjL`QF^${sC*(P5$U%~Rxn}h7^(^}QvI~Cg9>QJ~T2p_V0A2OY7+t+q(p0NO zRVvEqx?9ee{UL}QePT#+Cx(M^s}r8-T_zd%UYTyX^^kTxa>CPZ16k}-ExK332afZ+ zr_Rl5k}($)Xpi&C><;IJJ@^{H?#xoBj%8+WkMo-cCcl!zzW*!szHQ3-D>-7BVgTDX zR-G1~?g43<4mhDm&K_)2p!4_Mf*rlM@BFB~Y;7_X(b*Tb+FPR}P|kAi8i_~iu0jRp zeJ|Y#Y*EJ1N~f#!D>&oH|pWwfdR~|!G6C>&}B{kcp5=Y-cx=YmL zeEJaf#CQVnbe#>Kc>P-`$5^uVPYSux*q8p4YvB4o&gB@BM9Ntq+fk#5Cz71}3kMG; z%dUQs&f@vcFGs@x&kQ5!8e7<(8ZET?6<4X5C6L)A4Z@RZEu2Ndz;ZJXk73JMVU;#2 z{iiAY(e6UTrtzd+rj0AVhCux=Pcn4KG}bBQJTn|8{q>x)!ww%N%g%E@@a16eTV+eu zkBVkyr*u(!*;Z+!ryeuo;P$6iE zw^<11(`LWme7%t~gzX-0>5C*2td+^3=aeA9y19WV^ZDV|x!nJ*nIS0}ai6-6F~^od zISkXk>u)*iI#Y=u)!+Q3;AJ2OhBe?%sDW00~ zgbwtu#UCwlP%+Nq?&c;|YHN>&+ykJS!hJEx;U_)Pi|5fjt0DK@dvU_dd+d>x6BhIJ z_s}j=I{bnbd#TKM7@O;)2NWG?(|R3v`KW!lhha+Fx-2d(+~EQ~b|WE{zDI34Kh6={+~h)Cvc~{=qaV zb}j3;>y8tJ!t-0ljG>a8my&jVozpFxSyhjww0twz^Pdl`miwpd3#5son?;jW?)zLH z$||dasr}YvAUtrz_09g01-@Ric*ZpPlYgE_NeFXp=uOA-IgM)_F1Yt+uEcGN4P9C*8rZJ=uIfKP7d%T&%k5O);y z#eSUEqqt7aWUq#b5spo8z}FgCFJu#~{*zvQ`;7a+tuS|{oM}mIr2mFCz$MNXYW@rC zs{eV(f`N}nKJFh&-^2 zf^%oI(Kl(aBu8yL@oUeg^ny0-I}pMa92!ORYi5Hsh1_`IJj3x_(VXma+`7B)n#gRX@El{}bBM$}1# zF;zM^J0T3_ANM1NZ)UU5i@JEFpOW;8%!ULn96}CLT{LhCh5u*%Beu+B3YC0*z$8XG z)k&XReYl4_KFjBq)IwnWWE1k|V=QYtsgHdouaUOzQYE4O*T|4kef+OmFubnNA!ltQ z?9Cwq{E%BLU2w4*`M35vvEOfi15|<_=7>7+TkXKIb{b;nz{}E^H~$Fx|LDLHo*$oR z5D04&dy>YTI_yBM5kB*(hBHt82*!KwvG&EiklF@->elnZm)YNGeToTAsh2}l?Lom$ z;|9~3Zier25PnY!5_WgHPkqMm{=-%|tn6(i_`JQ!+J^A_L2rZ+2VVKtYBbQ@oI&8Z zR1TLv%(!q+{|Zz0x8eIm1h?VcMJu&>dePGs53iR)lC6U{A@M4U`+t3zuRpaTw~0}; z_vm!Ke#kD$A@=wo@zk3Jwp!B(%l;v3?|3ero%WFqaf5Y$D6Q=7o*H z?<@85lW5QK03x~Kg`qSIvZ`lN?Z+$G{yJ}r9N>RptNSvV+uKu^#IMIGg)_HBS#;R_ z%}{ii&*zN3>3=MG1|7HlwRrKW7aok@euN`4smk=l;Lr1!yXuBXzOEffz0z0E1vfp> z?_@BGZ;qqpy+*_DW?p|@xJPnn!$9iz^fK+;&hzYEL9BTv_g!$0=HU)^JepU{R(=hp z4%MA7=AA2E6$9Ap^Op41Wg|HB-37`1&yu(!di11+4V&D}6}5_x4P0+U+m`+%1{yrC znIvaxW*E|?4GmCh?1Y!r@%_cYPBHER_o3K1a^8%oP#JVj^qLsMko#-6rh}2I;WvqBF{f5 z>dU&fS5?lfvBM!5W;oHTiZz4`5W1(8!?aZGE6=qh3nyLzMgBb6qyXEJ9!OpUae(V}9aNYn zXRt7mOdQ(?PntOov<2CmqM77*gc8I)(Zqdyo=EJR=98=OhAjTICYo;wWEOoANwT^N z?ES2PZ_k!W94phwwRsQeB7Xi^7!u6BUYSEKT#tb@3L4n{eTJmph)i2PHLi{C4Dx|Er$d@2#v#C#tKXabX0UIlh8_{yofFLjxz>8eLI5GnvfW zq99oD>lMvm;Lm-QUvyTpgFX5AZO@a+FOhNN?bCi_f~qD)_YH-G-^UY&ud~?o?ppXP zVx&~ZIGQBp7myqUEv!5l3>eschm}+3={7hvSPtfsCW=0$)l4J`->GjY~Y61pO#5)r1Yh3BmNMn zrW;l$2gBPjZqzbc!p5m^ovR7HH1sv50cQ|!!zhK&Lf-rJD5!k4WOl2<6)hWJI)E*B+1Y4q#-}f z(=av8?>ZL57T)eluN(;kBON#HcRMdh9O+0u7=NHC#%}m;ZXo;q!HW(Lc7%IY{5;nE zq2&2NTRP#N9+Nw}qLn0oB~J6CSN5sH|9xBI%jHa0Vn9AHle`;$|{u944gb+FqaIs1|lMATawVHNjFZE8oh`SfHm=Cl&L zSJJ}Hc~2x)g(M=bGGtvETDWmlAWICJM81!AhHyho{JH9wq=?NWYrj6G{mnHo#ygnZ zIx~&zQ5^&cJfHph`drB?vjyZt$1dvbq=Dm}hOnioDI|YSDmc5Tqvv7;$@>1;q)O9> zUhq)IjW;78v0@p?P}tAvJT-88t^EL9ml>ogWtij-zdm9V4$|2($fMe|tcm+{Qa8ye zlll)O+mBe07jBxkaz!ZIPaHwqYf{+-XP)O?6(D{4H;~wD-%1|ZYhjCS2s~>ICllyU zcF#&1rwbdTAG`dBNB#}s^MC%%*&vXNLXvr)51XaWnU6otOaDIgCUsYoL0dxyCrk~5 zpSvU^>1+zuz0fu`PlW9c5t3xLb)6kUr;0`&epT` zXNLIR24O(HTu^quMsr(ueQ%%~g2$g0ifA=UukVHP(*bgB&JZ?kJ4OR8nV_eN9Byh1 z62`x0Y~>jnDF#aOnlyEiJ` zvz6wDB~i<7sveb!d%5LRsd7zv$MI-(aj6%|Jq4fT4HGQ=P>G_?1csk zLiqYJl(r5?gwtxCxcuaDNjLWZx;5f3eX8Y&5vsu~`*IjPyCxFQ&;u)n9hWE-`_Zxo zPx$k}uge0NrHC|swHw6RyW`%8)yzi8m;QVB6t;VCzI0pw8^1x5#*Ws4_1D*5`{dy|jt**GD_z{HeeyQ?H84jcUoY zDVzuCV=g?+s}#4b9l{2tIAGyv!sz!laZBc-z;4i{q!_k ztm}pPtpXdj|BNu~)pDYI*BG}hsbVThGQq6%0@(8V|3?mC%1eF;kwQM%$oVa0kE+;? zy-GxqTLq7YYCvQ4L=NRLT>$SfOe z^wzFs->!}z@8$PlIe-4!%>r4r#X_QQV+F%GzweMyg@nAxCLsqt&~iSXGyiQ6ThO2T zw1$O)R}gpI_FOC(%JZI6&gauU;p%8z7s9qZ%_gHE8HPvo#Jd5ClG3d8RtoND;{VIXN%eZ)!~b{=h;Hf8LivLxwr|m)peF=o#Ru$q4g0z6!c4@6sF{M!iE zuLV%@JuIBmDW@Aa1E5%04(C;N2_J7U*7(E(JAZP&>bu^8g86Rx>y9Z}HdevaU1ox; zS0y`nne+dT5xDzJSJKkHmM)T7;PeYs;5BB7znWhK`*F+)a|#I9VWU*DeKkFGz#4bS zt6+%wZ)t_m1s1i<7CY_`*!?R_oYlF7_nho-&D$!-EY20zofld3LI=D&5Wq{bO59;k zL?6y}#I}CCJ~XmXyyhrp1qseLKoOzjSr1xpv4&cW;PY|^_T(h1)*T3UtTky{lmc_ks^obut zy->L$2o{ofdir{QKF{Zkp_$oIw;r?U&kvVKJm=w*$P`*sJ&wD)eXzmAOuFvv ze5z5FLK^jakPqO3XRj2xzsGX6LdO^LjJzw?wrA6MxhI8#+P;{O70!15Sx)T+?1XR~ zAMB>P(_j6=ELt#ew^*m^gIP3`*{9E;F|uqZGw?=QhP1ta|J5jTEARMSPV^4S75Vj_kK!R_zu;)`bQ`@9ObX;ul zMZh}2M@?PUFRdS`ESQTu4X;R?Gf%O%I@x6E6lZ*37FW4rhPo_7aUVGnl!4ZE0pjGv zrxal*QwVuF-{>Q}GZ#duB{x>-q zu7sFYC;mF3LJsMv!UVqFTKA|Di`GqtrdgUWY0W61$FIF&#+tiu^`s^!ZA@Y@Mc$(7 zhRHDbwJNk$UMFQGjnetsZ$sAio=_ZO%v2vLNV=Uc!)_nBf86LQbIqJCXdb!=!RP;x z&OOU%o#S~yS8j?WR)0zItpjYSi6)6_z5$;DKai&}X+lAcCxH$V&N%u&md4LxvZ@K> z`S>UtZ~TI+dHtIu&)Q7hXq%wMhnu8O(Um>uJW5XF4Mcmp>!fRJ3riSwg%~+6;f$zC zGRVnGcDD2*dGs<8XI|J(!m=uv`d?Ley=gIiuHQsXmfFbFEG$5MVk9;{oJFkuD`XJ^ zJm9X`Vk~ZpB}bBtWq$_;!u{V7SU%N;%<9_A?54zm&6Pzc^X*9jJ#=LL^QOXy^AWhk zszR`K&Sh`1=fjyDi*S6-20pySE?aty+XPvl2!1#GbO*4~{}mK?G`#s24X!EN73No`izZ zMfmmfH?e#(=ls8_gyP!~sBpxYI{B?-__+!+-Y!CiYM>br`m)MD*CE0&61R2Cq3$zw zvt_DxKw~za@v+aLm9ylcws9L&?ux|zmMdtPMj4yn^b`!A8RNCbTj-QKIaKt232O`o z;^h_F>4x@8On=BnaGlu;{Z$T8(}Ry_{fzJMZ(}`-&pk>%rddO9?r&Jp%>;*=7SgH$ zd!~F-0oO_!z~$soN!8(8aYyC8Fz~eaByyz^w`fwHWAEJfV=iG$*drIh@ zbK~f1&S(5Semp$AQAX7>M#IKcy126F7J&01x^!MEoyghorBw+at~^Tfa_vB`hG*sP z+=kFU1vGfG4SU;RggIuD;dts%I^E(S$>;gm_HK7!#Giw-V#Nry*xeLIWlRP6$}$?S zHHY*WYKAGi@A2HJgjV?GGRuYBC--7HTx&c-HL6P_Ukfbp9-p;!%sWH9_OF5F>z3HH za3+X5i>YmJ4E_1T3ZK2vCe=l}-yJv(RGh4F^^4gsy19@Bujf3Jkv6z5k!STZk5J>& zPB3nj4f+Ml1+&oyXozx1P?k!Xv2!W5w%}{gTan3QSs?cQj7V?Mcp)kXMv1v?jvg{2< zxAXhMH=4}QZWD@rJ*EnGb@^Ii$j1J@EaXap!HoNCs(mAge*aEEyW=8VI!YI>cN(%? zSMCWUd^qgcrGuaThLY@yzXYe1`{*~$e^+EiY?k9Yp|zBAl=yzhYFQA8Tct({6q9J+ za2LFJF#zD1h!kXvHl>C@VmW;{6;To*Qkx99qDkt&XA-v7BV+=U3@;opG2pB z7d&Q66|aWr;)J*Jp}X5xp+;vn+qPT}3$OW+#^u$*Dq1Mf6S;5Lem+S2R7n=LdfdXEO~|@p1JBn8jQvZkN6pBc!41rY0d-v z^)rO?F*)o!KOdcS^(IHN4TOL#j>K5c7{{DTgRggNg!xuktmnX9DAV#HJEk0v_^2Y$ z&hCYnl?H)dnZzc35#KlRyiAfO@vfimFFcMW8$OzFzH=Iw_UQ6=_sU?VE@t>K$dmjm z=IW1KLr8mq8Jf?m7}sU*xcRb_-?HyxzTlB`eDjIGVq2uep{2q!Kb41Q21h| ztjcFH!n{bo^PZw(fIl${u*9gkG-$YCB`QQNWA+(Vn3my9)L*BFDUYqlzLQqiY&#Fi zt*44k!U|^g(i&$u`4Y9qd&S;aUj<8B8(hAB9vJ`FCC=EohDqXVaoM;&m}ItH z__W;?KM3=oOy!c8ow%8`G}xh|eLwPwyca*tiIU7y6}`4M9%h{7`!Ul9VyLJ^om$V(l&_r68DPj1 z!H}+f6bjS)IL{|Ink-3Frg`EMDqrA$AHjfyEY_lm2faX%&jY{iJ%sotDNx!=g%$p> zM;flrx)F7{X^1IU1lZ$y<>4ga%3qPVo3n2@oaZ`Rk7-XBz><5~Ol|mbsqM$TL^0JIUtTL^XZ$RsA!#D?tu)2@i`q=ZyihXy z_HNQg(G-u}C}lU4Zb?eoM2O?}W6Eo7mY6U}sPH~O?6>m!^;;=x=(a?7XmJr zp3M34U--O9cRd!|*OTP__(Mtu=-}G*!^!bs{mD@7V?42x`}LyqnYhc1Y(HlT4wtmC zhO_R1fAk}Qs}ftweGrQ`8?bJRJjlmWevlBVjq-$n@oZlyN*bMCIRr8m)W z90tQ`weX*HDA8sigwr(BEbxrh0>L zcD636j-3ZS(=3Q_#Y(n__op*eyot#@6;gQ8g*0%#2^pLQF9mfXnUv1J&;X-N+{q`+ z_kv%aWn@S+_Y+P|h0TM13X4=Hv8~yLXusE)pu-)Z_Cyg`Rbhy?HmAVfMNfpg&4Zcr ztr7ZWI1q8bC825P6>{9x80R)6L-X(^p>#O1cO$u9dbcfkfBuxvL+vH`%JaLEt&<^h zT#c|s+nWt#CivxY8)*0x3(G#fWIs4h_Cv;8XgVqg19#f6EIU3wv!M<4d{z|>)jnez zMp$8{=UljuY+Sj`*^Hf8#r-2$ZLlJJw)D)(r))p}J~f89kSmQAb-16Q<+UC9?`wnK zH!{Ux7SEZsr6c|*nhOinuZU4Q99Yv3Cro_N2J$se#hn}9u$mkf%$}JHf%}c=!DW7I z8Rt{@m)n!hevZ^i^(N`_hSz7-r+{aZ1znRfm`%2EN3~cNqBF~rF74V+wv2MekI#r}Kz> zKQAnapAX~mBI$45pS+pkjmd!n$lT8f)T~2AG&{!6E05D*V!=fE{Y)V=w--e7^KntJ3`<~ zhc`}@4I<;lPNp%VKhtYYK6oNqpZOWhp+k0B!S9*gDC>KSJ%~-9YrEfv%_lsu@qsS; zU_p3Z{2OWI_24__UuU>-SG8UeP@yR`^KCiMA^vmN4u7rfap3J9vQ_=hiQ{;drzDB*&+>}d>!aS{3B~oWRJ1~yb3J6e z&5ldcwREt$rv>ILE@q|2swDqSUjxrZo8dM7djIeN!csFGbmDxYygkLtrM*Jv>$@Jl zelfy#cY4TFq#c6iEj`Q&GQh^4#VoPKhO|uD4(XeCf0${om|X+NkhwNOOq(wE@szNS zQ~gP`S|RLmf<}@x?sSDm`o#VoIhmlQO7>55kyIGKG7IOX?2@A zM$9x~Zgc05An61U%+%5BS0M2jkwvCeO`kvo5&2SogrAc&P_fFNy!Q%=brIoi|Y<%$m`)lC-osdG>rTgxJ_sX)k4u}9=Q2MkcfRN*sx4( z)II4*BD#FZk4fQVz&UN~Xh;S7-+tuGtXWK%*Wd51a3L2Q?8yb`UJ_!bi?_F?K-o-J zGSO-XTQph^JE%PwR&7Eir!)~??r)Btl?=)bw&dV`Klc72_W?Dw!H?DY#OL5ER`l5r z%ZAK_xqsRORX0oa)4>=I#kE2Eu`1#Bnn!HaC=>MCmIR?k<_lieHCg9s&O>x1Uf9s&ORmR_p|LaX2~MBAP!s1vE$0nu9ofwEJbZBe zUk(x+nM4&jA4x-I_+ZnKUhKs4Bx-teHMAe{#)|7m{ME+LW2<~AJmL8WHDm7o9Y;Nu z%z;NzkPo*eMv{L(1S;zw#z*-mZv@JgnI z0XwiPf`&eDhqd0Y=*)MH~b!>HdhEx1_fiT!?zBud5HPrAaL zt^44KS@F8eCq05@36IDkUe8+7w~Q%ea;;E94dgF%$7SEO*`sDF8a=s?jH=~aK z$b0RK6VglAhFqR(v(ATp{hVXE2L|46)Z9PzwQ66t=wT^tp(lO;BC|3`~D z%g<1uEgQ|m>E^tDzpa>2RHgeiu7iOy?a_8$582ndPetXQny7oh23Ok@GlyTRMX$2u zV61A56Xx}hNxy+uI*qe|M_J(VH%Hlq@8c>voEHH(Vun9w^pHswuaIa@Q$y|Vy>P~- zqb$)pRk-7`7&e9(KlFRpZGE)3u~L zGKQ@b)KF!CE?d#MoHSf}MuumrqSMR~RcdvuTq%x!UML zdPJv_DXoe;)4PzO7; z?MQ;60U7t@Dbb&&gKLzNp}^XLJi6n-1|88w$NV-}++Uk4N_);$w{Tz1=OjoxbzAVT zGGdd}`T5eb4Q3w`g_h#`EK4xP$C4x%WiwlN7}kT$ozn|*U$(*|mq1~`;k&GLALo;` z%z+Na36l6dziD)X8D`YCLS|-$e{7%IY;KnYPPj4$VmEz|uDtq#)^p#<)RtDTH?kHt zO71YN2{t%YEeVXnw~OcBc4KT4-_L2b!FQcvao@QXmUGb_NBoxrJ;isTFi(rU;raUT z#5PzYSELQ+9<%*+&RCo|7b+h)(neof<~Gs=UBQNIXzfjR+x{TcYg|xUnhZs6U1;+X z!d_5UoF#E2aYh4ZqShs1^4S%yb)~@kcpti9))>~xeG`MGyO9A^LGM9*kFup-$b_vF^OzHlx9h{0*DJdCLbR zIl-JC6rK($k9byIcQ2D=dgHypgdDuLgxA`?i^HXSeOqD78e_9)SKkbn{L>3#HieM1 z^jS3X=>{6vpZmUQ4cQdC6dHRl7Pe)0;flB@(rtVKo&NbAE#m8Op``)auAWFIt9pRe zA5Uz^J;vI5$I+(FCvcZf3wvhkvEmLt>N83WVph20@DroRn@%@6F2$P-yW-CMaJp<^ z4}U6eY9)!<-0$U4#^j+sbcsd{92)70>7TUOVWvytmKKo7`(3auWg__-p-!1FjjiVS z)<18xSil(zn&py6c6hnqcfC@U-qVCGIZ_4%3!U&mlO{8~^NaJfRfuV|BbIM3VGHJb z6>HBIz)Woi)U#2Mtvz;0^dD}58~OSDrgsVR?}Z}inFkM!SmO%?71`kEO6lz^BP{yD z`y)Cf?A@vIs_>P6zYp9|!dA`yD#X$P2u|U7?M6+uZ;t_)Ijsj_QUhG8Q_5JBF&Q?k3~nmx zLFy%)vniT`F`rzdxGnx&NNz&(y|sVI#<*mJ#GE+Odbn`FXRiKC{0XK~nDZf|O5u zo_YLWGPC;#5}2>Z#}u^@PZ+SUEdz;=H~^NU^E_)xB*~mMhCFYQ(@*EL_&k;oi{27T z^wY+|`EQyyE-sijs81#fb}XZkzFN5U$^uAz9#5`aDPz-8wUK-lNYB6^^2+9g_<+Cv z{2}Qu>LZUKr0r!6uXJ$Q+oDwvk*Dm*X#3MbS#uM~VORclVOfutN8d_Z}!W` z344`#N*$^B{nz@=>LSP#@y@FjDLqUo@$e}o}C z&+f;+Us|jN((Kn8*ejlY{aD|RJiDDhNB8-9L8`)e9xKw}bbA8*S-ziz1$*P$en8rS z7EzBM_Mu zKklzrhF1gKu_0wN(eLd})e8DB56*{QsHw~1iu`Hdw3{URt{cuYC}ZssU#jrB3jSEQ zqWS;pM;iJx?&fatXQ~T^EiYxZ?=@(V<2iVD+zGE&XtDX*ABwx>BMJWC^F>dmlCZyb z#ZhN6*^NLa4F90Xe$annAot$ctarpSg(d9ZtDoZ4cZCqsY>#W5RAgRtHKNut6CA?p z?;S!3o4GAaylnU%ET3zQ%X;wo*PA-2#vdbe7kNIzw1g?Ls<2IW(GHGobxtbTunqF&Trd*dTeilVe-Tp|353g67 zjv%);k09|;wk&DBHs%EAvz|L5$do!0_*}u~srw8jNl%88vuC=oz~5R}%Fl;d*#k*X ztUo*zv~X!eB)O9~hD_>SMWdH$VPbzHW^yE!7>?Wy(g2CtCrG5zcukK zTL5Ei#*?$WuDGi|&x2hSNb|-ZlDqGrsKDQUbZ9zE8X7=Wec!|UxsSaxupjvq??eIz z*h$*?dUUO89{6o_BEfezum$#dD9`XETOR2UqPD})d{s5&yb`dBfJro0!M=H3Q4JvEV#`WeW%)!Nvh`r!SfDzsND-S zwi||CY=V=z-3Q(b5u6*|F{K5Zcl>fL?0qmmFpY6zrX}V$rM3;CHI#(% z;+L%Qz9kMTm<#=WY^&_2;lSo;TVun8Hps}|D2?9K$vy|#qWtV!80I)mRJiHLF3+>W zy4E(Zs$MNR&3euD9^rWn$7I-Na$9`1*_$b}IpPYJ`*3N@2k~&wC$>+E^KQN*!~OS` z^unAV?niUQ`frY;YN;pv_^X0sWVm9JeJX4+cB1=>$FaoYZbBY*4af zu7S4@vud6At;3()pPVUK@o5hnO)3`sCthL+)9r*^e!TBE1wcvh!0S&JJBom#T-#LZ2TY1~2#Gr0Ykh)?|HI zf_W>MB%6<8C(5YbaXB+NuK?p)dgD{oMmlwUAe&*T4Ra>GfLpb9Y3IRAi7c)cOpF=^ z2K(<))uK?gb%#03=57{+mF+ZU*~tr$C!D~``#)H{rk&PRhJbsk2Po#{5arUl^!nXu z&~fvEVcDLn>UAx>SEP^IkGVm;TO<1zb%HKStOAEAcCdI%4xPmE>E@++_)OmxhIIVL zY-3i_XzPnm_1FyZYII3mdkWn+Q5Q$=HHROQhccHj!E`0h#XC&z1#U}t{Zn0;)~e0J z^k8jR5aunbZHyB&O9OGVOE*w{dzM9%KJq_cmWKDLKa&$WX0qi4#lnOu0XX4nE3q24 zk=vAK!7Qm z=(6m$G%V^MJXT4;R-*v=JMbQx^S%r^0ugIYPNFuk2JFR-GcbNy3Px{CqKA)nvb%)A z{Zhom&(_dK$^+Pj&Kl5dO+m}3EwugaAMPh;gdOey7?OLKww<2JeuXr{vbB6qcJ?@B zVQwVv$9?!#8-QQB%ILOj8`#0)&!E&<8n+%e-7oSPAdqpnv_l3&b>9X>%i zcYgIAU(568>*>Xg?_jq~1ShvEbmsjKcv$iqdT{1;RMaIJ(bAnwyP$x_Iw+Lvsimba zdcc}|MeORQi^T5|m8bH2<|<{3ij={Wzn7`<;jKiLtb*bzUEHcwOMiJTW6g0r@zCju zP&4=jwXk&&oVnj8L?VHePaElu`)lAve@%SsQ3aOwtLcmrarBi7UyqFevbE~yKfmGN zZ=r)XcJO@17Dk1sujpG{J#=c}^HG6vx~hjU_iX6n^e@$*){j!XHXrs&!4TE91w;7o zYI>^ASu*&yAs%Ax(&c9^(%G+0LECpj+%z%_22VLf>vz5qD!&?`X?j_OTK{r-ng?t1 z`L$Pj1W?Ig>X~{+lzubDA6pD1pQDRt_>=i?;ioai`bUAug1z+7rG2#RZ!fI+yG_!x zKc6;u1VgQo38sGuWL`IRao6!H$WiZwUv9Tbj_Tynnd*8F!kxbJz91Wxn#pIkZo_6v zV;p9vF8r4}j>^6?k&`aQs2Kt5h}Ce~XZj_u@iW3(hxvS-M_>A7gcIHgHo#L)1(p>2 zPt0p82hE}S=y|NK5Id$;T#(+M>`c%{EhB-=`oY9OpO3=bxxB{Q5Fm8xTrI{Ld=rAR z^!R>7!u0>-h&!_jA#jr}x@AQOS>LQgZ&Dyc@qCmz&jlssn20%}_e0GI9hCoy7Fvr+XRl?>YpkNCYbYetOlY;vqbRX0GG{8$^aKKrwoml7mD$L|GW zetvLnixxaW%mo%RNm#6?jqP?4_VB8;Fl+vP_^79a6+cS>q2bA|8(RnYF_{@`0NK-cdPjFl|ewGa9@_Ia~pb4a!@ zq*@=6e*TZ6^A5=Id;hpXwD;b7@2T!{U6Mj+PesxqGYTJDW~q>!z4r>0dhT-`lF=Z0 zg=EXlj`Ta<-=EJPNIl)pIoI`mzh3-46BPk^Z_9;kbsB83j5c0Bayg)B(juY!n+YtG z*T$M_;js157NKHwKlVvY2YU`R!Xw9Jf>3yuo!8|&rO4!8WxRYv)vXdgg#!ij;#XGWuaW=U8KUqQXu`!*v@h!PD z%?5Y#@4xy|Ejoqw^bXFm#e?59g)3%ObV))DSx{t)SGGmN`zj;a?@S82w%!iahS&(x zLS1NQ6Yt3EvBSwtF<|z}j>gdG?EOi5oY*!%Xj>^zZW(!+eedyl}$3(+Eyf0qi$9iq@ zqg^`|!)aaa7r#A6*jH#t({_c@`;MHqnD5JsH`vm1?GvDHAonMaUM>u*)}pox%IWb0 zJA4@D!&F-h=z5u07(R*b2NhQf2Y$=b$FU7GX^Aa<80O8ep9by!D}ej9ZIJQz-o9>G zDzE;7?m1(FLbw+jbw`ONIoiO(tJb)%V}~$Bt4ExWtHyF)^S*eJCyUclq_Y*(;i-%@ z9$I!l*!kz5xMs37JI*@`k25`3YmE}UVf2e6_*r4YU6Hw7m8CNSuEE6_ci!qWct)4LD{a>bhTqud9slNrxMYd}%H@exr&kIA(;`5=HiTwP)>Ny9-F84n&vXW_XQ(=EOk+3jmVZJ ztruo`Tmj(j7~?JO?C7{VLhztFl^jy=y6K8+?e}Eu4a(g$9J&Y*~<7`OcHzo zLy2shs^oI9GUjfKgCxyRa=vjTd$~mg1NH?98~i;SI0UNd7)vqna5;E_USgZ+K~H%UxkD3MTy|KU!IxppI`RzMlg`> z6VgB4Wq<7T(Iz+?+CK#fWf?zdt(yTF{x!B=y1{yUjBx(<;qdhGPJfxbZ)p-S z#+joVVcw7xwU^bdvkAOUe(l?E$eN}j<}H6qFL1y4l4*?~Z3z$uRo!6yqAXBjP&mx) zy-PH0|3T{#ERh^-gt7}~#J<&c+2&E!{PR5=de8bTvJd^4Q5L_SC^x~ill^F4yEgV= zq8+|(ih$58N2)s4nC;|#DpmV$0c-#H(vESxAaj8|3Tjb6&pK0S{s2~8Oq^NHad9!ixw;Y`jn+laq)SJ!w?L(_y27=r?2fi=ZD9oB+ zOBJqsqOSb^mlWZ}?kKy{@>mwN&Al*E7O;! zQ_j{9d;a;b$5LdCM`Wn~6$Z=lEb+@LRcU4DB{A`=ElSt$`>902Ucd4dt;9;OIc0+1 zE~!diyDXNhd|`#MHw|&~4hh@-pSo~j*lDQX`LU8Uu569rBBANu4Dy5XdyZU{u&aNI zh4SEPe#heHFBLa7dG{ru;o53)Cqf738;DHL@22ql9fiFZQTbn0bDJ*bYqF1fSCvt5Wm=Oc2xp8Gp>DeH;yCGT5q0S6f1a%KMf@ftxc zomPOAd>)ZMdxtPBJd^YrtI9OARq)*&FIILtiBw;3hKIZ#wYX`G5G3J!EOwtJ2J?PI zfDda{O(na3M}hW8&NF?!RM>iXGMSZMMhm7Y;rupVX7ghl(eRxP*2@%;wdD$S>v*>& zMumr7PI&CS|-> z>MvLv3nlSY#^n4%Wz;?s13PYqlhf^aEdLGnk@{N-AENzDRzg8@+ zmtkg;EOFx9MzH#KO-vv4kY(gs<9CRFuqg_(Y?wMrpKF74K}~R3MTcgzK4)x+9r}kv zLi1vO+F#X@6K;Y!6thY_ea6AT|k%r7sA%g!kA` z0jkGSr;FQ#U2mQ6OR7I>GRvWjumLpxIATU#h9K36rVW0DVldwyue|EVX6423KGPDY zG2`>kadU(YH$vwn52bg#I3F?Hm(_R#($NXy!7!A6eLD(;1$i#idGb#Bb2R7kX!@}5 zCtlQVQaHSsVUNe_*9Z<%tmvq`|B4*@ z$o-j`hdtS;t@gCWN)LWKu*HB0lr`rX(``I!uEg_+nF~DF%8TE`;sbxl8a3|EY&|Bp zuX-vTcgBagY2RYK3bTh%9&Yd-3(jOE8K5{Eq6XNss(FDt5i* zyYVHaSYaVDeE3K5Vj}~kJ;u1dTUFX`-P{^hZjaZ`8{lnCk!4%O3%xlXHQ}iqR;+Mi zqihZcVMF$lQUADOGg@TQyfeb<<8=^Zq=Reh-I>R^PC>8oJXtV68?RP~?2xGp+27p= zxe44?pyI(CHk*?o@|JfxH89DWvXYMuWK;HCu;o1DpTv`m6~c+!BNeDQsEQ*Jw+jx3 zlgJRF#8fy>qK$d+{&zT8t>y-2xbHSUa*gn0c?$W_|1LG=_pRZBe3;Fz81ipHG~DF; zu7CZP36-@Obf&p49j%=gE$RI&an2%FP@96u&U#6o`l z=p74o8i6GL;B0n#gBn`gv=ff^aVCHK@@!9eh2M=L2Tt^4GiliEBI>bk%G$|~&=0>|;a#Lo4LMB9c=I@in+Pw@LuyUYf0 zw80%_WowNa4u``K&xhicnSEH6iw$01PhxlMBlgUj^P%QMfY(<8`evC9a{+r? ztNkXRr`v|sSNDgRL+o+fu1M&kVnp{pab*F~4j3^@PPlFAK;M=AnsDAN=LRet95 zThTBEV;%8$y1w9_8x zEWEYzqZ54>vaMU4v8Hg4aPa7GI%fED!RaWcJspgLOWC2+c;PCRCc5CE`Vm6u$T774 z`0ForH@UjZwhIwSu_1(_*fbl(jlD$nzJo;Q8jyRry+RUsdw{hjg7 zjHSXS#Q}eI1;rS&;T=~$GeVF4((-Vy#V*}q8FWD=oblK1XS7TOr(gE|f zdoaIJPr5)u1~i-PamG`T-Qcdw3hNdqePfG{M!Pe0?f#q{(nJ>bwZ*~&k+F^*@sYy? zNVT-a>%G*ZJ7=61%RBA)S^<}A!COjGC4P9)>=epdb2N1eq_>NU%*>xxWj9;F#bsh@l9@|F?|1VF5id6T>`T8YCO-CsiC^=QlU?K zB=PSqp&Goe(813i!$>IcwVMuA4yq_zp2oYQqsZEedej0`G1V#oI+~J6-nSi0h*HDT z+eZlYUV$V{ew1Y27(PEa9tV>@3?#ajR$x-naixMR;-fuh3`w6=K(-g*FfcZsX)gO)Br<^St+AtDb<%i$4mj z3%-yJ{(KP=BH?~VFEVDFJ&WY~v*qzkAgz5R+{)njx9@tmX=VhN#%>dqo9HmpfBLBR zuMtSZQen^K$Lva9Bb0WAgH_V+0QY?gEKAuKWo|aYf~`9PyuUnP+qF#b!G&RoU?7V{|?)}jSQ|_-6zZ*VgNgmdy zH6{X1m){X}+_l&u?nCk!(geFBKZrI4FW9R=cKFOC654GH>4a`;rZ?OkbC&%JNSSO$ z9cOov5S~|YNr-|Bi3zoyj;u4y0pER87jl(c=&^5%?3n0)N0&x}a*hr4+dG1_{O5@J zsn)`Xo4!;%u81fsbHp3Hf8@>e7l43Jbxtr&c4dY;wWDvE< zC}Lixobg6}l<=o2i5_;)6x!>Y@yhoBY)e-ny>g@s9^Q7sdixyV{gHw6CSDc`IDcpR zB7SZ>Jcu6NRseDQ{1P*4f$-_QGi|RPMbGoRNSvoHGw1v4QGwYo$l4K;&lCv@Kbz7w zsrzYYfFlO?-Z>_r$$I@;?>o{?dreY~j56vmUIh*pT*# z>kX$nY;i5WYW|d0r)ohr;DekEhVOT0ZpLk*llMJR$e$;VN1PGFmsiDJmxi*;fz~+i znHwA5_oEmyzLM`9t+0=o$oem869-RaFlMd==Dt;x{$0IW?8pD^Qr_=Qzan8(V;@Nd zv{b>ZT4T(*p(@><|6o9RgEh{6Xn@N^e*fu}BBV4_LfdaWocq|71sy#gNG2ANdObay z@<+m8!ztmRzXS?>b@0j@H)g!>qp+6kA-m(Xu~)Ll%FF)t-T>c-@9 zP9vGZfB$qJimc7vn%rG_4SpY0!>GyD&9`^qvM#>%>{L(WQd+@puw4 zrIse}zQRa;fBomjZJ&=*A$Wu`IwTedLzUBr!nR!clh1pNv;0^hNg-QDEQHSmO1LaD zM_6@f3fca)LEO5I^Zw?>!=dw&$j{nMtZkn%>RCnzx1-}pTY88vvWm}hp2fn2$OJN{ z_j0!Oe|*2Q-olp3fh0ZCj~L%p!Rp)?sK^>ja^)wp*?itTbAhRFD%qWkTU1VjkE*!H zC>nOp_a*K7qS&k7Y8d=NL0ERxhRjR3No4z~VnV}(NVSuidCNo-`$_EFgsoD0}Y4h?;C{qs{Pq{S3OkZ z_n#qd1;W#(ciA={1I&&K2WjP(fIGdqXf842K8i+|Q@JZ(ncXe+B*+-iCLE~s2+3H5 zPC6r$_h%M1!accK$=jDV+2bfPd@>{)e*Vo6Pd@xfcP5%+&E7^Ry17(LR=UeFQ!RO> zGaOQ*8^!R-zN|XS3hO^Nf@)Qp_9)Ae@^wJ8rzv$A zDGv?vZ83ChB)Ix$QRyBRHn-3YbBy{5S6wV^7$d#;384Dn5^pbr42=;h*=iv&fQq2Yjp;3sZi$(A>y5 z?BGpD+!G8!uzC=E?kG>%xi4$~$T;{KGmw^hmax-bxX&g%PS|ojfgbUk8c@M~5l_z! zU=#BbXodVL_^IWD<}W7-8_SU1p7mLLXX}K$hx#$^-+^>8pRXtgj_5JHfM78eVa`DXOS$dmNRTnD^c@6B`<+0unuLpTrC9{)UD zClvC&he^K|RPLxfzT`QSB5FqOEp&$K+-KF;v`uh(q(LjTDlpY2b~w1mllK{o>EbYL z2>fM>TjuW<#>!|=hpiUurG_0|&+}jh`SVLv>>{&VY%%PP$SnS9(S4TJKrPG~tpn7g zi860QyJI{A-myu-<_g~-gQ(W%33JWOSo ze@)@B{!7pqYsjAUx+-SaaNhd0I0)@9WFN<7uy13X!PHj?x6UwQvpv3wt9SUpO1qs9 zsA0}#rP{!TehBJM4v=Zgn9W*P32~JJ!C6g*^X+t)@@qwusU&dutdt!NRb+m5Pr)U5 zANXe8DW+NWVgB0{uw}A0lr$`5-}E|Z%gq41rR4^PSN&yY6mL`K(ehZ{WexJ94B0m| zMm_iWqh*@~)CFH=KRkC*{m&C{!z%;We%4I-@^wDFRx|+nDyl%ru=Q+H;Q)H<-FS@U zeS5!hd1-U?Bk_;JO5A4FMONz#lfL-1S+cSBc&z#QfOz)qV8P0%LgvL%v|| zby0)N9GZjh>kv`aZeV*}jwEC9OHu1tIkB8;C%sa&g#=fP!zT~sk$VeIu*03_NT^RK z23{OP+7}y3>nuK!Y1;d7+bCDk`Xoc@xK|xk$d}@~7tMn1I&GDQxTo4l5^mtO&x zSd7E=`+e!Y!|R!1!3tQTUy1{ojH!OIp7dhldWgy#hcAmGXrS9JHbZ9z_zfyW=Y(-o zZjPxmH{&o=T^@%yCrat}rKgzT>C^CD&lk&nZlRYucTzby2?Ryt;7->awDD;J(@d#{ z5eI!yC*cHbu##o9r<>sCiyW+5afZtC^HPh-9r!uS4~I5h;;eOl_F>W^epi&kFmjD9 zu;Dzk8||<`W&nEiX`&+@%woTN-$HU;KRhUVhqm4;5W07Nge!NB!1R%~>EfX!(4f%? zYrXp8bjt?%;A$vczVs)gg&l+44o&o1MIto)?Sjbn{qbE9=bdkOL8k`v!ab*t!%(Bk z^cd*F@h%xO-64-Ef6md}&TcGR(g!niPl9Q`D^v)oCi?T`a6+^K-WXX=-QQ1Q!v@LY z@C6lM-F}r?FAG6;LbnKDi2ojxlAQ3QZi)Zt_G&Q z=RplSk%mOQB#DPKvGZ3I99~mRa|gt;bMv&ZWtA;x8JwdlZ>16cI30BS{asx4kkWrz zyP?fV2OB~hKH(m_=40UF`o2O1Uo{8mV}=Du?PT*nw-h7Ovcv%KU;y(k1Cn z!6R4`Pd_**j!*TY0X}`;l^yq=_>E%Kjn1@k$#oEwHLzmme(~BQC0hBSg=l_NMbDl_+(~M&?xzpQ~~asFLTUk zo%pZUVE-%sV#!?Y8=snx%$kqA^$(kM5_;FdCdl260~CL-e}I# zv^xbG|JRY&xj`&GRVWNlnL_4WSHQDv$!yl3HG=D86u$ zA@WtNB*Ir7O#(bX?2;$R^F7&AL*DTids56HKZVCHWx=;c9w!WUhxxj4jQK%*P81- zfA%L_6J*mi(I+od(P>^S%(1TH4xMT?g!A4_?>fQCnB~IRlBsm@4h<~ws0F8(If7D3 z1#_OueK@I3FyOkpP%~;MZAsGRe$QH%R`xaEVc{_*&;44_mQJ8k>gYf5nI|2su7`O) zYvB6T@ip}UN7=Lw`gqdZ30^imm%NJgq?Z~D@P40KSO>ktX&J}ZpM6HCKEer#eWr*w zIfQOlWQ?0!YGJI-0x`4aB=Z?EE@&o9Qla^|A#WHJH-KN^4X}lfcUn4)knZ z6Z^N$7G>AELg?#Iy8reUT07kiZO==@-D~6M=rjvBk;v!QD(>L0VF+EhL!U+abAOKP zNip?lEIs%|25e32v23Xan9LbQO=SGpAz26P>%Ui=J2Ht1*Xu|I_uoyF^@8%UC~Ezb zzmKo+dA8vu(NQa%7Bwv(Gx&MVZKXFX_%V{otIT5$w>#qIlwwiUdn$GQ@KRV==!i9u zNi6TpWcp;nW;mATfCHoEh{>J_)MuBvxQ5T4cb`dMbsrL_!_GpG^80OeOS-s5J&@KN zbEKR3*V_^p&&n1KrgL4V!ft!MZ(lWB)bVzwL;Tm$V13S~{}9Vg>-kdotFh2a!4@a} z^%eVY-}(J+?$G$d`CKPrIDgND`o#IcmJil=;9WDjv)Yt??(P8Dc1vsv(vzBf`YQ4j z2j<){!=)3One)-uCre3fjgB4t13D5dP zy1I)&^&X_Y`3X&oRmaWqVp-!ud-7T%6m}0*!*s1+F{rOUDSUZ=KK4?>-gR-D^X*AK zt7k)z70>&893kGV3?^NtMp6S!RUD;>MQ$>h+t2`p?r_m${v7w^UlA@T2alAcTzEDiI7{dM8whFKV!AIf>_ z2M>ws7ZLKb<|!G$d0Y9<-Qn_r5Hefdi79bDU`_2Aak}V7?z~k2^B=0%cbOZ+Iu0g# z+m)HteKqWElE9`Leq`(8+w9(14YYG`h3$1ZBEv=(;kQbow$2`;YV0 zOfnjGTG+Gvs<7rJkL-Et;gFHekk+tTD0#7pI&1125)E%T!TN@o z;?z00)a8#QmQAdMxW!Aw_=GAp>Ap3#40VRAM^dq|q=W`k*{nip)iQ=| z*f5zrj&VoLX{*H(FZ1atA4hU7z#SVuCNYg!Q)%k(U7%&-hJ(r$iD8Emsma}y0dDGU zI6NwmwMQhZNMP$pP@PZU44Su9^}l5q*#`0X-BQvLtt0A zBUVjt6~q1YsM&_+w7l36ZM|YxL!3EXchnh*=JS5W5@Yf66iqsMt^)fsmCv&cqM7*; z6Dl384MVfJ581AneO;|VFWWza-6^)%*gJ~-if$7<)_0M#XdAQ%>5}vhX%c_w`m#|& zZ1Cm4NLEtzhWFd=6D{ERtEeV+(EFa~J?%1V^yYc)MY_`d85>0S};|mi*l>BOBN2>~ib(>6Y@ zDe8)0%NC3#d!BQT3im(gl7ZrnmoF zxFZSl{4(xCj!$5-v!@e}6-yu|UlHqu%oGoVFC|y+ju&^PDPnWHFQim2A(pXg*#CHd zd#|q$2lkytQolbCbi9>tRFO9f@XRN&jdNMPu`;@x+$0)yjV7n`cwW1&GG1x(ghIb8 z($SsBg5D|P&h7iezF%TV#+*jZ@KHvO2oIQ|Fp_*7?#=$4;q$I96=HT#IB6c(50-9H z!Hh;XNKZ*3S~oS>_1UVZ@2<6dn2kIhLRCOj;)C&CwR3y~#0_Io%46Bs)RP`a;qFPY9KXu|`M!{0l8! zEe_49V8{5pBcPS{t|J@7e>Wt-cB`{9ei;nnsm95Hh#dUXFA*ok9 zy_eWccZIm&)|47?oyBN6{E8v`wsXT38SY?vG=`4uWzKs-?s%x@s5rB9G}Q_FN=AHk z!v&u_!0Ki^C5}NXWN?1CNj?%3+a@UHN4;C zf&U$yEN(5xp-1y>i#L5eu>Ed4o4acQjdhz3hBoeaG?xEbN#~=w@6}``BZy(M)543GJV%50kGu;@od4qLGaTJ+sDy{i}Dxiyl$z#2phlD^ms**7AAXnI={{ zM~l|kU5DNke4ef!$&^!GiHRXM$@>GG*MI1dWM|xZV$OROAWL zccTq1xZTL&HQtB?=R~-~neO`r=}IpiIU?rpvsz4%IX?K0dj&Sjh(;IBz`sSNSYW3s zRo|3ad-#YIs?9UP+;NRe`gpK#VZ>>8HG})cJanZ)Zfy~sthUArxjg^9tC2OokR={z zXF+bfHlF?*&TeO#5oe7ZWCFiW%Gflq>hm_l;`#*`nXG{YhLOxyCxqmlxJiPd)ls*p ziS1q-K}7SLP&z~v50*r+T^6}y${=~z%KJ;pat*{Y#&gKuk18zCO$FBtk71LJPa!)x zTtUN987;GXM33|HNYSqAbhZ|sZ>z+y>*J=A)3php#Ch=X_hLjLY%#g4w1~QVQ^e7a z;@Oyrg~aN}e8}bZE9cp{qHFsK^61Dp(X&MX9jkqztfPqhUAcj!)GFctxk53J%^}ud zTZK(~d0yzgH>5_)BYF19*1CoO>NZR@V%*clOOxK?jH;<1a=>@%^RbB;UKDoi2PpKrV zM~B6|S3#Ap63A(dAxcsA*_^9tXqVv%fNrFn=li;jsblV72|RyoL(sf|jVa}RGX z_X9pXKg^cQFu}iX9N|#Jva{7!OzA4_C*9Lp18tF`YD4ZGVks`>IOe@0IIDb@xPLdJ z6BI1a;av?BjO`~5a6ZCPUs>X4TYf+Mo-g`Ec+=WCE6m`}Pa{czc<}9UX0*cw&+_xz zkJB}xi~cC8IG5kYQfooBq)x0ctYp?B`2C8X&$1W(6}yT{Xs3?@=3JC$xEvQmRB~|?9golPoU~GXsRh!bl=G}6^iTwL(Ar7O(+uzde)2?Vfgo;^O zvD9;&4QEffB0O?~)^owsBT}1b|L2AwyDG%0Q_=JxFBKk6al@aH9w5^hLdT|gv)Aa3 z-@5jR<@xc{VqP;zvUbP!mpx&3NI1>B8P8@adSI*kX7S9JRH|6Ig52zM$Fbqw@a1k2 z4alF#o7r8c>h6iOPE;UJ?|~uZNo?k$99q178}uA^#~|&6;*EV#wC@dlNx^1! zeB3XQDcp;qt=tz8fCj8P6gE2pu$H76=*K`S~P9+&|Qw zdR{M}sWGlNF*%NXp5;R2?MK1NK`wYB0L8UejOdWAY8vS2f_t1|S%H-mZ8ZpjZ&uFO z{Mt#ZE7YPZ3p=Q(F7KPE#;`FR#uhD#(#`juf1+6221Dw4 zRs$kC9WXgeL0tSmm0pvvX84-(n>r#{tCBHQ3j0BfAKT;lvL<%JLzBuHUFF<5Tby<~ zf@xfMA<70{BBaR%SE}5WEP8cYoG?9_ov*XOa)k)?Dd&fnIeQQ3E3rnKQ;qC({9AEL zLk*ao;m!+pU8(!CW8&et*4X>F8CJwMvaMhGiKoO0kUwaGt8{dw(M1)tnWmOFbGISx z2>Rdi(O*b&ItfR%>f=pQU1`a&^+NUsOYGo&jP0}e`ETPt;mq$dP_|kN%eIHJ{DGYJ z@N6|nE7C;wKaEUX$%2>}odd@A^Ks`R*z+p`$qxMsL~oWF-rUl}sx}NIW%AdcbqeS0 z*hMj!l{sY9x?V6oOPTvwG{v}kd1RTr9^1tCd9*c}DIFP0I&EyAYq%26*SU!IzUPy; z1utng@Vw(nem}iDfmrbUt*4tJCJLeAQjNK!q48|oyXi!ZFA!x_74Yzm zZ1K&WC1m$i9lGkTJf0lm2M^2_lkqRMu`)g%yPL8|oZM>?>D2!(pz4+as%`Uun~{^q ztzj!zKIMF&m#f4=*Fq<@1%j+FYIHHbA z5;^xfT!Gl1ZDb!;XyV1OE}$Xa5;{~EbsVpSW^ZfZ`0{$8!{R(UG*kyQk2ynU%`)NI z-EH)zjV{`6uZ3$K`9i?%T2|RdAJ_Xj!|a0J0aMl#(Mg;aot@9;Q**8c{FAL_=cIv5hBKH&nP(>18V*hcELlJ}_>NZ>`O0Ud2}jd@Jw`?T|}u&6MA z&V2owIz~ERVtuW+e0eZkvDFlYxjSHixjUSw^P}N|4OwsQ*XY%DLM(9!re~MQ@N=mH z{+;Im4{!L>U9kgL(j!Mc-`OiB?i)t6HeDj$&hxy{Q%|6$1L?WviOhrF=a%g)7wvw> zP>uLPvTc@fYNj*pt1A@~62?%OJY~{nj5D4+n#4>NrPAM-+uE-B6y3{==(0!S>6H)m$d1Rc6G7%QAuAI~9@}AzN3dwg^9j9|9H5uD zkFcyfmMy5zrad!;!w1GcUuJuWstJ9m;jTM$?nzr*yfKFDXji5&9zO7Kw+;R{Zzay! z`cD++_2PYI&X?R3&BXQcv`5w)CKOqt%x-OQ^0?pPjuF}{Z=N;IJH_Ak`}@=MQA!X! z%?h{lG_n8gcZn-Y?}8TJH_F}Bm4>=iaX6bN9#1vJmD~8-F;z|s@4gBX@24%yi(!LI(#cDIPbm7XjMskpiZAkW$J7kBJZM1@vg zSj*3AEyi4#AfH?8W6fs zWRW|JaKvI~*z(@F_WJG(blf~+>^xKp$ z*22bIPcdaKW%G0`FobubepVP`b?#F15!1Sl)w6^Rvn-=GQ!&BWL z?0FFVmZ!ixeH<}wN2S>EBZ97;pbnP$Jb!)F9X7`W(WUkd?3RfSaapZELu~g-HuhMM zF(W*Q7R)Waq=}C>Q!rlo*;yN3Fg_ za!qETgQ^+L&}?NP6MqnwvpzhV5=09imj&FGhp{&Ap)xLk$}Di8<3cnc`fD=mrz7ZH z&wMuJfG$`kC}Bs)B)S3u=(2VT@SU+0w)CA!*N)JEQ!9R702M?A_uUa z&^pJpvgJktjQS`;8N z@i9Gi;D9hp-v`S#^#^vnl8x3^AzKT^VoQt+)Q&Kaj&eyN#SY#$@#|ZX`M#K);~XuM zgW1@4{t207(NCK9=NQ?dQ-a4V8i?byq0%`m56O#;EIcW5h`ero&t7lpAu^YWv5(pY zqLSe+U1P5UnJHQ5J13Xy+i;6rTVw}&R}^FE&IoeiuB&v?U4Wz?nfNe8hm7qw&(_*T z^D}5MS{(i;q&~KjzQ`X7?lqa1uyK)4Ik1{ppPvOS5yiOTm8vi?&{|sFw-D@hXJXU9 z<&t@Lnq6}!gLA`+F*C_WG<#+xJsi0ef=_1Ru~YS8Q*|YqGJPLh9a)UB5B`bYPT5M= zZ8-^}o@Zi?jyH|k%UITh8n|NMi3S^Esm;i9bkc`&;4ft1lc6c}qVhG?q}K>a^E~nP zz`0b(L6)5lxdF%aXW{Vp#k8#CDNCR65F$D~QEm8o&I@&5@`u{tw^cS?H`_`pihr=` z#~olW&kNNbo}lBtCbM_ioiOLAEShaSOWpkZ}mSIv%EJJ zt~yUWn>nWTtqium*#jGz&r`j&MKHazH?H>WgNbp~bjQP`G{-{@gSnmbs7x)*ToDSB zAN0dDZGG_I>k3+;)a|B{LduqDxSGsfC>_a@e3x>A6Yk*wBr- zI57V(Z25hK+Wmee?hDh$y+`?;z^IYtD^G^OoF9DR*%6qjg`h08l3*WDZ!pVNmwZf7Yq@05@q=BPZ+gU+0PmWDlD z1ZLD6U-nF6rgFz=!}&g_!}C0|W9?|xl})tUHJtPAxv!%-mxZidO&@>y1O`T?c6Ng(^T0lH8Xs+avsJk)PKsrg_3v;PEk zTlgq$+jSD2ZP&-1L5kG9x>5{AcM?5KAGZt}&s=vN7ssU^gvlX#_@Syl4VpVuJf_?! z95>LzvI{wE&(*P_$@<+e^OFuYfro9FK&={d|etvcX# z`gREXsDaJ<ZK;cQBje_F^4P3S-ht1F%BB;9V0;5gpxJkJ`%`w|3e0+LaSi||p zi?qkH5$RimpN9LPbD$cI00r7-#dRUA(STHHsc}C3c%~t_E7%V@1_OD2YAVlNc9&OOC5j|yb`C!u@OihJI{kL+i{PrdnaoS&uT?EUSLUB^swa;5xT>L- zM2jAJ-zumWpC{XTRFV2xz>d-Hgy+eFSYV49?*F4p?}aoA&%0ib9oyB=b&5G8Z+apO zQgLU2lXzdPpCPp!Tqh`p_lA7|>iFrT8IX{BLhODs7ALQPx!;Uwzco|{nWPB~oNur9 z%M^Cm-4QCQ)L8Kz4IFgajM~XC!DXl=XytO>51N9T`F$bzUN818Koiw!E$PF>7lgBe zJz;r2O?5Uo>7<*Q=*jaZgPpGlvraUylC7NgEHws?J*7fpn3T@U*1^^L zPQjbQbA_(fI(C)k9m@tALu^M+z#{9z)PUz%m(D%~?`AdxY&DfK**XIxYQ}K#*wI?S zbQe`BHpJ~yPl4uiB56!w>~X9y{xLO%3Rin^@4Y?ruaOD*t~dq9vV%m^S?8G2D^rZg zGX^nqhZygFimpGwc}w-D;C{(5@&1yFEMS%ePE|C4P3PZ>Bj-2M)%-NnbI5bvm@MWJhChMBPrmu!{ZJs7;<$d-a zMMgARYRhNsicmk$2A_aA7_Tv+Z$3IPdsSPkf2&Iy#yZf-lozCg^H+UxEFe4BoX$KP z!lrQE)L<7)s_EcPrJijci3+0XmRGd@36be2w6!6 zEAAgDNmCGD^gTn&KX8Xd?UwU@Hu5WsKckOzi!xZ1gOyCkKQ9m%1OEhO!pDh}Rn4*jot@_o8D8@68!jkOGE z>>z6*+0`2kaen9K31(o`=t_py8?c^0bv*aQlr9}-Ns8x~zzr4teDE;^&~YP6)O)cl z57n`k%W25IXHBFH*H{Gir_gR=7{d6#0!x%I= zY6X=QyXa>bUCbDK3Z&h~1jj|SEWA+b zHpF%EMv&-O9kA!@So+i42nV)TfP&tdfcm!;Eb*-|zJ6{9+QF6*D@ihKKWT#d9#_Ef zpd87~O%=@dKQmn2WeBNVj$(RgI(@=<7Po#@fSmz|k6KT&nf)v=CEN&%w`>x3nJl1% zEtaV4b_!Os>=qSk&a#S))>!t~2>QQ&EUHc0MCYX0VAS$cU}DlC_Jo{cOL*R->zFan zo0`;el1P)j+F?}BDHt%)kXj#WWa~H&^m&~L=adJ~<%8eTCZ2bhG0L3!lVG}GoDJB; z^FF498Mu7#rAMY|F*DBN)B0pcv#tiw&pG|U|Fa{0nrjaKN6}eFRrP#PToLK+?(P=h z&N&9QB8Y`Fs3>BBf{kJ$SlAetUt5q+-ko`ZU@Ic1lz?Jjfr{Aio8R9oc&zo-J$L5p zy+8X{yFdLi!Hab<7u>%}kM`IPqirwhNEOd_*)>_g`=db1vqM-wj4S84Xi(#@u{3-2 zZc^{zifo7t92-1>erue|O#8UuP%~xvEG3efjBz7-9=qb}t25ccZ#s%NE z%2NF2ff*3YJ=SqRK-l}6gd8dSsA#IR&Sr?aT z$20%9PlDTSW02pigEQ3LtaU1wpOiESo6h`5ISa z2wyNySo+MEeqC#bx8e%m&5s1Zr27O@A8m}|DvY3F;OD?`O&>&iEfaJPD1g*}*1)lA zkFusGrl^r^1gE7f{n7fCc>aJHR=5bgyrog$7fUS5GESw`UUyGBy)dsEbO+7mA(A3wp`m)Ig&8^ebCC&bVw z1G;FS9a-My)@);!s82%e?^T#(jJb zD7s_+A7+r(H-?^*_Rt=#-(34@PIVe*&|XqAs2b1vCH7iCk6k3aS8m28Sb3sPrXd}} ze}2Q~EAji}fi8YlVAq@TKBx1Z@~fUmWVPv1&QnueaGu=V=7|Ryt-&!jk;)cLXX_KZ z@Jxsb{i?8pTGb6F`F>uQ)-{t|mR&?;ZXE+pWluCGeW}^W2wHL6lkcp!e`v%ER(5R) z4bRvP0j2I}@b!zq?{PsKGL_ZUI#6B9(co0$jHe7+#lb5L zXr)I3O+Ux;Y8DA>q`M{E-QWe%P24|e`&eAirbRPG_hn0G@O`#?JWJeUN+<3&0w*9sV>!R^SPv+10KLy^gY?Dj7 zxG(JmftxlMcc+$Zc=*eCRby$5*;etsD({ZpY>uHzYuWJEt0kZ2UjwhX zra14Mv2^@~Ie}}!T+m{i5w2cR%YGPb7XHRx1Lk9Z#fdRYCI7atd1yJgrKgW>JXbwI zzfqWPdK(UX*TIkWv21j_DtW&6IVoz;#!dbCe4VdH?tH3+8D*L{(<_dhn&MAJ1u1~T zKCT}9y(Uq+>}DQQe`0%0Dcj?chpseh^`? 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 z9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_ zzyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb< z0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q z9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_ zzyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb< z0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q z9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_ zzyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb< z0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q z9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_ zzyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb< z0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q z9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_ zzyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb< z0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q z9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_ zzyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb< z0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q z9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_ zzyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb< z0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q z9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_ zzyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb< z0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q z9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_ zzyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb< z0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q z9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_ zzyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb< z0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q z9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_ zzyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb< z0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q z9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_ zzyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb< z0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q9KZn_zyTb<0UW>q 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 >5_tF=qcjOQ~8O38yjt#<6R-h9h)8#Lo#TJ!CN z?7dz9ZM8LBtGP3hHR>~;uFpHDHL$BL`Q^mYeRa2M_qAI{;*}9J|3H$qz4A2~b19IH z)nBMRnb{mof;?%`^(opQ)4p{7OAETS*8pwLI9J;BO&fZDbwlmKI-}@Zu1~%D>ublv zPNJnRK9EH&c|2m@G}_+n95GEl$G4lzrc;ru)$H(AzC3vjHH=zKrfd%2-SQ%++CP@` z?qS9k`plyirjyC7cAweNar0^FIvhVDLDhbUXU)9kt!LmM8iNi1!zYSIg0r~$1;9(6mVSy~5k_U*r==h-_nxt$gC z$DR`De%cC6Ji)s??6Y*lZl31LFs#-5%#)5^^V6iDFu|>s@1=sQ0h;dN3c5}EO6uC9 zm!@!`g4VqETv}JZtwuiyG12RZRBK*c&3^2o{U4&vJf4d7|NoLUN=kd#w?rX{Gc(s* zM|CGtKrk%C-Hi=m0s|g84U)-KWP2bQEUtE!Po~U#pOujK@QZ>ygvjQ;HWb zzv_GZDhk?_uhD5J)5V%nB=`#H7UtEJ) zUrtnPt%v8-`U_~xW09h+As*|jJ&&e&Su3hxezh*P8XamJqzH%k)s&nnv^t=N;swmF zcGsOl^Q<~3Odr5!d!0j{-nPq!HOJ$wfl9P@;~lvs_!WDJM{0%6V|D5q1jHogE>M2EVF(Cr2HJ8ObfcuO6R~Bia03 z@^iqy*2|IC6)m|J_|@^Lax`_vN7;4Yt>$v{W5+|8J2(~lTZYiA%d*qJEAGh9$vc&@ zzTi>yXCMo^Q7j7u?w19#DbZfpIpA(FFq^uUD(epJ6udx&IvrXs^9I(OBtsiIEtjPO z?}r?%>&Y3iTHrw@GNkN2PWBtvt)~p#*LRfJf+PKe9PMhRnQSKTp!ZTVXJKEN1URu3 zp0n$^$_jx8-iB<#{fG2Ca5dy;^G-jJwgLw!!GFG8ll}$%bXJP)z9iEA;1ynwqYX` zFu&Ror_RxmAV;%)tycBhg);SWM#Ur{)Ir!}DFt{J~(~zoi zwAYZMjlca;m|u;9`PIk$>KyGBSl$6`PDXgRQJj#dJGCI70<(e8s^xh1M|v?0Kg3e-7T2>6xQ{DCmPssq0|HMmyrD@w&5D}?#g z8StyL`$d9l(ZCN|)j8T#aH@xrRAGJ<2z)S4BDhvJ;KDgUf?t(`Q(1MLA^6o&;H{I@ zIhrx>-?JkH*Ln=@)a#u(M>_~S>_lI|sX~G0b?qWB0=CFf=V*Gs2RvE?zj_WXbml^x z;8f>;Jz9vs`M~$z920mw@Z5pw`PE|JuD8%n$~+u5_b^z1n{Xv&jkND1pKP3 zLEs!cZCnc~dM@t^!BJgbBCEfm)qwTQzEB+ z!u6{8m8JD*VO`}{`KVoB)%qUo#S!LI75T}#DInlps2sp8rjzy6zR-RpTvSXa5( z81sCARSs4X!46gfcpqa=euTsoXYaG(kC@c(yS5F- z`|TKhs&`Lidc7{*65-1)A23dt^`@FFO$^~*-i}vV{_4#x@QdSp%<`41YK=J8hp~K7 zm{KV}{)0Otna6KXv?v4mPU5YG8t|(5mD`ah{&V<3ctME9xxm(F{!iItAuH4v=EL*0 zy@k2f=&?O`d&zXX)$OBFze7A%_b&q9J$6fJ*>@mKJEbN3&WB-mzJDhB{^lxvOjraivP)#ge`5Ig zU8C^a@hjLPfgN~Xi)g$};m6u9spa~8jmD9~;N^V%^0^Z`VsLmaVyzk_+`-dl%~YjL~N z<8ZcC4|eveSLBc)4wv8W!j7GComf8sp3srqy|t3qYe9Y#_7^!O7m`e4=zfg*hM3k2 z(o+O~@3*~2$L6djqdj2*9d1WGRxKi%=R=or|--J`1_ISsfZ;bWnj6@ErHPf|kwOp$LYoF!SUkRGzXy@eAf!H`!XW_->G* z3%Hi`=NdGz*h_J`E*|5W3uw`9r0CWFUU%v|@^=}o=nby5s6@N zWA%6&St@pP$H1649`6O_y8h;MmoVQ1w1+HcHnxIqtQsp%;*BYBdP{K=z{62Ws zP-}wzoC}uU0q-)rsX%5Mr^^Yr)~X~0dev#HJRMvs4l7VslaX>yaIMn6ay0R*sr(Oc zY&FcXa{I`0!L^p9$=bbO2sx^cYn9o6UsZIH!~e&6*&g6N zk7a1)cZKXPa5<5ol)cAgv%#;X=*Egr82Z`OQOsbJZim{ z49yU)lC1|mB$6SISbv!uxXeO^T7xIZ-UEl}%g|0;XPF5&Qk|v@kgMaaL0Ra-+TO5ssLV52hY&6FQoT@Z&$&*DF3GP8?cR3ihPGxNqd3Y z%s3%M(SawW*1+S6VaC-R-V_S_d_T;cUhI_m0Nd_`d!}WwbP;fuU2s3VzfKwk9K216 z9Cj^`CIU~`0vXerDbft!J&+a7G-IUufPL13N8PoN76S*xLSJ{Vf%G)+9dNCd@jayq z;LLD%u07F|UI5O4tgu}CuCfmJ3AmPzdsF32;2@Z5jhc6{vI*D}=2}#O(_yAms&W;nZ!sXyv(@K{LS>Yg- zfot78<0{Ox>cF+ajqHWF)>UvVuS63eD|`&DRhgzQ%(ZlY4_I{;vO;%ot!SICLRPp7 zT&rN-V_~lK9{kEAs7{z`!F~~RccDyhtsCH18_kXht~C>QVPvi_*J=Z&`qwL6aIIM2 z!)Fr(*D?e)S+PuTty*xZ<*t5$YefNHZ5%JKJ@DaWqXpM`3-0v#u7xnmItA=t)L-Ce z;FyOxf@@6xHs1G3@T-Bq$5*!t{0>}5Gp|A5OTf;{&k2521RTPtv%)0cHFUn?;2x_5R%L}V&^*DTdH|Q`jT87MJQFvbRnN6v0xv68cb4t}kDF>B zTyq6DnN??n9I)A0k(P;jAQU>|?=Tq_UQ^a3ZWX9DjZOaxYCh2?|G1y*H+ z$pz|JR=nz((`wg>0B#9S5w2MSykvo|z$<`X+jt5b1pK4tc)^ht0mC_b|GCzbh0g!E z*1@C30?&kN?(ynw(sbaX(@qEupz180ZPpU5QO&i2OLhqBs=3zmlZ^taI!k+Z)(EVc zYyFPm1y;G%(l^@$b_4d)jTTttTEG9Q^FftseX>Xq)>W?cBe9RbD!)o=Q9F`~>)z}X z+(YG8SDnReLgQPZ!g=V>Z_?QlStr>Q*Z_ZG46^;MkzJVNj; zl~egn?)Tri(KX)j|D3Ad${)hlS6#Do*3pbPQoX(CoeE)tu-gaO!x3pp%Hkn{8evKYOXDARK+^|gS^Us7|CK`{e0(OZ< zGy(sp%EaBUD3$h{Tu9)2!!Uq&ob4aU2{L7Q!(?f>y z)xj;|wBom1P3%Jc;DILbyX2wVv<8u7ur*Wf(5?+|9*jykZkOti$C;(l~9IuyF?eoocW(BkuI#ap7<^tK=Dd4%V71P~U`>wV zrgZ&`#(#q@dT%FAWA`((Z&WNEdf1K=4SaxVSH$9o)x$VyLDg93&o#}Bnd5u0dHRUL>jE=*4K|MLQ zNrk99Hx4^*(cu){x#%hQp2y8D+@AfJ=t)x?KH;v#-EvGv_rAvA`W6jN-fatN*MphW zm|vu;aUx=^p^x453pxKH8okG`Z?X3~(%x+qGM)|@Q@~4dG;axd6$Dw{t0%;_&>t<0 zfv)?>X5y;vgUV9l@ut)Fi2T(AbT=2C`>$`30t+z`9f#a%{B`p6HHG9d_?nlmkd$$w zP;4#iA6#>hB<7AlakrqWhO3FKVko)}es#i*Ct0i+iUyx~?J6hXHw;kncW|)q3i9y4 z0Ho1Tg1u``lN~$t(d+IKyn#AFqEG3fY5gQvcKJAI{MHSzMiTrd;s|-LxDz^UCBX|_ zi%8%%4O9s|!M_%T$>$w08oT(>I5SNRZ$eLGh&dX(pq+NrInTjwX8^XE1AEKkqz`2=cpg zDsytH1fOqTOZLo2W-e`$VEy7%L|ngtA+Y~<=K2-H`CcrOvP*({M=m4zzt=F1SrU9Q zbty@D7tF}^Nbqg4m`waPpE1pqU_I@HBr0(hvpf&>z^ZqxyK}U<5e%R{Iwxt1^btqpG+ajwgJrkQVHgJc#weu^_i|GpvyUN67k>Ig9$h( z!BcimAa^XfGKWq{@ZnG6$@gEHO!H|8Zk_K&CUpKycReG)OCF9TMd2T5bJ%B{9W;jM zjC)Css(_z)2Uijr^q6+8gr8?ICMj)qXgjF{f1JY-o0He*Auw80cjT})xr!n!?<(mcg#-r{iO8B4C+QF(!8dlfkU`eR=wTe}-A;2Rr-~2KkAPQY zj3#tY9-Yd=p6FaBGI>chJyI#b38zMp?m0W?2H+kIj-*y6jSfC1!8YGVlBm*T`WJAb z)kv~-^9DM(N`h+x97w2T4Bfq2f{*XBCkJy^)2YC1Pwa^1>L9wyc?q_4up2tt2hi!>Q5~j^zU%77|Te5Df3!Mmj zD9MJzx;oI!z_b4jBR4k=qeowqU^-?P`K4`6rvUf=V@<&-3P_DW!rky#o8$rX==kC{+r)yO$~P&I_b21G8-=Wbfm-R2%Rf znF$#XIGy?joUz@6Y@9KL8c-*}1D2VPHS66ddtk$HCd91^OSuDQ8kvxP*G5xwf!F*t zChgbks5QU`nv6*@Wlbdk50M#@w-u(;Uf_nk#-wED5UK>YGS--k+S`xffzQt~COsbO zQ4PQ^#u}5*Wja&~uz|HPiRsyy`UpI&r!kqCu2J^|(0`2Gc=oxnqS7?CS2 zIig%(qrZlvYp30!L%`+l42k}P3{eU2?G{5a{$h&gEO7iyLxPhwi8$cmi-x3M_UWC7copPY8Uxws#&Os&QbYXf^9R|Je-i96eT?|@ByTP)I~up7 zZ4kfs_=MX|K{mI&P~5)2fj^k(g2VHw#M`5n@Kx_y+1$8?;{KKrUi7F4eK_$!ER9;r zXW8X(dek2=zt5GQ5N*XjTli1>W(XXN7P^>^u>B!kXIMuf&&Kn!HnofE|IB8u>PPdd z%`c1nykD~i2QK0@2Okly=wpsMCye8DT~fpWK4bBiSPQ;+$sF;EEi>^(V{QJ*=waf^ zT8ps^4n2AI@F%`Jc{zS?<`U-|ehfFP3B~-7Gu+rA0r>mWHTak1A+CLoH6A%34DT`7 z!?}L>&1RN{S2OYqh{Z>nZ8%f?+b99{?wxP2im&9DRy?{0 zv$Fj1_aswmEt=;Av#htTNJdl;N?8Omji5HNZC(IcxDI;1Mvuw&lfLLrGWbug`((z7 z$tVo6$Q1fE^y|kUo#J@dW7t3j%x2JKn1h*gsv~&=MkD?_cvoR9DH&>yzBIrLA@Dr8 zKWi9T2bthj4<(t&nd$37J1u2Q>_l;IH$K63L;?D9{3)3#Nz3x8a&7Ww->_{VOEs>@Q}l zlLV)H+fV%bJ~3I01b6I~M@GB0GpS=Gc)nu}@m}$Sv6>{ox5Bf@vZnjYimC7{zLrTg zCEsKg&5+=icqj2#UB~p81NYmS3{sp`!-Ot?^FS7CBd@>mOj;m3qxDkBq-|1W`Em&! zdvgmxb51ioR>3{zXflbKTf&5e!S}y&6WO=pFjEu>_rq<8+8E+3-ob24mS7LpNOE&_8dIMF*W3*wYx6fVAJX8SpSqfK z?7oqCmjTb~xhsi2mM|B0f;)LEC*C#TOw?`(9_1HABy&R;ZSbXa8hp9E)F&L=fneHe}X5vrhmf#gDeaYyw;Y`vIxR1^9A$H#_8JlD9-~zn+NeI>%$b4NwEEeNu;k%Po@L-(ySg6$%wpej0gCVeV{w(vqX#848GLo zni~n`{?cd5C3va(I5Mu!7y351Q&#;L!dz^pUx7R6Ep{d5w_54<;7%T0#6;=RM7M)G zRada2+xrIkKDg7DFz}`Cm*{igOK{{W>E~HR=YlUC(5K0VH!^yqLV_JWi^z;yr|Hq) zOUE9$kjM@t^jF}*Th633w1_SNUpjMZGzm7`PtOHkihJZlbhY==oxqXuK8_-c{Vuu) zSfM+LJkHogi@}i+939Cf%PsT`;OzM$$>R@+^nCE8@=OPEuPKgx0lcBnp8RwPql3Yh zr2Xtk*H6pnHekJlcBHt=LV6B3l3V!*(s8vPT@S3^V+2`f=S?%9l2E8PveD4($1?nfXJ7oLLVz2Mtw{CQPt*}$_i9Vxs{4w13OqU3lBAfmP(#3fq`fUk@0`07 z{9TXNz~A*<0!KlyjkG0_$`(A(ziPP$9sNpBR&sKZj8Xz#7%YJ9Mxe#WF=u_pBg*!zzW$-MAW z)EyjSWSbG`wcvwj5b(b`BhuOSg=i>nNre%)J@=7lG_X^F5$W1|TQn9pEzO8zovs&o z0iTF6B0KAAME<}#1C7YGvAie{*umF`?D}0HS`EB@j1hU?`J^ZoIM%_4%$smjlmu*G zVnkx^6pAu{19};eKiT_4dw`ua!N(3{i3)%VKN%9=N83fmfb-i7$=`9QqHyO znj}&HTU{|EiLVnx)xag3A?YcN5?uj4ddiR#gsu`b0vjBL^`T2e_kcBW4T(=wfanqM z)a`~u{&Kp=V)8mXp=c|YY3anz*AByPj_l=%tB3G^AFjqt)rUD_ZEb#0RVXImr#X4S zcX(OS3jA#p$BE;fak=TsF^;U|2J~#^S|$WzyL*jX)Uj61IyMk@y3x!vjMC!&SS`TX zhdyx`uY!4bznOUN4Q;-x_yQkiH356%81e5lG?aQa4tVlq7yf3>Fs1JjU2Mqt@|OPd zl#<((>@3Af{+dCWvSiw2w3LtM`|6e`7mirOUCoQ)cW$UxejTjGf6ko7AC7ycbZPbD zFD~gU9~VOhBD%`1GaE?!E=@c zDsL>9h`;tQ#4qdZm9y>O#f%2s@CbJe<;w1h@r8mHY}ER9yhGOz%%d9i@&$OZJM!`eifN9TU%S zSNp_Z`FVFX(=(fMITnL&WYFyMlt`|^G8Rv5vu6t*%;LJG#^SI%E4G6R!%c08#hVux zu@|3Na+_lAVcqiA39pBc0v&@de3wv~D54~$6pR2*UG`g@__pgwU zmvMN0k|w(;x13~vQ-u%tgPObTC!;OmaWDO^Xz}GVqKo2j^zC=(9f~2xyuow4UZEws z0*K0~ItRC*B@^9OHcWFWSe)gniLOd?%{SZYAHzMQHpwFCq5B1-nOa5d*=RDvx z@*D71u^fK(acMWuoMWwu$|JCcPP+lcTU}P@oP<8`)q3=9a=9V_x?cUSUPTwL?pL@F z=xBAkg6e|O6>iY=vJ1Hc>kpqr8lb)8#jiKwcn&(gfbx58J`6KPl zp(n3)%dbKH7;=xGx%aooe?b0d7*0_CJ27(Y7x7p!kf7qOfpX24@%Z`$1+p0IBYz4! zFG_(LUt#$vaL6=A1(JE#$wMJ?y!c6u)($q74}#1wNh(LJxVO9l*k_|0b>GoRJ|1Rt zmDA*?O#8E}7I>PK9Qi$MmSM;lYyZm7ksViL$AS5KGBo>(RMr!+#r6srT66b^EEu@c z9vQMW&5tban;Y6CO3*?EN7s=4RWeGA5;F!rWBo7IZZ3X_}Bt!AvX38!APdAkz z-q}s|19-6>bn-&;e5Zl##Ze1WxLui_%NezI8LfG5y{_2?!$0NipL@~_&T z(kkGnE6|td)h2xmtP6V;H#s&)e*GTk~Ufsf>@BK|f*sC}g@<%(|E_A(C zLjL$+;2mMF;veXGE$(_==z5)luGfv}r-iOp1$4b~G}U_*o1p8p{BWkQSJ4vk$I;wo zA%Dz<{4wrLl+g7W0r}&;DT{>su@$;rC*OGqdlgSX{+M3C3SF-}$RC$294_otEP(tm zX@#MXKgu9;d^SYASMdd8jt6^c3HhTXuxVfQUd0H=AFukWyI!{;b6g?5B;=1{fr+Mi zuc87nN4*6{g#2*~@E0fbUd2Yp84DBDU9aW9l_wH}{81P9?gw?(OA0xonWnnywH&zR z>lh((Gy`^Aq28N!uW>Bk)+P&L0hd=Z%~u z&w%%*4j1?iaN@v00$&2|@2MwbjtbzZ&ouw*dW8;qBxHg` zu)Zqdy1==>uRhfZtlF!X|3TgFQgyv14>%^QtGZtAZ*3De4*1s@^}fY*z~-aWT`yJs z7}?)VxJI>C@xr^MLRP5iddUxZ2(0RQIsLU2H~_d#W4OSxfv-O@6L==@un2W$Ue)#T z=%C)KsLCG?hIJ9HQRR=^boG8i58&xv)!lnl{&=Z(q>!(v^2ekPy9IU!p4(5IKdQQ3 z^6tlkbyfc8<~T)QRsJ}(R(-vS2Zu)qnV>3*thwqhT%*b#Jwr2uoKBTL+HN)#)>ZuK zc!7}psj|rBLug@L#U4Fw3fUh6Tv%o!tgG1l*9V~kugWFARu2@`ReWadcj4=+a>>T= zPyXW=%h>{}a>A=7wO3D>K4oE8vful3JSRwJJ#?I zT3F?Xi5h(Jmbv`$NQv@n+DQJ)T4%m{uRP_spm}`3-yhtDyOm1kxEQ|QLd+#w)GGs? z#PVZ@8?hmyA1EJen8(uxey}3lR^@AVD}L-HSFD%wNLkGBTzS9>oZPQb=`^^6MD>O9 zMmO-vIBPL`c5Mvy|5>U`)w#!Zf3Oq}oSm;UM}si$?SZ3?ZBiy@i||h$d+e~xN4fj` z6r9*=0Dip4P`Q})$MtqvxR8Cv$9D5WxhTR07b*FIhBesHwty{L zu$`aLdmTP7Dvh0z>d)smMB*MFquKl~ru^E?QMmQYVs>xEQ|?7#G_JVm!>-b+;N0jK z{HSsq`}kWr_vmsAc6#cp9EVf3_hbFFbh#_5c$jV&3x5ppqy2Pl;pOg^MTw}iioE}zgQGxo+~qvN-b z#Os?Pwh;Q^ZyQlY)&s@XWAN;bxsDzw&MS&e!QR6u^~gD*O!1}?yk+)PloXe%h~nUU zfV|77!}hI;1=Y|^>U{~#{Sc{;UW79iPFzI6S^7xdUqm+`3j`Z@VGaGR5+Jj~cm$|J#TS`Toj``H8XyWlpI zExb45%ue|L@R=$lL4NH?at8WTSpfuTMX!^)gWJ5;BFNu#fm{SW)9EzysSZq$_XnRD z6$EE5+@j?zz>mxnC_LRpz6abUtWAzGP7jg0g3qizE=TQVJ>^Znb0X!)jMtP0g3nx? zAV)JB-pbm5{SD-3u}PC`Hu%i(FEaF2d{K5DIHW;_dj2~jvjB(jIUz$+9gAe~zRu<-jpySEZWZ7=dS?OQS894hC*J4$tBXN2McyjSqoW=;lht19!=T zK8$3W)DJi{3w&wV2I(^31KZ)OB-sjSG_Xr5oR!4-Nw)w`g!7IE6@cp8DLXZ6<_{@|G=Y<}- zDRB1qa-mz54?c72$U&h`Wd%GtaksEfuo4_5B0NRtR!s*Uw?A5No1fq<@5~nq-KrvB zjSW6RpUMxoM}fM>-Um2KV}#&2H^EgrB8>#M*$W)%&`WTeCBO;QodtFR9vS*x@R@GF zv6amNKL+>kuDL2Wj12ho51GJwfEAjD1&#)eq;mv^2>{;YxJ_U;;H5{R1s(y6CoB|r zAn+5V`aG!4z`wS;3EuJvo@+J{NZ?jr>lqdT-vEyMHBjISz!tl@2|iN^oPJhA;1b|x zgVo)tgTTw~T@XBEFYw9XN`bcnPc1to@D|`my`ute0G^e-S>PDpb2rr8s&HWDY?!dF z+9#O)VxhpxfRFwhD|pBf;KSS1eX0e(a}sTY^|`=>M@9+k2kc+fQ{WlEnrj~m&wAB9 z!NsNBgmsnMET}3J)>S?B&d2Wxtm?66>OT-z)nl*s*e9^cZMyzjE3nY5>X9L^%55sj z{?}vQD_JG1t9)kGAoUqjDxY!o>>{kIc#wC4;1w#jDKoSd)>S^U?8-Y~UF9&{J=OdB zRNlhwQ=fI9;(v)(1P@VpOHD@y;j=0}w75oa9u@ECsVl6jd?ru)zx{(NuBrF;seGpH zrP`@fJ*&piY8O)VsSFqK!uO!!AN}75tm;H%9sVS+sw*|HV$Xkk^kISU{ixQjb*mB9 zRr>)ycxnE}=ZCEmJWX{?_0&Y+`&3;s;F`MArCN`3P@l`H;+EV$C$+9E;ot6QVebcy z$5~b@`0{!soF;Y}A4&=5SKiBDx0(ILE=93?u&D*>blpgt^i9H#t4d@X6qNX&M;zZU zs}IMPc#20(UdzAn$ma@MXN&Qb1$>p;2X5k!dE&>9Ch~Ve4EV3d{l%uK!{KZxhOhMV z7I$&$$yZwW@=3^5jQ+NAOvDo2%-2@jT3gC>%U{LYchnWXQD$&swuSQt`{dy_3%7Em zzU%nfb@SM-&+@p3{%iT7P9D5Z)g{hw;&MJtuZ_=Nrv)!p^yiNsb5QOo9>#BMV0nw? z70S&q-n^fsKL2dV4&@#BD*mH&DHm9CL}|HS!kes}OZsh+D-Rus;6-~A*s)7%l!4P{ z^4@E-@vaw_lxylt`7s%8cxgh7a+bk)t~M$JzuiKVQCr@U&#v(I@PiY|U$))Zo^VE} z$({nGOLZlyuUv`y2JTYE&gqV=`p>`$gJk7Z&k?vVj>h>%by&fQnzfg#6P>hUrD`d!F0qcd5% ziq$+`1^X$dB(jAXh;Qx`g;%ax!KPm9z^^ci#^I0r*ySf`xwD_6ajn}VcHokHE^B)X zZa9tDf4$ao%3iU!RXLJ?#OCXR+3L0Vc-46 zzo?|Nkj#g^eY^KJ)Th&S(&`eA^*+2uWijiCt|!boCbpy2qD3SS`t}m{XDH|7M6z@h zIM4MKH0P8f*%J@v^<8|3l4hF{!>urf8QO%}PxK-KcEc>??QNugu>(;;-~LXIo9IIN zbA=eP#SO6yXj)>u0^X2@ZAM;0ckL<_b0B9NVO599#vN3QQb14J_X;ve*rAwr4$e;~ zzl7w)8x$Wez?{mp76tbRR%pPyE9+|w8hF=Bal8)ZX|)$nemPQfY=ACz`FT_}Yq+92 z%)7=`R-;H?Lq+{<=xH}pAylBJm%w|9CMEWZVQ$U)yexOlo;0e+~NtUwwzW98ex2{pwE z^xk!(d(0_7tr@>VI8~7FU?R8~+Dk*P(B3d8>=u7Cdk<^z9E@e3zXB7TbY0 z7PZQTfd^{A(OoOGugS83{U6Ivb6+C+1N<5K_9JD-Wq#m+o1t&-QN2%A0(=|#_T&0z z$bJInL*Kr`zC@WA+^-b+_TPflefw)78A{6cm&suLHuUX{Gt_c0J%Ptb?It?t{`LEpYDSKYTCd=F+FU)6p41nArU`Kj*Pw?p4vT%_*Xvr;MA z?5*zGFNMCnUCc@8Q1Bw(V(=?tb>IHWesD0IT~cpYr}n~G3RddAz5Xt6MUx1jZyyGI z`|l6ceS071+jkh`DfI0Npl`45tM1#+UJq{bK;5@r9Sff|SNH9kBf$xGsr&Xh;jpLd z|M%_p!@TQeth#Ui66Re;N2~kxA<(zCIH&I0TS4Fc&$6?XkKudMhrYe;d3E334*K>U zL$ZaweHhHUa=NJd_K&~`nY-$~{Ysd3WgJ!a?G3;WtE$y~`xoGZsTb6J`)lBYFa6bh z`+9J~0AqFEz7?D>&b*J%x9<+Tb&R@iKLPwOXn?wJp9xOLKT`MYKY$1Bo1yO8&jr@; zQupm|f(N!q)P4I|z?nMgzWp=sz^_*7zI{Bf<9_woTt>i4@>l%Vx4$;iUvR=m@IZGH z_y79#v#kEtw{PG3zrOvvtbYIX?QPTk*SG(8<&WTjs=oc@^XhXXRDJtv?Tx~EE$}dn zD!~H}0hdMnuWx@iEl==0Ro}k<;s5pRvq$`|Z|`NlM!3cVt~t4Cw%~ZGzWsA}?U3rc z(4X-9-N?BLtm@nA=-Uc>4|p)Gc0yI(e)hHh_3b}Zb`+fOG_3#ed@49wF)$u@P2has zr=8Sib7ca5v62bvX~0?9YA00n?Tw=Igmnq<;*|*kM*=_BQupvx^R5m>i-mPn-#+A@ zSYXw>tK+s1!Ru6g`-ZLRUj01a_islF>$8Ece^UFQYTh;2q_eQDns-&+yd(IM$_Xtu z|F3VqHv4~ld(QEOaE)r-HRhChKBjWQYQo9IrQ+wvMPQX5Zq-7KLrmG58#>d4&ooNvvGcKCw`*M6CC+; z5q88cIfob}PT8;wf0<~JT+v0i#4Redbo6P%iTX&S8xy$45wJyE5(@sU`?Y20)ynheQ#3&!>oq%4J zcQ@{qcQ$%kABXG8J8{OBwxiQJZypaTIA@rdfW=dIg|6E5R{K4wAfFuNcW{%O&dkM-Ty!&hB_!#KDq~{QN`BP@vM9B2(vx(*P2TY+CbSEr! zlRaU#n8NAMi{7!5n9ZzbX81!-vfp-cJp3Y4HD7`slx`!&tk?1I$9s#;PFQ#1&ld#w65JtAP1Oz z%r^;iye;4bdrq|9XtlbQzq_HV06 z!v2j+I&`$oonJ}%+O21nLq}_M*>ciXKY}rZj#g=95ZSbT1yhkN!Q+~jkokFw8QUEA z_ZlrCJ)iqC3HzXz8#A9Q-ZPDn=0m6V!(8$==Dsfz8!fZJX{iws9 zBx&kkrduiWg)V!L6Cr(>Na$#N{yT}BKi8AFbppCT<0g_jQ?waV=x80vaVK|mJ24BO zqm`gJo+vtKFd5L%YKa_2x=i^>pMs8--QO|f#OK%aMd)ZXZFeQRzdoU_K}XBaQA~`z z?$cMHqh;3064~!Ynm|WOwhxg*KQ7Y;p`(?*1Ug#dtLgP}=!}VIa_xbfo(3H)$pDIA zSvhS0y{v3a5$V)iLN^0b-<-({x5M;q=xBBNI-0b++E2SfM{DO_Co-#kFZ~`kS zz1cpBq(DH{Tq0Nmo164q3OBM%aZUm#HjZuS_Z7+WJ8WR52y8^i*=`L7^yyF zNe2O+wi`y?PBo@wz#-+1?H~|CC_BKbT07UxkJf&&u(-p zaL{Kf65L;lHi!Pz?QK@%f%#u*G4PP#RwOL(GgYACYnH@fR6F$$_;{ElSvJ0v>U$a3 zz>?IJ-lHZ1|Gs2FY!)|A>w(urS&(B9m#9;~9c(SgkGgYID{y>^IqA7lM(IJ%>e?Q2 z;^BXqVu0`Znv;X6$El^j3BAq9^52K34B*m6Gtyd`PgMX<%rqmT_U)k_0=vvMBLNq8 zQXQZ}wZz1Xc-U^E%z@>vOo>;`X37oN;;bndwmp$r0-T;`O5PgBQ5%8Vd`yXB;##Tz zxR1FhNgK0_;(@ilnGnT-1ymF8nJXq_X2UG%GjQhu6B4j-$@z4Lv2-7tkl)@liAo_~UgW67Bj@WCffcGa^B|9*af+zdvY1zBb+wxdIQ* zFe1fu*F;l*N5>kGtyeCJ{D3n`uEGeonUN0C4;lLvmo(4$)EIz~_eKV5cdKvuYYsXGXwCiW!AX! zub%w;_-@5oen?p^mp1dHI6K~#*FCSxJ8eHLK5^ZGuh1ULKd&ki z?^fLBc7QMG=^PfjKJ(ym8l(AdpZAJ0pYCNQewOgnUDL#~M$cgnYDV+s+?mM~C!M9jy!8&ZHy_KtNC}OL9BXHo5jogRR z>1@rQNbEj4mJ9R_XGbU^@f+tgT;s#3>?7z?6>JIS4AzfiO{L&ha~E)#6;|v-%V_-h zs2_K^#DEPAifJCL>=lRiZyv;XJ5``jbR4!D*^es@FGKwo#$g-n-kffyV&st& zhg)@ZxyKLoBdy{%oX2W&Ie+$`PQhkh4QPF8=(H>@bQz3*2Fr)$a{y3<^Q|b6`#q`J9|EUxFy;hfU5_2gTw3rgo9 zKXt!M#FIy&?l5=K{e6M_$goA%VW#A9>m2cHv_vmp7G&8#NV2~P@`u^T{kKx0r!@qP z`VCpz@U!G|b3YW*8Ge7ao+6%)dm$G+c)oWjBZs^9Kw$$V*sJw#4?{L3sJDZ%ds7Lb_eugpV{1Yb1CCm|EwGGE0Kd~-}LX`20vIpr?F z<74*_X<0Kfz!UnAb-Rha+a1Qn7oLw!yU6GM*O?D~@Ekn7ojkU>#H^eL{x&|H++SVA z99j(gHkCl{ipdF<;K-vXq^RT!Gi@cjvodNk@yID-8rHxbAO9qhK#nl|BA{dJwUOlL z9b|^az}~v)8%W<>c}y1x?8OUNPh7|EVJbJky~rYtI9Tjr=p^Vo?~Een?9!RcEfW08 za2+|dIEAT6g*|t*YlvIbCZ;hR?t$Av$td>(rg8_|S67FS5&NQ;$V}+st_>z$m7z>O z@T;QjfyDSxAhTmHbk46XB5a2M=3Oq_Z%r1E=f%^R5&07QBO`#&$x|3_@T*<}=a3my zZp>`(D^sZ-@fWkqMDQ!8RWnJtjx%F&7`_KIox~2ZXIhITSkrhK@n2!hY�yLw|2F zTf>a8JTAenOuR^2!w}|J3G~D96teSCKgJOJ>Q?Avvc$3%vmX2^31+1;4(c!s(1$nI znn0*oof&=btFBAOll`~@GameE@4a!vs_Z+x9Q=y)A4|^ScXT57)uMJ+ve)Jry$$>- zc8i#Jgg&IVfnRlS!lb_IEqVj^)tWbmjQ@C*UJicceTpFmhh3m2fnQl9(j>T)(8l0b z(eo&BCgv>N4%{+cL~f^*(WT&5?_FHT^VVWI82pNHawcZc1@sVbswL2tPx8#AYk<2> zb|R1F?WUK3UtL)=ilCzzbZ2m?>6;wMSDUSLF0fD8NOHDy6KxAlwX(&5WYn#v&j1Gu zb|BlXN6;d0s_S#?No(**x&l~o$c}uSy@a+0r!xC8g5(^YLmvc=ojihUclD+9!K20& z4<~<|Jm@%JR%bZ5v34B&1lT^zmaO>A&~D&V&8;@%{xv7M5V-eD8}g@Z1pNni$Ms?4 zmfKKz8aUNRuVLiGeG|F}xU$ijT#yZ>zX1Q5ZB68LeQ8(ls7ud>k_!fUbPDi~$e|>) zK$~s=_SYRs_ATf{_W^ghdf1Ar@YJBE1Dm>8k&chPQagd2pIMT}ac`)4;1?<2SL>cq zUBH)g9W9|deV<~1Q=2Wwq}4a5wZN`v7Gz7{73vVMHnt$fC#$L3z*j$+lMZ7PlomKr z$T4$b-|r0N0DO6gIr-;OO3eYTGc_lAIftnv;DA;$@@w<~szk*H&B$fL9O?$JEXa(^ zb;+c@1JAKDBcr#ZQ-i^UhJH6CK?W%l0`669N=$EUqym8dq?;0IkA#W?z87Fh);nG;DYzYBx%ENDhk-`nlah%!IDY?9#LjY ztTT*o}G)Y+!6m?o8IA zz5$nXHYOdj{)#$-hm3k_L_*s?i~0f|y=_GPrnQUAfHjpy#I>ST_IiV867b*zBl1>uNi+la>9w&ksX#`QJ`aF>uo>L-KRp zHqi-Sn}>!({$;aB3f$p3bl|0lA|>$jYC{s37bmI(wyZEDF->blzemGaRwH`y7Flj= z)1{gGW<@vt%NR}mrfeQR_wIMjqsQDbrHCwR{q1{4N@I4ILncXZnjh8+7>-;l9{-dzyH0lPlkQ zloj^qc1*lt!g4v{1Kco$GbRw}9+e+SN#2; z6KAFC@bBRrjSp5m7Kfc#$0dhH@*^kS5?lT-M~!e+#q zCJph61OCv(>c~H;dW0h?7h~UFZCvPa1$OMe9A_N8%uSQ-#=jSb;+sp(a5L5|!S>_V z;E{ocxD`6Xuv{F5oxJyOqul?pJ&uIq{n{Cv!=rO-Gg*gkuG!3mJln@w?2o|bTN60; zT{0UnD-wTBj^u9l4q`=bBk_%2E4iI}#<34pL}Am7ft>ySBkIiKsrcXb-=@-{koN3k zDYAq!Gq0ILtE5C)kW?ydq(!!aC`n2Cq9j^Kkru@{=bky0Hp$k$@7lC#Px{^G%=h>H z{P%p!W1ROpk2-VBbzk@OY97qad>X@9Wd`$dJ2N)KE0&9Ip2Yvu?#Gg&s2gj?^F4C( z*q80%I9XdyzVLDE^yy6)Cg4s_p;zb-c|BMU2N%of9FpcN# z69@j+vPWd}H1yoQ+wzCFTO?ykJoo&yC4c2_73qPylizeq`LkISL?3r2^TG!3CSFQX zi@UJPn|kxXp{K}dPZ`%#)Pvv6A0-PSWSnGscRqREL2?>9NOB6h@M8k^l5HntT*RA> z{JL#BhzssccAlWcNA=i5&V7(^w;s3VJKRnuA==|==0GD?u1+5Rq8=5L^0SE&~q>Bp7V}bGz`D1rMvNa{yC#P2KUO7cS6YD`^*F%e5Tyr2B!;d zFrz2o&W_g>=(+hC(-erE4|N;i>gkKjq#5{LziKt5v8W@5aHWNt>DFYZAE?6QW^PWCkOoJg+rBUye$P#08}9hY&Je?97EvVabMc$_vX;|M)LC;66==Te~xbG)vC)A32Ubw+* z<085VIrN?@b{HR`3sE3wtnYQ<;Ihr(gYEV>P9#k=2~Vc(do^nT=Pdd_gT za05+HD=u<%0%vwDU56YT>Ig2{tLR|ViW7G^fOn?^`X%zen?s-=bQwJtwW5CCAz*E^ zfPRkbHQOHQ>}S#es1>K5v4g?8rqWf&I^FHyvHt{`LVegfVla5m^rZ8Uxf_Gvhuod+ zfSPb5HwdoHpy;{CKabgh?-(b#0=ciHEqKKbqWhyJT#;)7!JjPXNaV*RHgG%Fh(3>O zm~RctmOivDYQl~V*6>@dPX{4~3s#U|q(dJ-w(zwAt@4ia8{{@`20~m~TiO;i;iHs+ zFi7_=wE%gO=|Gsaw23M}{$61TH;2BZo+H1VZwX(#pHlr$2af7t2_q}+P!o_pt1Mu_ zs#Zf`c(Cg-bp|=l%mT{)sHj)Sk$27ENNzc0fO=17vpLMjK0&!7hkBdCrK%&; z0%X6=<`Cd@klKoT>8cs5`L~x+ARpLZ25oIdGFl5GN0%EnXOQK#)#ZUT2I#NA1|@g`vBB<@Z!HmDmPxKWevo)X-h zGw18rzaCE@j*xI0<8$DG=V{26yA{{|aU`N#>Yjp1#exI5__W(> z#^TSmbfF&LJ@1AX!@pc{ck(vwPF5z0yOZZ}cXDyFxI4KIcPDe!e3sPqXv=kd8OR-u z`o{0GY0b@OKaG<;abUYgzF|+@p2gKQW^gmRl(VmohjT&s?W8K}Aa+vQSdRHIOnS3% z9CPtE>g-*~Qah^^{M_(puBP_^sh4Scp|W!T7xcM8DogSd9ySc%-hX>0bwy3#wstLB z;{Qi_bF@t0RXx=GqV5@KQw8~V&EB6oQ`bW<^!5>AUo=Y(<}TxBZI2cf=Y5gxyK#zW zw@MV&|E!nV_B+EK*NqS|;*Lu{=yl^(drlN0VmC=I{B^|te^=qkx4BZ|6JxlFY5j%Q z$&S)lnOMyBuDx)7HKtHXW^xVB-t%p{mvI@YdEA_eTHfPMF1I*3oV(>D=hy6B#?>E+ zoqu9^UMVN8SlL+3$^u=Z1_P%v)@`LyS`~V?W4>FLbIQJIdp^ z1tZM(5Y`gr9x!I8a6u^^KJ!Kqp@5`IdI8ByeGv)-rfZv{9OuEd$bA0yb@^83& z@@K7#TXC=}-)y*#EIlIQ4&T-0=a1S&@+z@^-nBjd?bK#+;uUHVWgC9oob{x#4fZNj zw?M|!RMM?K`a+9-LihDaWWN*U?R~$%ksr&+0Z%;dCbkj2j$J_PgHdBVZ-DbXW{??? zn8!|k3ST`Z6Q2~^n_Kt*dcE-`23zrS*4&1S_ruAv{pd&4)I-sELLQ#LnIKaQ3tqXB z_L!%-UwZ|p;|?UE8t0O0FTjUSw!{Q;P}y_NLJ?z0EHSfWI0xX@C1aBI1$!^ol*6*9 zeq_R5?C`u&3hw?r$=VL+71*4B`GLAbqKnV;!eaQat_zvl7v~G3jzHJv9Y}vOeAcus zfKfBrl3-iZB)1Ph5A7Dl$qB!EFXuw|&Tq_q3j37m_rlQd_sns3e8>5|8@n1_GNGf< zvvS-8+nzsURO8TVTD=`BN^db$=wIo6+5+FE)G+A*_{?3r34+5fGykSze}YyfH1TH{ z``P$@U9ukRMkyG>`8Wp&PY2WXrA%!&KKHpaxc{q|8MPFUppSclBpm5}B#uRnPCbtMEsYznAP>1X?TnJavqM5VX@O{~A9@t(CX97`& zFeB!`_BXSc>sjanB+r86e$$x2*@@hTdm%96@X4UXgF*ZFSY~Z5zMJ0;gnmuK znaut8Y>J%gZbzyw-@m;vBKlshGXLJwabNQ7oxG1d{MIk;PpZdUW ze^bT>b;!^6<6z6+{>=3v>{aOM4YYetW;p5)73T%lH*{wXpbi*9qN!o6Bk%gxSPI%Z0I-? z)}7l%$Dt0n?&S9ps69r8J3&NNI(-z`Y?mW&lUCC-YLDJk4lrY65`7-|MtcXC zR2xN)LhaGba|k?Nw1}=iPS|V@s~3dQ3~G;u&+Oo@GLSAoekrko-*fzEL)0Eqb_|A! zU@tli`N!`;pqoF8{(!tTbP(t{GxT`W9yQl(VZZKBx(IpOXj}MXXGgb3y>alI4IJAv zkPbqwbhm-gLrv&nb7(6$GYsqcVLWz#<@5cxGV5R?zUQM-^s9$12TY9n<6IdY{X^j`g(>WaGJ ztFOOMoMsx6uS5VrhE8gul zhwXuP{S!RFAMQbf%_zTeLrYTq29(vgqeH-lZ<_EE=?KW3Z3Sv(Z?Hgft*Gw8c} zE7goV$Jz|?zHgw6P%}h)F@=|_*HZ4t8DI*E@vEpA$R+96g_W8>B_Z=uaaQK1Z!oe6wtA3%LZewl9qOxXmg6Y7Dji6-z+@TAO;uS_uk zlfE7lg}lPa1ZaVxCLnL_W&$4BPShOaj_-{jf4!QQKF<3|}sZ8X%M~oq{$%xvI z+$RG&uO9TFN|93|jA2xZK6MFM&(9cU&(xvrAeXorLtray>J4(x0AmO_*OvN)+@YN@ zG$#L*bVQ%0;GGdj8=53NkzH;W!J?gSB^Jns!3exhJ(V~j|H#LVg+6yB9CGh1Mo{sh zRx%d3O`;K8YrZU*f_!3u5m=5nE18Adf2t7-YA%>6#)ri`UznGlan8c*zyyC#8lETeCz`PGX3js6tO23Dg36pw`5ZnuQN$0m~;O$O_ z3I5;>@WBMgQDDCJYeci>6ZAyw2Dpnat zH@{lTc1n*Dj+GwbMpkWPx36C=?2pW3Tbs&Q9i3>QuqP368_e0m1@XeCxle`bc_$h6 zQ=-uMo1^N*lEJ)|cf64LVYw=!Yc($mm@mw<+@tyuY$+_<P4Y18Fm=IH?_-Ee>U!ApUqo}=b99#R`1f{PEHTthCbS+dTl<4D~ToC zJJ(2+#oZBjmWL_lbbwN28B9V?xC>Wiq^2)9h+*y4>XiBd{G`wNb`ZKJCKZb$JU#Ami>RJFuOL zYM?XD4W|rl%U1q917F(VZsYJ45~sZ%7!%y{>hpsXE!hY;=>N18K9M&~iEtAApPT{j zNS$gXe8t>*U*iU{=gnwnSd86SN1u|+zD}T>h`W&a56Ol~6G&Q@z}a-UN4A;iLO5o$ zd~e<&j$W;y%f19|z>n+1_(X#;r2xAT!s^H$xTgGl40V)o4arG7quhudQI}rV$fErH z%9+Xp&S&IRQt@?@G7WWFP5u?K)HYe!^CEtZ%VjddE=*~Jx%Zik7s)u?@ybe^Kk5q? z$Yp1uG(=D7?vV{qYo@1h(I$$iZ1>+8ZFMi|Z8C4VVv40g^Wm6CMZ=Aqb%epeMyk_M%N!Vk0VrhgS=!emoLYs|Xqol_9s(LEIVkd4+W z$mz%q3WxXjXADq~zhOV*rO3AjD~SHjr*b>Yw=3HzNO@Sbd=IkSV>#)*UMX*dnf7N& zIXN`+s5}UHL$;i>8j~$ALH?YCdHAE5@@C}fIdbyWB}MM>34cH1Lugf1GZ^hjE6#Ek7P0zeO z=HB1rbMKQe_a19`sq8*}eht+o>6vdc5BKkU#oW6Q=H4yx#Gd)t zn0vpPm9FV|xQ@B^Od(#=Gd~k^?*Ti-+`As;-anT3YI^1$Veb8IH!=5q5p(YryuGGp zz5;XaUGIyz_xqT252f`qxpyt(su(f%?vA;W*6czyV%Gic`YKJ& z!(`;YHDd0)W(sEMpA>3(9{i9y^cQpQ&oJM<<3xsL7cvG}ce29*sQch?sjHiEQH2tjV|cMh>xl zt>O2WOAmi~Ta$Iah`j%S*fYN$xyQ^R&Gl8t(|d?L4|CMl$Nle2>QFXGlXX|0N$s$1 zk%rYh^ABys+2t>!K13uR`uTZnK7E$Oj$&*E7HE ze5&TUI`@7&)my{ro`*|SV$Zxf_kL}s&wsghQ~Mzr4#w+=P2#?!I`@7w!bo#ny$czn zFZRrd^7xyLAJrC^yS8J}TdmeH=e$=o!_a0o7s$q5R{q@0Z8Xko_ zJ#3|h)jjh%t%^0Q&b=R(iTjW0-20hr;$EaW_x|^%k>(yXCz^KBusZi{bo%jsS$Ey! zlm9VOXZ2t1-7{SLS%UXZJl1oFG43p=v+nOUiDw?vlw+Hgri=WD+k6RLjL5o%NPLr$Bh~-O!X+8(|+PgQT zwl6#d|G5JMr?Okp&zrgkx?lZ;jxlvoy{T*Y#_TAezsp6bal%i9A^!aBZw1nJ)&cB7 zqgbKTeSt&P8G&Pj+7p&HRDpshYO)zgQb#I6u0H2y>OlM zmc9$|;s(a{6Eck3OIH?6;l}%S6#VVpa4R>@$8tS7PUTy42CyqOW7b`mz|Z~BgY|qL%QfB^!zVxK!p@h*aeK!P z=hH`Pu?g$rxGE!-Kltwtv98Aq{0KL`r`-qg8+QX$3P(O0JEwMg$8$qx59W#L4*9t% zo?AHDir+uChO8=!=k!C&c-;@^WxYmCb;OW=p2ibh0~tqI_vORZpC;Q`8F%TH0k5bl zCSAx5^oFcgE%p)SOwFV4;ajzC&- z2lCz&=OFq8pcC7cIN0L5`RfDFO47n;qnA~CCl?N0{Kmvm$j|n|*{t`>I`p!>YV83y z@sg3Emo?vg7bJ9j#Oxi1ymdP)&%ebSK`(1?%NDRns$mucpeG~S1pBvMW}Z&R_eA|n z(0_iG(Vva)q{{Umov&cp&BwVzY&wKkl`^NpaUSHA2ABFCW9-q(dT*BsM(&51#pq?F znXiK0JNGlPIDBulO@;?Xdzq<;m<1Y^1W`A4GFs?m&A1&8W6HKLtI^By9~A?KE^c7% zuTA7G+*}TSTh=n#8Q7=2atXYizM9cPFRR~}2#9-~#C*dn))M=LFh>>5oIo$@pVK@T z{WF~LMlb97#5thbe-3jo3+FzYW;xD-I;9kvQDk{g!Cbu znfK^roqjS3@?UE)gVD?SI(#HVUvI@sM=z_UY&hI`@`Fx6FY7ox3^qi6ptI1+>Uhl^ zzAt!5A3!f_^g<~Zoq0g-M=$GjZw`)4zCmwCFKa2itH9I^q>~HiX!NqGja;!)G?%s!aPDL2 z0*|llrf(oSxDJKXr`zZi=w+4qIKvf(jkG@cS3j3H!OJu0^kL+JY)5FjbT#dU{?+1I z2awK8qR%3?>5N&db}Q)N=wIo34}k}Hi|Dh+LEG)&P*x~Sp?|fl!49T22GT{yvBVCN zw)oNg(X*<|8VoJzUUVw*=$1jCQ!|WiL@t{<2=ap&+8h0=$G2>uliN`G2y&X2Eo_)* zN4G~dH)e$|Yr3cNyKK2wf6uDD~IcOg#qC${I4loD1&iT|@3|e3-^#||SYhwnldt_3E=sRUKnZo{qYbhym5pN2A7ObK|kk79(1@npoDiQfI z?owOyUQT5r7ucFYK=lGjj_luJ0_E34FH2sJ@12eT)F<`*1tvhAiC)&iBokQs)sr$s zA1Q0930O!)FH7od0uLG}$_KCeb~k|oS41!CJbGDOK8s#fa+NWJ%@Vz=)T72=sAEj! z;r%M~vV4DwUY6xzWB6s%L*r!~MK7yaCVE+;+>9Zohc@*Z?|+A0R^yAd)KBD0^s+8h ziC&g%qY;=IeARear_swwP`;IzqZee#8$qitqL;O>05j@iMK5bDdRbrF)k(bYo(S}^ z(ygvYCL{M-XapDMi(XbTdRe7ra*da@7rm@-t&T_t48SJ1%-zjp$_s zEfl@1UFc=a4ivqt`{-pIOcA}Tqv&N-d=msQ(0q|!`mL5-`*aa^!2vMObDiyaKY}a&e1b1Iai6uXj^r8* z3;2G$8(8;(rQGjs*}Nb3hOKv6&RLsm;qP~?WphKKxL}=i{5#tMHpy=Vch_PSe`s_j ztB=|5;j`oU``?zcv5IIedDs%(s@{k7#q4*tE%W$Ccs^fFSq!&k&J12x7|7OH#Bys+ zPUU4~1K6KyW4ZA&e0h6?0lN~j-^Z4C@x3>8WyfOnd*IXIyxUhT_V?;IF7q(UlVN{} z17^RMUUK72W_={dnEn3a;>2eSdPZcJ{T}*YFu!^6T_VBk_b9m)KaQy-y)gSd=b9P6 z^6(`x8MEKpdKmF&wGo2Z@532=c?b3kX^+|OHm*JSi3!I@;|%m_boBU%T?>dgX1{&( zb@=Bm_L0Z=GVXy#C*D;ni+Eqcdv>?yeHUyY+tI^`@86bRYLG!*{F8C#Q~$yI)@w*$ zAKZ~2@CzCTtt0~+P-Fc00&NGaAfBTzW7GdVR4rRbngg*PAmJ5g51C2)BCtc!@EJ^- zI)#L;L|^6i1NhZAj(Bdyz95}Du(e?X8I*@-1p8fw*vTxB9>;DdMKz=ya3hHV?&goJ zghvw`$=@oRqqVvSB|8R@bLgvlzIztJ?pTt0=!YD*380u^Le!psb5l9|)9z2KnsL9+ z;WV6j(UU~9SMR}{0IddHGPpZ>?46H6d%dn?ejoJG4;_K~p&iK})El3J3ZVVtwj|aD z{agEk5Zv6t1UlmLbU+>)Ncqm(l%UUSkpp!TJ}@7o_#HKJ4>ZndV2+H!dlGlS!Lmn; z?l_zU)NY49-nSVG)Em9rwt~5FE%RP(zrZH@rju`8KU)En!UErh;@W0>WrH?~L31Iu#}j6Uj(yIbeL>o;?l zOw=2TYG%RPPQgs$9?U73&wzC&{2ALEe2#1h2Ir05%y`rrHT{A>Svi84jC$jeVk-EJ zW|>i_H-sg)_p9&9809B&4V*umF&V-IbT2)=Wkr?#T3+0B#-37>lF$`!OF6 zjd%Jpg+;i}G)S%vI+kP}S2e)T*QE%J` z8wp27v}Q)2-tfOa9A1?Fr01jFcoj4Z9*_A*C!^kIZghuHLmTJ})Eipsq);03kj_B8 zA#>s2d-t34%5waDejwodr;47BdgJ&>2EIC8pgmDur_S(%I)izM znEm!nb%H*QV)om;#1S^WUQOGg#_)gU0J3^9`z`7306~vd&~B(P4o({a8=j?DtvBekV4V&<9atjJR$M4!oHCP71V! z5x2zbx7TYcxNa(Dzn8^W!NbB%bgf!@VD{T|u9*F13kJeNzgF}_)D@YS{oeoXJGB{k zA7;OsQpN1|*maiRn<8ev7i0GO{S7hu{T8#|t>UgzOHfzr#_ad%#bWk*24=sXm5bSL z)34^>F-**U17^P;n2Fi%K6A`rDTZ8nwhB%zk(95VPM0F#G-9Ld<@* zVD@_;BWAz%VD|g*W-m%Gs2N;0ngYF7%zk&DZVKe9nEk$j z*>8u;h140mXDnvFJ#)nD_d3jePyQlizn5Y5d;4B7`~4lW-vwD>_Pg~o6X@0?X1~)g z`#my6%znpW_WQ>iG5cNh3G>@)#q4)DX1~9G7qj1fnEn2_U(9|l+h`0!V#MsX3bWsD za>eZTAk2QJwC$$Jeivi*yJWqX{U(_G&YK`+zbi5OO%;mSZy(Hl_xmAczb|0++bU1Y zehHi`j2` z%zg*uiP`VBu12u_rkMTq8fXNerl?6)OmzgM=~s>y!8 z#q4)kUT^V*k%aEK2s&nk>8~o!j~!^$y?+{NjQ%)^OSr-c3EKv?Y-P3-;m!f zGKAGVD9In>pP`1(Rm(}zss^7UL5A?G?;wd5a_@t$ zmW}8m>49uS4B^EneMxU*Z5Kn>QrlJ1AKBI35Ii<@lo%rySQ$b#*H&VV9B7JX=!|W4 zvqB!(A7_GrO>VZxkv$EeZOj|DXO~M^N8bpc`&L`7&z&MRw{o%YHQ+FxGAVE zJ}eYW)?2VIbK?btMNd_0-3N+P^pvJWPEpnEo6CnxixJ8c87h;eZ+ys_5Mfb4v1+u8 z7VO5`34KRgQ}Hbe1*aWn`Qjn3R2Tmx3YSL=qDyZ7QdzWGAj~nis_9g>{xd`v{L_tV zBO_fje$BHG~&iFjGOUp*VyGs;T7@WZ#u$(4X*hO>IR&i|BMl<2h zYV@6+gtAK=U-JEvW4Tw~ecA5|&+wm7<9)n7oK1D#$X8s6<2;+)*h%`4{5CG0iz~Ea zXC0crcgNn*S^F$l*(6uK;7dHGJT!pKTVukTVDISboSrN-P=}u!DdYS@y0a0Rn&D<1 z_L1J|#C|Ax3+u!Ftl6LQA~&kS3IJ=l^5 zBzJm0xSNUnkQeU|+4WA~o`pH66E{h}^*@yJ(IeW`R8O8=d!URvf;~$~wS;?Lq1=gn z(e4S=WOCjyGxrUSW} zAEg+9^Rp zbF(kW&m)&%@90~T({l5VsJBaS))sh3E<^U)jORFi+##<%`u2;q0(THhsvTwCa z9*A?akdboYks>aJ*aTfDV>>Z6QMc>{=q3Ip{fxV;G zJ{6Wbpf~7n5PLxl_h@=Yd+seK{R_n2(cL?+4{(UsJ9-RzM=vypy`v+rceEmMYPmWi zHxYYBJBNzBqqWK9q|*$sceEq{dxQ>%y`zn>*o8h^>>Z6?fpaudv3GRRGMs}P7kfve zv3GQauh=_!7kfv~9~XN^mt*hfDI2kObU5~ojyNy&jt&niCsdi(JGumWN3ER2-qB0g zJ36|5s-}0;17~d;hKaqSScygQ>;Km~8eS>(jxNSo+s__i@8}GiwFUhXdq?NttSxt9 zKTYpw8qU|wE)aW1%W=N;`GnXz+Jf`7;V<54W^F#mK5k;~=t-QfrPyE8^p2V%mn5Ck z^p5Vs`I>9_!T)+kzZ>q*^p47LrgpkH?Z4j9B5*lYME&dz2|HPrM=S-^mL!tnMA%epsBfse4Bw@2uC%)YQGBrm^uFR`-rB2%W8A zb?@k{$3B`lnig`7jyP*;!WqruHg1~h>fX^SjCiK=b>xnj2Ab>Y-ci-Y4w_!6a%961 zzcur(V&s^!4>YXq9i16}NyAyleTR#^qnnZE?i1&0>fX`scH)`N>fX`qkJ2^wt9wU1 z%{OXzIdXbSgof3<71}g9(C8~cE2YYrjSp)xbPoeyL&>z z61=|8Q|t~^bJzMon(OM`(P^3D`OE6A(VSYb<5bNjsMFR;%xsfB5Qu_g}~;)^uU1ukTNuee#sDwQ#N^ zNZ9>p3iso58{tL&Ai<=l6rMinDm?DxFWA(l2t&S_2+1BJ1?7cb!ccEUhz}nujIkN2 znzCt%&_21NFzR}ks_Efk;q}5IKD9Dk_4;^%P`joY_N?5ax|&2Js%n- zbWXp`+EB%+CAA)csevU|dZtJvGu9P$Jon}9@cAm)$rJpch6wJ}=4_S1Rg3R@UB(?O z-l#e&*-n;?$9K8-WR>3V&2_Zb)m_a zd#N{yqmCJ>-d!Ea853u&Vr>_dVa`ZyW3mYs{P2%p>NSx|>)wrPQ}j}pm@=J9&-umn zoN!AByAZ~CVF!b}qDsg`?=Jhp3HDg~a)Hrb#{G%RVn422DeP;E;_408u#e+C1)o#V zT>J7Rti)JH@Ol-)-7*hmzmB`kzrP&IMep}!CtNDvi^Ai$E1RY4BZt-ehHr7)8n>Zr z!iPD$*{pc(??PKP;_*nH65_c-<)&=skRklK&iLmx?Z;LY^x=cY%D53BJ=pFiI`RQ2 zGVb9_9rju0FW_`S#?8{xW_7mR0=IiI&LXHCd&roFlx7)MY}bl)j46QM=#Tk+`$-NB z-v&WAkGmN9g@kddU^LF-W^HLCMt<{w3qoIO;VaTpHXitecy7q;XQXhP8wABAaQ#Xj zk*>=vVRRavhthnHe6BQrES$|vKXRKW1GFGB8_zd6eS?(#e6RF9ggQ;Ho@i4yl%0$5 zbI#O|k)uI*{}i6*vKKQ>wFSy2a?~@zRic-+(e8 z)^FrQhNs^(Am6_rC$r*8*CQEaXLLa?rp}uGozoo6_|1>B#ZhFgFz%U%nWb z&%}I7)|~Q0W%#d_zUw$6hXQ}#JlCNb~k<%8V&YAnTtRDFvW}K`pT`jwdd=xWIl_%t7 zkC8WE#%WrI!m^jhdokmbvTb+STjaZ#aZ*}sDEo-apav`6x3a7W`5b1Pj+rki`++UO~#2u4c2*& zc3DTf9)%k0_`lz0Iw7l2cU^0Gai$A$A7qBE(`1}hqV8f{1dRs!hPrFuxnr7)QxtOD z#2k$VYlHk3Hfc224%A?izpd72u%XEN=SFEX*hAD;KQ~R&^n9*IUJ~J@(O~Y#$CpqV z-PM9R>V=-QMt7Y>P9N4+!)eHOW_8u*u8GLTMr|}~j_kGNvqpFQLR}>MzNO)MWdHBy zHCn3}`S!e04R1iU?Q}rHi;-PFi`}07$koSFHCl@x4>-F_!KWcMYFK4mqQx(O{*>Yes$5=%PYo>qDXj+lOr4 z?Y!pt4&v^xE8dmGB1S(&{9>{a+#%NfryGk-< zX;`hhQm-%?R_m^y&)+qghgIM2U-=*F$E9glon`vhP1IUyUOQCOPHL^CXZb*Lk6LRP zY#6NhOf~yFnV``~YEAXCB3N@>&23G}HP_Yp>Osae&Cja2BHq61&}#ngp6ioy{<}UWTI?)U-@ooSHhtm0JGG{|IdFsKel-uJ0#07A zz-$H1JkoWR^8I?&K;IJVw*EDaJLfrqw{?!=u4%pJ8ulONsq{#$x}TdgvZl2F2ZOl$ zdC^jXOO8Sn?aJjuWJw!u1q;?%&Fp3?>>v0WD?Hlk$qr7dl)A*o@SMPIe8Y`9(&K+- z2s#@-@t-MI?0y&re5zn9RCc99;s;=~!@mr48|L#fl& zk=&n56T$3qXQ{G_Key{+SK;r+CNAjBbWSnkC;#AmEqD3+TyDV9yL@BbQLcQ@A}+jC z#ZT|Jh7+n6bHmRT@p`SixSeDv_a-NYS1vW+-e89O)3dGoKl&;D_oKMe>FfFFe~Vb> zfh#yZVl_W9ehb^>`wDLOt_1$(JsIn|7tez>UB+*(n#_(G7{hfX3-}YwF6__T7%ubs zOuoYlYqq^^EEhf`kRLeCi2W56%XO~w~;EjYoqWgu6X%){|dOGuc%3hGJ1p5kJ*zuBI_sE{*@m%&9 zYd*V2JsDaU&mB~m^P9(9A(r>!x#GV@{PI^Sa;&3_8@Q++pL?Z@ba#?*R$Y7X#w{fz zIY7q!y06DyjXz9CqKvzHTZg|kGLJ;&%D7(tI`L&wc9ZdEWn4#}4*bmHTS@E3GOp{D zw*1s_8_2QWc)np+D}MdpG?LT@f`7Fcd?2m`gjrSqlGV!_G`Yt@*KZ^9rL4St30c}D! z5{OzZHm3#(zDtNoiMea5tI#LXiOjCVywXheV?)%c=!4vvysDW z&y77$_x=?VJQC-g+F7u1=o9AVSUmsNe+RsSJIpU%oX3@Kg=4GgnCdAwPjuW2>1mbB z)L_hGoXv!&i|3iWvvB8Sb_Tp4SdkZod&&dWL2Bb^X7(c72YizT?`lez50SWMeJK?d zzA9w6D4b`VSp}UO4l)6;xW6M$h98AF%&-L9y}FhJ7yPoAzbg~DjZbB8+Ikz4z8ZJs zM#sWE+l@?PS|YcsItu71>llmmxW~O@DV!)uW!y3`^WeA`-q<8FmN*05ud@giWXCZd zw&KoIr}?mJLnO0#2Y#=Z&4qc#!WaXbfhwnjV*kT*CK_j;Lct8U&Oj}4ydk+uZ{}t(?g?J?f*zyw7z$^g zx3$NBzoHAX0cW6nr;f(Cb_eGA37ox_jf7P9HjFmTKv}C1cqZ&`+5u;vFAoia;f9~- zu{Z;@cJ_diKVQ)SI0Ic-BgLJ;$8-?RK&M4>aP-72+81Y_Qacv>)>YF4XP||j7?7X3 zNE_k|)L5V)&03(pAv^4%;9kQS`n(c%$`T~->U{~FhMB9W;cl?fxsV=?Gtj+Zu3#$c zr+*^XEp&keY1#Ba0r$dUhl1hy9rPHSfv(%+4AUw%(XWuF9(RI!?(6A9%v>G0>j-)u zQt56u1GVYo2)Q*Y=`7?74+qT1#n47L16`Rs1SXAMOz%amxMB~%W^?J@IQQ((+a9z- zg6Rz8u8ZtI^3I?Bi@f3TVDPN=ro(U^>SHq)rv4s5*C6X{9t5AGS=te2o%{aT!b&$+ zdLy!8i7mK|974ZC9`eoxR&BASJ#g+>6=nlROw8zQ$bs*yLHA>Sx&gUpi8Xls=}9|Y z#!OU;6+D;f((%YIH{dSena=ciy70x;{mzu+#t;eW|$T~yJ;YULOB}4A_(G2>m z#1lu6b4$!Xf5INB3ORL|8Mw~aPJKo`NtwaEqZ_FnILFj)YX)-%ucKU$H(fIYttYFg z$;bv-rqEEGM6E#H7-k9~l`E)i$c=8M@NiBzbpp9pXH#f9c{Wvz-1@Nzw8{#i-XQNd zWdh06M5+yDoUW|H{ws&ER6pdkp(b#C&Tz^J`66oqOTRMI805&lCNR5lC>4U7_`?`- zAKFpNk)PZ&27T6wT8o@sif27nnNZoti?$nM=UzXm1UVtv7-}jFsB_4t0*xWKYj^58 z@;}ZP_U3h>ULXfr7{iwdTGUtM)19$9YkVuJEza_EnlLMM?z=<}+3&s)xWv4d7$dK& zz#h?QFC=!z>xzxw&gJ_O8hOz!BM6*)T{0TE?`k7>HT$Y$B64P=5qNDsF9|_D8*Bs) zwo1tYPRp01BhT+^1lA6@lC8+^I^pMc-z~{T zZr5xG#B7`75OUFbL)es-z6yYvY%47Z#^*-D4)R#lvGc|JXKCZc!xZwgGq4pAM4_ z?rgyK87bqAP$|-jw=VOsaSOO*2?wNiFIfs{t{z-RlM3lvZo1&M8J~`?A4|(#%7hia z+OXe;ev_8ZjS{pUq-#1Enk+^Mjt`90XED1MC4A$l{1D;X!rxLi^S1n?7c#-@-g~L) zxCfg)F;4K?TO|$p^o%Wxoh@`@T>?k|~dcE}MCn>kV-AcG?5hC5(;LpVz z>LQ$5JXk7wK9lQe@}3W}ZY7<)az5u6bdAq&EaB*9;hd*l8Bbj1aQ{9;az|(6^C_ns zxTto^IJzc_uUOiS8!B7QEppz(_j!AnwaAL%oR+QSJv?*Sekm)s2qBr@@hhD@B8}$U z+Q#yS1}|dY-HYamn8p0-X`bxzpcrmn$y|Q!5qtK0T@2SIe>&gz#GL)d#BxVFOyRS8 z_Gb-qV!661AKtxIpMCN(mh0B!$(P>i%(nH4<9b95<9$c9W1VoP@7V;xyY&A}y4;WB zrYF1dWz!ppQ(rvau(cz9VaH=K!atr1IWdTzkae5%#xtF}W)I|_J6015^uh8Kro3eh zp6T)-o}+XO`NI)FYWkv%+T4f#kyuJT43lx~M;h>ps*8y0e4J4Z)a55f93l@hWSosl zS3Yr44$(a(<8&jm`BrOolGfPM-cqZ@n>TMFx8C9$GoTIcTe^;vX<>(_ehb7NTTLnr z6F77E59m~%NbFq_xW9)!!xMfP(He^y>DD_)G?`DrLJ~L_*#JAfO()BiqPF?^1lqe! zBJQj4thWdE;po$`ezg2|eqfelQ^k=!3}=*PwEsE7^1o`$he( zz$qOE^0Ef^zq((5Tcd1A$^-OXKC7U9uLW6-o|5@DCD;ryCKvJjqHEuB82hv@Noc{d z^QM==wetofzau{5DvpCyO?NU%5C5%=Duz>SyO6Mc`0w|1A>eWX>1K|Z&x84J>uDP@ zVi4xC5)QyWy}yi(Gk#Y@=EASTUzsH|J~tEhf@)186Xk)=g@e1{SiuX%$P@qFyx0lZ zogXqw(0}!(w!^aGo6K^5%md_af$o{rj7=bZ2U>4}Nk=X*J3?@;`RoSh(B>?onvFT_ z@bwVCQO*?1$BeFBI%NBwV*Dad8?;UXlkvq&1!mVDzFG|}aRp4v3cUU}1>|@0n0E1~ zH{Ps-w7J>L-9+sFX`2KUW;>arltj)uFdkZU*~0uz#bJF2TmCv5 zCNzXHy?0~wZ0IbQYaPTyV0L}z#t`Uy-;XKCN#y>v3x=v{FXjSf$>wejgl@fuGne<{ zccbf67*W75Ck~=UZJLC>_fTeaKK5T-z@GMfc8vRB)O$yLp}Cb6^QI8{@C$svBhQ49 z9mU_znQ^cqu^-b?gxRM%W5H&(0kh~BW-z*V!Q1!Um`c=9VZNR)CAt&S8?{qz!6+E$ zs>MvkELn@rNQkm-#jHUc)v#(fY~T5vK8!j_&>jYt$a|VsXUX=s!%q4IeF=3`S5^wo zx7?>IP)99pWWkbLr%$7f%FQQmL2{MOMjd4t!9f1X^K`5Ne4E&cxzeB##YbfaS z-$rMkc1mz`hLRA|GGr2y4%+qQ{_iT3hM>M?qRw9obXa{}bd}$lhOG{S|hE&-Y zdMom|H-q5l6%YCs@(;g3pa`Ss0Mtv5&)b65C};W%GApr#-4TQ7?x>NTowR|gcP#1I z$UB^DVBkt)`V6v7nKc}r*OzXO8Y$e}8uHflpnZ{@YpmeKD;+uu*>8pwbYG!OKS9p= zF%W`>wWCc@7rosy5S~P|P&1Kx3>gTvm0ziS$lvQMAuHh>bsu^D3QKU#ct+`?78-AC z2`9hYrN$tqR9QgC;W{b-`Bj_+XdS;ol^{>Gvw)YK&QVX0RnN`g`~f+ogZk(9Zga@r zdXl1%KTa}-JHkw7z!z}#nIPdoR<7>@k=zn=EX*t@}j7;fO#-yv8P?J));K< z`cP-^XFV5UU+7eQ>I(9g@y1YpwJUWG`J}TkL`)TX+GF|}LuoC)`?v2C}d5FRYd~S+8?b{C;LEMl#nx6LRjYd%UP3&o}i^rU~ z&Sgzc`__3z(3~pvwD*{71pAH4H9hSkM;O5-hZB-m{7frnBZwLy_Ou_vp7sfM4@frP z^*j1T@IFKAY2SrC?QPeKJ?$U98G?DW*wcOkd)hl0i9PM^_b^XYzeXa*pLM=w2p_V= zp7sMOLwLVf>}lU{$`ERwM@s7Oo(~0>B|8}=xq~cZ8-n!FbjiFI4Xi>IDok}>$u6FL zi*1Sx6M96s3SZb_wiEhA=f2(%8vadY=aX0=cj+Ki*@@fCs5gm%-lT9<(uv9Z4)<6g zrg*1Hf9-dk3l0&aC(2c3C9Lq|nvLK+_Ks?n$6}%WddLw zDOR1{`kHOmJ(MevXRBUbHR4XR8qLWLu2eaP5U!KQAnsQ47!^I=hg(|EgPV1-m+IQ) zX`HpB6?fdMNuWB1amns?SnkL(!S`%9cR^XkzMODGxVdX77c?)MEp6T?bWMrkR`y9} z3(j~7AD2dRrZrLQ=zqP0@tD2ux^M>TS#_UR9E#-vDIfOMhhzNLiE*6yVGs6jNIE~} zNgQX`&6Pc5u#mqoA)c#gGnm!U8_RDfiRbp3o3kBjo%ry7@m$Qb{#YM8fbZZT`K_@y`wQ&GP8;$A&fs2N@JDUdxx;;^!x?EuV=Z=1-*ce#L&gRCKc>z)tctFE z+csEOCVxeNe-fLzXSXhXKf~cTkV4^grsOW>J7>HtHAtn}kX0MqINGWz-&(LdHv;wBdBjCKI2K&X!vGCj_0Mi4Vvte4o>4Ilh12be9ZV z-k9bjU>ADVBGSsllzvD?|Ekjs;^sIoP9x;S~B;2ij+oQ0qnp4`hEsJhORnDJXawUd!d{&iX0jO?%ZCYi)OlSEf!f0|k{ z3G_K4p2qyjCtf0>`tA_xK7+G0kx0w11koMYU&>KRjz3;1&Or9}X$ZxAvh&2b@U%T& z3?xkO5hoz~`?l9We#QiG6y~e*Q zMI@Q!wZsqL26IGmH>-jef$YztE+vEAx!-PBFdrbvmZOsX_k=d=SE|6B~?F9`u=NtMe$yUN-@aR{_ES}XB;=qpg z_2lD-D#B5)%~jktC%)HT0^8;xueoqf{~FwgqK|aEKyQMa>*Wb_KO8gk*5LorkU?k< z=(~cSr0B`_!<+R3!OylLznid1?+sp>h|ZGzB7GqE=vv&{J7l^(5yLm3gyF8b$L9JB@Qa1W=DwQfGr^bV>&g1> zUo#4n=aKzgJpVZ33OE4$D;j<&qX=w<{*~twL&kmZ3uJ$t><@}o*kSpRAwvcHR|HCgtz5!qk$h7~fD?C;)K++Ay4%Cf)C;PC^m zv+QpZvcLc0vsm_51Ni^1gB4LWk4poOzh2CEH+b7fHTz2fPq35O`C9Ox2YVT>0H;n}&sfR+mh9QhI2^25 z;=_0WxZ=fGjOTz)Tp7)H2Kb8w$Fe-7f3+)E%>kAE)suJq*}2lcs+-Y#$! zK1(wgE1j!nz0|!2N)GtASnX&j+23BB+R;+@@S{mA7gMso>$Tn4&ng^rc0bGMl)P`E zn+rQv_)UX*tf!=8f3w2dvU7#Yw^$ulvNk3AJJqHcJ6E`T(0caISNc~|AJ<^#N)8xt zX(KyVvcH+H8?$qT2M*D*b0r6C8?k}0lI3YCda-8|E;;S&to*wa_N`Nuoh!NCbZr`Y zUg1g|f3rWo(z$A(QS(iO1HSiVKdU@5?{-DT%K2dv_3lE2)3W!ZZz<>GTM=#ed56vU zmTm*(y)P~K#ygMktBSqkv4Pe2!7og8fd{6`@u`K})jnNyZI6b?9<}Fln|F-UnHZzx ziSN1)w+>;tHB%yFPs_H_0U=iR=*3L=Pqi#bH#lDR>b!@%??ioh&-r*=hXd{93XQdL zqm-4pnfVRbYb>|>I9L|;BpRb_+~olmo5`n^oiKhqGFP^|dO#X> z`n<9HXSCdRLvw9nmtteUv01W>xt`gu&dqNyho9DHuW{n0T71;Ik-UGK1Y^tMj{GBY z7e1gtfbr7p{(PEX#kcb4Y^-*FG+(;4Iv=yOqH+5@KmL(VDYwGoy_|7%27g$S$L07K zTh#t1;`d)PG=E^B%nfm`FU9*s@@pQ|sh$pI&;l)S|dA> zH?uV1eoQN*DJ7A7{`N}Tx2C7)Q`0D3==Y1%4%>-)^3d~f`9f~AUrkqQqxj(Rx1?)X zIMsSY@o9lC$<&U%)X@(;@R(<${}nfScU}~~#`+Q2ZtO_27ol^~x|rCl!QVaNv3F?8 zZBprj8O`1Vub6X_#29}YdhEh1YwI=Arq>fgTq?Z6;tGjBe9rLX81{%3T_hK?Pa4Lb z!Ta=9Avw`~m!UC@;!zGK?)hsBj+lwP2r3}MG>Z&-bJ6E9%_l!H{0-ZYGd{`AC5wMx zDLnqSl{e=Q|Lz(?>=o=+UwM{v%xGhX!Op8u3EAXHO-q9YS)})oETUUtW;k&hetSQY zlsQ#0d_W&8(KeHWUV9_{E{59#8A%9#TfFlCj&V~a)n@04tI)%5(N`wfy-taZ;el>h z7`3k5D=vD9eOv=1vehTW1%gOc$JG~4fJ2sv z#O_X2u{Yc=XM{*xmwpm*zyn*0BAKwfooS!TR;OUV9x%n+#s0PPN^n*hlTP(PPf4d7L``Jw4Kk(dcxC1(1jF1h^ zwiC#xoo+%oxS%dvaY+}UHC%3d1%Zrv&_eJ8`@BbYYj-0d9DMKz?vPzwUDyeBxP>16 z*dO{#u>L%L*M&aQKLq#BL}%>K75xveddG!EM0N+7GOU9|{i~?RB5+yefkG<>}5b zCv*dcS!b{wz6AGMWR=RCun)Lv@@D3N*WiASzOP~(ut0Etw1|0NUGUb5>dq?xzQ@zi z%mZhFj|jb(2ett3ZPSJEQ+VA=TRY~2so?vI%$fVm2Van?GVTTDw|!&oXAT})=NaRd z@U-cdt}*vJ3m&>mX1oi0aK$0UOTh2_)E@q1@U{VKnftkey=TTS?gGv?Rd-%lgKMt$ zU|v@PoJ|HZF2}pLG{>3o3vibi>Rr!8VCyc8*!ekd!_Del&lH?cMZN1e9qf_%gn8P2 z@W5Z!7;gu6o&E2w=kTT{*m)ezEf%WXu%+M^_toxwB>3zxb?4PWa9D*n_WWG1Tcv+H zuR6JTu=A-n5B{Lu>Ffs%G;?N-r}V-4-Em?(7F@7R<Ho=@xYvB|1nnjV8^yBU>>D-pthd{J6HJ5c3XC?c;GSOz|IvO5_^=npW=bj>^ib@ zg?BXj%v@3Nz~xUqu%A_U>GG>5Ci?66l1HuOdS)x72d%sFp?5mV2Vca>aqC+0;e2n| zX8Ak$;%w(KUi|zA4t(g>UdFQ1p8TR$b$IWcb&UgOPT=2+ z{KD0n{ZU^0YZ|{M{Sp_k_m-ULHiwTnevCWozF)2r6vXc^P2vW1T_VR?1@qsIF5{x> z@^brYcpDn#aNQ!S%U^$n^4{CLx$pm7l%5ua@js^z;_TP&l}3bz^XFFbT%W!%()mB( zyk7k1yf5_*|eYCG7 z{$B4}PHsu->6or~e?53lIy_%O{|rROxH)?4Z>Lg&58jWJUy!hAgK4c<*zFnin3yi_ zMq?tP_@oK+(Xa{~y&Zca!>*GR$6gsK?MI)g z_zF4K>8fGh5xnnKTq0FNM1%h+%u<3bkfojX8@$9QzTf8aWJ>dmhV4dtXZOB<^!v5c z&@Ts_`H*}vx@({zpa5>uDvy}Qdm3ynpp*PLhd4LU8J1nfU4+GFNx%C}hRxT|fiKP` z2bbCyrl7}O;ZqhdJ5=BB9;CGHm`Ra>nVH^Ez) zCt{XWv{*cbSyoDSO8R#V6pz7MMn5u;8L4B$E%275>kMRUiJLeJ-m+|>-w)&l9{=Ps0h-5X)vWpojmz&EB;70BaMN1-qH z^Jl!TYc~^SgNt9_JEpkW!bb4VJNVXVP(|Sk*!2>AceQ@4zX=XMi{FzuxAY&uX#zUu z^>g&K@s2)q9KR30p3t`hFHhBzWWPOn4Y(G1?9;6i^+UlulJUE=#Y+7|@Q)2}q|h+^ zTyTH%*b_?q^^3p_&|_ce=%HT?9*!P+muH+lS$TdDzIF2LzFBxQ1s6;4Ojk&#@kR#0<=WvNAFr z;(Q`zSwoytS&w}IW?3=qwy+-iNqEbWcdJ;By(wl{<+m2G9(xMBCE8&I>#+~UEbB(p zD7LH991invS|8S9{|ax3lRL8>`v-VSe7QaImMY*K!3|lDy)7K(sJ$thW%evUtHdUZW5DGD zYB6sa3MOwWFt!C>IQE=*%NKY>y}TmEm%;Zw8=0#d0v{fv_SoaVR|EDiKM4f8TvB&+ zdVufJmF(OVJl-&!aSJf%IgWWqU9fd;cgDYzcU&C}9L!w@Mk;=ytyIIH~<{jZU*xWrN`cDuloJq1hBy6q zJO+GkvngX`mUX-IA$#vDJ@)rQ>#=jiTk4zt>evSA^Nm08w^hR+!H0FPgr$XJT%J#~U4HwF(R`FbmNg1-&m)UY--*oPDv$OI-E)G7X0hcq4J|vz2tg#9C&~8 znbISDUwP+5TkQTc<9k%}kRM)a!0)p=h}}QF^2@qExR+ll>k=(z$$Aq5*DkGt?)-=_ zIcLx)&L_lES6&t^=TJfGb8L?83N6BeZ8tB##PkQb^wEVFCF5L0kn(oMtmd_p=#SPw`N{g(bH&Wq~Ztj{wjO`*i%H!s`$jeVA8_m}E$h-Lp^0Bnj z##LLxWQ*U!q^!P$#>kzK@{gu9xgnW%jCE`#$z4s}ak=##8DGb=l^4|F_=gS;jIWmz zNGC?k;QRi(YV445l?Ls>{Nkh07&Xs{E9n-&Z?ZpToZ@hm>pXWFe?4NSk$Y~z$J8Cd zd)AyAf4s0N-${HUXAYgrZ`t;Q8@K(T z>>L!xHyj~z+^bx9O#D3lTUH9!_{TcAW$6MwZun|WI66W0Y!brPnH#}{6+6i8!J&NO z!^vE=4kglr;4t1V%aik1rI%`V4(E%5+_+ZX5~NPq;e5|H7p^>Zp47`Vf*;?~iSzC4 zDXrQX!N-_6aCf|WNN>?4(^j+M7NpxrpU}ha^SKc>{fn8jcNXrRPOHo1+x(_0cSiC_ zO=@zkCXcAq`A9yXbv4d4B#*9n8_64UD{@KVF?!1k-=O9HAlXSx~-41@GWX?V>8Zia_u<0q$b?8YiF2J{e10Is+PVK3048Fw+xJM>; zw4{U9U~coah>Y1)ljdxW;%D5tL7ILlH~id zk;$kZ$3;KP)0(GBIK1K54h;3 z>XcL%F-dF(7u|ZsK;q~Su?Adp%1i_KaziWL0H0`OAV)&liL2qFpGrjXb7ga}J6ts7 zs7Rhats`Cm4+s~@^}x#Fc(`b=yGUv^eJ9)ppSKo?`@p+`C;apISAi4{%@-u_f@=cV z^!c=41Ltg?j{Ox)_Y0xm{Pp<0a(j|+4qQ1zAjX+-f;l{M-*|!CI2J-5*%`LZGp^o>m+mn_xOds<3F+$yundr`1b8_10e=n z^AXr0kV=qUC>vA%e_8@oddND`levt!+MgQ zo~G{zUb`3bnd@8iZs1wlF>e{XMn48zx(VL~zF4B42L6J*7LO{=)`x;)vDac^$FXd$ z#oAb$&*`V%h;tLn)85tXrr!mA5(USY=%7CYZW@j}?vsW7G1m%&j%aGTY? zGV;M&vDe~E+KY@!;BUxPOSfLjxCu@`u39uCGou*ni+S3xm}41Fz~eDbTlGQRYq1jZ zw2@?e#v7d9gNt5{Rrgwqz&x#O;ew3MIDZQl?KfsZ#y9W*xTsmv!EBxuiFul!)v$S5 zAiT5*-)@if1I*YwEekF>V?rf1Ppb;Hxci39(?-KZH@;N&TIk`T z7H4u;uIdOr^!Oz6(tU8zYxUK=7VW`Kk?LLx8UE?^d?lNwjRiM_ zKli`G_%Xb(WBvu^q6Toa>8h7*0Uszk$j&3ci#Kj&&glz2U9Qg4`ht6ZSjf(uz`^Tg zGHwd4v3nqM%WB|ZjsqBff+t)$q3*SK0?s2H*!gvE;ZJkMxnPscwg2w5Af422DwVw! z`$`@#SKI?`>vxWEGFV&f-(HJ$H`ICBN}O+BeTY4?MB(MD7>9#LzE{0;0XSe;5Idg@ zem!6kV`YT=iT~9AhO{EslG}Secd7vY%2F| zfV@zDoz1N73~Mh(1Zep%>p#Zj)iNcmWg!0{;i+-KlVtj!C%#eHook%kY9L3xgz;(b zj~Y#Li@6_$Dg64_9me&aoAIM6x%1anEH$1y=gLQ$Iq~_!h8go^_`=sl{OTA>W6iR0 zyuNB>zJ1HL@}I3!_)i1xbE*1Aa%A&aeCx^vZh8w*{#au^KkC{}?soE8d8YG1zSH1U zT;I%5as#&zz6}lK2IpDJBr%jfc-D^#dG|>A9v{X(H6PAdnw^r4;!Z$2+df>0*J`QG zm2keDPY>=>*la1nErP#k+kuNN!hOd3BKU_bTXLn&-K2A0;0fC1T)wM~gs)8aa$O_t zj;^*eA}Ep{T&pg}-}p`^?!}&~xEh?){yyz>3E%4-tjfK6b(UIwjN}7HSLD*ej?ky| zuvek-5ArQ(3-xP#N=)DM3wX$Xd*8HWiT-udCAwTcY@LD{he3^3R5+DVWJz zyh@(>-8H;`8>IPOCf^Qb8_Lr$gX(gT>|S!j&{ZGBuj^At#-t=0GT;V@|D7Y_FaBrP z3^(wtP(T(Z1{+?%4f1y8k>wY?4LNXwag%e2PlLXOftN6+>YYPAw&`XFyNXVZ>sey; ztEFKg+@QmNY!Y_X!cYZss`)ds@Oz_%VLII4{O(NBz1uHwGu$BQrIFO_|3cgdH}LFb zBwDv?qCebV=K-0_`DPSrU{2*?DU-2%kBR@m4Spm`#JA!uu>@{#(?KGg>a7=B!3}PR zlw^!tE)IknSd68lVCn+V6K-&+0wv>GPZ0aS4f-545Xmq|w1p4k`Wr||RgL%(Ol=G# z=TaMS7u;aeW090pvlRQo2d<}z#JJc@d<6cnKqT$kR1#;x2X^!oN!JT+gjZmnW+J)K z;kMulAGrGw`w)C{g#vKSC4rQ7IwiD$16({J5Qimug(cwhwF2>Kw@J7P?z})CuNwR( zSmM2J?v49sx09SZ}o>EACAr^f20e1crR29;|ORiz|GU1c{Ja}?GIzR0n=u5!7gdCyh zyuJ$FiQi5lH|ZqkEy0Tqp|53eQ11-R*@NHJ1C#arz^At1cjkk5{aA2MxWTmzi}f?W z-f)98muBk2!QaujI_Ww_zY<&rZZIUuO`ix(K;07;4aTyi3Z4exz)eqLW8U{CLGT~XqWt^Xa8{|#9l5q<>9B$AyPG)Y<5^msf z^9XZ;)^LOAM|NbC;F&RSg9XV308@%*f#yVGR;Rd#S=CjV#Ik-V*$%nbYa=1Y+ zox1bN7jBTz#f5dQJm3aq7LKfQH4bjj`EXO#xeA3F*zZ<%ULArDY&fcRuHL~1?v=h` zohvtR&7hksYfFU>jHrEA{n;_-`MQWxH0(Hf-&q}Uj=M3wHM3T-kZ` z=ghyIS3wW{?Y!Fh@Gg6ID{de@&1JkrdH${1xk>;p_DW~xiW`jHq3&By+~APO3U;oz zft}SqH?WOg$j%ivXx|`!@pN!4u953byee;8{;s!Q_s~9U;TPIJ|4V2vrUR4gTbHxp6J1u3bxIwk` zVT=_w_}xeCaVc4wiGDUaS9UMt3u^AB@UB+{Z2qInuZC!B*fYxf%JPXigHp0KPt!N- z8D&njwT0TDQdpZ?n?0}0ta?6iWX~vka_B|I%KXaucq{gd!hyOWtOupcslJa_cPS`r zC7)&I%4{mN&sFxb3g2`V87p(Dd>ge-rOcO3Et|~#nF@FLq2_wZ3`%eMZ%);)q2Bp_ zbE-W%)!a~d=Jun1=iRTYXIY_g{${W`2UEDf`Xl@EbOG0o{d~guqmN|vGE~m_7A{|F zyi*b!=gX6?{g&5NdLcDi=r4C|qBC|JU?mT99w7fVi!v6P4wQ%XXfB5YCmS!F2$U@? zBnkgD8=t|y)=XJTNxxjo^78Dha;>-qz@fF{t8spYIKC6QmuSPkN#}t>;4i{>wOS=(wRW9TdX1?H$T}!~bIEl0*3} zetw*5*+Z!^?y0$x=fSOUIVq*Oh4W3G_T~yhEmh#{``JvrH@4=~dSbQRn_N}0) zaH=fxGP2ip9vu&-TAo!xp7j|;qv2GgCQpgUc#dv@Q`O0TKw4LAOFzP?yg%M0ZY`S9 zBWsbb#TJn(+p5!FaH_92B+%rEuZ+;2sZqIQ~7VnBf@ZR!!0;fsBbPw z$#OG{g;PBzIYhY8)v)p^<}F>%lCl#m4YS}>r~9DC9&KT$3#al8K!0g;4Z{LBRlOaV zWW(8?VhWtf3Hv1aJbEtffKzqnjl}f%RWT4wRj^kk;k%7ueK^(bCNi=9a#T!!Q*GTW zk!AXw;#)XXS__H9U0x@)hg03vV|S>f~N})M?Y5O=h)unJ@0{BcHfh3ks7Pf)UI|-y=-QmIw@KH;F zR4e5LQ@D^8PBqb0b*h1Iszl(vyx>%?g;eHLJK*b>r4(=2Yd&F{^QQ({I8v5pb%b%~YrIgHu&mq&n3;I8{(v z)u}XastOZTr)nOA{`Sc4%&B_Asm__JPL&F$`u+SebE^Jus%qw{Q#FHA)!(l=l?|L~ zP~RP_$36^B6~13}ssnJUsU=I9Q#rt?Dum2qPL%_vdOu!uswHqL{Dx#bc5gV9+ld~` zsfNI*LQGYs8Uv@Y_E()M7*4f!nCesq;Z&~IRi}Cjk8*nak~vi$u)U}{)qZ$X?aiuF zH3qM~s5;d~c$DWw)v2t(?eA@1PL&Ri>Tz3jsv+Pxo&^6( zf1PUdIdzZdCY(=txR;%WfJ=IAVZP)I-nD8q<6hut*P|J?1s@nToq16s@N+M9k7y-u zvotq${toZ5_Xky{dI&zB*n*v30asn1&Rep&XtW5ub$YTGkb<}FQ)){IAjZ*{B8SaGTqt1mE5P_n->8)~t0 zWrtPwda64q^Ohd_F0p46j|%^Jhq2;O1<%!I6pwOWp2E(Ro>Hfw>KsOKr_Il5VrsQ!{~U!|Je|<# zf7zdpe=l~fI92%r&(8mIr`aY={+@fc{pU_|B(*26_>w7q%K3lK)ATWaxoVdx?9Zb- z<6TwVYpSqELiFEf-o3JQcHd?iSXVUaR&St(-&T zhIhgw&p2xAKRjCARb?ajUg3h#Q#V5%{;GhRfAhMrfgh0{bM5%wPp=!R4*M>B_3-8U z*1Tw(yx3E^6o$PJxtYeImkDH^7j{(?q#FZw@8OnCoyYHem|}buX~Hk;;>EX_z23OC zd3%1_CM|#G&`hJFU0*({nH@i6SU02ma3nwCXf59VcNOE!z)8HzqcZO7?Jx4Xtm%A# zQz17r!YBvX&*dMKq;bpE9F|j_2l3CWH*$5p&z6^k1@nFtVz`O3wDOEvp}c>kK+f_m z?t5+>#uqL1;S~sxYs_CS40F~ z+Q^aX|C^V5u1D~%4%l$ZuC|dpnn&`lhc@9XPMb?1<0ARs%=+BqHC3cexF6Z!V=c~e z?Mv!NBYAD131|B265aA7lK{>_?>u=tMa^CqZ2Y(9?79t(@?PxQ}qA_oFb^I#EpeR>b{P zaZ!9Fi#x>5s~#Pk7{&j(f0G1Rijr^+m!Z7^+@}}8WNVe%k!;_;?{6~jN z1fMP$B2HtUWb+Heix(opJCtQ z5cPiKdqtQX#jE!t_rHL@$3>Lr@8bDWS@?b8t=^AZTaVxWKQi_8;6<*-kbiYM&hAHU zcL3Q$rg}f}rJeYD8nW2K%fyQtoe z{NGZ{mx?v)eq^^r`2Dix(ULhyInW_8&8$g38hAC;%xkGu|Dal7~G z{m6IG6|dJpy&u^ZovY>3)%%f~qH|R``ZVi`S4Zb6*;KtBxg|PRVHJ}yUg1C2babw^ zeO2#Az6sYFIzEzh#V4b4^YW;Tch5O>;~`p9P)`}TM2Njy~7@{`BfSGDtw-LKk``cr_<{F$XDQ3 zWn0o%=V}D_b94260RC(YCmn_D6 z!Pm#D_aiR@pZv9*In`9~&O-J3!69J&WEeZ|2DWK8m$5C_v6ec&stta3tT%J2?|8@Y zoQ`oR*lN8a<2&GL|EXQ^Lhz5*HJEG3;E#psEb9c=vhhpiLaE?@5tkY70N4F+mhmR= zt>*g~uLidoq0X|FgPkkvVCT``bCuLtmf~GygBG##`QXXfYR)waJTtg6JD&z#w0k6T zq{-m@6V;j31hC^%wSVOeo>5cnTq)j_QA^FXMuMx}uJqTtx*sfL&Y*bL=j#8w%f_hA zqZIF2zwZ`%M)9ui7qS^E-nA)2-Q})y#pe!L#?F=bRle0;#)@~1tuUXl;$4$&wqUHd zmgBB^j1|{9{^})j4~1)ui({;K*Vo3C*fWZ2Y2u%-bA=ytQFpd0-jzbt8JEI*XLY8e zc-PIgHQCQ9uJ!$B68l-juQUnG*tx2D_*V61%&8Q=s#R0%i7A{n z$JT%nF?U=TtWisxGIT+xo8ldwzI!L-xGlRO^<}zvt_d`u?43)i|4S zV(8bYa!F#5^ikJUezjwk+<2N^Dqoctlu8eeXTcZA*Yv8c^?>&Bn%P>phUsNp zRO6e{z_W-Zq>8u*g? zwZl(dS8<%~ZQq9cjq;&#lSNvc>-G-(A!m);^PRo!^U7ZQ;i(RCV7MbkCX?1S%XB?-XZ}m_bZE~8g)@&yK?MaT5)^aWXrT!fL`q|@>_3$yg z1)axN+rL|CI?#r{x*>>n>$*vjg5PnjFBb6UeOF7vW@d0L-!0^uR*jV|6ee*!3WE7h z`xi+=GGe&Lp&@+V*$XB2c@wyh>Y@B+=RnD)633-259Qxp_m@VzZOhdw59J$w@s{R! z*>ZLh!uZJ{BPD0}qN^On`%f4mjr~-Y>(eNlZ@#~ubhdMKu5@xZzivQJ>FJq@+;!Y> zr0uPd8ub25w!TN_YHe4kd*%x=%qfDuVbf7Mf8ib}4uFe3Ya`9MnsSa*X8VT8*WwymXR`Zv-A*ZXnq?r;(2fBl)>m zb)*-sQ;2>u?y7!JQ#$=-E4~ej1XFMBP+HO3YqEW`DvrkL@c;XV$MI zX=d=)Yd>heJu#$3D|pfR&(!cdoO~z9!Zy97pMTCFgFNAW_e<%8*eRsTRLt)DpVB2u zyvfB-%$FP<(6*(+Nhi3ggZ&-qcV+;YpNzTO=o|EIsg685h{=c*G<8BR2d=d(n+m)mkujr-`cI}hy*&wmv*|aBG<}d2S^pJ1qH|~H zn}$tD<4Ve&z>{!rb5ge!?sQ&xjAmNbAu$cH(JxdV28 zt=vZ^jjc#boUprZMhf+A{#|>h8+IE8?4)KF-fPPUc1T8Tql2Y@4-JvOQ)Z8~iJ9H-Ymrh?v-*!vaKAVG`OMPOgb+1F(-V1PdaK~kI?4o_z z8KKw>)ggx3zTK(yjl@nNZZWMJpR8@MIGQgNqiEuoM6I|Ky9Aqs(@Gu*T892cmnQH%nhVtwnb{)H$?M#aXRhyaK5%2 zd%f;om`d$WPuDKljD1Hx{b{fKiQ3o6xXY~XB)VDWrR}jD`vVX9(o+>Zv{Ny6uhQCw zQi}oF@ZH#bO2^X9Aw9JV_Fzx!j4?FL&Q&{lA9gEs7)AZeowarcumj3;1PvP4PJ1gA z|9QW7(B#aP+K@EdFIhg6dWBePs~*OlE3+XqcSaL!^b!1Qw?Q;hz~KedPX8Qxm(q ztXB4-YwNt!SYnr##DiNBB*x$A6NJqMJ-aO4>aMMrN<)xjb`3XL& zbE2;&Owi0b8_jDsbf7ivjn+H?_bO{o^A8Nw48#7e^+Vdz1^N9n8Q}7h?dab2I!!a| z@9JpVjt+U+LlX`*S>Kkr-|eKi3GP*+EiJWdtLcFKT}PI;p%=Hd&@2I4nzo@9W34pT zz@t|?(vPDXYizNzt5Xw4dVO_$%?xnV0d#YJ*V3E-H`KPKCw7`>zJd#`wW9aKD`{M? zvuob$R@Arl57!XzYqM4~Vd;C=~mRd2a^ zgRPHYf7hLhu4}=G6IxP}-?^@t;0ER`>8jbX>pO7pxfWDxm*HxK-CX-)TF@cwj=K&7 zujE_Md9x3?27xR7wx`mk6xXfbFOogg7`C})gNH7$r|y}XTuZ=T``Oc&Zwaoo3ZwZO zb?j;1IjdZqz(u$1=;ns8uEW63_uA1@UlzO02A9pZquXnSxvmD^?QKVwuAbwX2HxJ# zj@Iy<>Y4|(F11CEdA#dm@NmhNx;u_?{Ry_;XiMkTAL7~&d$j%w#NCmt`?|IV&+2DO z>mTJ@-N1Qvw)A#Dch_;?C4X#aWN1g%IpD-%8~R9cbX^AiXt1F@hS|F&fmd&{p`V*H zcTEG2jkcj#Ru--jc<>|}I?uPB>m~5$zBaVxi<+(v!3*2kP|uiZuJ6Db>)Ft_$cnBN zu-oc%xix+FpxmVn`0PV#8oc+dOLMSPU`@Fh&t2Mr6Hi#vo>H-kNke~bUjqDOkPqK- zUls1+tw=s2J8CF$}u_{$b6pL4gL-PV=dj*|T@WRmZ_%XHe}AbE$+Mk%lPcb(TDH#x)FUOsy4 zr_Su=2dUV1qP*qV7u~D+m8ECcDcY?0OI_dlT5eZzxIF)UzHaiGVy@}ADYF0Z{krGP zn)A=B2FlS3SLixi(DL?A+R2@7j@I3n2oD+9KtAT#LU*&#c)oc5Zz+nt<{O$#;kl%T zQnCF(-nzj|{$TZ7>FuQizDdnFy!+eZ()X5Q_$O!P@#eX^r8#*vymdkl-(~P7DW~3h zF6!w5{`kDr($!lTT-lq2eE){A(vxbNxoLU9{Nq!Lq-QT;xS1g#e9`iS(!jzATwl{r z-mHJ1ba5cZt;ZdO4NCl_OO@Mkb-#x4oT-nraF#9C-8YQizH+2gFsTXWCx!8+<_wXB zn$+VKHH3Sd?kDBrJOfe zTRN`MT+$34a^_Vjt+R6qdJ@P7=RBopo4rX2JjB@f0UiBkIH?W~F?P5^9~TZFgW(~e zlWx%3zjY)N9x_6InR*0jh!;G>&!v$5SK5WNgNNKJ&ZGBRIT0N^#BYB#oj2H#q`*VU z*2~m9*Pi&mL+#4S4*0#ab{{?NUy*$35Y6wImqI&t`mRleht!$9lZHKf zuPr9vW!q@h^-^tCAG~KzY@w%WJ=P9(kLIJlZ=!L_?r4|6Lwv?;q_fF2?M!&cp2BrB zv~!`hx)1g!j#^92{c^OvlkofGb36?wl(ciFM)TPR;^>#a3~is8xMO$rN?OS+U3(WE z5;!21_8fLd>jDqi(sdb4j^C%92oH&Mj-hXV?9`5m#7@p$i|O*s$=YV{kS%AU=q>+5 zZTeE|w`>tk-MtgERx9wX*&R&RMy=9LjKh1452Cfs#cCs0b@>_fh>Jv|3mbZNw3{lV%WI zcc6jx89b!If`K%ywwac|LpmG#)5L?O+U4+&FU|VV=V6t#MtDeCtQ*bz{!{Y`9&)l$ zA9`idM@@BjNYtucbV19Pnx^oO&=x)Em)?&wR`3w(b3BbbRiv>{JS2jn<&l>)RpA~Z zw1jqCm#--WzcSHM%@?C43m($rfh*m+ORrf656Q`Np}I}!8ZQdJI@*I)yqKo3fP0kh z>rV3r?A2TVUpml@`c&GXiGYU;KG~JJmM3ZK;2w1fx=^>a>or;6tmn?O<@$KdIJig6 z+RpT;^9s!yaFV7oJ!ul735AC=nb(Qlw2aXF0rx!CkyekLr&$E|$ocFG+lC%VQ$0jey$yEnsU9+8jU#oQ z+*o4+$Ivu&q~nwSpNFKjrhjVG)}-US25C(*j+kh^fKOg;MJKJOr0D_27%`_6jj{jX z8Vt^^(~7!nfA4w{{16`UXnKij892tvf%COD$9nxdji2esj@v4bJ;b zY)MBo$YUNt;UOItsUFhwd<*)5s2zIdl)U~JPA*)ry<^joQ#KU)4h{!9!l#sveRA z4;k6n!j<=9xf7v!$P0ML=LX-HhkS&GjL1+u zYw~o3*fulQMH+%h5mla@*l{LL}cDKtqaFUrdtr@Y^ zB^ey|$BNe5lIXGrT>rfl&AqeMhkSEjyBf@=f0W9)Pvjqlmm0YZoh6|GzAJlHXxwam zk1Se>K5pYv#(ovfaJL%G=6$N{H698zo9Kk0JvgY3G zbC7Dmf9^DH%xy8$lcr9NA}<>G{$~ z{#sZiZuf+f^l|kl{+G!wB3|D?BU_@!Uf~PzO^&DT@SMrHZ^_!1Vf3K~zQ^zRl1v;p zo}Tf;H$L9aNVn>4)N4L=;QV+Nxf-%j%GcP_%PIhc#NQOs6ugoSPiOmedZlR~NKa1p>n;G(MBY!N)BvT428mge9wY^y; z*>CwqG($(ra<-9NNh%UcksGeKB9k^nIpP-NhDkkTQh4U1*a96bOGzT_>+cogkQ-L+ zE0I}wiQ-k{hC_=eiPWzYed|Il(e`sS*(Jr@XJ{PdH>2od=5?u zF_4-9FP=nhc&oF4jIebQ=O8Pz{fOM~v$bdm-z&?&H*uEr#SCz6j7ZFas*3%P6}ote zSXJ>+I0t^t?+ZHQgFe3n5;Ebua9H8n0!h!)3w4nRu0Ml}FEv$|4nCEHPWz87 z0tLrJV1HCXykLq534A#2i&Ow)%!YXiPS9Gz&(LxT`)=nU_hMVvW+@-ES z(*8ILj>!IQ{=t6BNiBqt;K%RKRd#43M1ozOpo872y08muyooGe$#;Dgcu&ScTCwKH*}b*?wHzu+;HuPQ1(q+ z8{~%Ta{btjsrwW3MAu8*F?G}zdnO6TzKPp{+|a>W-7&QTxuJD-bGEBNkF4-qpStXu zxaUe%c&G~dCaxv8wY|DyY5{V?Nw@B?-0(WG!j3}<*sg}23eQ(}Oo_+}`DX`MZrBrC zG)dhtbs1UVk}B~mH=GX6->L4HstxAe2C&>P16kqHX(L%~I0O7&R!`P-w+CNuq3)P^ zf*kNqm@Uf+_k(wIZp5;}x!|3H)NkT+V21@?SytEpd_4IP<5J{$zkXb0Sz$J~+Gw@+ zuI!k4(O%6Bl^s(@-zKw6a5C7^V+~_v$5dJL62{KptCsT^TY=vk9LX}l>fjxV)V|hN z&EWbMjo@Dca@m?_hMeS=PgB$Er zbHnxEHl}JXD-QhZOA32_DR|e61jdoz2a8uTUI_L*qjtCEg0ZrgozDczo}(BmJElIq zQhV=y;KTLRtk4%6TV3sLjRS`bYsT`y(crRQ|Lz=gYMa3_EM-?ijVkIL&`NH2YJ|Fn zVGwwx{X6!Ik{eDPre=alZul`ckDV*I;iw1O7%P3PqdCcpmE5rM#F31Z?v{JLy5B&_ z4Ic^->|Ej5b?dV%PstD$930HfmE7>cCUt*;k{brTtH#b1PQO*eo>y|i<1f@+x{?(J zB$l&th1ZR}%UH<@~ zIgwIlBLDsONAAkwanz*hM828BC+_LW`Y$UvbVbe%wxTzH!1r-sW~6{`f(A z-t`sb5B}=JhyCf!UpP}k_u>DTdh@uN-tYatM1%?%GBvBDfeM|y_r339N*PLKLZT!k z&GSe}kwl_MrjQ|$q0Tw?-lrn-R7l7y^OWJGGW^!r`}=wO{r7y_kGrGrXs>-;>so7a zAIyAr$A9%`DU;E_>Wx~C`J2H~i*b|Kd*5Pl#N9lp?B*%bTMc$P-##l{6nmSqe!Cnm znA#|H-%Rn_C)wdUXMalj6om4tqV}n3voRZvB=Tu-H&r#;nEK9M{PQ{OoQf-l59Z5t zCh^85KIg6T{ z60lQ9UryP49KG>Mz&XynxDg?TU`B8PR=DVJMicfRW9akOjO@xKco(2!=fS7Ds>yXZ zw*~1z@0rhJ4K86t7K;0mfHyt)Oa4wzM_u(3@uRR-;t-dDp4ma4_SCOLr#cFmIw#_( z0UyY=jw{jI`7pct(koJ0xdcrQg6H_MXC%34E{aHoK5g7YyaL>je-6w(opz7x^KwRW zpl%G@QctE8u_)>U^d_}lC+TXi(-3<2P1ju}&x`Dl>s6=?s9I9{+8XtPx=yQCHJNW_ zfh16mJ@3YmWk-$CX{c3>TFA&bk3lG}9s1aP&X5SJeyF(<=+DZN#CvEjbVL{SiO|Q1 z*9>j+Q6Kh+)E^;c`@5hs#_*n-aflcV>WI2o!8_OdVzN2(FVivtba>~zWY&)#Oo#;b zHB2oc!<8SIY$@m-fjbFvqnVjDF$q81pHKc8K4#=o;oa(69?2_fVCrXp_TrgKI;PxY zcFjw|bqzUWc-AGxzzZ~d|7>!)zM7fulZ5#mS)|_#1vA4x3FlwQB;B;mFuFmoA18ku ziT!q*$qogrBX%wM)$1^GFA~0=m8sd}j4( z@G?9Th+%Lp(`9WE_P7v3mPThYJ{d_k)+3VC9?oR8Z-BjEt)Zm0(^{rD8}@vWRitA^ z3bS!DXnnf^$?}o0%(SiW{^ETMKCtpU`WqwRh0qo}Zwv^mUTEtx2nS_&F zyot;*Vq}P`1(*L@^BJ9>*zr&7nw4;M`8C0>rQ%E4`#L=gB={6Q_0?u z{TMCK$|RYSNuQXWOuz~7D=)i}d*8Y-9O!172Dy+G#hQ#7Xl3gXoyms`b;c32vXP(1 z6A!kPo_{(C{|+8U7GL^Ahke<42PY4SVUHpp_N4jv}rlJ81%3K6fM;bS97X2CeK%up=SAH_?B9 zf9E)mKe6lST+qrA<@V&K-CEiV^fB`fBgo0VDfBVmz2+lG;Noa{1n6T2{Dza!UxVlq zz#op=k7k&H+5EL7er5~lLSWNbwxka?lkN`s*oHD2GUUhy)DVvBc13Tpo8r_ zWLQu*sZ!X@5a=1WioW$()3_KBQ>iMbC$j zpRenwVBn`YLrD75E7V@##BoE&Hsf0q)#vN@nEmp^gB*JZMTHBX&@?fDHpp$?FYUsUN^a_ORcuDVypK z`j~sW2|3`CNzuUlYN5y0B8^%A{BpAi!F`jdIN$@`Cd6%JB$W?5&fbI!9K4b`1AL;R z33=1QhpGdu+=TtSLk6uZ2(p;Ga}{hjHunfJvSSX+1Ce9 zCxNGi8xg~=y{U7+C3B2O>r`Fp4zK}ZME2j+qMCts8XJ-PJsqhZz=mCn$X30-l1`u< zZTnwW*^alRhU`Q6}zn7Q*PpvW}SB5;73>S~EMu;BtjqG>9ZtOPciWJuoiJSB-z-ElG`M@Jl!tOmBWG$eO- z9gu7Qw$L{uL#FSRd@owW+g|v^rVi2K%HDbNrdL0+wtN@Rtzn+k?mMh;@iu&KatObr z(-F4se=l)CaSXrr%o5hey03J$Q4$}ZQ-b!iIY_sUP2$71?I4K;lcjDbn&0UZ%bD(* zFa5Q|pHK3w&pRF85P6g3r>vjw3_TxK{Hh{!?dt?DRgHTYW5o zAE;>Lu9u(Wwl%Nf9bL}y6E?i#u1#6W@7XX=nG`#K_cEQrpBX<->AZX_-znRizd9#F zd9vd&{si}gJDjms`FvhHzu4KD`*z@r(kVBA?~&Al8j=J#sE9!#Ka9hk zfuq^!-BxlwZt?i%bQ|`r!BlSFv3ML3XvWTtbL2F^XXJJaVxNsQ;97A4o>10@o&Ta6 zcQ-l#8)oUU*BpNmsw4sT9oUs!{Q3deP?vx&J9lDRo>!BP-xKheKWc3M<41`{Z|KKf z)`ohk=aX1l=np^g72VsIPIM=Lu66nYS}`J+B&WuGb}3GGK8_*Lq>^!uSt>saI$L-Shb~nW$vZ(UCmGD4$agvNF`%t! zmlO2JHBG+cRU+;+ouJ6XFu6bIYzeIjRPVP)J{PpLEr;L**?h9x0kpLvixkLYqeR{Y zY&B4U3Sx)KPk_#r)FempTLa{?L0hvfmLt98+VYRUvJg3nvrv~ugSJM-%8|k6cd{SA zxBAJ^)0768KWJ-(pJgcQ-Z@zv@b#-QWPi0>W)FH=|D&L}jovTI0H!v|P(a&OStIag z*y%$$WXMdQ7VS7+hSbKz%6x#wjFX|LjXttHz>&5x)a%kTStD@tK$tI4!OFUUCT7@G zhDsf6WfI_tZIGAmYbf&pzWxsSkZ1RlWdd(|1bMO39c9OW*VMr~eo{;2b>M^x&}Zw{ zRQV2g1*t^8JuX*jf;Kh!R3++7Dk=?tZyo`?rAplCW40f9lC=veUE$og5PJLXh&z2M z^Ps1A{IReM~@S zE4WT7R6BjzpeKLcd~v6bI_PX+e!GM$q$B8TdAr4(J{x^NoAMU3kUF5VmAHfmS;*ti zlV6;%prQ>vCkS-5sbgJ*ETk*wY;T^6JAK$ipmm%Oclx+4gxp-BxYK6^=xpD6cNgZM z?gDMCK}*a+J_l_r$x6&ZN`Uo@?g%BBZCk1US8?-h1i{efnec-I4 zVixiU=xGKI#4Mx>aG`ySkcIpR8k);tZ$W3<0emlFnxL~y1Kvp}L1*g*taxN2XlqwN zH>=quW+Ar#A9WV9kY2!FD>?|8n;mda@@GL?(*S<8Ps~C-1Rcz6{RKg1I}5BQl?j{& zJS|e3FA)Xo9wpA6@&sNNCeD`_2fS~#ID5((xXNpppq2Fl{=IXCz#71d$4nGhm4)22 zPt@6-0B;HZx6`NQt~g)f9Gs6H_%90?x#pLkcd4?FN7-h9RawaYysikm9avh<37idV zw&A$Isw||9@{qvEz_sE3dh%Pxh&r39C;yq*O5u*GC%@+&slck9e7Dm9f^Oym9R6F> z(-s4FtozrKe_+zTIjAR!#Gd@waA#HK6+!<|X=|U}_7Xm48t}YVM}%`#7IK!)dx2Hj z+OXA|1$G6Vc2d;PR65%odvT_ON@r`?oFUv%>1;K2YXny5Y#o}#dGD(J{GvH7!numI zGg}26Or^7>=!pIKDxFQ^hd4VzrL(=2Hw$-ETs<^XV3p3+)cUVi|K0T0!nsOw>t(GJ zSf#V+EbDlxHYJ|#z15OS+3JGKO5=Im#b(@@ti$BP$^>3d*@OFUZ7nx@Um{=JT1UQJ zp8!epB;K=zCjM78^P0_&4cy(#jEf=sN9RPoz9to@HL1ZJJ1?> zC4cbsU2Sdjd*I!M0|1hDc)0K0Pm471wZU%!oNQ@h#wI?32(Mt%O2}* z$p`9_167Rq#gsU{kL2_oXOaZErF+>1Ux-{izrK%W0_PdeKdRb zejKkCHC`H;zlrUY8^L?u?ktTBJHpO&3gPEiXW{whkFgrpgLz-0^C+%j8=I0G&d=Sp zoX>Tg#(pV|<%2GN=g(hXfvDUhKKMMN{Or+_I}LMSn@W?Ek-N`v8y5xgZ;baS`)ir; zahc=!1C2^$NaF(DFG`)yY<#G+=$*ii8#90#kkg_JF^lHatK-<6RezP!ohI{+#|H|Y ztly80yj9J7+;RB_r9#h(`_mYMC9OA=hF>yK2Y=|bRjW`=xmCE{EAWT1WT=eIxL%7hBkp+yH*!jwsyNc{OXeOTzCrj=>2# z1K5v$+d0}P7QgqJ%Wk62b9Xf2@CkiacBk%6?nq%AzI2jdLvrJ}?1AxE?fD4y*hNq7 z$m)1plw`@SSj}=<8sl;B5F>U18p>50C*auo`t0y+dK?YfTI{@D?AQbi&UZ@!evsFl zjXm|6yyRg{X>4b<|IF*8C~`3GG^xqVTAN&o{k@ZYY;2W?qJQ zk`HRpk;_vRt=E8$pGO;)FbdaOP^%Q4Lw&yvQ%nX=Hg{hQN*X*^(FHtN4Za$!P0>}P zfp+Kgu?l7N)lgh~0J9YAs?fXmPx6K)$cLsV(eSGK^0VN{4t~a?zc(+)1HqFe(|B}0 z^^Ck7>c*BU9P&APK<*2k?1AYV>g@uPU!iWi|D2$7{q^!Ds2dL^64aodDE|y~<46;N z(7@&Lw@^2pyQV<-YBS~6p>EultUz_eW8_6pD-Nd==*FYr@`X?<-fe~2FWXq&73#wt zJnVMN){`FsUYsFE$1ZBhouEFPGZ*$hj{G500A~%8qq>(*WR6fD?&}~&k`>ovdw?f2 z$yF!-Jt$%%GD{ycH)OdH4m3mMw z9XSp&BFs)yS^*zA2s?uw?XHvp&)E%i*Za+tGk_20L)LHL+Dc#G>@DzIvyP~Y0R9D@ z?5a;*m8rll!IO>gn^Ktrj8nnKR8p0@fd7IgyW_A`WeKoBJk+H(23D2>Z;pn#Xn~Hf z_h)tlcgKSuLz#3J8(Ic3v)^@L4An6h@R|JVC&O6gt-|Hp*|e?S={>*4!k3A zwNNYe1)km-Ak>OgP!sm%XA8ArC~)S!2?ARIZ@eUWvTvaFa~x+X)QzRUWNROxK8yms zW~L>uGw?C~hfpi(0~b|_Sk9Q-LRNg@WI@47j;o zoS#1hSOFa|gTF#A0dQtP`2RfFEy{&Leb^1oUpy6Ok^O`kWBFw)oWBCL{2|WGXaEi= zGZxM-0sGg8o~#1cs-K$R&z1onS9>kgatDCdJ{M=^7Xs5a#ab~}#Z6+ZsPbg<RVy0g|2kCxJyXMevn1!(Mz(Bf5-t~vb(U};&dXqQDJjug!Oa$-Yp2Pj8e+ZAfyo&!a zxttp>DTjHD%lQEl?r=$MXYr@3#k}={@0`ZGGuY(N9DeE-Exy;LQe2Vk#`l)=<9Gbt zjjfs{@GYxM_`{#FaQQNpuQVLSr|J6Qi&+%!?{3F$3wqAlY(>1Hvo(Ky>q+j((24x4 z1|xpXj4k|vqqF#Xf4cLhKYizy&0fa;4tmVJ+GMHRv?79^bTWrqe|(xUxiXROW^``o^?D`0V?J*)x)atqnx&N2JMj|Z5qQSMOl8LD z9=w*#41A(?jdEn;V|rwFwl)v?uBx@AtCO!NF1$;^4LjYXR)<45r_<5+ znp1{!V)=hu@9vB7&K`%Qt*sqm~=~Gl0*G`6=z-4chAUB;KXvrIgv2&Ms(* zrYa?qowe}+H;unl7+m3Vl7r5bs|3dL)mpxqQ{(;zp3&%e# z^SHE)Z`iAyBJrE`S)4^hIeV{56mE83%WY%x*p*FD_))iH?%4hmc2s6Gru`x~jg$p! zW8WBjae5#}HBjuQ%`te(pQYS_F2h)74VbNAwScn?GGcvJ#NwQ@Gr6T<`s|L2vG{n& zRIbUe2YcTj4(qfzbHA5&Vb8CO!!^ZHj{Z-L)jR`Q-yw>7cKa)G_!)ejg%u2upOZB*8L5I=NSjZ8~)8#7d_Mzd030N<#8z*(ziRQw* zj;h+uoY}gq$o)YAuB1A0^9N-k_P+$|dq<6P___|c_Jlm6RXdr{bq(4&6tuN3-^gk{ z7LAp{?D1b8$&hEOP~a?>@iplUIUDVZMu0Xr>+W-+O!P#D zjl}Yj3(_lu85j3&lWZL+3ONe;%*dOBy+fhTGSJXuSIA;pM^p;>-ti?DNc37;bPTk+ z8N+Lc-9bzA8)_<<5l{MAnWAE-VImylWGz1!9sdcsmfu;DwNW3LYd}s=R!+L5=%F6k z(Bo=zf+X(NL6LpIgW!&mCCysM%MkjR14_t`8J$p_1>}H69w1|0siC`ezytP?M7EU) z84cb?|J?+C|IC!I;Op5Jf-m-(Su+9h3qA!zXT(#c;}q!8J+_S$oM>bmrbD(!dn>70 zRmb$23%*$DW^yLr3Ugp#64vRtiG=Ju$9!7?p4~~vJoe(4zkcA2`mHA~D$g=k0>QT$ zoTnCvr97Wo{t!K!3=zo43Mv5n-Gq*Q__p~#Z$jEBu zVh-f&!dH^R74b|iWDVX2t{^8HLKy^}>6a8g5^%$xsmV{mDdj#y(X^Pc+L?q0t1Th- zedaP@yP%hTnHMP;HjOFT4IXau0zyr8VaoPG4{*|aGV!F8IkX?VX4|>so{xlCcOVJZ zf15=L7uqw^4nZ#U<_yxWU>Kuu7(64T2T9Q%!t6Z)-spLEQh3LJu{j1Av4>Mh{0)7k zxD{XHj; zH_zJX?%&8?+I4rhoMjnOA;+?f{2$k-E&M)XOF@k;q?E4EQWUsWMM_+*NKgNm-{BBCG2cFPA zl#G)NrXK+RN*PM*Nk4ihc%$yxLrL1to^%*+&q7P$7TBGZ0rwhVNd^w=O#cD4zhpr? zzNynv@J7e_S`dkL8+EG6ml=Hr|X(2t7f$ z0q=G)Bg@W}P|?5({xc;{UH4JDfpaQM$H+?y zc~|gH@2{uqfxT{<5cQ2~sTsg~cbkwep(#`t@WUVzvPCM%*2w*TpQ0T-h9VK z?|zWa#)X*%1e)vc;6Ljdw%AVV&@HZd#$J;kHDldBI@&gTL;$t&zD~I07;%>J`;K7G4DxdWF zLQ{Xh8=hIAyh&xSCVM0Cv9E`e2OZkjxAVMk(|~;CwiiS2<<_xy%Drf1#oRIY+a(K} zvuKRcwqZI>weJbLpLLYutrz1`_CMCT@;A?q@W-ogJsatLiFY&$##{W#*azRw@a<#5 zF>=jk|2|ISw|0xd3VJOYknYTXsg1@r*M_i;eY^3&-(s+A^g`Au{wBA*E*6J1Phs2Y z4{&oMfQQ`b!hRorhYWZKI}=ShvL@dY z#29*|ZvOa-l2;uhiw45%%7UM$d2TMrb_Cs{cMIAcw1#+0g7@Fa@6qcg%Zd3y=q0v( zh1St-Bz-09OeuPX#@dZ0I`QCDt$u_~?;Jv2tb=#Y>-W)+*S(2pE_h6<8&FJMN78v0 z%uL9+jq10*S11lZ-+s$2RHjz1SY8Su(w#9+z8SQgZd(;- zOp>#FIcPieQxvGfw2^Wv&~}=-Dv-Qji2NaN;dMFMI=-Jg5wxA$ZLr7Ls;j&g)I#pQ zaunkKOO_A3Y_uGWPHUF+20bT2TaMf|*U3_WEnmry(R8Kk9kA6o*oS!HxXcywoKgE_ zXnXK(*)CwsbQxN=VYBQ#@ccm7@BAuF<^b;^>N901VNJL!9JmI_Q28t`*$Lp#p)zEu zF-6u4`~r3(PMl83`hh0%1$HAkjF5D9(k=ADGyh}L1?MK1U%>_+qp zhWGBYN5XEzC!pf|ta{|EkNvW)O3||`oo?vOHxEnDYw4G6}#odVKRQ>ijS;B5a zOYj8OPfihbBc1?l$FgIfup4n6Xgj@Mi@Onxz!SXtLEMel0dyYoEe^tN#CFhjPHiz0 zX3lE^Ppc7kBie(`!&_+yo?rlIJKuS6H{xl~cG@nByAgGOx1YNyXgg7$?NmE(!p!;i zpyzn4EEPP#mB1PvMZ(PaR?u*6b>1xKJlVk2o5kITw!k@e!Ub*T4rn+RgBJ>%2Amuv z?nY#Qclb#JPp}oVn#4Jlg0`dDjkpI56j-$z@yDuvyAdsWs|z}hYB%D8+y8bW_O*E+ zXg)VUhp7#(5wx8nz-C(I0_)thF0g7h;w*P@2aPFkKp!tb ztI-91f5}DQU!ZT4Z4+m9y#o$)5O+F10A3Fra0Z|eT?5YT(oJ9IuC6ma%X?7dXS~-)_W74gYo{ zE{yuO8*xm+c|r40_1jOayCtw{&b;;II)Ntw8wOnzST&pLwS_pdOXdA7Bf-MCs>eQM zVv4{jzpwfKHy?F)iQ)e|zMJup!X1_0XJgoMQq`A^fHS?s8Kf%yPj9o($FB1GnghjI zqbfGrk@7$9&*9p?`KbTtTL_=2>amYMRx5m_s>lBL-yh}owZ~vRBTIhz1$WlDBZD)E z4L|NlU%pF_9rRvO{ISN9{Qdj=@zotu_$qyErE|Y8?4bs4e)p*fN~6U&EEgHUKS)ne zhSq7LQ}>ei?)~;EUHfKmqYg&$$M@AJM|t(-*V(%Bdb3|BXGeJQsW&u){NR7<6ZvIt z8io9zePI}%F|$y}56&GvhF|s5Lh!1tPx!*oSG;j9^+rj?*>alWp|5)TRb{)@3lzN^ zp2rVPDLb94V3*Yd;p&U~l?U{6v6d^;Kc3l2-&A{C8$TK!-Q%OodFqOft{99hZS0hD zqvm3CqzjHa`IsL^d#M8>dzp zhc#x=?8LGtPGe|1etTj#dvn}e?g!)t+gDkzjvURsg8X1Vi6I*tV9u2fO~ApO_1U(Z zp4@le1f0LCC)+JYoim1+2_3$4V@EH1NiIWv(Cd{Z>ofNXF@2kWdj)r3KUlAhDy-0>|6>9mMETM8Qfw3jI5+IW%_ z2LH#tJV8{u9hsQ|voZfXMB29v$m%S}h($CaOz9AZ?NEET-$nZqe=7?1B;qAW_2`fB zGsUwKsGWY_MDnAT6n16s99LdPIgiQ}dm%sAr}`=y6|h?|lYs8gb{SpknXOn<4fU1J zCFDCINpZUtdc|8Wpq9L)iVK(FS%0P$4Q-vISb80Nw5;=}`zA_Jatkz&#B-=i7c0d+ z@T$zyYtYTmfr>fcRp}O2qoS|cifiCiCEu+=uS(SwT_3{t(7y_;d-Yzf2YpSkE0yS? z?>+fPsAsy~D0Qo`F^>bvkaQ?*@=EFZ4FKYwt0{OxI4GuCZ zs6&qZg=aAq^MeHPgX1;C{9wQ5P^)wl^MiZt!ZQoCRo1|LdB8g5qp zhV%Jn!G|gp^Mj?3AN)RC%nw!{fcl}om>*0lf@l4FF+ccvJIrCO7xROUHp6Vv7%@NS z30~FX;DwcIp|0=%uj*W&m>;ZI1Hbc6iuu7cNznK5NX!qG#=&z(eL&@DxNjW|{z#pe zA8ZY;M1NDn{9t$Rs?6KP{Gc~@RS}tDe(($QH8o$X5%Pm)z^hUkl?(a7qu^Dw=8O5k zThP~(I!VkA4u*Q>XZE^^FYsq=0=l$akhhkB-`y_g?-2sO;FzU~#j;LcH~VG2@N z!K=y#uj=?;Yr(53gc>Geq=Dd7oq-x=!D=x-_#A4OiwZG6XbL>Q{);eoGz@B(Tc5=I zU>(#jojfiHHH;M4q^p=8l&R_&M)azrz>OOJ@`LP2(W~-@8m6{N%nx=4?(j;?51xU# zW&ZFvf-#T1xOT+9{NOJ9FF)Ae^DjTR zY2z)SZc*h2FHGhHR^Es{G)PM`C_Z zsxs35=IGvq^=%rW3n`b5&nc=d{%VI|KhI$`)AF*YxUz z__eCq#>631I9K&D)$JDd?5Jv+np@&5Pz-#0N0U&Ks5tAsnEO-JHVfRJ{jcVscBKof zs%=8I|Lbc?^my~XdM4+4_5V1Jh-BseBrOFJJ=amZgRbT6E z>>;otaECVWYgKm+Eq(9MGrlM1;Fo|m=ICOJ{!6%Y=!gFJ=PGWVRK_I_4aU9qT1Z!{ z?7*kEEWk@k{G_&zhw~qMN$`qJo2C8ld-Apx8aV6CQE6HC7{2azAX|Q}T5A0;kq^?T zBHdr!l3sv*C(5yb>o%%UdSSt6eoV1FAAJ0tR1)%<)9vrW-&=M|I@xs?chD!EmvpI? z)`gX#>pheB#b$e@RU>lQb6q3&#Cd7bw=-X{&fY$Jg5zT8@^5B7JT`+9?~io54KT%+=&jG@$TkTxDfi|H8y$T%ez8xjORYC;+hHeN(#r9_-&l5!#8$8Lj zcbI{CbDS^d?`zGDX^Fw3y%utd>W$f(^JB5u!&%%3Wq)>oEEd1w+_=$8da^fr#^L>H zE?lo2TI^l#IP9@&43{>r1Ka;d9Aw;RZa&Ok82%CV^*kKOjfr@T23f~ry%oc`)l?ID z=^KwbSr6lUFWyF*cf@1b+?;!Q{0hpv7LS+AH0G?P)}W5R;xRcrhU8J%0uKX z%+9Lq$Wa3}q4pNo_2a3|U2V=l)3o84JM0(v{B;d_0`=aQSKrCpqHcWW5afZH~PlKe{YL4bk9L1wJOP{AZv^nXs>L*?m%DKMCz9fL@Vp zcL?V-2K74(_1lM=B;g>9Dk?y43AjpbJB&oRP_t1w7fIDJJ9MHRdWrAW5bf-tXdq}r zR#iM1qG5(qx=r47IpMb&puaz$X8V1X?Dg!AHmE1z7n4tsQ!c$>?*(LeDo>Dp-nyt$ zAMl1I93w7!x*~N0(1Aaekj-5*QMx%~j!qpQ26^ger!C}|w(cXjo7$L(qae$+X*W5= zv@jb{5?)$dNIY!cGLhrK>!~jw-#TivT;`) zvpyB(`%Q@>+POJQYdUE1m!inQQyUnx9`Zy!;bg;~bjB0Bs&9irNJ{V;W+r%5ZeLcC zZhDD~Ie1lxFIJEs|8VAZUJ@Si-H&Xt31Ak3S2e-Jms}pRgt@u{W-F~&LJZ30G5vQz zp6;3#nH=K5OaiZ}#C0L*x!RTS0<98PI4C&8<-%AY_U`2VIKoq}0p zdgIBst6%9~;9HgL982ssyrp%(tLou6hIA@^O6!4FWzdL8w?2)uHh5LD*0bbM!%ey! zc+@0B;@)1QAA@f-z7IprPOhRW!K>==o+33Zm2?JpRfg9kZfE~aaNZZ6=vjefXl||14 ze=54K134bFj(!Dvc)UHiEnP#0fmc-@JA$B$c)AU^xMDal`W8yZf>+h>+m57H_|rdt zO(xk9w}!=ZAox>kp)DzPpG!9ZzyD!F)cQ@MCxJipZnh2SYv)3r1pckCCZTy!x-WQA zuPm*J{{#sg2^?B5jKom(^eteYp2Nu9$YHboevg`sQouJ+RM0bMpJ=W6BJ?C+E)KTSYfe^MHd+4IxF& zH>fONxz7+%=6`|WfP3fc%AL)^KVSu;*hVlG@u!n2S}+!JMnZrqnh#w<|Itj{*l%hk@TF8M!u$Rzo6?|)AvvpdR+x)5ObYWq`<{>_z#YoYkUU8(k)#8+sODm|?3LsI zJL?*fb&cX&EJrn%k#$3yi&YMDv2GjYNRGmtDwvD)eX}?hYxZ3O;yO;8ixqgufLNmx z$vL>AK@14JLY#}$v&?|3(OD%a-tvsyl;g`Mp*X&O{V7(Syox`b)XH}?p2ybO#PYS7 zjB@LlFh&WzJF`O*m9r~Xad)3Z^K+EDmAQ*Fc#TR=K4yQFazME=|I^=?&%5zhxwlgU z%=^scEYp4}+sqUBCA+>O)tsxhmlyEXo74qus=Z+VpY(7tzT48OtiHOPi=7pYzg}ok zrq6JabARFA-a@GiZd%K3`W}ft`5aY#v}|RU@AtxQjuj}!)(yelTH`SBj8mc=W3XL< z1-?-?PH8`92L2q?1GjkfRE7**j03{|W49dt%2!2FEKE8i2&f8PQzI}dx zAGatRugl%e{+W}?ch`=>--oYd^Kvl1{9-gd5){I6Cf)dD-(#@1`9gNl$eWx;J?!nd zH-+^&d4PKZURzo-W?fp=aHD_0ew_V|Y)A)RZWnlM{5val!>kG1J@DF&IGeD(v>mq) zytZm?0DB@_pW6d9jCSYV?EHJ3Im5LHxLHq!eX!y)*#usj+tn^?KkGY$1+Puhpd-e5zMcFV=-oht!V$c-?rW~0%yS17cJf4AeBcWD zRJ2tQ4PKk<_a!tcBuz2oJa}8HFCveQL5fM2px1i%1$1%3Ooiq(*hl>5JUX~ZstCLZ z_0`LBXz7CCiZxIRJ%3SywzU{3Jiu!^&{mE1^wd*4z6TjPvugBpx~5{p1L&OwuPt!- zcez^={8^<+wB7QFoC0mCxSJ9ks=g|3gF5P1B##z#k;}J$*Ovd0L;da@mUjkiYASeb zi@NWW&j)R)MvX%SnH%NVpiSw3*LHTqYWX4X+Gc>)=Gd@OUIIGRmFEg{Q#wz+1+=N^ zTm^c+O7z-tz-y~xN6LpmomK>18=pNy-URFmUYo|Ke)1&Hro6#xb2R8G*ZTl99(Zk& z-9@jB2Ct2YY?k!_J<1)tw&96&vNV-81zy{(38L4g1zub7PSI=Y2VR@rGSO>$vsQ+7 zriotL81UML)~CrFL3esHLx$SI!etS_$G~edA1``si@Lcwc$yHfPp(!guGeopk-szIBw zNfx~}bMV?WPZYhjQqZPSKLrS0+g$M4tQ$qI%>Z<&R~4eyrVcvQiV^?3wu%j+*VY|$ zsufDnYa0PN)t<$o*S5kFv?<%Rvt2=3I0f2Nz|rTzE<$Z!I{McCytd>pBIs1_K#%HL zCwgsxz*cdh*Y*=MsFhwhg4ebYm~>1N`lxMyy-$P*{@Pv8ppwpd3cMCr>&ZW_?a{1% zUR%I^i~o6TAJ_f!+O+$MUfVR#te&Q-30|8C@B`^oYdQ?5aIVs+ zaxFw%OA37YcPHUo#eZNMu}bGr=~RUcmcqG8r}`lIES#&fsX0W{ml$BPhdqQlDh@)6 zg*&Ru-Sd>c|Kn&aQR7nSR0BF(6V6pS)%nq)ex=f;F1ad%a~0cJ?-N+1Q=N_(C49b$ z{jJssexFKf`f-mH&Q%;5o+_NHw5Bd~;=UWz`N%@v;r}$N#kFn1XR7Wzd$dhBSKYbO zI!|DgW@Wra{7luIFCRbr?`u6y@3z1HIRv-NKFHnf6oZ@lhvVB53%K}=TDZ^p2poQQ z6E`#FJgape5_1L_Tz>X$He*8+{t~sC8(){fCb>l8lWSu*=1>4jJ&nfNw^wmfxrwaV zk{Eo%&5tuSuw(Dsjlr{~cyT%|X6(^1vH0DIIUHRxkoDddiyLC6aUBEo*o(hn@zi2h zZv5(QY@S;jPPQJ$S$)=EWAb5_N_WJ`qgzq;M{q73&DqqvL+XR$F;hK)3y?fUPv*qq zmD;F8{bI7#F&^g18`7yj(QMGZKBg0mBFQx|QnwPO*=IFW!)jML)sowg&d8woh# zU?)z!EC&sG4|AOCJ8&i|*Q3{(Fwe90H<`8~4K*8ruN3khnKm^EIgL)lQtvP15DrJb zrogPE+;?Q{L4V}#4Yh=3Gr5%Pg{Fi<-E#H`F}^Shbz2Ml#(N)-kjN=$Zyw~%&fg{N znd8tjsB=c^)scsv8Ds&qO^5VrJtcg4G2DDSK~-CVqn+n-3Kva{mC-`UmO($J1p0x;|*27W7yal#$O{d!W<3 zVCRKlDe=A94c#0F{gYLP$snuFDAWvgRU{oGHl-cVUTc^qGjBgRQTmJVbA)$iw>>1t z^&4}6hM6`Ccafb#-!rvi;r%pq2Wgr5f(dYi9S!HUlMm$&8M!<3VGhhAUi0oSm9vuY zvWzX{33HtZ@Pyeu+Bu}%^8#~sG4!t%ZzOi7l}x)Yyo=4)K+K$F%##(cv!iz=$iLHsW3=pBDcW1?fwAb{yvhi2Ce4IvE^j9*Gi^pJLpmMzT|tn4>NK{5?THnhVQ3w zHrZ)6k|{U{bD56LB=#P*%&ZdV1K>>kiJK)0FP z#FD>Fb#xVIH9hhX$$EI1J_uTknKwfw4y~b6S z3jR2ej^~fjPl0{EjwWf=2kCs!YG$>JBHH!4X;;u{G}}j#s)_=-1$eObNHVh_m(B&P z#>vu=EV0j~?LeRDJjH?JD>LXCV7q90;*g$7dw@RUb94mR)}BZ=0?&RuoQ$6mL3@He zQ#ounIq@riZUAlW47}^q@fzxR_&}Wuvc;IDAQnycsE(Bh_z>-8DE&4g|^A-!@ zq|uQc0y>OWmIaxs_J{HXJ~Ir?J-<6^4ds#6EcC2h} zq^1C$zc_@1xZI+Wfu}?dA)50pQ73_)TMZ$uC#tAt!2VCnNb77F)dTdFbKA{G^q6uA z0XNJrBekJNDL>%#J>6qraQ$i%a#%fqN&~i=4)dCP!l=E#zNRK* zu+a*N2loD9OwLNZsr$gat{9W+XXaAhf&KRw6T_%!ln!Vkvtx`&Xr>Eg4t#04F|m3s zrC8u{8)LF5S3=DM?$p(oXs6p#D}YbFG9u|!!>AFS&3~lNGaHN9~`DoaMdIvnIzY%e6?Lf5y4^}fG zYreKix`Mv(;*}xMUEU(;51eHBK22X?Td_7O>wT1Hw;TF1ZKH6dI8D zG%v|x;N;B)?YlEC5 zzkqiyF(CcBjgWM>0XvE28<5X|R+7%ZA3O|*7H=x)4y--NfP5$&Ea?FpJJx`7FX$)f z18hqhkO%6$B>jPhIU10@^SVn01Fy6(AP3ttCC0#?%?(KSO?Al-;FCrMB<^La(@@|O z0}M#7@Xt=xz;AoQ-^u7#PQ!uc>l%=(%tuZRz#Y39kiybCPNRSyb%Z-w*PSG)`+o+V)6 z=Zr364u6LKXF5lfdot76`%RI!t*B6$YTv>(toO#BpJpq2*BIlx70x*SQn)gcMYxln zH9qEzltp*ka6n^UY%r{w@^0$_+*_)ST}{=MKWF-31J?&^r<+au;$uNrX@E` zGNOn|%Sa_k$vNk`?^8y0Mo1D-R$8PzC>o-yj6}&OWK*4S-S^Q(LkWo_WMpN0l$GE6 zzV632zyF?(>v4C==ka-*^E~hIx>ixOZ=NudGsEcGym^%Asw>Q>dEvB8pUG6inj~iS zlW_Xonu%1OzZ;oDkR`Qnt_2mFn`whADTkf?sKOB)cphX)?HbaHn*8`N&VVeb#3^c&u)Yv?LY7qiZzYO3m5Wyl zf?T6jKhekb!#Hj%%pm1_MYrSP@zAM|3v~4ZYBlo5$6dhdyx*W{iO%@odZ>3vU!b!! zBAg68xXNu!Xmx`ruG|4Vvg?o0cy%4@yBB7^o$Ar+ICXsbDAX~g-$wy)U*#uHLCq?) z7A>}ZBu~kOSz`0MXhHr>`L1hFtLa{aN{e&l`H&@5KCA-OYNg4|S=ixSa~rjJC(4zI zA)l(L9C_$%kxwg!-TBxuv@6Y3KBNM6v}cyW-M&-gsnw8$KBffqI6pzo)WW$*F_K*} zk!Qd@+N%jg=;Cf|xd>`m@0J!Kfr=4t|D zNl8*`WJyrVk{)G|)Su6i+SH##vPM2jY9eGw*~s`Tscw1_=8z?|xt-6FdI?!li5&?fOR8fj%vn)s2^>qoFA?LHCD$YZO&viaa%HR~tjt=Fsr1X!$zW)tA zODg{$+=-mRXGt|dmekjJK1(Vg33lp3`7EjIIG6=$|Cc3Y^w^4INf|^zZ7qS%l3E`I zbp~@jOG+hJg6_rhSyHW=Va~jvqbp0Qdj6DMOgKicn%mmedcZWer4p zmXs3ATuI#dEGcW4xeDL;FH1@`htHDIfSIfIsb1gSl3Es*B~`nV&yqS0b5<3_e3n!{;6duw$lQ1`)Us^# zPm;Ou!N3|$|FWcPmG~?vN2p~{N#Uff^#STvW0UzTsWjm4tDVTql@oA5ZxNZZ>IEG8 z{$G}qWCWijwGV1mZh!ib`jtCyX6nBzDP5IMq<+O^Nexuz=f=4#sdr^1WVVXSl4?Ab zPdF8LcE23LLBKNyrIVT!mnC&MGm)?ZaA#cvVKZQncr~dlQF9%-d#Mii%0zWtAXUG=;7u`}N&v5wwigEmWI5%fy8PkKDbG59e zMSNxySIb&u$j^s!^{b%rN>b0^>Q~?NPZ8$oS0lz{5$5VwL+`C6%+;@6$43(8YF4&$ z#}ejhR^x8-^(d}pHLK_~srhiMlom&rt6$wZ_os`?CnOW*>Q_JS^(C*v@wFjMWImj$ zWldbozb03|N>1Uk);V53>l^u5u9o#>t40^Qi}`vNSIb&%&F8~&^{a!9{NKrO+v7)F zwXA{2iu_)#9yRdC-0}abS=}o!=sJf`Bl#Dk3nS@>9dPG*!RD_ zFkYS)=*7QW*tw5-uu_9Fv}w>hw&2hp_QCukw2||4R=j#R8*3gdj&Y)ed9d{W-)oPhHA>^XS1UOFGyntM#mj z=pK{uX0)PtLNIIJYX|f6xszhTlxTL`$27br(ND3tF_Qhu}eY&rY!tzuw zb7@To?C&`%{ERDb2Dru420KN$W1gt=6MVOyuB*88x&w_H3j1uII@zKfGpUHrVf3-0 z64rD1R_b|eFfAOE#5Q^-QQixK=>LYbFc$|$P~C=y(5E7M(c5z@sJxjG^p73ow87dD zC<(q>UfnoS>=NCd5&6SCIv>`FN0iGLLsMURfFxCXv09hy<2sX0I&wqYbZHSA_oELz z&bU_G@HCX&FL$SWUcV84SR27={2s$BxYjNX@pfT*GwN*p)IZ`e8iUyE`g!cozdyv! z_iSNK#fPv}7e9%a)n`%Q@M!kUuWIohi>p+~Uq99@@}fASp*KBn<6`#Ynq={QdrP`J z4ZdEk^AMxM(`dCMLw4#iGjaEEi|GAQ4fd<~clz$174*|r?aYwDcWL>(wRAtrN3ipm zOW(Eip(U{jrZPQ_PQUL@+a0~YXhh7U=Q?brtzt8nU=1x={56pNT5*7xdHxw?U=c*G z2;Ieard^=snFiBFD|awI7w@N}?ZLEWbQGf+5J?@*2%!sm2QrQQhQ9VJ=F9GEwldRG@le=C^Hyz0@9(jOB} z_tT!n)Vuef28D#v|5eh=!7qPNFbn5TCNXwjKBESu2zsAr0y8=7CEAZ7=<52hjQQ&Z zq!ScDcb+$8zIE21v*#k{$Qve%@5EbZ-{T1S&zIrM^g0C^)Dz~}Rt;lP@(Yl!btLVq z0(XSJzl<7OBk7b{P3EQdS(F?dN!L~NW%k-;A$%ed?gH+`Sj{+!Qg1@9*|7)Xopk_B zZi=LhZmKZf>16cbXC&RZQVFgZO+XTG@2puraVi~yZkt0rQ}-L*DF{X4$h5z!ft$2Fl2 zzgtM7Naz=LPp!uE>q)3t4tt&Yckr{-)+qKi{Qq82ioLH}pbfBt&~&^Ir#v5pvS5!u z^8kZqt}{XtU=DxHc`3fCriV;_!adh7^6=3|gV8QksEr7(;mx(0Xmwxs4u16#9^0;g z@&`i(wPP;6?9dbKF@RcAM-KMCp^CnahMn%x)A-gLCG=(-%ynGM!kJnfqAhl?3x6d8 z&wubqlu5())~a+|{P?xVcN*-ZE2rVXCeK7KW&yAI}Fh9qIOF;C?019Lbp6R>^Z zWl=`}WVRQ^VV#C^qUk{}A9Zazwlz5|S{(-a+BahG{Nov-*-?;(U%nM*IHrlZ$3VUJ zQ6$#XPZjOk0pGjDVc6YZkLYUx)Hh0lu+N+%k@+s}{_D+H^<qQi%x>Hl=s;vwnlL_^b{ezm|8XP;gnicE*PS(XR3 zw_hSEJP!2-jTP9oual@X6KVx}+;Bgkqo^YbzK@%`;-+)7==~{}fqA+Fe_3ZIDnA1? z((Fa}&ie79xTXd-Gj5BcF+op9=JJ<+NQkadtY2b=vJ zEULce55>0BWj3ZcM`$ZIwlRppJUo zWGYTh{3)COb=0VnlX0HkrWqtzsIhdQbYMBP*$dmwa% zI_gq03cfp532CUKHhmD`x~x*60n}0bseGmahcAflo~yi4*)9 z1ry+NY}>~Xc)#*}!Fu2$uorIBRv}0SzB^|GUSv=rs08k&JOYc)W5I7=Er|)1Z_X2# zLS6LJCKLQ}`z3)h@Fq(W{I?-T5Ct6f(HQsj%MzRc9(dUpcN3=zDuDlNHpWMt4+=g5 zTMCTv$P;@6T2S*$RW`=jdP#zbz}l5Y_*wl9!4lw%BamZXxK$7gtiR3(XB7ksQh_7w zjBwyWU%^%23%#K3YVRee0#18sh)v_&1aE;ST!%X%&7B1*P`6y4WQg^3XA3$T!s$b? z6RF7$JlXS*yQpt$K)o>fzUoiLai%(z3Nyz(jgj<;A1c&UxeU+v8%Zy`@D~+TpTWy?A!l!C2TI7^k2lyrJ)z+< z3V#xV`^|#hmd<;m|8On7y&ST7{=PyN7SF*$e4}W!;OEFP*cKl|t8Ke{Cd>;d2bZH+20n7{TQKJ{ zvJ5>9T_`t!c_H6#B`CFzSe^hqIG-oQ=tqsE{OCQ%LVQw$euWsw*TKBdysw2wDN9rS z6>2Ph^$L;h2Q~Q=m=`i!b`w3k_)WF~dUl3q6-Y0tNj4Mag%Z0fkj}^oSx?wy>$ZtS z;hYGsi5qH{7$m={{-%b>>8qcTsJ7qa<-k-c8B>@d_=s!}nksoo~L0`o%4 zCSvr+$VYYs`heQaawI?EB1?lB%Zz=nr(Zu+<_C3^c{Anc*VPHK@laRUqb`Sj{Rr7} z;Ft>7$1l;AZGR6t{;4u#dcCJ?Fw6_3td^m=J-?*Kf$!MJ(2w#K>5z}`@9Hf>wohxM z3BY$-q)6iiEByrARwzY%hFy}*hR@BxC#5L*ZHDv&@ZTL$oU|wi5o+QcI7m}ZPDESI}S_=LB zzr_*_nCH0&^Fm1Fx?}|KR+ty^ntn4RVaiYWn`1=9)U4CI? zUT8AR3yp2@B)j?jVP0tF{dtmPc*Y6lg}$~^WL~Ias|2|_^YcPVk?^-U@$*8fU|uM~ zbAUt!&kqcO-hG)W+0E~}88W^1d?CB}b6{Smdtf8k%`by_p}_6@yihndFO*nN@C<%- zCDd3MDhf{Jc;v;QEdHZvJMdtE?^K=Y`%tE#>>?3#7)f0eDHmaZ+Pxhgynd@E$TR zv(~dNDU+t_{c=Qu5t)i<7PfNPX>OY;CI>LfJ2=# z$oW>__`b1(!+^~kw-F8m?$G#`*FFBI6FJ`i=YhJyt{RJKw=slQ!ugK+e>Ik8at(6s z3g^!6`P{|Dz=C(*NKJs-Yb!~-MR-2&zK8t28&_|+e&z%@=l1k>2fifC?dg~NIYXGM zw@AOI5$5VGB1r;auHG{AHa{1{?dczB`d+q*7dWu&4+dI$@BqTuk$*;lQ8%1Y6z5dJ@b1>x30gf``;T~ z&!_y1>w2bk{J%Q{A6Vp)|5n`JpkBb=W5~Ux)O#R#p8UQydowpWg;0iZy-BscCKz^qhlN6jDJAHRQ~CddtcaiinKC^pPoZ>0=HFiVMni zwA;_|^!F)C6rs9v=nF9lvD3_y~nBS9N2F%Qo8soB%nV%j(>kJx6 zjoM(xFdrl6LA~{gYMJ5akg{6m{+RqDsY`ocXjm-W@hL zb_-Ts1bIYj-=g~kOYx>PQS@r4wVV{$8=fFXp)Q`90{8!Z zu1D|A_r~lI$O3wFALVubA^)BQSwq_Qke9(zxz>4b=8U^2d045Oz6$$#K2@ml(q;MH z0+^)_u0RV89Fvb`z*P!vqmaa1a-E_m*e$w+hUbRK!^&V*t+))GN?9Raeg`}!t`x;S za+JTXf;&w-O3?dWc5;(iaG}L;r}ME<@`3lG=pCzy5H(##j-eis7F&n{|LZLu1O36a z{F`XL?61rn`h&0kDA4xQx3ZN_;f~;i3S{ekUp4{ygG>R7nqL&ko`T1I9mApswX3pK zP)pf(mO(Gmvt&i!vHI2w8WMj%)*alnPZ>r}&d1Blz+D%60@nx2CW5<~^@97IJyyxg zz+La=%h83>xw2m1t_L^DQNvS_>^^YQC^;&OHJ2rWyXwA`pv?o}Bimkb5=x&ZGpiu00j zz^SJp+xbvo>tOx$N7kVfLev(k&ox7m#;NmJt0Nx)D z_qPT)N>YJ)#lm~?Fk8t9;8)NeRNgRBk_)UC4)fc;2TSsRbAn-pyrh?e1&$7c-p%7b z1?9lU0$>*U)a!z3;GfVRypVsd-~sS{=npEPn+1))DU+~x!En`R~!xnJY2b**Y)L=GvAGm98^}ggz=OS>|(W{looz7~&*B*T!nGEos z135l_MDoL>;I5`uO31AH7~qz^H%NZ?8E{woTc?S;S^#I&9U|_^g0H3x+ez+pb_I6+ z9ZC9wo#3dg{%eTGo&(N)HlOqd-GLSNV9gc&wjscx!Ip&U!D9!T@tF+Af&0b}ApODh zz`MNE2u}jO6ZMt&ss{Ir$rHjaz%wi6-X*?@fv=?TnGET`1MT=sh6v#3p?rUEC2(>6 zF5<3^z`s86`Qetp{z=~Cd>C+W`fTE;J%C@SP9gjse8yFb5D|U}th07B;W}XdO?<{w zDe(0KK37T#oHm)ymAVA%6T;s$a|(FKB|bm=C~&ZpAT2M;?R?+R9r%eV>T=gF zD|x@=-1R@5?&RDVcz$CY@h)!G{hgf8WS9%AHImO*;M{e4@oVx7H|ySsatL$o>bzzn zVa{FCN|Fe3c~eP6{Jk@ryLw(bOU^l8-8<5ZFxM;Wccot!XIt$j4#T%KAhS&nB;Jw{%W zC-+@kAz(As9=THG@~G8U583Q?kuv!UC z%-0>$;C{SStl{D|#%H^T4(sO5F8I>P9Bms(mppN0QH3h2x~QF6HQ$weeOZldTak@U z+PSke<2xC#y$-AP(2JcN+RU^c%wp}M{n)n+*O}CDU)d{nLfCM-047YLr*QZZ#h%TO z;H9=A1(w_H9s1$)3mJ1%v2S+t({r z#agqAV{K{q>y-+fc>`HX_xbel=J|>%J6af}2cC384N^Q@p2MJ`0D8i(k&0zjUX0VW zP}<~MZ^bfG4aO-sk{=dR|S#B~##T&Z^#wg;QQ)k59)^hr^!-c4 z{#ee=@0>6G8m>nVuA9MzW={}z4zZzMwM}3zN%h3FM;z&evkh4L3%$fn_ZHDNi~6v~ zrJw0{5i9B0I^P-h+A8|=sCD#;vWJXU>sk7cj}P4($TAvxx6_Ay`qSZ+xr`#+kuF%a znSS{CID=a>>FH`)Xr;vmnBM7)RD>XiK0Is}b0+3IbzwpRruUyE?d8+x^ z1Z^!D&Yak&KofdL!hM3nnCL|XXq`b6LF*zvwh z)zcGb@kzL2v8)%P_Fo#(EP|}{VLh1r^ADgi&me#Gpb8WCWjC_>9ZC1LQ)1@ck4GQ1 zqG-{dAK1QQ8)~(HT5HW$Ty`Y{&6xsj@b&|?Z}maeOCdYU;SC;oa5XB}2z!o?p5y74 zm!kimXNN8{Vh@{nNO=$3)grCOUkx0QawhoLk9*izlSVd|z{lLGvCIBRCKh*upOg>1ns53OQwPZJ}g08iT)F2!?;bGJZJ<%`d*$M9E;M=Dv4ft=?hH%^d=j-o&+g8-bgUKjTBMi;bI8w*;NvAt zBC9#ja~XRG-=AMEnh!lYqx}c4d{~XhXenfmYwW{gjBkt1y2D)h@f0lcEE2Us&u;1D z-FQNiT=aGw%=Z7@i4X0`6P<&eozATUye9av$Z`|(-E!h^=H7FnNa)#hPuq^IpPmw> zLeFl*u^4>JHA55;1$oq0w&H2s(?r(Lvr9W4iOZfI5Mk)q1r7?s$uCkwx`}X)ZF&&a z&`c67+y%WD`^{K)L!8JHdUh@<{+N2ZO*9XBcB1Bu__9{GNIMnolWkg$%aj5{1<MT#@Pt==W`M!yb>P zi3Xg6`=qxQ`JnI0wCq zmGfcG-B|SDJpA5uPLPSAC)xr%yNj`Nu*Z$TqE_hHSznojNB=iKG#7ey-fc6m$A&(l z6VS6eC7zBS5AGpqfu0?8Vj6a7?f3Ho$(ODE#p9w&v$ z(5E}>Zi`jN9ur;!ZrNyqjcpGJ7eb%TeftC)9kN&02Aq4!8V~xCB#eiiT}Y)BjyVx0 z90Gkh-_G&aZ^t%a7VzYWSjYlAu|_x?dUHQCEOF7Z z<-+~I9;?UVJ4IXeOb%~KM4cOtODKbmI1HS8;$Slbr<%69vsRWg8cIXi7 z1U~R}BzCU+C@2LkJTww#GA)9?z&`Xy*ePff*g_93uyq7Jon9yK2EKL}vetK32#y2y zojC%pE-4mN1ABFv;CFMdpc6R#h6z4BG*4g#eYeAYu{o^aLQ93!8PD$bt62#+EY*sy!DA8Rv+ai zXayd7)ev_pTPRS4o?URFA%0yjOP~ilXO$s7_H(je0&u1X?x&6u31$JW8e)i(U2Oy& zz}x>bzr@?}{)K90$%hV1Uu$VS+2bw}K3C`xY%h5pX|O z1Kh~=6F3R|Sjs++seihJ4p;MLFaN&HoVvAw{^YiXRd;S;oD?hQ@GTxJv*QcXvS$gc zdf1J<`KlXxWg*OzJG!tpzpJxhaUPZ2Q0ot=`^Nii*(6uYiDu*wrh(!P^?72Exd z*eg$_(r@ioDKrF1?2LWO>F=)d6nhU~=4qu5E$=2!aUx-)44rfyY)7kLKXX4Ix zIZVL00Jdn!Lvh4|G5AMmG`l-oF23tMn|f3q#_BmA6}xXKrnax$$UdnF61!Ea(Gtp) zRc><>TZ)b7#j4ZTH7Cc4qYCY4YwPiB@@gG%?)sT@j7*okKcR>C#g`@Yn24UN|LS*i zZm(6ed`TNKe@i*t({4STV|jvyb!ura{h&RTc}}HJ5IjRS4~t+n`UO&J z*%11J@+M}K&OEAUawt9BWj*uU%8JU9h0+%+J(#H*M^WcShtcDrmomn&deq)sVe~D_ z1?)e#>~M@Cc3{Aa(BYE?L$ongn^QT>F* z_Kl#I4zOkn?=>ThnGtkjz6En#@CfB@i=ek18qKW#RgE^?h@h2ojhX5GW#~vt1byh6 zKC`Pgi`HvK(!YI&GMzp0k)9}$KCYw99G-CrwXK4l_?H39yM}C}4Sn+^9U6@IdM3J= z6G`_l?ZupXa0Ka>N78*`yEEa`e&pH`Nmr?=Fj1|$&`~AmH81^(sropiHWX%%zI5Of zYTJ-(Jk)<`zTmmff>5I)+&TE|Jrzspv4&8y{NT!{em^UjZTYOSV51iRQwN z5_1s84t*$^>kRMnBM;!2pQ=Tgu8^^FYA^1ubW5~*1-#eUrQr3m3PnYpFgww_3pZ5B zMEUDs&g$4sT#$G}n89Mr#LJtofN@kg0yI6 z41N)KT%;Ebuj8>5H;g(WssQgg+dmRJsvi(J#lehFR486JFh!J;2(y;GgYd!`J4N-o zz*TN+!XL7Ch+cqq=|}iscZ+SJTl?TMeZ@vxv?^4T0Ny29wH`0n?k5^?7_Cm;wLZ7hR^5ibyQ z7Y&7-)5hh~@IIq%qB-DQrFW-bvycwqCh#uBg2{MPuTR26@UDq3>~U3li|_z=SH?Cm z?m&&g1K?c&7BpU2Unh(Q@3MG>a9&Y`FaW%3!Fdth+*vGi0`KyU5aRS$EHnYv>b6vX zuP(?FwgKmeC*cOKOE94aJ6~3I_$`wo^a1Y*g?k>3I%f%ov+)0tjV-n_PZ!<>zB<(g zUq%OoKHyqs-6!Cr#67}Z;96_8TI0igl7yMS`_5Tm!;&3BOK`2mC*$#k%Ugv7!0p=O zaavliPz0`(>M{;peefu*pq$1~}hwERN827HWZCojzrO zmAlUtZUrvvVS(!%rwChs@B5o$+j}CRV<|k-WQNVo*a%Mpe_v>Z|K1!c{0n@zatwYo zbhL00_|^Q`V=$H(3Uh$JSDWH{2ZjmTffu@%;&ZuL!pY!Qf|k+v_n&^kUBIzHqw$5< zUcy@7&fcT(0S7gq7I@V5)1$E21SR2O;Li@Dz}dbF4ge2(ITCN1{y|U;+?+5H2ROVG zsDnG{jUS1d4?Pypz!#r@cRAb>1Of*pjllbacLZmE=b;h!eoT?zA@GPVCRkNdF6a)v zRD0G0qyMf8tboOyCOD)2MZt1lXG0Tw(JxyN58U?581KkIBL&I8 zp%)FX&1M6^3E-?01FXJqsNier7W&GrJ=C0KliAM4!E}fARw}1t44XSQl-_!59p!ZP z3uCb~jIR2*h%)`gFh7Qc({>XasZ~!7GA)m;Lj+6*G zf*wWX35Cqwml1S*-{Dl^yAh0@StKoM9!xpd3}8k>rm0Qj0LoxeH)dp7B)#%pZ)#id zOMI>*k{(*wo%&vV8^3^j@-i1?YV_r6xV9I(|KItI#@S`y*(0Oq4R`)Sm-_F9U{!;V8s0LGdDiTv`M9(xJtu@sg?hY8}h~#}pyuQN!e3&_4rWXs`c!nLhNwKCf3G-=7a8K<3+9fW$t1_uV+UwTmX1ZKL_?qj%*E>Wfiy)c~sj4nP8lMRAi zSe+I|yGD7*`amyiOQ9TP&6_X#06Z^9j&@nlG8y#33dhM&#)+}AAn1in`Yc1=Vus5M zq5m~LUxs>I9w5WO<6>k;rl}^I1^us*`7-o#$X974@U9Uubf?!-=@jUHje>mggqqvZ z%fOTCrDzBxkq(4fN=hDNl}|V;^#LwFBt<@nX;K#We7F>8n(mhNfLUm~tu*U<~m#O+e^2t^2K<~-&rQ|uBpHx6yeeGQdmrrh*4|hyB z^ZDf4F2au6vkMXn=nWk?1DV^!$0bmwg?v1y^Y`8>Sqxly7dS-)PBs?)9M;W>}^}^2vvWK)#JH zpHKcK5bkqvQj(OxGk>5Lmau})Ctv6X{e{l^1^40nCG^6EZRhjJ&p|J&QjO0iKMB1s zacfq=Yj~y%dSQ(gd_K7r%yj9G@f7g%;b7xrt2#7!t(6-eDY_||EjyILV95a!26Q;d~$zR z*zNlGnDoM`q5pNY|83F>69H#?@%iNW(EnQ2noVZ9M8LvkKA*f|3G`_6_5F) zeDa>a&9Q4qFYG$>yk`7bM0#QCfS=onN&m|bxFnR%CvS${R?kCxFYFBP{WF6||H~g( zG?ULKr+~|yevtmx0N^R#UJ`x{y{egiYe_HcCa^_`obYkrNu9Zbw*q@+^0`l|feTLW zAw92|z=jW_2#*I29Li@v=>p%TmXJP|I&hU_8sYEIkNCb&K)40i@DHB>^#C}~Pm7$F z18esGmrwo~wUeF{mrtH}h@a^?4NUjAN6xuk*!&T<33I)$y7V)Ixn7w4oC}1xUf9jE zd?tAW@Vk?I?o$vj`#qdI!}Y>`2f7pH^2z%+@O`c|z(&$_q_@T8lh;LzCA=IM7me%c zg>4Mr`&>)l{8jUF(tqK0<>+Vq$TQp=*WO~jZ^iY(oFz@<8Lk)R>sL>h>xEgKcubhP zZzbX0Ny1$Js}S>fP?LdeGE&Jo*9#l?YZ_s$|D`u_RTrBWq>_FR*YmoX;!4gr_DVME z>VK(TnnBLF{@2*{8D0Iabw_l`IoJPsv6#;-=lWk!Ms?&hxjxtY%zyW-tonYFye8N4 zGTr%=Ji~ED@d(0P&+F3gFI}vAbT?tH=k@0|-@oISz4wIt4O~CVyp*3k<5=-N{?h;Y zUoV%BB!3&%+v@Yo*ZP0w*A^The*<^^FrJ?o;JJZ>3U{bcayHyci*~Y9QW_#ewXTu$z87*@4$AwPO`FQ z*Xt<%_iz5H_~d}D*GWA|cl8;M(wnVX63pqd!x8&3CyafOG?cc{p3NHcZ)J;Jeo+T{ ztYCZGF;@twGnB32CN?c$y<(R^IdUzHVs({L6@G9%j(&VN8x)YI_^6}AHlA9}9y;_; z5#BI^E!?cfmVWt9k((XDeu&@9aQUKzm&4gS9U-{~r+SMsYf#gdWQ|Vg)1N(+xsV>- z_nU%+`v*5W2h+^~4;AymRZ(6ecp)QG3{E^qxnByTb7!1WOgOGgA2f5Lzg;<`7&dea zy>}i>_h|`KOpBXB8}~J#fBb>|;Iu`w;IIb0#;lKG$5Rj3iD;vSSO3Ra?b|?m_N$~G zohxH?JN)Tck8`Q_vo5eMcLHf#n@U}hZercn2GiwxVkw_jh#jXCN}sOwp?>UDW=)5O z(KQyXl%vNj<{0b(Qn52BlR=q`UP?IJgNCTnzFQeZKiK*EU_~9ZS;25Uso_4Rl;W9~ z@u-QQ+rJu6n)zl-+0aP({XQLPyQ>znU@6ozerr;(W@?NZ^ewALX;8m1-r*xMc;;sh zYU`)Fc*^rgdbOtt)o+*td#gmz{m*owz1>gYcf(<($gdr>EZB=9?O>Lv_h)oku@&df z0YCA0hwKbJ@z9mvNN%rS?qVi3@sFZ+zi3AKDiiSXD7ZVXz7ZK@8{yWSuv0d%0lEDi zfLl}HPLtmc&hAMktKjat^r*&P8VzhFkfQw0 z%cK(EF(aku)syMcPrxq+!o7ac6Q#q!53NKEYAXIg?auHu)ja!fMhh$P2=y|=>dyoI?W2Y6cqJU>%UauxVJcxDssCy@i6-2$J#hANU0 z;0tgMjurE%paS?Sc&7QIhJrfaEk59oW6KK~fGuHn!24Vt*&Wb@-2u~EX9`}yxh?Dt zO!Gcm@D4Z(JhO6AQb8MV3wY*T{iuR(z?;D{mk(M;Jkto~ui~#PEcgZIAHXxyM>-UA z0^bAAjEo#db_Z&~Gxci?iD$k7&(t_Qu%J7pt$^6x8@W~e+Qpn6zH1N3fF=Xb- z0C@FgAL5y}z$Z&jFC(5A25h)-8sYK4+hw-IIX{6nem*vW>!P_P#ANSoO8Pa&yQaw90$D4Af0eDuu>zx zI}i#SA>ny5aFb0SdBzub?3M9^*8>}+I}=y*0(Ku@N|@Un@I<_4x&i+@#Al5z1+KOK ze_5mXPl*?C&bj$Gf6mQcSp{Ko&gC;WnDSYpoO5pWlQ6d<@K*0V@fnVLTO<+Y zoU?OYH}VX}8+KhL=bUqXv#%%2Ip+uOG2|JJRj8tXqxSX) zWNk;ODS9Rhqq2KMve&AnDjt4!!}~I$*?k7v6&{Jln4ANfSwZG$MUs^k8`NVSTcTE~ z&>QQ_CJXzq=|f&9W-wvw`Au^fi=jUihHhbORM8^hS5xpjw%B?Q@hd@cZ}#4?#c)T( zXGJp(X0*IQ=(@Bz#gy(8@`pNd)?lf^_Fy_yFWXG3*_~AwJyWHx-gTuXECW)W?9st^6^T~Ec2P0;hI{7A(YerG!&U%^PPf@;{T zU^_+x(29ohR9WB!cFLPTdc0OD)vL~r%?b~uzqZFvw-$+56OB+BecwpUDpX=$L9gmX z*itH~vW&Ud5k|LupFw$UKh6{#2&V)55oKW;&CDAFchkgMQ6K7;GkYQ;=*j`6RMcmh z*;yAsho3T_YKq4&A$pPYf3tL`HMxVBBg=rXCZ!vv%FNjlNvpT@p=NJw#r8Oo4!zZb zI{&d6Uwjcs@3d2)8YULtELHeya_K}JqLa7-X2g1#wIlb;J=k+n6rEnxh8&Hy;^?_> zC!pCobX9#dE(gC_Y5oe;j+%j4f4H-+pc&qmtnn-Gs|!~e(Yki1lP1A?yH*2=a~gmb z9)#Xd;{!B!Q#bq#{AzsXJyi7lmE0HnYL{;fTJWn<{u=x$e?&FP%*&T=1;5hNtwbB^ zPs*LaukOsegSHv$lZS&}Rh_?u5*EbBdqW-X!lZI!6u3^V4RySfPo-#xlapKlex+Pk zf?VB@T&o6V<1ZGY&A-j%x=_b^a+Z9fSH@%$7NU zU-ffkkm{HtvUKpPI}UzzW|s`P?CT-3 z1gBcGOoseUwo9)APai8o1FfD*Ex@CU)MV&udX@Aj@UA8)+J0Rw{R?b|rAT{4u5=lA zRO2xz+V68rdI@;aHYxg8nIioS+=s zQZ#MEbm?c{3E)@#AJ|F_!Hf1OL#?mdDCu0_RbOEaHhzdS2sow%GN|YGmU8{U2leoN z8`UYnz>~qR0{z}do&aAignGrYI!OnxI{4Lz_M4Ic;1agrSKo$Sk(dIH0>5g$dqP41 z-^qk|*UJ5p1;7KrubRHaNj!nu_QULPbdV$v*ctrl`794fEU*pumFm$slD)tQ;8*o6 zLgH5r;8z#UnGwHo1HY2*)0JFT$;c;#bY!S3kY&iC^6UzglqFlK52__?6pB-meUbZ(sdnq}e&qseGDb%H>aGjy5_+B^e&r1Oa}@7a z&%vYGi;{_7g#m|E@qVQXe6#;X;#Z~MQ4v~8iBkmu=icD`$^w`gHj((%d+?>qF~-EH zE(4b_+Jr-anK`|QUpWGYmHj3jr2~BUb_?N;;6FJ=_X(E+tKGgyoa!{Nv&SXEJAlXT zJ5D@m9dPiXRKjzC2X^Q08MFnSyxfnR8vq9sEF&J(2Y5#LEW$tFbI{g)65%(%my^a5 zt_QXmFr4r$;Ful*h*Qad%jT*Oz5+biqlq|AHn8`MD#FKrm2^r89{_H>eu;1raLd3v z!aIPo>3G7Czymb-JCuWfKicgk=Ug36I>do6SH}ypav>hI7C5cMfiPFc3$dF?n44*T z;mv1WxdJ;D@pld`26j2hXI?o2AMeKBgUmUV`2v1_liSCuDT22U>S| zRBgT+d7ksDTd&V_o&Q=;p(N2mWm`+G#O=O4}%ZuqTuLbNm=(x_2{M z+q9WFo3)dw^b2AOT&J6}|RibbVrFbCpFU#dt|%$R0QySO1*su`fT`gtn-ez6g4yj`GZ9JQGK<~*NPQfr#9lUs`>Ab~Qh8=&jQ_7NT1zp5GI)E8`F=2*K536A zlRZ()5N*hJa<`)N=PzgaM@7)zKa8e!9HN=h`w_JB4g;#$a}2XXKaw^ar$cRAH;9RJ zi=^kD)}*YasxtldM$%&%`cNtTTJdY}MyO?O; zWML0O_>Ak{juyG@!7O-VZeAM-D38Wf;Ej{C-=R}!t8gC=_{`OLg@onP@h^YywCrXS z-OU;gi-x_wtVWaqbB%kz8`tz`K<|1Fz!Bh$18N?i;-|qHV6c3cN7}m!KAXBsZ#oI@`HoB#@cQM}s%&Un)Y<+j{cX z;ElU)6{0Mo{_?fpjSt&zqO`Lr@(bXN)9oNPHNH*8f;Y}eR3P)b$FdXPjho)G=+>2T znG1NM{}L8Gn3pem1K!xb7WN-EWy=r^hI*ypFLjY46a!DTZW_# zMlxk^#nPKHlx#Ifb^`cOk_>5i^pIJBD;{x`p<>5&X&&$~3mJ-PZkCP(Ka5kAp~G{l zr0Kw&Po+pXKrZbDPM9Z`q8P(m>2hE%@W!x7$E25mE4E5eduodG5AcOGQZ&ajRyrA+ z@a|kGI-2e$jR95#Z+zJ7O1x1QyfLxKk$B@rP59Y8wo)VTy@lY75jRH?Zyfa%++*Po zX)v760dE|j-&>jvd>Xvb&V={I!QhQvTD&*LgEt-+$a~|90@%AhdsCtb-Zcok@pIE< z;*ILyjUFdYNN6~}1m2h&$9rSP5!knC;JxwTez2jm6-NaW;Hit^~aCf|miQ%Qb*2E*!?!UzzvDA;9)kuZb&u0IyrT{6mV`NPRMX|_b(}Z8 zdGya4`#Sye#>iFwyz%C^f8O|@zLR(n=Zz{EnS?oS+}Qc=-k-i1$>f~##-1y86Xv`z zTGf{@=Z*bd@XvGJ*jA@X&N;5psUW_@c_Zt{`yS_tRImNyoO4C1x%~4STQ z?H#hER90yiNraG6*Xwm;&#Yw2-V!0R-_<$4@B8!L{r0>)J1RZTdAuIi<9S_0@%*H~ z{$%sFC}GW?4Sa631-Y#rDV!`T;*TvKL(0~L3Z~nR@o%HNh-bti;kfceKIH2R(*ISk zaBAoy{`gLR60S8zcx&*PcVNBAdk@UFA5aoDKX)bxy?uqDr+Nrif{X||d73arrH{a^ zzr@Wx;v?LBhWGI%yJ1`M03oK2k`O#TSg`0fUw9eukoSwbD8%sL0u{H9|B}^5w)toRHw3sMkwj>F+P5N+!qh`yF$|8istP;+*af$5qh(MvG=@+-) zQn>7(y|YjmYDoITEs^O=G!$Z|IFk=|X3M@#?IQf1=1-nVCd-cWujgOBTufxcDA^B# zmHc9x7?Su@SLOnGyzj+C5>}}q>$j)?v^nhMr*T6F%xbO+e2p_jGLwY3kx%Owi1XlVk;d!!ZB@qNy7J!TAbIL>(U6-1YuF?cs^eJu{2D@PuOYEU2y;M zOj>bMTex*@yx{uwiFDSlQhxRAaA8}}9jR@QIgC4x_Yf!5N&{pQxK*Fxg+!a}(&sv- zIm?R0f}T&5R4G!0kQhH9W2vjOw3j|;GxrM z|Muk@poq=EJiN%NH-GENHul^3B=T`pcYd17X4Ve#@UgwR@_)XpXJeF5@6G7|=jIId z#SqkizuQ65H;v7=NhUh?zW~(|&B|ObpZ4biBvFgm#r~+T0$)S7_Sx*o&}8DS{0#aS zPG`@iVXg4-Lny6rXLn~O6Vmrj8h%+qcOjtd&o~gq;yz`6o zaJi|LITC^yOTapnv-=Mv{PY zPbQ{=QQ}TUD+TkwL8SkV?Mc`C-}Y4XDkn3 zzr-OP(D%e}rt%>EUpP(zr?Z-jA?D%R=evP+Uv(w}^YCqDuJB~ND$|5{_y>PnK;+b& z(ZW1@uUX^Zi>Wf>hI#nMH=UtrMLQjadHDLNV_@ds7J4=2;f-E8!M<*<=*^giPgpL6 zJl98bHs;}JYXaY&-=;ILj`89(i+2{T(4m-z|9OCcD?QKB?zK4UDw&4c8-X^!4E!oT z3Rd}7(Jjb2qa|PzdWf#XJp2rMG3cDzM=!=a{LPV$5EQ7$!<#rdz+2mV`l5i}|F}`0 zHcpX;e-da9Pd9C%dtnAXE6omE2d<+Fkq?*Kg2C05v=wIHzdW)5)hb0EURlcq#+Sv= zG-lxQd`ChAx0J3yo?C(qY3=9HwwQr8`C>ijE2fTs)fcVkf5?-rnZrqAMIK&hk~thX zqeqvX$GZvF&EQ+UA`kx+^YFG+iadNH=HZ`r>o3p4YsQ$uiuH;-{Q5qoaLHAXhwr=B z1iDj-Jp8gTCUBrqk%!-gdH9_~V#||Gr+4htI$~yoz=mrGhzj>-~ms>8~OWza8`N+Cvn1_RT>L~K?voH@I6RF6{S&BUTHq65}oLA)G*I*vLDoT-uAGBN# z=7&w7bTP+n;;#qEmlS#U6PSmWOjG3Hk6<4Di`1U-YR0=H`~NY`bM?s+JR{L!S9bp6 zYA$sL-dmB)VQ=p1U~M@9Gr1n=WOWqVaC* z(iQBw_Y~`~1be`KUCpN3jbgR%y(_|M13P)E8M|r*-l@Oy4o#s9%=47O+!JH!}0Y_?}Q*$W};BGgt8aw*7N4 zyWF{wDX_%#_FZiGl@jK*DQcOUdsy%C9A<%G=X+Wyt8sP}YrT8N;Xy#IvSc!KS8JFw^j}VEEq(_U}3o z^Q14{AAfd;HGQte>`=wK21gIGGef#Et9#*{@yH`=V6V?~aSwd&)vIK8(huloD%j8Y zR3-ade1UfDhMyN+N7>9LRrJj+_?dF|D66beN+&4e&*FKEty;I0mMY=zQ+A9MJlD~B z9r#>te4HJgmP`-%hj;ClA7`J3FQ85TCX=mA$JuiCsk9q@e%&{$Vr||!(doaj2DGS( zy*$K*zW6JdJSeYX4eIr1UF7OlRjfZhkk0s-OcI8lV26L{PXBDjengW_V2|+cR4nq6 z_!I0py{A+cf}IU~neIAXiJP*@-pj)Q@l2w{v zv+7e{OXeWEy{Kj#Y;H-$A;0-p&3bh?C9y<4_`RB)VR=}hiCp=wn*G(SSfYg7tvlwx zyKk0!M8Eo2AIxofWJn$$Umt*3h4E36%gA%J@L6o&EJ+=5q6q6&WfLWbkPY-Z=dDnZ z667FbeBL=`F4=-S&K&a|e}+jmAm6aW%x7>v$#Ud=Huy~1y^ACPxtl%KfGR(VBay2e z(7QIhCti#^Qi3^opL61Q$YC^Q7|tIP2O_7kHEha`Jz_uPIRxtnu3N<3$U~g47WR3K zcrtSNXsn%4iQkjw6vvkfq1U9IcVH-LZCaafhQ7awc+}&IU&d=xBm0Aph7jSkB*&hw1ikG{$uk zPxKiaemiusH*zocR}MzVsmRT?cjdeX`E9{T2SZ%Hh`eHcrJP?Q=ag=dbGIp2k5k|5 zV1RqHk%KbQUd}6!;pqrDZ$|#}ufLp& zk)MC)Bj*a_l`DEU=;7!7xeBBH=q|N3({*llo&*6-~_46BwRKZ~V|Ae;q4i_1xL={hiFFyZ^UdvF-SOykwKse|v69)c)gjjH;Zi@oOU^ z`uxY4k!5loiR*p~?)}GZgA~0qZE#)xg{6GGlLN(D<^NVE4+)h1x30w8kgwa~x_kS4 z`FbaBKKtRnbyJ6(@^w30ZyY$|KYsF7`9IDLJ}l?XOt@FiA~|=~(JI)6|MWcsNoG;7#Z_iB?>OZFSZRC48_s>c5|Bv&|J(2$&I$!^Al&*Y#=boZ- zgZ|sY*Ka%gf8TSzFV^z?oqH@VZTfG|?Onuff$BoxabyF(_v3u>%y6F2XTl3!%Qcvs zQkf-~UHZYVb@eB&{`d*>mTtn|pW{jFwrRqL993b$U?Xx(G*vk6r6#xvN4Xng(2vsU zBRG;Be9nLXfghwSERRYP3@zphn%^GqcP#G;Lp&mccAGtXWAi}SvAhJq+=b;!*Ez^k zT2lmL!$Wn0w@s0CoJ|yZsOxjft_90h6@>}=Wfh#q{0Lce-V9;V)~@8IW0Y(vM}&MU zbK=W~$|gH%3)7ukiEqy!nN$0B{s5UpHY87$6>U7q*Fq?{v0EZ@y}OwI&@YZCKhu%v z*LUMz+({zSrgua2=mz8P87%VDRiUVH@cJx}h?_IP2;ssgF7jlB>e zNkM%+|7DgciF1x3Uyo$-4(D!iEsLUwKEIatF4)6u4u~Ps?l0#Pnm2MSda-2n+XVh! zbtI=;A4^Q{hVyCh9^Bw@=sS%J;bYotxXTbnWW8teQPw70u6aCpHp7=cGE2mHZj2}M z`%U39dcp)dEDNg$Bt%&*K>;XKwP5S<{7KV9&LB@GGW#tJb%^6V$p zqw}u84_p3f-cxp%TO#osz|N>jBq_ND{2tfyY{aWX((Q>h z|KJ7B+6_!1?tVjg|L0ZgJ?zPFRYj8@Xncq*48r-~Pt^H_>Qc4_doq~3>dSB2T*OYt zd6D^paemE-ZR`Q;$uK*jJMXHynSG2N)Sb32{FbZhSxsfsy;KJT)n%};Ls2U>w!`gr zsjRUr-UB`U1q=>GP|9Srdu)i0vFVKU!#l42)+S%*~tbyh~eF`7m`ruqK%tQ$f zK|9@@?Y2CW$IYA89k_u;kV%MP>y|v9@Okr*I>^yF{>*}CNV=U!4oxGHWxjp zhYe>z-OGZVavy7~`%i(_R%12@J*dm20Gsvo*aq~V9-OOzSyzX#C8*(-cdvrVGEMe5 zdQeyARYJdm>g*1D?l}Cs0-oRR!`{T_6md#99JcPsX6mC4-9(0e?GS|?9 zGTOWrZZAI0EbsK7f>wiCz#--zdQd9kGN5Z(88aF^s0Y*v_|dqF@l3$yP^Wa*He)Aa zoq|1!rl-OjwQbC!bezT0kqE}0H#33gL3u2VgN8pFnG^Vo8TmU3tnJn^uhD}Vx;Fx9 zvR5*#=s~$J2?gCDY0Mq;pv0bwVYzJ_lY<`Ax~U=X$S;(!K@UoISumKU1~cW`Q^?0d zK~T9bfay_y{iC|ihH_7DW^5tOx{aO*uk9x>^NX?)CKmqwL{K z?Lq7_U@-|YOEeiveE)L_aD(gb`!gHy`FdZWD^x8~Wgepk_4$hnWa)QjbkT!KoHh<5 zs>;k1^q?v(I>T_cb~*+ z2z)+rn_iC|ly@@=sXMRGQ75r~!X5_PADp4RYSDv=p`mUL(5C1+UGbto+opw1K$AF*Jw1lZE$4 z7~6X(U59ME(;DLb&ZS44!PzUHtia37pWcUj*x3rSK6=rE(RVsoYzbk{+~_pqAKfhB zgRV3E8rf*61uU&(Xjk-_`aK!}r&f%jOOazeN5Je|R1N4reGdx#S4gKXwx0(Gh1sa)iF&y2xk_($qGvSgJpIBUP4dR@ZTu{MV3OCC^C zWa9@$P%!)!6@~n3jS>79a+xYcenA_-`p^NJ@-SUPXqu+z$#CY00ciXwq7LEulVSt#yT6@kMD_|c0GGcx)GuUJO9L1= zC6f|e!N0w4`q1mK!h`xG(}$?y6;vRuf7+lA!|hV2WaNkb`Vh1(ipodcZ>bM?ri-Z> zWM?IPcxtBbpmJ~PLCY3Dss-1x_Ul0hr|_T*uqT76o1!O!6ZT}7m^+%1TumW&M(N?- zmBNF%udW9M>WZEWH1=dT&nbE`e7vd)yLTyiGCV)13lF9!dNTCKo(x;qq0}*aodx08 zBP&>gx`1aqKQjm_G|kxQ$TofFLLafHR(mJmbNdnZ!u+_;(1?OI}J_~!t5?hA!~}JLRqmX6I_P9(Nd?t`5<$qXF2-+ zX_KMO z`XQe8t_D&#|MEV47tedhO%4Kg+@vqydEdT~1+{IL=tFqk2lz0sGv4BC2VHa4&=-&c!fhdU#tPaS&-kr9HgI8o zGW`fy<=IHs@n;zwh-ZA4(MUL2xrly%yeP~X9-o{;d*K-$RBr_zwf*R`$o@mE;9rv` zZHMQ&OPnP*J#nS;kuN;50M33it&Hb-*?0@^x<%2mkuO(|fJe1@ETH3D|MwV(&% zSuQR!2inJ&UW{C0W)2TjbZH*>K!q9Dw+^BE;8~t1HUoDp4cZ5J(K%B%8{3aALVi5m z6qfYuMZZLjZ!v)@_qx(1c$T%+n!xn~f2sM%8%<4MUEelpH*)nQW7vM~9rXk`D$E$? z&^@KJ@cix^f<5uZ-lN=+2c0tly>2(CbmZevMlf>7Md}#xJX7p_7kY|%fvob_5bkT9 zqz2$Qjm|TKgT0SZ9CC@LAzX7fK!qSLP&0(wBYUW9$Bj4ylWa?_l1^LKPec0f;oSKhpm!=Qn_asso$VHR& zA!1-8wF~)~o<5j93!!AlpW5^w^z$t00dmDfJ(#d`I`tiSP!aaBGn!1P;d$&As|Vv; z$5STA8$Ho;E|XFm@^TA3csfHuc_TmVsRz?0+ENRVx4qJZ;x!|v6y%*}bzyW5BWg49 z%RRc#TBA+vMGjo03mjBgyVYPQ(>H+c=TV0s{uLt!3Ia*5> z)K7Jx{vc28(1BYOza^^I&~tvR10S@%NQNNaZ_t6aO>ZP7$k8=A@M2K2WEAqJT{>_o zu1PW)c~qtjgv@G?xFe5C(1Drp=Ouo~Ll)@3qt}9D9&(wt4t&q3mV_a{8KVQ|_8*ZX zAm6jq0i~M#l9k8{^>v_l>266Ta^V0SSUzZ{WE=A0t~y|v*(xzrh_9NH6 z(uUKQ)=Q2e+uhTKQNgPuwa6o{XhS-cE;)_7U(kjR`{E^+kar%{hK<9*B{z_J?$gHJ zV)G?;k)P&kL*2+g$rEJLY;903m?n9Nd}oz5+}PnRd5`=yNgGBMjFYq?2Q1TuLMO8z4I%+ZF!jUy#p8n7>uuQt3@H<$E4-tVamb50pZ`XFC%)due+B1wN_ zX0$f+^BXJ~gxp4H!`M1?$q?kPcG{3)*+(KmcC^%n+fCgiddRiL_&v*%B}T|8y4s+= z>8IGNlZR@bD|D z)!QYWfPC$x2=?#I7f(d)^-KijAM(WR$O|8fV0Zs4@nqyr_eF4g<~s2d*OM55fB41;|~FiQt!LxHtq^zY>3zE}G&+$lixVU}(}`ycl_V z1%5w?y~RtAKOGRkp+4QkOOd_GMNkl;Bo0NsP$q(NbALE?vfDlpv<~^?7>4|4uL!oN zzjO>oPTC`aSht6c5y+;yMUemLwqqpnixLs!HeGUDhFn%G0;St$+Zreq$DkIl1 z4%g>x6T#}gnQ~sURRrB&jbl8nAKfAXhy0atew` z$3$E|kRyU|^}%vhLVhs8N6y}xMexpNnqyMuYi5hUchdwp4@RDmF~%_&*VD4_XTM0x zxpk8WUNqRrc^nQb?^IGJBq~3DYLyp|u_CxW@t-phF>@|9mNF z*`|&ZVYf|a?V7wcS@`0`!mfZbTnPCm`|-<8Sk%{ne4hVLw*JHoe)!rD;`Hi;Y;I;V z+*^h

yYDI-kwCr3(^CP3aMt*XirrC0PiGj3}19i5^Vm&%uVq3s%cw-a3*68nz^Q zosVp5ze%LpX$S#h16kc1Ka!cFLgw=yg^AL6quv!&C z;$QFLhC6H)EM7*De@ixUqX*6werm=NmApi5HDe-_M8y&RzwoTRoQdOh&x?z` zSi_s)Oq|~tW4T@C+59r>A3kY^g!@z(!S9nK5=%R4&Oh9X@137Wo((nTlH$eua-50t zqrW!y{gytz6=&i+_@~KL^;P4i<4l~uWBs}ON&mnFXX5DTsd8#oPvO-i%z;~X=lbk8 z4}mxnr~HaCXLtWF9PEcZz;FF#yB*7ioo48Pw6w9W8`r`^Df$w(KCy?DqT%aQyhpa^ zEt}Nf3-f|8n_cjNy+6qbYND_n$BMNhQ`LmtJH2gu`_ks&O7o>=kxb zNkN?J*!4wwZ7KZKEfRM%nH0L*^Z;!K<=_KKM}J#=f?_lp!WaYXIdn`^#eCeFTFC)xHsCr;{M z#@oLV=P=roo{U9q-F%WAQl*%QV-|aoJ)5YQiF0x0Np{Lj#Y~(XI1^{8Y{AJ~%z=m5 zo@6g%|&&d8%S2&U69yJWk%hIe|34Eab3N9H;{D_^aki|&{PTLnOq{;UvH!qW#Y~*n z$=LU4gJLF*P6F0|+7&Z#_Q%w)Judc^&%{YvhMDbaikUct;h4)kqnL^FcPaMW3RTR+ z$z6=~(g`O9 z_XG!IDtbh8vIei{i`98g@Z`k*_51p=*7AS-sm|%jzyHoXN->x1{;%F=uu}2*o$IxM z|C_^j>64=GL}%UblgqdNYKY2R?B(A>=lWt1sqB26&RU^~Ivib@XH4$R9!*}h`U?xi z7UbIkmaKNx6nZFGlhJo6;xuUsUtMiUPWEI-*Gg4Rz`Ed!(lO){2_`$829lWzJjpBf zr^LwX17|TLh%B9DEG9a<{0oP8GXBCbY2FAG z;aZ6wX}{JeUH)mJkiU2cdGYM4^ybz$VfvP!&K?d<^FPN6k{uKHPImK{BB=jR7dm;N zb8q2UgpZ(k@3-_V&P!3ZN)WuxewOYjQ{g5yBndr7T$lQdy~sTYS|qHvSRtL@tx4)e zc?i>WGo{&;Vsd4SjquEVu2f8Wkdu=%g)Xn&ozc{S`>)%PFS71**X-6Kr0qe1= zu5{xQ3^%dYz9f;Kvy}Oo&udtdzL<|1^#_9gE@x|u@ZN6gH%Q7#WcM*R>$$ZBJ`{zs zYEw{S*uR5EhV$9Js1<{&Ucg_i0QO`oYOts$U=ZiUTCc@DOYg%brwMG@c6`q%Y=mP= zoY;;s)MIVefj>mE#i#>QBd$OKH;PR@hj--$U4Rdv*6fa3$>j0F)8L8uz#gd0D$Wa_ z+{ci;gnH@4?OK?zQ=9#WxiYS6H4L9Sgze1BUGO{x?#<-)IRw-|jN%+`L$hURrw zn0kNg3mvryd~41!!{?yKJ8&a7>I#g_eB5((9o*!rnI4NVx4do*{LHRoio@_ZaqcRp z+;M>E5{216kCl*cXD?$JhaT^w<#2j*F=Lp7Ucrnsc<^Wk^C1=M2yMymdv6}Ias_%& zQxbsWXE9$_;rG@M1Lk$>8S%OlqOoupM0a1!Oxu`3M(Bq_PRw$~BMZHV?@M5?UNWPf zgU|SH7eaL0GUj?7X0U(Ghh_94#(x|3UN)Wwt0vE3F6_YmATVI+AtkvXHg8j7jvPLr$KtM9n)hU`Xr`P z;lv>ehA+d~;-D!o!N8cARgTa5nvZ~2XEkD#f$6oFJ$|PEFAoP zfqsnsxy@kAY)?BySEGOa<|75WI%??E=%2r7kie9dO4i_e0OT?=eR> zzGDx426^6b2l(Y#NJpY)K3_HpsIlAVq3D?(zikiumTjg_B7bkSgUb6GXfO24Zw|JD z<1wr0SI9rc+QLBB<#Ysk<^vLKKxs!J{S*0K%}B^lj-=z!Ggt1ghT^j!^fzRwn>CcZ znnf=(ri>34+^vQ3VS-@)# z2_1zzZN~^;#@W(0kfj4gKuX#O+6;a2SsTq^z+Xc;2{~2G9M+%IrmrDK=bAyELt6B3 z^u~MZnt|Kv0rY(2L5ED?*yO%+1@fZNrqJBlgZ_%#j15+{T2i@CX<3P)~IHiY@U zyQ%HSrS(`Z8?uu+h5T@(0i4p>O1(m!<7NPBJ+i6Z=x^%`M34RKddd=6`H?=f%v(jd zBe(3+2P2nsY6o4eOQ9bYQC4XUTBn0he{4 zq4kx-9Qn~P9k6hEEOA6mEkytPVxzqXVJ~XC?l~=5uvm*;HP# z0Qrfh4jj}tA&EqGk?Mfqpu>_RWN&L7n6j}ouY(! zr?dGrH`fc3XT=NsqrCa*@@qoN`edQ0=pJlb(M^{9BSn}#cR4fh+HhI_u1Ug#j$zz1 z%37vgvP_75lE;M)qh%4>f`!Ark2wodsVr`jm(azqKha3%WF>DILG_FU>3P6G)*fjn z47PD5Pom9ax&!+NmM+uCw}*peH^08)nPov_^!+Zf)R|{^=f#Uj;kDaBSj{0`92rKg z>FJAeg_x?BT)@OFQh(J1K_h)U$Cs2#XFf|7uth4^zNwL3mo65Ztk3el zxKq;0X3oOFL_?u#)+wns*GG73K269vP%BNkzm@m)S|bzJ$trGokNIBCv>E@a67f1zaML}~DE9di7>i;#E1M%viZk&OOr zD`@2nlU~+xC3hEU3wz%6l(w}^Bh5Wjh05ShWWDEXVxjt#k4(Ev7E~`F{iZhZ`6_!! z+2tig?O!6luQ-M~b~KjsJRQL=cs7Oel*Ezr-V1sA>2}<# z$~dCmIGgVhXUg@{jVC@LKR!iUn>(=r`Ro+_fW0Pnq&c2s-*Dsm|LM!Uv`--4sj)ma zvpe@CErI0x&R^}$Up%{+RmI+7 zz7xCh;>8=-$bU(gPw0UCQ&+KFwQycQ)K55-n8rS|Mz7D~EA%)U!-~dXFV@8$A*II> z_Jtqz!n*t#w%5(U{^{5!VZk%#)jS>hEn?nD`Uq5(da!e|@LvCvyYPGVIM%Bebz{yg zXei>?$ivB``PVh@?IL08(D$3U<`T>=wq?g&!3;ce4$|IPup0L;_dc*58jMWXQP^)m zsV~k7tk7dC(VG%XPlBJhq<7&`yfEnjqPcU_d#at0kfzMro{$zmrDt3Z2!)LO0WjxUI>}> zpO_6&oQ<+1ALib8#dx@2?Rd{N7^VM&shNZt@>?E+A8lf8c;RQqj2zHfex1qp#aR+} zv%og$Ij(6hxlb|^~ zhv|`l?|T>GU}Ib+6SM|jb4oNY2i7uM)?;1lR|FXM$YAzl;ye^S6n?EqV>V(wN>aEO z9K`X=4XEcrJTZo_U zCuYLNj!BG7G3JO^f4Dtr9K-CwtkFYX=yjN5Ecf8&OSTV;jCN$Ym!cM(=?w*GBbf{P zQb-W-f}_{XnCShe$wzs@u0R7u?EvZ%&I5`qMNIBN)NeB;LAB#xrWfkHnze55C0?Cb zgn5bJ%dYU{n<@jS{kn_B11as!D52i_nLG|=u2W|0QSa^g>NpgF{RP4>c}fP1-0M50x4LuKB7}l`@whut5-DA%TVtvQQ~0BqO0^w)O(xHFz~P7 zEX|_ctIDAvL&VbqQSZ$Tqu}w&D!Lij&_@EZ+YZsYQ2XVK7lYxrGI}QJJr`$37;(RZ zR!6<}*wq1KW%+a+a@+J#kW!sT&qBR7GTa`5|81iGB8#)_pgCzBor8L>rq&kPtutr? z)Odj(ZJ=^+8hsGC$=C)C&x@sPP~$zAKN1?gE~O76>m0U*(5LfgGt_ti9ab>GIDjrd z_VBiX#`>vrAJll&M=arc`9wMf*;m67&b)A@A0f9UT0q5OmL{n2CcYm5l-PkTKpqh| z0#YVh)9uK!?wW(fE>qeaHQteF=CG5~r;CwW@0o#g;BdMX`TcA&2sY8AS=4n=pG;vv zWPdsXc}|Kcn0)U|UqxQ6VG0uts?hyW%hevl=6d-`v?p@Y1QVRk@`K7mKK34UU9V5n zWn}A3#t{1V1=S7po1xek)=qdx(a7P?jUem&Eh-H8dlt^Ad3>2FLCzjy1X6=D)GcJw zc0-tbsE+D_nyuiFA%vtIr>v20h8TioQ3d6Pe8|`k?))mHmLm^-WdQHY$tucZc{ z8n=VGfo!$d0Q}eGQs0pe+8RLBlT2y|YBT@eIHzX*T8c(CIHwOM%~n$W$X~Mcp+X~- zN9N$XeODaQ((msuFqXGR#P{YEWm85Bcaq*%URZ5!sN@1^QMm>J@T{ z9_0)wKLpvlYsGSO0bigC!n?wV-`&}Jaqwztak38j+4y0Q@myASCD%XKm z@%JVD^W6BV=kcUr@D%>;`(^yitXQ(I(TmJ{U&@5(N!hhJ3%0*|#lHjMy_|>U?T)rrdlr%5m*Dw-J zcUv6!l@-Ky&o<{i_lzfxPS4;+{?OsFL*vO)@2ULLu3DV$)p(*iX%cUKOpUWKNWgo( zIG?dgPY%Kp$b~6Ven+knS5}iiPWn>3*RZeb>fZ@u(NTN8;@C@en>dl=xLNaoSr6Fw z@I-QRh&ey^@=ex%Zz5^cHsU9LxX5NVC6d0=b@|{mr`Q=PN#yeBVf@!Qco)k$iCE1V z%wNqu!WQ`?k&F=od9mt#c0*zk>1(LQ-)SgeTX*6tP;9_#DiB`?1>-vG=CmV~CFM#F`M+C-@*HU?e(x?hACV4 z3}@WD<01QrKFfW=*Y7w9-D5?p)6Zm*Vt)dE7qS-+nil!0CAJ zbxt-c?RS~^9Dw@db0$1+Im1vv*b5|k16bAqGkO8$lU>)r_<1K7)g_oG8Mp@Y#vWm| zhU4eg=M304y`1@oK9$dt6_C7h57P&=icxbqY}F`YekNgV?Mo^=s@cv|rD0y$G#T!# z&t=A~MBTL^9=@#I#FVebXJ_>oxOZ$F^JX1>wpK>MpYE%ezZ+3Ig@u7@S~}B`h3}aY zmO%5EM5YFPs(j~#P(3+Wa{BIqMGw&s>-*C8&P_{UB+Ql&Rm1xtIRap|z`oDcXzgpH1HIqr-+- zun+UqN4=m@I)WLxAAdi4JfZxQA#zv*G9RgRt> z13|Z2X-Cv5Pd!G1QRy3c9BLKwcT(te^9em3wTenMfzeZ&XenxymT??37&p)ss8vFG zvd})^Jlzkq%Fjj`_S6XUOXLxUC>R-0O&>$8vUals>LQQOai~=)(#245d_V1gTE#li z5r$B^>G#OHQXJq!M*+PRwaVf3qu|iLEi{Yzq^-mrPDrxphsZRZyRl53z+YHtF;x%xCduq=0SnJK z(rb{VNh4t4<&pFYWcP38aA%-7&7dY(6=4pK@(t)rP#Z7t|qFPn*EABg*s`ox;MAI*R64T0 zk_jZJex`Wj#$Cp6sr41rj@-))GoK?KQ`V?M3cneFW_2Sq7dc{=5wvW-N^L=&H`NG~ zE}o?>BK!74|7sjhwIh!d3}LnE3Cald#?@FuI6V9?<%z5{$`CSx%cywdZ(j|7{aHel zAWuAQ0HGK1sf)Z8Lzl((Yo-l zt19&z+1o@HHr1$5Uy%#?Vs^AbiRywnTfNC(D`_$1LmwmXNO((soO zOJu9VI*{o5P(mShY)8*Z<+j8HxgZ05q_3AHUdUY{bzp$~8A%|r@hlyPs;iSMMDFIU z18Y-{OQMiBGCHubszQ>Ae0qcqJXPN(S&O`5m=0XpUo6>-Jg|=rtd8CxDL~fws|_zo zawU6^g-_b>`(dV}0{LyTHdHNLE2%=>eoGrt>{m*7ZcDMeU7Z-M4vYstdoBthEJkB@OHBNhGPg;6tR@Q2OoNx}YQLPu#H zU;N<~IVoNuOpKTDuX{cwmCu6&YV=!P>e)=*4)zra%X{HBB* z>FxZs7nE@Cigh%edTRVTyGVo9mV-yXzG$EV#R$d*h!cn;A1rm~>Hthes`yhOP7vQA!y9boAoe7J8XufrDpy1+L^ zE)p*1wM)mZ!`bquQv}D&ucWhouH^DGVuX^OXQdB&b#T?c0)!*uc1x!>nv;k!PFV1G zr8Kn1c>G+`5yCG|l}4QPBc)%u36qZ)NWWuUdFkaR{KNY##PiW&l1bI`-G3Jo^UN?D z+;oT!zB7?*8W2fb_Z0DIV4JIuLc)U@rF zXYg4{x|}&`+N^-7{H{J)+|MiVBxLF&es`T3cTYcoxRs6L&-d=hEkR8?*;mTD6)17D zP}9B%r1-C9U)iy!X~)#q^XuzhvVN#(#h%vuwQUbrDQa4YjyXTN@g{4GnpV%yh#&Xu zB0CE;txA9{KPLMWYk`_}(}iJt#3IZUp{C{M4(3&N9ARTn)4sAE$p0O%pPi4ImNQl3 zj3=0sI~&GQ}XJwA!lZ|lKda>!+?P}A;K>&ClY+sLj*O>1&MiFe(%noUDZ zyZpf~SW%zOR->kE+0zDlM#Zz9sA&%$`vkpahO!G$)Bfr97OZ~FWwlY$>gPO%0+ku; zD%7;=0w2SuL{GL3HSMvv_n?p8c=j%8+FymYA>s;QN1&!H|I+|BQYp3wHLdRQ%TV*m zj-85{c8TSA7{pkyZm4N5{;7v;vrXA-)U+=?@i6tJK5L7bmUOKJS(1o#KusGjJ^>5d zwb(tVX^(C=3N~W~va9=|=carZBIovF-=L;_zxe}hAo3GGw)E-{``^&${uH!QK)Gpxf@_;JuvJ7 ztf9EAgV&2rFx{8n`}3eRknMJa*^HWY>6Z-nI42sNb}S*|!?&m>Mx~q-GuSVjceM$0OmX z>MG{fM*Lh}76xh=>C6Yzv_0LIK*FR%rV2IfMHj5S`b97SsAv_rGz z!lcky|BtBij;Hed|9DDEQraY&?2&|X&UIg>NE+HhX^{4$$R-le5-BYuQc;Q&XI%Gv z>=mVnhW6g2kJ9+P@9R8%egAttuE%B6=lkuv?&tNo-FH{iKLKeXVoku8gD0v>LAl{z6(g#Ibx9lGVR6zUgUTm7twLZv~ewSh)1tcq7`Q# z8(*14Zn;~EhUG$zIz5AYt1%W`$%AvubJIxS4qcJ>JY?5OPjYknFi~-SG>-Z-nRLho zh;$*-PPLvy@+|v`0wL21!aa!o^`0UrWZJ_m?&QMRuAUy!PmZkY6lz1J^{8|u zvmbsIj)6?Oa>h6kckz{QJY?FFZ^gvm<(KWSBN3gPV!)gr`Y~dT=^IOM|O4SVEK@KwQZbw2?(`lxCoi&;~5T^+5L8k3d?m*NFl$rMIn^DBv zJ3*)lId;1?WZE&Y!o9#AGwq2>Vwi9c&*aqvi5$0sB|4^Y-4df-rv}21jglkZIoxP-fa8 zp~l2Y@1kHjWKv_Wf>nO5-4h{SZsqM3FNWZJzA%1rA9nRZySGSj+3rhTcqPoN3; zGXyg2_e07|TL+nT@Kj}{9hqTB&e$n4Z75_~^TQ#66xg2+nYOF3GSe18rtLdGnQ6ly z)6Vl;BzOUP-a)2y`k>6Te<0I_U!Nj4G-NYw-gSae^B%)$^$x_p3JxDGi&}H<}^C! zGMQo{HeggF%zYTjT=we6E?ysrE3Wltf*<}N0mq^9u69~m0Y_JW+H_&B0rr1c>r{N!eXwX!R^Q7 z>Tm}1N>PWjAMKKNf$sNByIR!f9xh)7-S0p3)yP20NA3aLZ@b-9$jHG%-qHy7#jLDE zr&c-32i<@>XcktW_zxrHs<&bO_R4ZJcfXeW0(8F(c9fxH7j^jv=zb5Bm!ji3UF5T% z`+Y&B6y53dMm86^-)rY7kWuw*nFaKVp2;|5KE7Ob8@k^&tvMuLR47{j-EWO^EJ}HM zQYMG)cbp@OLYnr={=%6QQwuY|-zUgSp!+>{1wlEpLu8|%``tyIAl++AWu~veHA&>C z+-jPv`y04hd4n7oA|z`9b~BeF-@8__BMv^q4vUbX z`$gSk-tVLEo+&bvn)yk354aY(-$iBjq%+{NxDmSF^GS_V4m|0W6b+qUEY4B!a17D5-Hm68ZDg*+|@&hG_+Pr_X9UT_j~An zv!xBd8=?EXHfWqw1?Cd4(EWBfV=uJ>J^Y z-v-eAR*zD4zkfjYd-!8z_uCe_-|I|=Nv^D22!ruX%2i@=7 zL9a@#0r%Pn-QB0k?)P!%ew#!nyWeY}`)&V4+5KJ(-EVf6viqF^-S5UMW%v6TbieDG zmEG@!(EU!Gr|f=zhwk^6a%K1X0(8F}Jv~c)!Ox0=?)Sh9A? zd%RF~zYjq7`}1*S_qz)E-qw!F?sqR>?>uGqdjWL6ZB3QkZz!RmP2H;K9ne<58#!h7 z`waBGn*)^HZ(CrM6lM3j6uRGTc}cYU?F~G%pYjgqKhW!T_gh7~-?_j$e*Lfe{X0i_ z2Q=UPp6O~sd*Ch5<=&RB?0#nedw&}6uls$XMwPM)tpC*e`mg&f)p_`@`+fLNBkgz- z=xGlOQqBNB0<3Ftmac~bKgGvsubc0Fr(N1f*&SH*v+@pTTi^#;%Def7126qKiT1jC z0Kb@{WWM|TfE!KM`R;d2H|5*{n~rx6F6H4KG$v=I@RX zhc>=K4ZGXyq_j_fpE0p=}xA)|5%6#|x#_s>! z7gM-IdDjfz{l2DUK|9ZU_d9%&58cl*=em{lpZUJGan)41&iBCov^ddzHNT!&GlZ`5 zTrw$wFLV&y7U-{rMjFt2N!|I?uyhPt$e22VVYP54z6xzzZ(2be-p) z$vKqy9{6~fGu^|p<|kj;+2(uQx-XRLJSQ|>pzC~pd$+Vd-OsZ*?&0wNo$y1}CiHvq zz3$F58AgFZhG9NfBQ{pYyRzj{eAGi{S9aJ z{_Wp=tjE9o$<@pLb>mHq!|B)Zzk{Z|@}6$~&%3ee3jIDjFOW}n7&Zv*{qt4Fw~ZI$ zA^B5qT$vVLnUsY$Z$#ML-U^SO_z|DJWrDqWx? z!hgyW#Hll)&>namdzp1wtQr!{O5vRBjA5<#lj|U^reHcg`0cegc$zmCsiDf>9W!=K zTol))eV_W1l7h{g!|kKgpIn(cmUFv0lKPX(PtRF1*)lG#^oRJ(+$!>=K8pLM@=p9o zV+rHh8p^dEs}pb8_JK)?U&@_6bXGiflnH*7?8>dKND>#UbHf!@#+-lNBJuVNFRZ)1 z7q?$xDegaHIgZ)>j2*J(50)-mhuzLru*)niVAYBKxZ?OlcDchm?EQEXe&3MEdi5NE zlk)@NPP7B;d*M4~{Ldi#H)3_!aAAKrjyNXqqX_vxr`4a(axa1ouZV$)Z z939yMuU?>$4)C63jV;@A@_n>^T?9V3&w_n(_9i-$8G*m-GhufZ)S*!~Bd}YQKHECA z40)))Y;bEG_VEZQvbKWkS~-+8@+d@Fvm^2DT?5&tCAr8gG!p;W+K<%@&O%R)MB<^D zeb}0aqex#KiOt{kWIJoqkX36W-oHqd-Riv;*?tGF^1TcD&^8fy_J{nrrjx98+lF$@ z;GIF6cJk0B9Ie36Gk5w(u21nt$06&EjD1Zs+m@q%RZ;jwpJ$~0kvIAt7KQb0JR}pR z&P49J;4b4EEyU4iBHD5kW<#mnCd6Be?&ZNePrvI#wXYEQN#X48MLl`Del#+xf%|rM zSCbi>4YGkOnm50kBs?-hagZlv9voTXV}u+azZor%k+P=_;}=@&`Kbq%Bq{^WJrIZ`u74fO(l61M9s`M$L~iXI8)fOB$)Vt@)t zu!VCsmn?E8<%h@={7Hz@3DRf6XVFpydLYw|k!bO2kr@2Ro#?~FD)Ozvcvd==Latn_7x{xf8Eu|SraZ3@DV9PfwstpZo5_kASHgK; z)K22mQ7k&T4xatp6N%_%fyg!h&iD)xi0Db4C=vY0q<-7UQllKv`B3QbYHT9|(oTqu zgFm^U8$&$C91;1z|6f-|N0Cda2SnfEV79>HFv9*#7A*pQ^42$)aK^ht$H1Q)>Jmr< zn-fG=z@IqE{mJq-v7)?v@VuY8o@n=r6or64;gZ&npTf-|Bk(7A87qnT$Tgxo@F)7$ zmXVqV$oN&+-(pc3 z_>%+Uy~zD@E}|gtC#>3BQgd>Y2!lUKcs`5B?^}w#o&^tcdj^U1G7+VKKjE6EkYoRsxll^LA$@`2)LVNHh zqYE%m(`pu)gFpGOj3LtJ*MvjBpNuy_B(+P8@CPvYEF^PRD}*<|r97?`kk!K_!c6cd z%y}1bb5NmhCHRw7N1VypnR!AJa3&q8PUPtIY~elN_ycezxHm(%1N=$RNk^iQlrFRZ zXJTA3nzXSg!Uo{5I}YTh)o$U6QaHo?J&N>cN)UDc@30z0N>0ZLx0S(pil04c@eLRD z24^z;q#f~U4G<;*FM4H5gr`>tRl$>lINB1Mn@faYzzY*?NX6`V!Z*P6PpyfW$u!|y zI0uY#vnFa2CJ0$zk31{Vei;i5;Owt$s1@n6!C4pstdRusUe?(Q?*pGuu_VqHErg@N zlPrz0AZzT6g*$-tx>%6+-$w|WfltSqlUv`13QfV8z@4q6-fn=aSU04jv zIGT}V6MG6ffgKt~k|X9_g$Ue;?&^````Vv^2;kejMv`H#J_$;I9nYDPTV*c=Ux2k{ znG%=whXM<5BTIgp5H{kDzz6tct_hhxuThW+oa${twnkJ5Du8i66Vlwl3cdp0tTZN@ zi;4vX;7shJjmaPBMS&-zJSlI5NtJcz7Qa zyao1fGa?r<_X#w>b$F^9kuCjp3G9J4-Z3OCRq=wEz$Z=`l90?8K>%=-Kg<>16e>st zZW0@ksGl1J=YcN_FeLMCuMpG%PkmuPvOr$i@q7fqRTMAe(F$fje-ZK6Ksxj1epZcK@wUTzlFH0)RK((xf%M{u6s6A5R9r9%W9aF7r5n*Q_`TnFCgrcZ_>_Yph>R+#IPJ9a$; zpMgL3(8`0w?f9vQX1!=*nkZqp;$&px>50=w0~T$j%0E>^%+g?hwt!~+)> z;MYg>NKC~o7kA*09eU(U`c;>iz;%IoWZstwm&L#jeBo@-hq$Z;J~K^^EO5Hw5(sR} z=#j9g7hIx&CtJfA;-NDxiNJ$L=n-GRNtYDh$i8}{QRAq~QQ(L_x@3XD0eU8=@ky6F z*pTdU9@ed%=#qnO$rW{xZ9)WBBr zXLCc>4pR8Ny3H&+u!^&2nX1tIw1hd=5Xu#?@d`h83o^etntOlcv_dDOkiGPIBlmJ_ ztwQac85iy?=H#!|-eqeZ`Y+3vfubD(*JzJvULZ9Q%HG%=DQ0 zh^r}DkC_21b9iY5ms7k6$5x+YB!2t2jjCJlst3bf!mL>y!1^%}xPO%mbGh40 zw(p4utSd2LboV*2H$KB`2l)u*Mx6n>b_{f!E)8Ld=V-8U|42MJpg&{v_7|CPG7=wp zuEwnBY$MrMVFu>U?o9oTD)Qh{Bz}BMg(-b`fqd@=ci3(1M9=RZArcGdRG<2W#tls( zO>j0;nDPPr%?~7%b71DcsMly&k{8ig32tZYGgLoIOuVrim2lC~Rc@`yHM?b79<=YD( zx6ErqE%z?SuYt!iS#}j|xO-H-1Uw#>Q-|~(@03phj~A&`i!8T>%1?pEvnj4dp4%47 zh=<8AUG=*jCXvT@+? zGI|j7BEeVY2p(@=ksNL9I#o6h+}-ija@1rdl05*nFp(qOHcMF=c)Y9^;OIJaWDK~w z?dN64YI#4|U10A}8EX38RptlT@6trz@gJp6fo*hU$TqH3>ILp@{dXzSKT<6%1J=DE zMdzkmks5)o`+8A|ymsVBBY@AQNYTDQ>Cy(^-&>^U;>RTEP;hj`i=^mUb)<9w@JV+m zDyd&7O$Xj(FGbm8mh?LCL|rLrT{Bh+P6QXKOVO_rc2Wo6%wO;9E3@B<46 zO5=ccJ%T%kkM@wB0rtEF^BG>ZOKO4jz~jx2eI$7a{ECJ5%B>nCUBOxHzs!FhnPfO{ zKk#^m_46e5z!SjZ&2&8~aR;`{fEnrR9?5**{DbhW_pDgS8ek4)I2`lZAPEDW4IU50 z%%?LPe8JmE=C6_(;Arr8qfWjkxeojYW;k3vexu|ra2R;Jml=wZ2f&lSqR``z;1XG*dalVI6q9MM=X;y2E-Rc)U5ol^#zD?rz5*rN{dX?(XyUcXWos zbl`Zlh0bs&1a~*^sB(sb5%BW`Mf48nX^7IJ%q5mQjzF1AI?DlimTn0C>OxOx@ieU_Dnm%D2GLnQACK-eKVEEt=Hb zEeCGht(@WD2#nr*q3*61@ZW=Nl-t0wWv3`-I7oo4vZd7Br334HI88YexXkVdb$5$^ z;|l5p!9gwz}DW%84kmMv+)e-<+=ms1iDiG0&YRRP1;UDVO&I3op+^3uc{LZ?9@?l`_{YsCw4|r3da&AK+aIe0~c@D9_ z>Ti|qE)4ic*&h0}LBNl5S5e*wJgUf>@*3c7U)-p3<2~M2GKMnm@s530-sQIlcwnB* zKaZC;OrJ9E@glXmQRY2f?wBU(op_Hoq^Sp8=RMvIy&ZI&_jtv_K2YX8UhCe&l=-{- zmL3YF><&CkD~U4i@viQUqs)7}zh(z1j|KkTeH3Nh;}NUg|M)=kE$W4Mk9RLpIqQIT zcOO@MqU$`LxW1n<@9vC#EANly-QBy6Lb}fL>6|3WyvMV;+)9~ucZs=H^k?zhK4UnY z<<5IN4YNABhv$o{epBW>UU2+%%DlT9n5p!8JYV1Zp04xmjx}zl%=@UTe#%)8JijX{ zq+W~X!yD@99^PeTEbjl0Pq&S@*z!>mv7nOLpRhbnhqppiJ*b_F)<_lRvg z^#M<>ScexBm9gfJPvE3*fBazQ1y&`-6OZk_8Oz&Gu){WM;}_L|Sok`Pef$0;)3fgu ze02V9HuF#+b3r2*zc!9%OyAnD^boaMn+6HfD@I)3h!O-$|U!+TdZ#t-3Jm9p%Y}zVF98(GSPn zo7~xR9KUWI%?1y6fj*Ckz*honS(Unb z=<~)1JcF@dt@_cFzS*HE|%TD~3*cILzh}_hTEoW}&Xo|8el^!@Bi7igcj=^Xx)TwsvtE>JI&% z+s3NwyE+ON6g?&5#(E>|2;iuPWcuY9Xx?t{U9l~MP4+;+$DscszeSqf zVRY>rWR+ppNnox3O@#iBAfukN_8yJ8)1l-CLvCr;mJz#*5$GHEt5wsA$*1+h(28#GPInggE8l@|k16R|?M!61hu)OSHWq5oswGmEgjeuz$hzq0Ikg4C9N65R%W zbyWWt*~YyRodM1K)4V1@_kzpJ8+dy9XyrT z!j_D6Um}bF-XCQ{j?~N*eg(&pB*HY9^}-<-kEU@cvzU4`CPZQRk{gl2Lb6gkyp4E*(kw z*8LD{1+MKnlC;nMB#;9y%P}SDwl4+WfulW530eJ6U;{qt_kSkj+t=FyKj7k1CS-OC z+yw@_f369EAflEF~;P};j@BJ z;L>&@^4K^_kO|zq*of4BKPspJJ{M+0_WU{^cn_Q*HX_wxW&fwLml63P-6?PY*VN~x zA@N@yFPIIy;J6_Ve~)LN7g5 z+5h=i0^Rk2b7-gi`(6X`K-H6W+V`w7Ad~IJ(@uNVI0N!sjsz3HDOu_okcLQQr+r{2 z%uhI^?6l8p(I!R7Pg>_GJMDYI^@;f+Wv4x7u|5gR?k{M9 z{db_#o^H`c@C10UnLa6g)Lrlec%Ftnx!IuXwC``%Bgd{PJME>=Y0uuQ?6fySr@h@> z*=etbPP^GzWv4y;h#o00Q+C>I6ZFW+aaU=leGhcnoz^Nl?dPG>KJ%-x(;f?*_Nsbi zr@ar-Biyxo>aPS=Ft=fx(qHx0(Sv`tm7Vsj>Ut!F9HIVd2XxvGRVzE~h97mw&B4jE z(?0pJE?K`r>94*+r=44+^jD_fuLMG6r@aX}?bmK@q5kSyzAn+1s)?#j*^cOQk8$R!&d^x}6UzpIr@0d+bS8^ZTHZyrU_uzxe{J9PA0eL0|*{wR<)ftmG^=_VGQ?8ROdb61Gu@Zg&0eiw(tHI}ftfTLL-T)A#U%;&`_5=N2xy#Q~RW-NObw3F4ksXR;&Z`Rx2m ze=Z{FEN8LgIeVsU8F!#|kmCC3Aza0esobFYnTki@3}@QQk}F*tuh`zUloQ##XB#_@ zE7U)PaSv-Jv2poDihcW|xNS@CqB_-b#gdb&xrLLP7}=mY#kbRl>-E(Vx7@5%XfP^V z_s)g*?f7!VJ=Gv~LUIW1&?r$HL^Yzd@8EOABUh1_ z-J{6&Fu?ka?)XgiAjQ7>B0TGc75;e~DF*JCinqHC#k>9cD4?Z@gHNkq%S9@RH8v~p z_P6(#xXy=M!p;r&U6X`yE0=I}lQ!cO(~dKjuI=LDe70coemj}xS7vejd_u6lMhH`# zIGmesHWar6EoBrc582m8V6KAN3?^nmA^UksIQE|E${1hvume7 zM{cV%lUm}*{+Ablx2G91eh)^or(iDDB2I@{U#QDoWg_wLrol{_y*hh0I1*1e+mE?f z+d+Kb&f;OC)fj`-_sNZ>NZh`#J7YbsoJ?(x#ES>0FpmbEC)ESNE$sM-Hh3Q*sy5(r z>b@eCwght44P4Fj_h>HXPefi(_{R2EsE6hpG8Qse_Zv^){xU?yg}}Mt!8Y{J(Sjsx z2merg4>>H+A`bhaaH>x;8g;)H2{;mkL8K%3@Ne><>?mA*@&+0!X_2qwvzhaClw(sS zUv&vwgk~eMu{|$Omq0JbM7}*7<@q zm!WN3Z}~p(Y_HNvQPsIlnH)S@(?bP1{p7jq3V60uCj}D!YLdl*XKTpdQ0X;JW&-(8 zJdi_Pqc6y^z_V4SvM96H3E3a;Y+iaSsR7$S{ z2RBI3oFPS0JMd|j&Pfp)n=MTMuHGX>6Yv4)UEqMtQsjpcrTXB|!WO`u%VAPK;5=6; zGE!YGJpp{zMv6j=XGoiYn}$o#NOde#13%`kCPgZ-Hc}Vhl%L=+X6i}(fCsz-SCFnL zO$5IE5IQ7ZRHf&Eoa`n!2)_k4IX!fi>3@Q$7Iv%;XH^VBl%5m9tX4 zft}9nrk-sau!%iw4 z22m~tuHD_6dbTUTe;@xx-B%v)$88TNp9G%Ny_|A7u;n$SXG;ctJ~NlDCjbjpDvn8~$ET9TYzw^<7dQy6y=ayx|mGr=IQGZOXh`yOLK*neWR< zR8uMQZf(29dCIQ9L*r&p<~>`Voy#fnZmn`&TyL{Rmv!*e+~u5`?Gtuizkc|mksnuK z{*JwTu8m=)Ealewd}M8mHJOgS%enSb&)9ePGkZ#PEw`sjJ=@)XH#fb06Q?%wBrChs z!iCKX;|^-iWz(kiQzW@Ya~nne4Hx0L zOB@tl4{KQ+*R^=B)(FKH&vbVD>Ofp*tf~mN@?j^|g<>72>zwfvXZ9|*IIW1uTw$v# ztLq+)-@2@2#9=Y)t@FXS5>B{w3wh))K%n*M|wC0{Uh;XxR zf;eyVJkIKr8on{*qe9T6^KL`Ci=0zV71bCB|6#pDXvM+)8XE7vMi5Y`I;9L&X=r zO~yJU+T6^T~DV9gl(yJa)((RzfPW!($^S{#JObV*@LZ5kP2%oZGGn#97TX-wya zV7z(WHnz%iH)CWMf~WNkXR|W>nZ$+=JXkw`wY@ln*)Tm6&xl^dK6+xu^sI)i+6o`` zi=HW?o7wOgyB!2Gg$kqLCoP#VR+oZNvt$Yo!R6Xjzcxw*nxjlneltW zamO>n9t-M3MYqCnR9|QI*V*@I+Moz*m@tano%9IRPK&@RMp?7h1DnyG_z0LyV#XG! zUqdUTux@X}4$Y`Sj&CBccC;?L!I?#uhQN%hKU!>(_zD^>j>LuM2eZ9*$=`-l;t6$Uk`iCdaxFUQ_#p)k+|i2SN7SIUC5~$ zoa+_-f#=zH6r>Y{t!H(RO@UjH%4j%$booLC*9D>MBi{8O5YZRW9Ho_xn-WnYd?H`ZN5vs)VLu-$dhfd8|1}#gtRWfJA>wp zq_ExziA&)#l&vKZhwM>KBfK9GQc31FTcX+b;Jtu3rR21UDVhh_?D8B!CKl+UV)$$g z43?0uKEqMuZ#YYmTqYm!5Ok?0bUcO^k}(rBk&h;HijL%yej(~;w>CHgmpsz-dQT)a zf}Y8@)8y*ZZfL6|JZslwgP-{=n&kjrE6XI`g4#u;0$8ugAZw?*7d4KJ#_4a4kjX2b zi=sWiHJKhFRuvCKtyAHCnXm&y=5t5%Y&N){=c#0`@R}%d0lZJWVjo#Gvqm)72OL-D z9%7wUDso#6t|Mm`@w1YNMy-L_iOZ5m+`A&t(+%LP#_S+d9_NeZZw5!F9Zx>>Ix9L9 z4DaG;#u2}zS)%N4@O#5zN$}faqR8lIJkEYA(aK5}nQenR3X390OhT$CCmy_?Nhq0r zaF3`n5#~b{1rfidM3LEUaA>}pNUp=(-(VGdGBqr-N5yY@e4licyPqG4xY=4#ta zvI6cYE6s(wY?`N&T%n<8-Z}7l&!@tCMIBMgdH6f*;Ym!*hlnOYKW&NgWa7J}zbF@6 z-^hrG-v$}}Z6u~@%TsQK4+ke76;QC^$U5Tas z2Vpk2K0j_Oxi{#!Fdtl>=@K!yx$M619JoGrbxh{=yd^viuFtIs5$0#TFhL4)5_XA5 zwx~k59Q@wn#X>T_RxWe_zjr_+AcK!z7OH~Zn{MJl8YTI{D&VYP&gAOQGs0-_dlo~S z$dt>OLVNIgTStr`?kPuv_ki7P9Ld_VX~IbGdxjpP$$_7Hg<9bEBx@YV<84X8eBhF_ zQRJ6+yAXljYpk&+i|w}xtAO*m*^{=@TZ9wA@2R@mk>wND3#)+l?zJW56P5`XaC&_n z*^rg#-oip)YbP7>!hM!dADo_izcn!xO%^5r2XNH_zWUU-uw z(fc-9m=8SH-IB~2Y$NOi9xq&BL41No3KszvVGH7~V<5Z;e52f)wEof-{sqpNVovmj z4HixYr}wADj7$#bCrkytwAPGt@9ZsX0ZvyjBjv2BPzT)I_9G+7^A&#u3xQ|3j3kK# z?SjL=Ev=^HuJ1d+ZQ!5Lrey5mrveS|b-T<=$(yoP!FXW*TP8$h(+xo=aKbhdvdzCv zkO!RaXhObJmI>|yH@q<>v%O^kHE?tlCymJzL6N`-ICzmUIkWt{z!$hq+nC6jas)ep z&$Jqm%Ueze3W2{JH6o*Z4-1-s5Bb9S*8PHCz+26X$l?2Y1bX1;l0O>~gUyM8vA_~J zyx->-C-4P+l4wZwFOL#z1^(e>NUG(5f(+pI=7!|ey0rosaPBYYn}shG+y&NcG9cwI z<_kUpi%!E`glRJbYT(vBMj4QcrzQ%FfGxZX$eq7q1p?s5qYTL4{Q|)Z;4b|P$j}4_ z!Ajuhclsnh*GdopJgHuv1elo$l7Z*v=@X+HdV(zA3YtwKMml!Jhj&bFgCSwHaJv{s8XM)rpE*=4-em zZyH(ipb*9Uso~rjdslY&w!MnA8PVK}jZ2W$`D2Rq$jw~T;0$Jb`zgiPqjS0Jitv)0Y{i*=U)WJ;zW7DxQN@@8@vJ*^$6ekhE5@aU5XS^~hk5ZfMMU5a zxJL!fa(b*$Xx`exEWQ(jjZ-}pvgRh{Z0u_MHFuO^$Y@o3&Dk3p571T^4%5bG*H6KR z%vBYKwp-$_Y7CC;`-BrNbioT#?C^2RQtr}XH@p=Y;~w))aT{$s@!+9axU1nFF4c23 zexu$GpB=r0TVu2UKj`d^cb}QZg{myU8#i<^M_ypArp-JhH#BMr#)?aypCg%DOD6-<{isx`% zKY^%kg5K1E$LOWRo~UnyIRJ|upcL@Se!IY9)V82Ct^LTDgWwzv-$DBKXxE>|vC(BxsK40?`I@>YeCk#e${Ob>*MM9x>TD(It0t0rH^F;|2P=@u z0ZaM9Ti|Lk%27>&j(q6dC_G$RhCVv>lc%&mpXYTc8hEp-{1)VpWtOGr=ARF;rw_on zMJiDI)K*zp8+4W)a%juyYS|X(bY*yQ=$r8sSvPP^!)jSH**8bF9$ZtO=`7m%yo`Vl2Z+2XOX zEO1SE&T`ZkYbWys*A&WK_3a2qJg19sXWL-w&fWJ2&u6XwZKnY3NX z0q?hvp^5&Fq+`G@DO6zpudC8*;4Sy1s0hiVy}&80kV?^&?s-x_;E6}1h;cqDy#m}8 zB}K+(_ei^fM|!6Yxb2DpIsM&qO){SpN$+1n;5JP~b(+po`+5Cd~k@y9@72Cj62pfTv!Spx2o% zBoBd`N+l@y>h=#0UjSDK}lsQk}BYto4|>^dRNi_d;;Fh{JWsJ zO{YnJo`{tm9`hfa@@-oT@QBlW-1PS-YYO(AO^QrGkt{8C(0eX$1Y@dS?i zETNsQD)3A8@n@-bngo1W?+A5G&ES^~B<-QDDFAru+ZgJa1_F;$tfj7rfK$5rdoFcN z{=jXqu9VGyFYg&mz0*r@N1b_w)HUS+Ykwb1{ZbHc(xqOMU4g|+2lY!sfR}!ILiruI zAd+;0I;AS$(E-YPd9r}J?YT(Tw*fC(sC+kb1#r8Q@?M@Pz^z}RscRYyd~8M#WnJJU zUl&n#qz3%PQt6sHz+E)$S9ZEy0xz4X>~u8)d#xKr_tydME$&NQ69FDLx*O#J;E}%1 zs0+#gKK!_a@-bkjOjF(uoZP*L@-E;JSlQ`{175W309}s+9{Vkc@)ls>RAs*_0N9-s z({=vc%#&>ksTW!ad|r$xF9lxxV;1E_z^2{oDK7vPoz;QWDRnr!YkH;8pRV)w z@(kC_rR#jBYu$iHl=*vkR@FCC<~vIk$pnmE&6#wooYo4F*vWB4cNDidw;k{(PghW_q-l+W%F+-?7A-F-qyWhyPyAL8GYFoyCU)3$T~%+ zWq-zbb0j|5?UF(iP|5UmfO$#ZPbzk%z`Z=SGw}D@I~9uq9kFZLX#DEuB1O%a$@u5+ z;ds*!b46IxeB9onCrfQUGWXY1Lm$|hNr({kE{&CKit6@hD;ZJ8m5=CB{qBCx{+a4-*D*zng8_{2V4hFxyV zPK9|#cLRnp8YcbO%WEL#XlpY04qaI5W05#GybrVZ?-PP+BC$nu4@Os5OSIod;&TJL zGP;uriBvrbkC^cb#r!-*K8}RB0gKy_#eX}=DtIrCjQNPtRYFM7Eco}i^felN#hXl9 z4*%xAeTJUbk0a%Qa1N682-ybNkWI00j&trls`DK|BKN@T1*;acvQZuGx`uO>zITv! z*G~Dulh9{&yNN7cw#j$r!rg+k*AaKIT3%HE9pjWnl&4iFA6Wu@-Sn&I>75LD9f328 z+jYq8>~48g8FZptYtirX5pug~=sw-AhPev9a;Ca6r5=R?l%45~y8V_oF$ zn_%X^stP1HXC{9PIp^1=a&*{LTfP@^PIgKeN@`V?cY!mt3(y@aKi@^}3};tts`$TnTp67+d}sLTYi&A9#qExqX{8xGmVhsaU1)^u4XaBhGc zof^c*sv+lWvy!9w3~N~o;y$#%AC_|=|_ob5|+Z6niqS(w@X)$oOJ5rQySt8YfJQG_aMdnUtq?>_Xrb$tF z?jdOf@V8JYS~+`{v>)V_bv{zm$9}7H7O>Vtm|0=BM!FBU!9j|0AJ3820ngW$qQKd% z(m%i{8gTz$bxraYIQ0tL;pI*w!{GD%Kj^MoJUl0{1=h)tpdQzbN!)CwNbADl)WEHSa3Y-g^@Rx)Dzt{z50V)gW42l=fT^AR7NcO|}+--2a zGs{VG0@xCA&Z_kzC3(OL!=W4hVVLAH@Y7)E#HRG2GbkwdA;l;%{gZw=WN#APjk*sI8)m> zKcVC^?DvP9Gh#t7?XLHNoa6J%mv+|`kaI2_RnDN;4>@PKn~3I|SjaiI&8%q7Nr0Tw z!)pXRQ_F&!^V+c=%{fhwZG8Q@(VR07_>cWZnsb&x&KabBpXQuO$Tp^9tLd4V1Mup@ zS7^@3hinsEnM2Ri#sKfFP|l#Jf;_Y7?M|9=e1Kcblrt#00c##t&Y-vmc_u(d* zJlbj;%{Dr~)lZc758j8|qW@5z=A2C6+{S@4+pGgN+}DG$5IFL5JIyxzfUn^Dl%GQm zX;r;R^Na%czNUn725`&cJjzkPbNgq|4C4!Yebhe69>8B?mECpz{=xR18|XSegJM$B zESg(-0Z+(L=A3r;T>De5ynpZ+u+|w%y5}~q;-2zMts1zxsXxs>_gtUugEY0Q~mH zBg&_MkEGU7J_5YiSjnltQ_d*Q(fAn@QOnQMJ==hDul;WZ#oOlp&7gP^8$tK@!=6a9 zC6xJ`(<5m#%_n?!{pS58l=(BYNE27ee9k!+=S-PDQ%m;!Uw8fQhW~Zfg}<9<9+(b$ zTHJfm{d~?@&qUL8{!DGqnRk@=ob&#DI%WQRjob{P%y-wlo+eP{&)5EZjG@eDp62tb zDUStqJ{m=t&pGRIY$)^D=HP1O+y%4rO}QHqVlNf1a;7IMD3GXB*+bMRc9#_bun>I-hg=FDiTNJPYLo^!xBRC%;MA zQRn;Wu^!*)I?oHe4p8Ph>J43$Gcow}ea|@ueqIE>zP3sEd-9x?c!;j^dk(cOrp$NR z{qKwD@5AqT=KSS^+6prnti-q@vF_p$30L+``;fUCuv&x$mK(XY8&#V<9^SG7P<>>A9~ zABkhdnbnG%iEx&cmyWd8-&M?6zM324eS@hT)249P=ET)T!oAGb9x65rd%>C(EW@6H z+X|;b1GcUf<_k1cC@eiX&D_e$4olBcMEdu~6Bo|H{*(78bXPfG zql_`QU&d0!pEZ+kqeKT^nr*EZUEzgC+xNmx4*lfLdo9B)TV68bY~FHOf$MOYa|Lst zTNxLsxe4Dml*7zjlfgYq2*R%Kk{R=Ze%#2mV65^xnmLza%Waz)ipQQ<#hgt2#O|9P zhC{y2VFJB5)=VcH2iZ+vN{bJ$gA2lOAdN9aci+$9zRPUh8p)IUI%RPK(#dP`f- z%jUjheLB1chwdP9>zBMSGYXe&yoshHK9=`~d=>riI%+enm3tL{!zpTnI}9($E5RfE zxpEc#{Bv9$2>B}OQysckuty#S`D(d$EozC2lD`9w)c&~|efhmq{-6$eI~S^up8q6y zFyyN~36N9jjxWLqF#nS6#E6`?0HfJ~)ZEJK&iY03z&UaSmF z(daIl0-5Ua4Dd)pze*c{qfBI|qsv378)Pc&-%^xRTPM8;?9?npLT8C|Ampg+SEQ)i z`mA(4Fn3Uj)M5`yIpC~tDXK8sE$st&>ANq??|QRUIt@5>k`&>sYo&XDhd9DJfLimU z)xhxvQuHOrP1*^3rk@n4u62-FLN1#97oKgu7)j>>ul)qi3?~}|0u7G?Mu`N!r5|}`~l6T)E2?j>sk-UE{l*9u&f=BZ2m?%jF z&VYRNaK5wTIPf~iS9VEeG+!Npe5H0)i{>ls5cs!osk(%PJud@cMpHl+2|wfOH{>g^ z_M4JM;8~Ebz7DxVJ<>DCS9yu$G+&*CeAT=AC7Q2JLcSvJl=-R#^3~*aWxg5=9?5FP z4w|nLAz!sz3ZeN*5AxNNH%qBUx()ei>4<6c-N4h3uZ~?sG+*t9eAWA$GGC=bzADnu zr5>pe@>P>Tf10lzL8g-YR^}^x;PAnpX}%=sS9+uqz~e)d?*?uKo|AckW+y*>&nIPPX(I4Pyp68g1DDMV_?NFvwJ-RWuZjnZ zrQ8mmaZl43%FlrZCz<@qSMu+}Df9X2g^toA$$(Q_ztYTe5%{I;3(9=HDvxQRd<6JT zOATc{Us)DrQQiqGZ&fnyk;FUp(e(&muV$q?+5+6CHkhvS9w}|kbjp0bn$>?i%|g6K z(jBS1>)8+Z#8+Lqz8HAbMCCh!yhpOg)T8UXM|vddOL-2kr)xg_eCItxVK-&oDcz08q0Hy2!6S}Q=JVC5ZvK?{ ze6@O!@_uAKQ(46Hq3b-)zWm=MKA-UU$|tCiGM}j?zrFvD6K^SJaPj%-zy)Qt;d9jV z#j$h`&#l5=lzDeF^{q0q@qEf=(ZBVJJIDUZT`vot&~-jvmE@&S=JS@b$GkCI#)Y%E++m);*B1*+}!;F z+?cjlJi>VvxA;_ltT`u19F^tI&AXV->7DEnIfbB=N*ykC^e+E4TpSBi?PNi4&V=a^FS5x=>aYZ2sA+u)9N+sQM&OZAhp^S-4$&fNN5NV#2vCLy3Q^}MF)xCF} zbE!;`AydZ8%9wffTld`8@B94se(l#uJv`n0IcvT5+BA2BooI2wSU$yI6iw>gQT%(j zi9F6}GS$n`6@9)vpqF~gq=_NVgf9;i^x%}a^myO};nU}hv}j`l?Kk^`U~(U4riUz` zwfXym1;I8{3|L61uvJ)*{*!O3SVX69UL#};7x`UP(bT%la$#cnc7EES#q@V(sxa^T zQodkX488ezv2eL<2!HHL4CRx;4=9{{@ovi?L4i z_7VIY>reJBM;G_;U8w5dOEk5$m91~VAkP6Lw*Y%#LD%4!4M)ae#`{!z3HG#2oZ1AW{|zo@9G+#f*#NzIU*-l(#`O0Suy7siD&CJFM~T)N4T8}@vi6O40tzjKUW=tcTB`DfvsnD za~BivjO4OZ*fL=|w>c%5Cix`8;htMKw{&!q^5WrEoAq2C_T&ppV_=zM7WZytGW}Ds z5cC!-=i01B_bF^XXV%_3rTP`v&$fGSznnw@ItnLFg2XcW{GX38su92-Vpq7 z6e~xMhz)Uq-k*lB1<1-ON0>jXKWm5{QTu+5F!i^L4MR35Z~(*SuIvTmw4M%NV(Q46 zqdVl7Z4X{+t=VYgyIt*J{ZLc(9P*T1b}*Q9VLPHbw89=;quK4*smQ&{Y(ajlHCupe zKFk(AhP7bdBFmoIz+t{A>x}Nuup}GUn*N)KK=$Zi19opdGKZ0?#a=MrL_PBY`OC~+ zV0*QW>50BjdYfM0H{=fEk33Oj4Y%80WtMAro;B>SJI^SPXPR0=O_rLeN1l8W=U=g9 zOege$ELU5Bhud*xAo9+kR^UAU5EG7kvbhyxzuL!aMjmz^@AAvv$pEs?DoarB*~&ac z&KYG1_BYov&C&m{?raH1`e!kA$hRI_faB9;j4$%$BRD6#ERC6qJSN@(OjF{S705q* zEP(wmpV^PRsJjJ(ou9>&BcFPYj?nWU<{@%Hg*oKS4`6;E(;Rb{B^${YqYE@E${ak$ z4QA|-I}SGor}LEQkKEVR90JokneoWb%pBGx_F=-1cRn$Lt_pi54f*0}Gsy9_Vm4`> z-(v<=EqXEskZ&w8gMK=l8711YNK zj4tyBdFF3Z=sD}B%&;2ICO^Y_aN0G>x*=O%#`(4@tk1X zE!jZi>P%Cp7+)Ls&o@}E|e z-!^S3^%L73>>@^~htaq5eyBaeHVgZU7t(=!9;lzcKg4|ehkIC&sJ^aV&Knm;(?@QH z)erao`z7fV7vXIb@)QMyZ2Up>g6<1(Pc4>sL9|R zovA3h8beRMjpSvGEybrlW2sL0WZt346=Cx2INE&0FuvuJJfTNiJoVa3`DKfi2v`2b z)82F3`I!TP1@#=Pah2Kgg3?RKt4yHhyIAn{7kUeK+a}V=EnWHG-<^b)qY^3etUVvJ zq`Ba>ERlBj(whH%?mZ-6=J{OIg71U(m$Z10NYCpv3GBg zLKBkcy;%>5%E=n~tiZWUrFTiEm<|xS5$C{%-zLA@o58@HI0HQ826*XYR`dcNL%E(noSCi`;j!83+tXGov6`YM9n6d!n+c)k0qobUku{6lK;wd|473+r9J zEz~4)@+D<6tat5*5{bnjg)-*})^J`6WOUj=r4iP<#0Y_m6LOT(u-+B^7s$MUtCgG3 zn|iYuh(}|pvJh)uQ$2yiPY+WTV(m-si3;7S@ye}O@3PpSB4drbm0_6cOng;j=~H*5 zGuFGjTdGKN##&j2YxG+OE$~^u=1%+%XEG`!-4ujqFJjfMiet#1Z51Rp)mQNnInqQyK7WuYx?r7Z zxt@Y>r|lHp$Q{38U!!|BMFjGXm)K`H)LO9-xzjzIu@k7HC_x^51!KHlj>nKkm}16Y$u+E>OPcin^Uwj(x|jX)lhgXfRf z6=l0OqO z+$s_4a#B#dq7-c4bQB?$P+O8S9mmBX^3ze!gcAH zenQ@l^{!)A=aha!9yJZm9~lHl-c%>7ef13RD*cP=zp&n=m+D%ogYVj3u-@gTu#)Os z`p6jx)avE=3Htno!1M+de^?&-%B*-^^Re^OXdGeIise#~Ro1wXZB>zxnBsH|2?TnC0owJ#Pqp}kD1cYVkDRZqrN>L)6YhpW0uyaajw`j%3?YZUTO$0ib6AVF{NSukh?A%_dmKBD)|K(PR{gCtiER~o+zHg!R zrYw<%SWlPgS8b5{qzsk#H`W=Z7J5nCfUMT(E%80%fN*WS>oW5AHEpDRqKN!3Q#%){ zSi_<9Qa$Pba$49GiF1*kRB6xaZ9#U4E0Wf;kl%egCGk?^^{ulcPDY-huRWs|gS`B# zw)Pc;%%)G4o(V@jT+(0SS;%MAVN(4{Q|}6Br*)`;kZ+XySMTcAM?2qMQ|~&(wv?Xt zM~=VrN~+Ij>Ro$fPbAj#6KU}Ui8bC7ck-&lni|)(v>J&uH7;`xZLLgG@qhgC z)h>yp8rRS+(({_SR%f68X4hX_t1GQ*>RSAmebV!qzTwZBX41NbQ(u)z>zcZj&th$_ zP*ck~@<)3%P*cCUkKXFn@NMj(`(wR-Jj{ujBS&} zq{BYymcIM=anTDzlO;>kaq6|C%j9J7?8Uw6t6w4o<&_w5&ag@~^RK1do6%2C~8U9cG6Yn-I+mWhSl@ko-~Sa=jPH!k>_}ajY^R@ zH=ovf7x3%<<%{*B7SY2~*7L2n5HUqqOhbOA;4|)Gyk{&u(|Ha*^70p9#Lzg}*)o7P z8GA+;*fySCG9AJn9JNi@wm+UGKVZTOBiIf2JJ z40Se}@>a`igiXB?Y3Rhx{O~|yVf2hd+U8X|ev_ZB@OX0~b$2!77aw^656>i0NAu=< zeEKCw!ZT>2_v-TLt|y_Q1@28F|B$PzcfnFCJl8D$N&o z)j$%42SKM9*q2%UoFp|2f~o~cw4K#sqN;JhGaDL@=mA-b?+M>B@tpY1TGFyv8z|j^ zSt9BdseSZU)f;<-)wwmKF7T;p$$=y~vFkPR@9ag@{UXdHcdN;uyC+oRv5sU?dx=E) z?pC$OUZG)|D$?fe8kH6H3NxZFkkdXXs$JMC>}7DC9KIQ>%D$LH9V^e0hz`S4Of}w{ zlU+$hdb6q}*RUS7vVzDj*sD^oSLnaKoHXs$UFCTj@7y_hhO}5~q$|AG?Bw59Mchi9m2)sJg?v$xQ>kW36UCa6t3&oXjeWf{*UEk&pD)4w;Bv97Bj$v5M{#d$cC^e9xd%Gu z8!B_l`Xk@LULiEDEAvNo--dtY_>8g;WUCG6du)m-i$>1IUSWLPl(G!uOzagdHS(35 z^S9V5^v#w@y}}dND=bU3D?5nK+>6KktDvjooR5nsBSAi`CFi{7B6LOiYn}7n=$t<= zcq8=+Q?OS!ZOCn@SJ)b}lV44Rb1q_D5`whO`5Vkj+bfz$E|xuVvXeLRIMDVA z1L%-Q`;*HLoNVqudogBjUjWSyrjU4l=oZfoQEMl`ljs_ zS|d;FsddhuVHRqC-CW8`2ar>II!GC5A##WIS{G{ovPsZbDKBZ9^MJw>i8ao7RBV*Q8t44{&mbum zX`J&eQQGYE4fnWzII^fGX3iJLO}v~WzKy)>OBadHBhMVJb+J^)KfJVaL^Zua)9_bP zp3(FQ4If>XI0yOW?+X%ZdW9<&Xzu{hxL7ush0^*GoO7cFdnpS|$8~NTFR{kOTJ1GdVok3wy@!d!!oY5Q%d+6X)JeB`c${3pLWIk1!Z8SW+(p_5D@-*{ z_3Sh`%1_kx>@>V((sOBDlc@raYCR|oJ49&vjGFA!JWcz&CSSEs&z7Foth*Q;k-nEE zQ!RMjOZr|KuIP78dPc(s$7%g5P1YK2sGW(b;kZBBrDrr5spLD6zE+d3A}vka|G&3* z-b6ctRP)U0liFUShKJq`{a?PC#jB4$5g!T{QbNRb@xDY}_DRUFm?qZkn=3w^VkAbK z@fUCId@n|3+lzJ&dC~l=tGafsk9eZAyEvw3w%X)Us8~F*R*3JBrPf^;FOKu)g?&$U zsS8>qi}Q~bk^b)s)$*0$V$z*5-gDt8^_R6iV%hTU^oU=H`d3*ev3s8pbTNNiJ?>zc zz-`*hEkwKv3w_)bS?YJm8~9Dui|D_&B=wSaFZoeSFbyr9 zq1G)kq5Rts)W=|$I_|0~-Q(Ji+Ut3$|Fj)KlS@qLji{dL{g&hD0_T=AE6PCqaqSGc zB)x%ed;YmN&}SZP)T!jXURH~vF3qQfb_F~;D_hi?w}{3Rtm6}+=83|&#dJ(@3cp^@ zMZ~vL+GqD{zVQBMVZ?|yT3Lx ze01S&=}i#UtV*CS57_V?{+#f-E`i3*HRW^lYy@4~L>lhinKx}>EG!F7q!DM^@diJ2 zgjZV<>EsTE{MPm_KwX|lOZA)cU4B&otxu%)SLyOC%1*$XmUuR**B|oBVi$C@#=W@P zS5jS<1s^eA^?dlAM9z$d^`kKZjB6m%OQyg=%vS~x&q=pggP=zg_SXy_lhctd@E7yd zhE5O2?15N^%|Z`qRV{)2M(_di)y3(zh$sJ76@>Zf%i0<;=kgO(A?B-Yt*?>lK^IlJ z$FR;*T}?iRoKVGKzRIk=L@J)`QuV=nwO_A_3`km|qL{BN!!M96ACpz3n6D1&o+lRu z2CI%@zDgC&l4I+ARl_k~UD#MjtUocTjn~k}&Zr=1k@l*!n6LU~m6M9g-BjL~uQne% zLyCtOsQ~lU>U*bgrj3s3H|DDaJx`OusJBXe>;oQ~uO?q!+)+NkeD$SHaCXALWq-!WfpTLh%wOT4lL zW~vWefYh0XD0MJX^*f96qul+JPmv*3MTY6fmB%n&J#|x&2~(Vv;h3*FepZs{E@sLu zn5nAEl*DM1vGNr1`gA23kf)~{gqiBo7$wCYZ0XpC3@nMs~z}mDx8(p+f$UpdjLzEJbt7OE#FVwk%Fn3`5@L zs~~zS=P6bpcf@?vqt$pt1#&p%s|f!=iXX^vn6Dmrxhrfj7j?vZ)iT#g;g8%M^Oa(< zi6Q|x9P`z!3EF(scnkBujh|&_aD5r(t7}x7uexKt@{nCC`;F_HF<;fO+I;m4U927X zg;Kuyh%Q!fk~Uu*!+aHXbY0n4%tgkSuQvWom-3a~2CT!h)8?xr%vYORY4g!vxUl|OpkX)>C%vWtowfU+H^HsNJd!>AJAM;hKnoW}HZj1Tq!hLPN z%Eo-Pds(dHVmV{J`k|UXDu@)dRf3^9lKeCXab+I)0s{ci;i>1j|({^a{RR!|MRBgW6 zgFO7w5h-7#A$LEob=_woS0rg&cVA?Aqt?Z8Ltb-J>tbp0)vKo3`B5#A>5dUncGBc4 zYx8~*KS!?n^z>jcJORRC->o#e^EN_S*JQ1`xl1J0WUZV3T1rfj zTlc*yWeg4PUVBGkO};ADee^%}aZZ<5ldtB9O{A~YWGX$`NoifmSLvA&Yckd40oqKZ z$x*qZv_6%FH}&QJH>Z6?2kjhnO}+|p`zw8|CP%&YxF)eCJ3S@h|M-sXJBc;fY3w0w zT}zXZzQ5Qmt!sGIxf93#zm|3U$A5F$jWgRx&uE;hx(D-%G|yW7%(_qc=mEBJ>Gty*e)Vl zs6DZX%CCfrMGH%XyWMi>jObZnzo=V6dfgtHJ#dx~9V6l~} znRv>hgScJSPaHkdSo8}%EGiAAingWSg!-yx>YO{_qK8+hFvG=JU8Rl_KlUFX^xZc` zUHm;+oV;Ij38Rw|rm08V3>C&qjHNyL3{e-cA{@p&d)aPB z^{CPu&hB$E?b*Do`gGYtGAtf@48AYKWwYJ*fd+X0&5J`~m-I<|q+uNOh#Dq79XpO6 z;U7n%THGKn2K3-peodgsJ=W1ZYZ&qy{fvy3t>lN*4PY<|>nVZ5D#nJ3D~#XESC$*V^t;Jo{GwWUNJt7_dTp`z zrJ+O~eD(t`dpk}1+jWZ^lFaaqp24E-p-6dg1WPXj_7*FgJ>@gk45Q;;cM%uO)|0E( zO`y+T>Wjk`y`T}EGwAiZuZ6(z<@Bn-9J(_4iqLiG4*IbuoQ`i-CZwk=pqs1a(|b+@ zLPet+HF*<7x6R5CcIN2Qdvh1jbqCf7;~J~@yQ`vU&fOJ)>(V{^>cxxcIg=$qFIgtv zyI%~wuq{sbV;8}5H8HeK87X*p`|_*D;>>)TSwi6y7e2cxmNx4+Rj}S_&5!CAN1sHF z7vd7S^Y6Fe>@1hjLgLU4yxHeCI(4*! z-HxY2uJ;ob^mt1ynk3L>BVC0F26d#nUjps_+fi6=afkH6`sClIHp1@1)nt|`ffoF; z5WWN-`VC3B%ho^Mg`$)gpDsCV98Vxz5si; z{A2hmj3dL+v9@M;AGXdIPMU1OGn@Ty!_P1;a%La8<*TlPdNCnI#pv+=x(q2x`;qF? zcouct1$Z>24{^GJ-*;FgMCCXT&HRc*4yWPp8*6eEd!`MJ09|6uh#h|ZG#OO}Kkd7b zhCi4yH=Km*Rwkrt3-lSj9)k%T+L1FjN6Rgy5IPSwB=uc!##E<6FmG3Lvc)o)ez?9L zUYj)~H4Zq_>EJ%_&HTgdaZ9F?w(o{Vre8Qi7Co7Qoe=Tk4cBo1x^tIv;H1fOu6zj2 zGdI`$JHYRMu%{`JM$-+DA=mL1rEQ1@q7JoK_2)MT%|~e#^(XzRl!R{e2I%FpIH5!$PjfExF#1&2N5I%y-MIQAI4A1UFwlS7k(+>?TZ>-4aGPt(mEs(&^f^Oe zN`(QZkDgnNI2gvK=yBe~nt4{<@Fk)N7mc3Vlx#0pV)l*AM$avz=RgQjzh#f2=XS5C zKlqeAW6RKUa~Lg$u7>y7Q>A#%;9nl+v(>N%&~w8`1@#40>{Tvwc#zp#+KjQppyC-kh@&n`pHt-e)17!|#n^+eBY zUwaQI^2=c#BVV-Y3%OyN*mU&VnoxJBKfQ)EMYrw4G&e9Fwvs)8?3LvTiG~^MKy=#< zsnK)$lgw5j-~QzS6$7K$5#>1Bigy8<*YnsaWWVLkVAL>!9f)pQ``X@+(ti?r3OUZD zH+X*VW3A9_8@k#F7QXReS0l?mI>PpT1KCf=R+AketD0rUqT8mda)2KP-Pz;FSL6<` zvD%4kg+80T(jJ<++pyD+w=womd&i6|My?m^z*gwW>Y~H;X0RQE-S5DTKwfy$7Pj?m z!)`|Q54DBgl`Yx($kYGWfcMH~tSLHdF#{$oH37z^)&O zOd4|Y01LPmu#m|`Zf$D;zl`QGD$O%L&Ec~3bmk87j4S34xpV^a5qW){IkfCQnrVez znSY`==u8^QSRwBkXAbWU_Gg?F&Bd!m6R0fdJ@1}lB7V>vNyFC_Q~yXOG0m5wjmO)| zbDj(t1Yd1-5vgSFTR}(CD&63OO zAGD$N>M>$%g{{0~q77|X)?e&o)r_*|P3-dyo^XkR%^yv*MEYxYj+l%q&CCY?+ zosVQg6YNC}a2IqBJR_q?0=@LGw_y0;F1fcTftDS!6Lz+|P9hH`&_4<*;feeL3A~p; z2Yxpd_B~MJ+$i+8Lc0k|)TM;FVPCRECxLt^B1b1;zw)-R;IZ%k2}#C0P-7%4;rEcO zyA$cDp9aFSQ8^^)G|rvyZ7y6qu#s3iN~8vrO$CF&t4a0GM5+pIBCP1Oob2d;-n-vV zXz86siX5>fWBD0pRK^mUfj9%I-#ZA64JYQ~aYj(qE0CE6lhV0(ZqfWHY<8PS^pkMT zRpSF7#iNMj8mz7Tx&w>14JJ;xco(7U2GmWUWL_bi8ZQVEUa4^Gv3Au^ogxde3d8=y_h-4%eT(DI^4F;pwb)Y&W)7U#|4 zI%5V%8ygJvML}HLcHGPIrh$b|04MI$+yff~>77P$uXdp$x?wV`8912xvIp-O={*sc zV#+n_LudGL0JNCz$(_x|Y;$ldw4C3E%PhdZpXFm9z0{uL4&q)DKN^aN6?f+l&Sp#- z2}_#xB`O8Q^+zALwz?kXwu1yIsH#*gmB>cN6nK z{V8wAXLY$&m;vVZ8U(*K{bb!R132UjggeHK>~PEgX|4m{*_)T_B+LLWFKb>!9b7Q7qKfa1DJ<-!fVHa>>$hl3qt!rmy*5g59H#x9-y1DgU!PXkQ&<;3Np5^K9~X0 z*1E%t@^$Ph7R5l0sQ2##QeJYkU#eM%k zstb6rk!&vVr}NGrbPZ*@;J(jya)zX_Q`jtI-+8?u>d9F45Auz3P7qT*oSlvP{!Tk5 z*wi?Py^1_*og@4V=UG?W_kaC$fSq`VdL44N1r8um7xp#smIiyUU1i4(zsz{(u+wrC(+}DIvIW>a%3uPJA8fOLI~6I+V&w6&EMU+1#mpw;QcnvQJSvrLr$G6?xJ(GZ3qLGmDVnrWxGnXUnWWo^{d;gp20P4&>pR&EW68 zZcGvKlo-6n`CLcl4DzN)W-zjOTc!s288ri&4F=3JWMYl??*!^GpOLq>G6OxX3DdM1 zKYu=&LPNz@nK3eV&lD=Byp@?D&#o|q+q0g@dLu^{nu24&JsFEUew!)0@~@E%L2jO5 z3g?Ga$^4NM=HngETgqiqk&jL>h2xeg*<9qU!%X2s%agKbWLMS{)|wT{Qjizfo5H#H z{j!zFle(IMr_FBJM&t(urtnoSN45j`+pnI`*J6__A9>eXyaPIAjqE7$jYmDfsqIQx z3G$ljJz@KWbeV`;RoN4sBqz)E=){UKC1FCvwom+eo5fEP*J>c?jagj}3ao^csx$e*1m95@|IZ4Mc$ z3muyZ?VcslE+^lLt*nwkm6A*iy$^`Tx?90i{5@$|_f+WTwg$EZ;dzzLUFfC(-GtEw ziByq#oxYf`R+zhE5pC7fLB8PUOJPXAU~1WFp1dmATAVs^AkF@~QNAMCUo1FdM5kXZ zl9#oM7GHU0VfXZ${KL9r@#l~*2y478xBNawjAW{Wo91=$2{&cpLt_{5nnRu3Vraea z?(qz9x<#!#!@x|~cQ-*?G47&VzxF=4oth*vn-9oe)$ZmeKUyF*Ilf%pSn`2y-#ASi zSTjy;d8HFwVLn34)@9^_w!6@aelpSIr@7p|vllH|XC=nYGLnbbj-kWx)|i{Ueo)=i zDYTROA7ShFoAgvw2rXXzKsbKxINh~;9zAxmTo^87(#pU{dZ>4i5dFoE@*ft^ISY3S zA9cFZHf0N`fzM{aXh8#Spc_pM^0Ndo>;!*BZ!u*;mI}MpY~~y9E~ec~Qv|&isl5C0 z7+SGxk&yXkGVk6o7Uz}C6WX&ZAGR)*{^}eoG_iKzpX*?4YT#s{=PEP2k0*}$UGW#v zS9j(Yo{OU{>fwR`)0V%~Bc4ueGg!Er+Je74FP?rVlMA1Xba<JN$|IL zTGpno@N&%yQs$mOOZGVnhdSOTPr?$Yd4#=CJG+K7-HUTvBdvvNF&D|A8woTs-%RLk za)vC_O{8txbQg?Y;r$R!iF9~DC*g1V&=COJ2sIIckx~!?`Fa?mo?=1*F@@F*Fm;#h8vJ=E+_KCSc~<#3fmeOa$13X&+}Dqu)jM=JCB}r zy>TB{#8l`@l(r4xA-P#{Q=OJK$QYdM<1b)(yh4Ve8Px+y`Ggi*#xW zG`&#Enfl>ubCXTryzDynF90)7=6V>BR>f@$#Ck>Nwa~Y;f_pk0_t3H|*liHxsy3m`h8e=Roi83pn>JSVLG93U#k%bINVFXQ_h0 z<=0fs5_4&7i|JsTGM<}+Rmr(Mm`jIv zjEB4g8JC8+RR8x_*bwE)`4-@wh!-jKE^^@h9>9N#bE9FRlQp;F5a!;hk+7n^Cue&E z>rqdK!|5lTx!r~MZ)7+OPMNglT3{|cJj4fzQ(JREm`hi08Um{=TX6Z9OFw+{hQJ@X z+(WEWxlSDf-F1JnEijiV?+=8=`5##;%%xvL2f!P?o^>z5dj@s-!>!;t))RB-$N~zV z>Ta_xm`kTl=3(5?D{K$Ur7e5l*o;f(*nh}Z>RE{KRI_(5m&(sDFz$6JyB~Au%RCvR zzc|K*VJ@Ax(Gzs653%-`MV+$x!Jzzo>?7pAYdqlQ%$;l&=F)lF`@)FnTUj^EqFs)= zgWcBk>^0;ASKZ)Si!62y=F*GbTtRhs8T$*_#>N#C8ENb?%%u@i`oL(5c-9cJXuu8^ zxVL3Kn~A*PsWWs5o5eQA{Q1bm8R9ktv5CkZ(tAVe?g8vu;%lBVR9$< zYdn}ejXZI`Bls?%tQF?ZP8}SfGw;bRL7unN0WA1F>_cSBzxI%oV$XVD{?v=NhYKyO z*pURUmWe6he95=^U^jmRq|SVQ%&vrHwjPit$KS}rhOkQ>XbAUdOjv8cj--$X0e zx~7O3ft)O}f|#2Jm>A?f-z|ZgxtH06Jf+MMuJ+!+oI`$>UgozwzG28fPY@&o}<1^He(6$3{HU^ap>sFo^D7mk*gPFZd3J zf~irfv9y=7ioet$oZe<%P~Q=e{Jq*3N>;hbo0aqADgHi;*bpUOIccz<*A-_%^~;ez zZqXB5KhYx$*}VrXDig1{I=^DE0@=;#>> zghxqu&mSL44UW$isOZY;mBi9FY14#}Uu^hsR&n%v^#q~(Y7c(r@;GW3?V#Pf#Vy@cF0`uvCVcsgI?g~;eXgs;N;wC{TggEzh>`&uQ?)jn>5 z{-h`5@Zbd6?Y)z5Fte5{PEMecFWCz1rd%a6iW6x0LrY=ExpU;`(*){iZ7MWQ7s+ls zpSWX3S0Q#{30cG>QeSTqLELtf%$$ZkSPx@ig-rp;&q$;J=0-w~zq`ns{rJo%10kwM zHhFY5krou_3#-#MkUp3_t8JSKmmIQ4#y`AMX6HY+VzP`h?SeD7+n4$2mM{bqr@(R#n4El_wc4;w*?s7hzP0E2+MO^|7{R;oD(H zvI%{yBd<K9+oymjY-TraZ6?-?f zd!Y56ubfhbeIn;vI2HbmyD7(d^{DOeGWi9!VKAOCU$G4uYaVhxhvR!|?PeGrdYfzG zkLSDlZ-gw_Rqpl#tW62)pv902+*r))mqxFFUu(~BS;5J4?vG3eGFEZvv+*7L%1S&p${Glv5X6Mw*cQC?Z!YsrX9EJAoje>MuSdIOV0E#<_d?AQ1Pxix9>H!@VJ8oDL_) zn$^`hFBtXkI~#)8p!f8F5H1VSO4b|m!2abd9JvN;cgzD9f*BZ+bBcY1{M%Os=L(Oq zhcFx5A)b(nWJn&i84<>Kj!*<3z@Q!)_nY*1WM-Ca;7Y4^~W#jBPY1C*^7OQ z{4UxNl%|9oh#4U5xdV*&(3jnfoHM}za+*7{zmWB6?BUQfThH3=yAS#I z4LeZX=*E6VwhOd_x>p@pIqv(9>uq6ztS!3&`B$7RyaEIE3bJooTkwj}W833if8c-( zYz%3_jzNCoZ3Ep5zcK5OKfLS(FAuzBE+c1U_JYd%XN*4X@A>Y%;8No~h9GySvxbl@ zHOvBJ#cFGKm088?Lynf?9ndx9%uQs6FII4Cnu=+Ld%Ehd70hQ&GA_tQp;nL(P{>S1 z*0ZvL)1~{F4CED0Eg>ghH**9zDbEsWWI0R?^3~avuyph$<{NT|izOV*U&D06z1#7J z1x)R|lHri`D{v0O_jD!@xnZpZj5?jnBp|DT@P6km(M&dSgbVV~c}xlNYh4RCBhFxI zkbB)Whmz)#n77FKN6ew$IX|X3?)B;E=5Xqy4`YVBBG4Qb84YCmAscv_!-pL#GXnWr zdvi$2aA$&%2R7pDg*{G8EOOlyGdSPIhRH&%IBEt>ip-c@$dA^V!H~^enPOy{C^I;D zvIA3zymp)!d~VZ*xrJ=Rnn9mkEt!|dTg}Yi&Fp5(H)QMPX0YSXaa)jCxmY#nib3xv7&=l^w+?DZ~=Qo)`_}gnTALN8oQ`qq6f@~bJ zakwe$8GJ@I9XVu@DFoIjWMRnRLrsBRESAL}+j^S9_D6?hX~@fMOyOlnzARJ2olHU9 zZI^5_a<3Mq5ZAa(mWw>$M^9+gZKJFJx%+FZS!Jx26(P@lfOk5#Ss^P$CRclcOYIVw z8ab=HClo$Tl$}QoD(MMxu0_cry+#Rr^W(&qjD>iu<2pf^x=8HnR3kbXUlSaT&K7GA z*sDwWwiAEe@Do>Vovr?CN5t)kj^ad%_3Fts!D3t4E8*6YL+U2O6U2#8PC~DVYISj& zMDfGPuKetOm(`Dz)5Te(Z~42QYSbfn7t!XhjAo3uuI^rNPl(_{X_5Oy^}5R@LU`Xq zda*aC`6GYHh^Bal$BaUCUl%2>KRBFz6LQtxF1Dd9E|0-F`)c)$Yp!%@pMKO~&UAG{ z-B6k~w+F2-bW+=TkEhLlw4kMSKgD+qGw3JldcMim1~GNuJUm}k$wy?I6+1kiPk&_Z z=Z#wJ6f+|h(L-z3@m3k3qVBcD^ugQ|e%t##;%cv0TIMsG_gwo?80i;BnfP)1=}NV5 z!z7;G%o)s&day;feK?-#g|qw*!x*8pZ34Y@)`gE*GG4IFN}zL>*zn$sI3WB9o)h#j z<(uU85-jWz=_-@Xc#A_jA#P?O{c)%rKlFr-P`Wjd*8Oh9XJkKz`4x%ud80o6Z*>*i zM#m;3R+smla01@6M5jgX53#Jyg$!%V34gzk+)Y_9hTwfc74OOCM{)3CbP`=b@ot*_ zQvhaQ?PB6{GFN91OhJ!5@n;=5ZQ%m_FspQJ{(#KH|8Hhz;T-J5T5@}e5p>^*chZf$ zMf!?=R7)|p49%z^D zYR@%vyi+R37zcaRcJ$btSCo?;>$<5%WB;xp{|pIlYot1lxv0;b)5QFOj!N%-5)JBh znlv+ct89ZF`_phWnZE9hvf&Y)-Mc1|&etoI*^lw>q`ydvkDpLlWACpK1k$~Ao-*@U z61_hN`SfOG4dyF{J3v~WT%r8)0%r?EA+L{DwnmSAQD-18&(2ipp}T&+LPZ>(j8?ux zPK#0DeY;e7vLT61x$UmT% zgM4_ag4q7bRseE5dh89WvJ@@QOIJ=;kjkN{is8r}=&{#1%u{3{D{!XhLUn+m61h8i z?B!p*B#+$%J@(>1ZVEfhlh^*?d7>#+im}KKai*xLnTaA1*#kZHW0oxyyO9As_T}+f zk9|CP>@%)ED|?LVAJjOH^ygK{V~;4ovr9L$Gey-Lfc9Iwv?8J@)!Et;c=_J@&27v@=Ds&|^Q{ zOzW|qibu!QP3y6{$Dn+3LpxKn$s(MEcvS1LcR-Il_lb6(oE4~=&`r@p!L{qpvOL>OzW|mqsJZ?qxIM~pvV5TOzW}Rp~vnYsrA?& zpvOMGv({rTM33FLB`Oo>?PsIMUK^(M*mnlvnJg=<$6ksa`|HtKkNw#sbh!()=LD^g zuT0f?>srCwK$h^%1|$OCEcF^{i5-lj@t16`4i&C$+m?}03A94qp>EKMXy-4ko%v<9wu{? z_!h2bkLe`w1?0>QE&k`Rzq;B?;$yh};kwpc&qp4Vcvo`HcOd)p5GCG-{KQ*3V?pDw zU(_p+)-@jch)}J&o`C#zpw?-RMxJm&JF{KmvG4B@Bt5U0Df+m8lYI3Md1O?{1nO`R61LdBAC3H{h4$Q^=A2;GKdrm2nX#~> z=(hB{#$*3?vsz-!Il=N&g~S?neL*y+LxkHSYSKRBvfr!}ZU~q~|s6y6Yb8`8y3C?6O~Szcuc9;&ylGc@5uN zElTSekNr{hfAbdZ?`|qRqw&~{vkpk#OXIGWbkw@^8h2g4d8M?jVL$$;#2Sx1D)hfO z?Q6bi&mMZ<`pbbkq-Qkl`ip+uq(5K79sfnR{lCXv=dbnEHS4})kMz98U4K98z4YIu z;p@M(^GG$^)ig```8ChGr#DKhS>H956hAmHNSs(`A#S)P7sa&EV*Bpx#n&gw#lNSg zirL-22rag>RV$q%#qM^;1S??FW1q&0mX|z)0ZXT-*L+LA!2 zfFdGNGkfhl7AAIJgM~^MAPowFsDvFTVuFeSf&t9T+IvteEbPX@Ja&V@d(WEp=l8$Q z^<0ZN9M5s~v+w&^_aps`Ue5g<5T$7v7b*D#%;wW3tkAsm@s}2O+~;H0tkyJKH$=+8 zok8yDDow~w8|mq*zQTvgiJBc7Yef}5T{z!ALbHDE0dZQ{B4PJ-Kh1-EZepkBm?erF zsCjeSlP2K3?)8FhnroiPt9Q+y7RqYR`p%Fle(zBj1Xu~bnhlWRx+N++y7v)!{OKyq={-`B z;xks*_1jp|+uK>uwjHv$l7EP;CO#2fB>D@%areaZc6)_6MnS@Wv1MYT&{cx}iG@Pl zzZ!!W_nF+@1naF=-XWn00nI#h7#xkY^dT%h}UxY*nmJP>>SvjWs@T*ZmUfnRU(WK^lC3XoJO!N}FVAkQhZT- zkeJ2A3d?>Ni>jr2i2trwVQyzban_pcWCHdrHVArbC;!)J2kOF zkL7yee^XbI;#Rm@msU&LM<Q+vO|X9i){KKN{?*qxm4JAc@M1&{K?sS;9atECsjLqV4bB8-OdZ}>c(njhcUgdWAKwI!yPhUzEoZ~cP8{S-l z{K-??l9`w-iAba07f~*9E_4H@6dKf}m=l69k5RjlZqX~`D&WnHzq5h{wLQdj4uiLK zE|G4Xmd(kcF!Ovqfj+pkle2;T7WrTqb&A`@J&wokP!~(jjo!osCt>zxb`;GWvzEKM z68hVlFq#yX!WpLGcS{YSIoDQj=Fs2z4O>V{h9_{%p}%Ex4Wgw_qq#fq=Bh2{)3%Qm zaj{!42P^ZZLEqiKfBGcnUE`qAf`Cvbojv)a~#?vU?<{?N69-va|>J9lg6xDDBlK-x#C1~g8k*Kp}DQ>>_p#YPm`|# z`z-E3|2mGB*MPGxIZ|)q;quwg++3X;=~hoK`9*NW=I*p(5ifUw&epYIce*RoU7iMR z8{Ulu#`cuI0{eY%po7lY%LV9cHv+MLd90Ou16ck6nWz?><jdIcVVZ z?dje?6L}PP!g@P8dFe{q2ZnNwocqwN^Kiyp`YXzNIG zMd)V6nx$FLF-wNYIzam>n{7d3v-`_>fxieAbY?dq8w_6G(Sml+cau#AZ~kdc>zX^s zLcwounbSXubTebCPngpyO)O=ZsL$SFPCMT1C@TO5N1D?)pWDdFz!_7_>EV95nX!io z@Hqq7Gt_(9nqx+*k?adN(Fn6=OLQ}1*S?t1haG;fnK6?GW|Y(DX2#r4o6#Nzt387Z zdP^36U8O}Cm3+7J?h{q~`@M zMfG1NjXXV6dNzHFXzy`S}%6nd`GxSU!fwU~B*k9AtB zc@^y=HQ3igXjr{Y6ZWRJ6lmruw9il1ynJFHEp0YI*gY&+)6$iSPaX#eevy%ywr_@u zmL*X_iHWa99O_N??Y;yaT?LU=f`K>KOtcG z9wyw(zb(Wkw&G`vjTMq^cUOd2b*CNh_iD@CU`6AvY2u~tON8X=t%`#q45Zuu-qMX9~2?MaZ<$8r_2Mb{5Dm3-=U6qpb;xON;Tt# zN-ekkQ8Zq;O7zqjXDCVOKgv|C6q*c2& zC>Gpv63Pr@_!}9Z7(aKAaA&ZYG^oT?G4$aC!8og_WZSioVqc)2ur=qiSoTpZ?0z&? z*mU5A*ei0su;giwVBtu`kO`Pc^jaj`vOXjl9aLZ*Aw+P^*&)tfYAnohSR#CxzCo<( zcbgwJAxu~}GDU3oem}o;Sh$chF;O&(Sj$_rju3X7j1g~Fgz@K2LUcQNPAb`fuGdrH#1 zVuU75dx+hS-X+0tF+#WJcA{TuB?&Bw5jK6d5}SWKODdor8ggdh-xP^lXdWvpJ=#IE zjV~top0Pr|$!*1?i7NEQ;p4$@v`2&CM_n)%-Rx1Rm&c zrM?)tX9LN87AqX}Y#=Tgl13W911%EkDCwO{R<*+{)0i5XH8q}0?1{Ph9$)C1RpDek zJkTB9@92ojfn+p1Q2)G_^m@_^ax@tI)zGK3@Q@F=f_#i-HVHLlpI)ZoLl4pf9%$mC3L2i!i=@E={b7BEwyx+-e4zC``CUe@ zH||QppwR{Wpp>k&ARnM*J!z$+r`E)FZVCd1irml86KJcf*Fn6@TaE56Pxeyz032z3^;u-$UcIn@IyZsZoy+2$q6g#RmeErY8Qi7> z_#lH~X~XdwxehDv9626ITTEZWEm?)xW+9B~tzXR@NQD>tYB81GCvnHogZ0T?>9dvW_HZ~DX3lxqPG zv~m1U8ZgC#TZ|s8#mT|+;~hh;96gwE>p|3KwLaGv9_Yj{FM47@Jx+!mY}~8} z?u#BQU|v7$ApIbZL=V=erVm}7@Is!19xP+Cg2tYFC{IEUwyTdoRTFN?BhiCxseuQ| zUy{#64^~GxS`m6$-WPq>%yc<@@RiEjq3;?pUq(YUC*;-Op`$#h!Q}$^e)M3U`g%}j z>x1$c=(`^B?sVvhJ@Pi_yK?%w(G9CJa)y$sMusm2^1RiqO ziIRfZ@^0w0@_zN8Pk&62?*yM2)q|c|KUUrxz1FCFM;aeLOdbg~F>$2bF!ldP+k-`R zrv?3pybqoUidWrey|!-honT=~H+s#^NnQg^yXim^6Yb<9(QEx4<3L}wvy|@zkGpM8 zCw%EB{|uft-JaSsZYvkiYZ<+@ql?G3kgo)r#M;rA+XnK>;9)J%k8NlqH$hLe^-xz@ z6Qd^|4L&!hD_tZ1AzKSpzP6=Fx8BJvf`_ErQqS|%vPS5mM!4D1>*fz+960ZZ4XxB% zmn{M#J0JIhF39$RKlZVqT+J!j4e-|Q*0ld}wX6Ypr}p{QG;oH_1D!tCnl=r~mrX`} zu#GjHcyGTf5v-}UqBp{J%MOEcbF8R`&vw~0@aOqfbj&=R2O8syxv5iYWF62ixz}1! z&0w7e+VnJX>5Ypi^}OHX5h;v}lg2vbiK~uVlfM;9C9}0h zq{Hj7X^j0+X+Z0an(LLz#Mh_7rH!AaYCe4YPb}&+Q!1xxH0`hVkcQQlOO3bXYs!20 zN?EQyMB&7F&C8cD(w)*SV$72&O^|bxwEv+G->=78P5nz_rIsU%1wQwqCUa_QY30t5 zLX!orGNI?2dhe#1?i!$AEsCU-w1}b=^&bfafhVHeaR-bDRC-J?{RLjx3%h zoHV<}XW8A5Ms`>znC>X#{qqZ?{ry6PO?(F5;q)?TU6XL()2J2vF6RM~(dh`GY0e`4 z;ABIo^Os2B_=u_egR_-l7BrddHN$vA{r%!P=rCFJ75we4iK4|X+~rsI=5LIeEtdMn z2zT|m@h+POh^D7vgpi4re6s*2ks8Met*&(7o9%BWwjU8I>}=DT|M;u1cnEV%7tD?M zm-!!Qk7Kcd=5`bQ@0^?T&3)Y6vunt2Yf0&kKe0lFo*qAU^?oYrh)ngpKgqd;8|gya z!T0U-nG`NxPThwf$9v3MOc_o?f{=BY{gg}}=1zY{!-q<)BI!jo z^v23KVfgiXM8B>zZL<-%>&drCOm0K^YX|g}O*cr8`mMS!Cr;S??JDVDeqB91ANd|x zS4anMwc6%5JgnqPWcJ7XYD*RN+2vj!S!Xt>12xD?uUA1DZA?;kJdNEqN#}@5zhHGA z=rHSD&XRGlW7U7r4;0G1oDd_3{)6XlbDy3auvl_esoZ zwNl@`gSl(llO!itU)}va@}OoQgMIrq)!>J5f^bAbf+svyxxpW7(o93XyuGOU@faCa z;S#y(s8X$YioEv^A}RQtt7-^;aB_%9;v6$o6VQ7o>xtxKPP!@;{@{lUN_u!FsB(}e zU?HcZwsEj(KfJaOHHV z5xg+NBIFGw9V@j4-#`Yt=U-h0`@xM-Ha9=8U$ z;+eBq2K#{3$YECMGT4_UAvZExDBXth*73-t`J>BVcZe+|Jx-ai4EE$mctD>`N|iX{ z7KS}&9=Z&6rx4`+g?wQd?DH2Q|0=kuN40@B7@yle>=-yFNZ(4ZbKT&V7EgCyA`L)U@wF}nDQ}zWw1~3gLm+KJj-A=hgUeF zMwh|f0AAr?xeLo+|2-91LszUz8X%{l8JPUiWw5)zE8Iw%unhKq$;jtCQp+;fkHa5S zF4ASNHwQ0N=`z^E;SbvR>oVBi!4q86OP9eO47Pie#WL7y;RE_vuVoMupH4_@Btq$ox(U7Y-g&=VCTR$(qt^>suq4<)yl3cM^p_qe5=b~PXtemFl3pc zqrk7`=rY)?z%PftW;voi;onUebC>Z|@Ql7?%pc4H56aYKu&06FAKSxxz+kYZR+qs( z2K;sTN>-PH@6;`1Yy&p!=EwZL7T|mzUCz}XcrlNX39G*a7tYe{bbbI<_vy^)m%)m^ zy8X@?aFce8m_K+NJkg?x`FFWsRk_X|+y##G)#Y4m0e9@E^90v`S3f$)&aVLHZqo5G zuu`^y)g!?#3v@YG+6;E%>rt#81pZ7$FrEkQHAk0cH4D7?UVrBIO$X0!-iz^MaON8u z#y;SPX)PF!15ev^fq7e6f3V#H6IRz|UNt$sn$@*C2QMA|kFhrMYO3J|##*m%YWxny zTCZ^D^DxHROwku}jxpByhA~dM40dfE`<8|YtgiJ3V=pfI$2W^RG4D+46|V3c&gxo! z&?x19zF}i8oyVv32Ty^4J} zf2H*YhsG^u=e1m3)|{Q!`hyNBMy#&&2ge5uW_2y=dzCWJPU{bfGu>HT%O_u4{O9Yn zyJ7IJZeM-W<^R0G24?mC)s1=-{;RM5qx<*LdV-2Ms(pb_Z0gCLM9CiAl7&fYWsK)xv+I6QQ+OG zarGFodh-<0V<-CdwbPKtHIDqi`(5&@xn#Zb2(l*?p2GXZq|>!Q#BDkDC1uBuef#?o zWh8Pxn&2+f5svhR@7HH*GKqQPM#|=(53ETcUspI0qiN8xy~l|*<<-+{Symr zGkh7nT?M52PAjgz5$-sLA0gHHjX6sL%#q3qN&W2a@*YiaXXHa6>EHK>e3m|bc0&ys94FS$Z5Jgl5V!_3-Dj>li8Mx<(#ahkT)? z$H{-11o`a0=&$A;C(CaH%Y*-*Z;_6ZV%tgb6wGgj8lNCG+(5bd7v`YGpCHSAyUOd3 zMbJIt1Zm`AD<1_uaPtH?UTG>n3cu;OQ8CHPF_2q=Ckn-+^`Jkp9Y1kTEvT3nje9Ax z1}APQCQS!lmmU9s&!olVK&?hL5^VCMm{cl`$i9BZj+lBS#O(Jj*-mg^ml8q@H^@eV zyL*<92SZoL48fVBN=U;gOJo(_&`0@~ke5w-Woy7AVoJ#0{9&?5;CJaIr1^W9%udTY zOGtXDgY4H=JRb}2nLj$pu7R^@38|ZJEXxCLuP7nT7WHMT!3%GdV2}Je&j2w0q=Y!s zzw0?1+~vO#vU}he&)#6GuO(!=>2c3a;OW0h$h7&{p8DYD4Up5=e2eE7JRi#q@V#BP z%JVVU&;%L6#xb6i;4^KJx7llsrv}`h6TUa5jrKeWzF>|%!BF9u1Gcw8zTYw@&uw5^ zd*n1)n|rR+p6QMZ$r&v@SAe_pM3!<~BhOf{oeQ!V`+oIU0{-ZV?+VLD9>L&n4}7nV zxZvRrJ}<*8P+z5oANU1_&v|&zV>0+AkC~J9+damEGZe`2dywWa3hdSwb357b9^T-B ze)#-}fgXdw`U8+n zhYZ|v2Jvj8Fi!0W-&A5C|606ztD z`v$vfv$ndA#Qc(jhr1nk0az@zbMFey0~amrz_=Pb+0)3~7WMX{(APC>z<40|*00xY zHmHYy-DlimoB?jNy3EZQbqY3(JkGcZ+`eEBrW*7r^DMFEhRg-cHnvAA)Uz4=}C<&lr);_$}BuejVda;NWn7#y`QMp2jo& z4c`2-7vuVPj%41S!&o2Oy}To11Mrk;-5FzW|Mn)X+Gmyt_>x%z#;w7t3h(yT)=j}_ zCT|$G2VdS)$haf;iK>8cXK?hLEXHQw)FaCnn}f}sI5V~cKTp`m*b4m9*p9I^xczz$ z#x~&GFOS$W(H5NieK4zQS^xY7R<{F}`7L5~d+_8KtAG4ID zGd~yU|KmT#pa1b-tIOxnaE)RarLmUr~n!|K|3Bxy$aKRz8_%2?Zn zlzshQ-;%X#(7$?WR+ppN|2MQh8!x~3kJI*y`gf-5)E11jXZCfr`FEx~yHnBs{j3zx zg#CBXo*82|gZ*yWfA09vHyLZ|^|sQPi5DRXYDCW)&m)=A!7YoC?C>mA=N{`x~6dw$-QH&ZhO2g&Q;n$ve(j#e#09_}EX>QkUz z`(Tg8pmT(j;TFTU|8ZEeZ1q%W*+4zPb?*^P)bn1Fc^7w~lWV@lAmo?ms5f1hwKqqT zQoT~_l8;cEvD-B042V5OXP$Z<(Ghz1|ci ztY5#1|64Ig8n!e-xMLc|&v9!j-PJ@2VK;pFTe0`V>cdgE<1m8v+?FpUPK*|=4(ZFc zoV7}9TOBQgs@(X?9s%O3u`$9EWq1Cw`B1SN?i)H*Tk#%lF5>2T*!67FiC0#35+C)8 z74inQ;k~L2MC+JX;gC~vewWvGYIHbOus+w6A4cxcZ#Uq<{b|TQon1!ja3^yG)#JUV z9-{5q#tCVkYlzQH+@rQw8m7PiQc2*O%iIQkpw{KEO+D_J}zZ}I*nHQIcZ~7s1D`XK&tGhs6>t(28;k!K?RzV^{ zSE>h=W9Q5Hb7a))5OvZyJeL=oB{n7#)uW)lwf8tfrX1|2K7R%MRfp50>rNN-`)kl- z+LV*wXRXu~H_?OHo+6Krw^7f6{?@?zBwu@Df(BImBRg<4)Q&s-Z-}diSlY-j8Dh2enZj-R} zI@Uv_56!KashV6{W~Wkt#k(r<{lE4qU+8brZWUR*$w>7BoDr-dSN-)=%b>qK5me;A z4R4fxz^-kOMc?<9av?M~`FrSZMW>W^z`HAy-@bv)6W>Ca20r%?yHvh4P#yuFxr+DtE}u#(!B@{f zt7-S3^d0z;8hVlS`O?PFul66sjPAkWQgg8PAv_n#_LsVW5A7`_{f1@utmwX0) zgZ|d(%z~2d;H}W#7F?cGQVX64{cVu-pprjeH|TFJ&)rJ&@Qmw@S^Zb)3p?Xh8J#%sWzHAYN-n*<)Qt|8-Y;5xTAOmnM)KIXRX zA>-TNP@f8>zZHQOT|U8hJ$Svihj9paVRN1S<^wL=znW=o+VIn~vKYp8;GG8kOiybC z-u!h4V?FS=y8{`&$8-6se=o)l!69R88Ef^ow`ICn{W9>gul4@vZ~Gd4Vw#v%fBQZ9 z0ps1^wFgcz*6MF{%~g!G`dhzyxs0{?+vc778Ef^o*!`;*M}Tww|2{;m{??=GI93k^ zTh1TMSgXH{yQs^S*XnOc#$%X<<_i{Q_hhWq-{j{1)8BS_=w|ZAp?)#>+%awcGa9`9 zo~}Lu+;w*ut84YQT0h;HA>bJSx?Fl~&b+WqSN8%tN9|(gwVIpW=benTn%g<26^s?& z!+R6|as3~jtpCw!Zi2ydR@d@|cC(ALzmHaDGg~=~)wMh-*Ov88TGkV~usYM8w1Uns!epr$fc6ei(wi+Zmn3hdx^BMI$2|!+DQ7~KS}ZrKcIPe zvyU{;v#aD6e@4@4)&gno{Nv*IQ;#$sF%O>*yNq+a^GW0McfJ(Xxssq(-Zn~G4}5+J*|0k!hyes{m1zQg__2Bm3;Z>d4fm8 zZcXR{Q{j>Sa3OoaN=;3*yI|D5moPnJf@YwRw{We0d!f+9N~7mDNtn5%k?{J|J4s)d zE&O`?jCbGrSo$Sy`1hAf#n#Tz!uFK|_;ya~#hE9g1$Cw;fAhp* zahqq1Fu%7GAGKtR_;-7Z@Ta3K-!;}ljCvmu0@9DiMqD@h33u0QNgi- z#qk#W&QX79AIxB1vM}VMouAMr6|q9TlRj^nb(T*45G%M`s>gqMaD*N-#*Wt;zsQ0U znRL5-oY3y$S7LZ)HNC5VZgb;3iD?){KaGtOt_8d%&etc>nRBq0HmjPHj_gB=m%vXP z`IxjA>WI7*?oBs zR~b|)k*cpJRS$5la8Wmjv~5$Q@ja4(xF66zTO$GYKmUvUZ9%9z2{Unz@6>X#AZWx zRT_Ggv9EDYaCc{w8~T%91uD|8wz;ZO+p9#YNI`r9)l~E+nxQJ246|NP8VOEM#j`JRQt3+Y=45;yrVcFK1a7vxl-PT?mF@<=ii3Z#%(nC}xJxwd zHg;}TdIEef9J>80gHj2+EEM1WC;pV217|IQ#-e;#as~Vwy-NRi*Gq1JHwL2KudL)D z*l#{O&}~Obo`HRFuW-BR?vhvF)#z2GPuNiM4*U?k%C^iEC7;0KXF_kev4ri%`G{U6 z?x=4`4eAHctMolItmHR14!w$Bshr&_3`VbVV3z~ikFx~5${yEFtXJ8HUL`lOSxIAj z&!0xGQqa3T+mE9U?r{D++mGXeUZvZldu%_B3jK-O`O~adaRAp}dAzss5My4K{6Iy^4hXBsG6E>s2O!TRw_oy~e2E*)dX=eQ`Bw$&Roa0) zE;%y3gFfWGmF`|)7P!#Ig!LzL!REho`*GaC?;d<%{fQwsujB#ar|2d69;`I0j5MWw4%PI=K6fwT!*MtKWt(b^)xZh@7uc8lr)n2!M@GG8i zF1tKffASQ(JEbS%>);9BbiK+M@F5@Fy~0wk_r2e&f5-<{@4wG@AK0Sb8OGbek&i^i z8^F=?vKg-ik4@I?B3uscb7TXnM}xah-O6|g_~(6p#tXrnLPjzU0G|vT$$Ap)ew@}$ zy4`{^z*)_R4lGj#ormYWD$oU}ca z)+-F1qr3m8W$WUG?03^@P-X4S*gsdxe;4a?JS~5oOj$ps)xJ!+>-O(x>ushDanXLJ zw(fJP>(O7Bbs8~psIu%JHu$g|IwYkjhpyE)5()P2D0pZ;;~ zOISCO`4%}aea~{KGu%kdD|m$m?s4~8_9acK;Rz1^z|CGgoE)seou<9@$@uG&p#>wC z*wdIe-}NWUuVVI9(Sg(+Ur6p_mM=Ekmb8ruC54!8oVKnP$>tVget)IH?aGbLZv|vc`W9 z(ayn!4T>d!ioT>>Bz(#7%Zbl0j;vdNnaS#8a&eU#=?)*WJHdVuj~-;{RLp-`t|ePM zI}vaAn1&@ANYCQt!g@Ad`&oxyPOM#9fST zJBfMFS*|5~%z%Zv$@_LExC=dSk11g6OWJ?a(zw@KBoSlLb9jlH+ggTm~pj* zq~QG{`9S!Xu{(-L>!geF9Qc@%dmSaRi%NM{_?RP=N6FT0x$<-HF=O10k?vQw%ah?_ zR_{MXevL?%&w!5^(fm01S{pAP2OrZU_&6yE43bZWj~P*ZoH*R~k;neV9lBO0$T$-( zc>#RPC6iB(J}-OAzred3wBrP6;b9{m2%dZQ1R3(Wt^6Ro%TXM*A$budy;Gjm^>>cPdp1`@8MB)X;4Bg zHrXZH2IkC5$Sue9GH>t=SqYh+kR)piHXBny9AAXU&cLG_F|UO5JvU933f>S~LQY2w zm5m3tSzAKHJDxHd@b6tE#I)32Rs)|g=tv3qWY|$w2~HME$glOyWVztE7fQ%hpL(*D z;O@6eh`GmG&w1eg;A56tyY1->R>8+CYkb<%1zZFl^IOwno*ltY;bTTd?(=K}p4t%a zper6!g6m?Pn1 zp1Zh=`Iu+nV=B1-=3{n-k9i_(yvG21{&+9=Utay0j~N0VGezpfe9Q>=n2~p^n2$LJ zKBh@P8|Gsw;9YJ#r}HuOhhp|@!%ya8s==40RWl#c58mbC@+-{8tN}khDKZ~35#Hs? zygcS()`wqN`Ck_EF~h*e7wde?M_|AEIv-O3ztSOnG4nCEfG72t!hFn^;8E#=n2+f^ z61`s|8S^ohfG@4o`Iv>^jSlUYkNFyGKUwEvb{d6UZ=4?UF^7O7i(fGBG7Oye_5tG^ z;GF1_%&*jdFKsJg`~*?}W}F2s%r#_u7`!&DnVZ(TECFXdea}3^li=A7w;5jo z4~f3S_!hW0qLgtJ_{Zb7V_6_i6YykFfXv5eTJm-d)tM>WW61+dGCF9m$#}BJ|YwK;nzlL0A+#Z}a z;XLDxVDl3f7tn7qwr6YsZf~yhE-k@z!%bOT>tk+p4`;0PG24!M!=BMv zA2TD;pVhVA<@%H`R__WvJj{>PwY+RnBCBhCOfz%cc`Z*33}kh!U+KFzo}Jh7$&2o+ zuJtHCl`Lj;t#?V+3^}U(chuIq21filGue6#;~uCx1nmFEe|=IJYyHXrO@scidGmbM zpJ?mp>iev&^(duN4;gEHN%3&mKc02KVEo$=s({5x14>Z3(gqU-^%J* zCP&8o;~5hgFxK`q#i_^s@v)z}KTmD{^W(<~R@bt7gP#95!AiG#T3c^5!0BJ_Sp6cVVTE^P*cE+O1-0zwE^ur;N)Ej%uLNoaRWg${T zey)0Gv*rAih;XU(V+N9?$V(7H7K3Q~3l2Lbt_WzDkQiiaA_6!sr`rRn$7TD*lj`NzLq(6k-;jc|5&-=1(x z^LDbD|7;j6=y~naWK3@%T=yR%?3kRcc|6rc=ykwN*r=YNDVRM(IH>6)m@RVDbUNuH zr1Wlr%;;Jv)@PQmCHy5HH|jsBWKp0X>tD|2pD&ZTnk>eB(j0zOR+cm@d5O^Z<62&m zFjKlz6)w2fTgKlia*_rNj}+$Zo6Eo7^--KPF-o}beH?EyOA;G*iWb_q4CHIX&0_75 zXhE-yod0AI7Suti2w#Wym>IE~ih;Q?*_Kq5Xy(%8|^bK1Tk#{#EP#jH4Cw%c>^bx?nL zJtR(8d-pL}u-S=b#bXBM^#d|Dv`w@=vV!cPm^SsOs%|%J=Brq#5d1g zee?$A)#FbQ51Wqa+0d^>>^ezaZ#j4Kvq?oGV&wnt*Q(3tNZgX z_x|Iy>L=#jRTm{<F14QytsjG$iyoK%wt?@_9EV6QMWsqQAIRM4+V zdaB9s-91!c(64%aQjxuJW-1G4Ru07~VwP{BqG0<36=`A8NHq+al{894yxV_KUIMSM zQIXwEs+9eqSy}v1660$X$|GR@j*{$jEmgLHPL*;(Nm{ucR0e^|w_w+E(l(_8&WVPP zW}l`sgf>;{hds_OmMKSolZHUoN(oS=gF7M@E2r56?VR2UePD$y z7fV`?y|+IWm4>6vr{TG5F|~9B*nK7Dv_B4J`<-_}zj_g(%f$*@iaD`ecBO}KW-Iio z-)GyG9tXFN!29?@T`tzkP|Q1d>6M;E{m&vie|zh4u|_X|@6cPf-}xEztB0FTl{~MUx}`1`tIcdY`^;7{{c08TtLT6TreB%Cck}-_gY9>| z3H@ql*AYy=%7K3M{10LJ)duKS$+x;Q{b~#JtGb%bB@OXhD};XK-bg2cUvc2#C|xer320XDEA}(rjRSwaqszs*2+itN zb_&z4=74$gc&1-91*g38XZqD~=u~G$>Tf)54j_B&gEk;KmQtH;oz1|?ZCuPqzg z|CDaO^8&D@r7jnX2QNt1K)eVbSi(aPm@5VJ8AVR|3n#Mt$r0% z?!kB>*yz9i=~qgk+wVLU_1VU{oGYz$_d8)@f5(->u`GNLJTsS@T_V^X+}W_fP9)>9u_E_$k&`XmzdI4Lh^* zTK&pz@z{U-@|F#ogVO3(7G6B7YkB&@W2|@5>Q^7v_hfY~mpA(Qul{GvXZHDW)T=h@ z^dha6wV{zcJFn&A&z`crNULSVpVaM))@oT3EVrKxg5Ez4b>vd`CQR()pc z{<&IC6-4%XYI~%Wrn-L@ZGFCbw2Su7P+NbK)`@+NmUE{3FFQ-mAcOr5+Ipwmr;pyP zc_M}s&lZ}@&*nRL)``~drV2AlvW3unrqU%f)pAe^ctQeK0Dt+Ffv^t1V7#&uHAT#uN{cJ)an%R z&#r^Ko+4aGC{7fUa@O%Ln??woX2yyE#*ut@euQwZU5MywF_ypFJ5rcDVZJ!1b#LA~ zKT_z{d4`x*Wyg=~6eaxhnk$(MRgmL3~h{XCH z?s~-tJ$l%SajmbCjRi460cS0antP5|KaLSRmzs$w4K-w3vsmHPmkwf&FU4f0d#q5q zwXOKk@d#Np4cY90EyW0EWPcK31|&rABqbSBvwglGDer?~Szkz8GhS)<^GbXVC3Qn?m=PV61(S>#1d??OK& zU8id+dGf9R^XFDq=up9v@FH?G3oEGAP2{)3e+-^+hW0aeBzx~*9>(J&wejgnD$rAX z>M7C{k1WVA^cc&BD(SU^PQ>LG{IwM)=+}v+WMw1hv`>oYk_j!z=;p|Anp{AyE^S7( zwZnb?FNY|9r3sk>{cz|01N7m5hD3tK_%b}3hM%hA4mu+*W#%55(EkVL2z@eR?oQgx z=mR$#_bw_4P(A-g+%o8#Bb#lZ+rHiAwj;ZsdB{dO`BWu0ZzA#p z-mjxJm(Fu5a4uJf?1Iu|iPUcEKJIK3a%mD1=*zY{xkGW-&yul>rj%!JzR+x+$HvmM zog2AVNzhAQMbet=HQazzONH@^!l>f*YAzZYuW>u%NA+C6tzLs&c=s33CPndFD6$Ja zDg$YsO;MaXG~qeQd9-rvLhcT-3!2@UL&vE6xe42lA8tI0W?q@b6=yCL>ihZ8EsMr; zHCaoASC^*IP6LN?U3TLx%$O;(INFP|-wVC>(?m)>^IXSlql>yf0WNdc0oe3zQ|X9DGx(-!SGxKbx>5v!;oFDX{x|}9VMflxIlgv{L0sp=Jq-w&!otF80A6N z#vhdXh{y`?cBhS6?Ufr!$j2V-Ms1&D%8S9H{aopqx0~gYHPEXgds9E>b@HF!pBXN+ zUVe%^y$l-rsb2KY^cC_hxUZD_)tSb5#mf(Zm5$Ezr#eFJcnbOU!9A(}zy7*b0a7EX311}2H15nb`BbhlQ%t$?1f@Sy6)RBc?kGIdq#iFB>xIFc<4YiPweDFkx|fNvI8v-vy^9n`&8M} zMngKu--BDuv8NrTw3W-w!AJOPNB`_;Ax{L8<#sgJ#!y}X=Gxg&zN(Sj_&jn93cJ#0 zXZ7SG!2O4JrEzC}$kM>|KiJaUKJR7c!BaNa(!Rr=%j#DkKSXXzOSe6cd4m03*iZx4 z8?s>Vxs5h7$^N2jH+ZO*4bAr}mt6&y*ILunKh!ckO8}35WkrWx-7U)ncgeM)_YQBDRf78kThX6on`Ga>dA+S@RqM5~b{CO* z@W+ydY+Nmqf&ZMfq_ZX^$tHtKH(Js*{g=t2z;k9=QjaTPvaR56E|zrq>>$~3@CbcN zY8^C7b`?DL9`>{3O_u!!wm)Kl-O6KRjV|H8d$I*J8#7ea1sv>aLHqCRCvyegkXg`{ z-8k7WaCTb@dcnw5HUoU;i#biT?jZ{YPrioSr!`$=DPWr-b87EoA=?SI+h9&3ns<~H zfhR37rw^^#$jZU_KIXJuWOLa~uqiR8@0uCNo`X{@&1qU?L)kZQqo(-$&^pgXm$Ccr zqZ!>&`OUL6_|_fdx6gg+X$kId(u`hE|D60qwQGdeW>n&)6}O@bM| zlPf&OffE*(QTq!gJ^jGvrkK$eb5)*!;PN46w0Q6_&v5VpPcs_5IL|X)TemZ#`PXwi zQ^2L|%xHtuU7nl3LzTY`F7$TnM$i3Vhqqm5#%EoA`@*U&G+>S{zuoO> z7iu~#k>$6?mv^Bv{o*{&;=ET0GQ6cw&)2qI(w8=tLSDi*{^FYvQq-h20*Tor^ifTf zM!%@zlkWZ%`jiJs*~d=uv6~zeA7)2Nj?Mh}we?3T9M3M54y<$_4I2h4grXSfNv)N* zVN<-~U0ATRQLYrnk4aXX4Hze_^lc_>aayU^cmcf+=O!Ilk*Kh&Gm^R=9w!ZH9i<@C z&Wowj0wh1z*^0E@5n|rd2q~c9FhvvhztpZ#oMhjogTkWU96ELDQmH&6Uznh_p<|IF zLF0Gx*4uW_g9JGe-Q-e}Wp?8Jgc!-G_KCFaXNEY}HdJz*<)Yy(ei3JM_LHodiPDu)eQCDSF-@=Y5z&6M|{zIt}tl*4NbGljl}ksV}HH{RME+RbTTd-k*+mP1PG0<&9~;DV zs%Rmpr;N|(6DqdCuDxwXo%k-D$BDzY#0byRZ22+ip5l%-F@id@3%}IRS{%?5S)D$n z{MZ-G#T5bAuh+nYk9}W9AMHR6r@tZpW%E;d=UlAd6r|5@eRz&$zKa!94eIloe-u)O zW|&jz{hQbp?w})~L7p4%jkumjp=tp$E#@D{l=N`=dkp4Y@?Vn*@5wZ6Hgv7K)r1f2 zOKU?hyPNcwTz2k3_a)$-e%1qGVcD4;NJr+p*>p)OVn> zrIPbRCB&!|m=l|D`z#ss-B)dgK5hS&GbFQYkXn5iGwq8`6Z<+3b13KHRH7CjX14inmm=imGvW#4h*HbH?vq_E12(Njg8UUT`+Y}Ai zu;7-eBj&`uY9u05ol>2J&bGLhL=68cQh7sX8+b${tpoR}3egk#dWz(y*Cy3B=xpT| zDcR?7M+uC`Ev}qlwvWL$0*_e`di8EDQpsjURtI3ZmBUFFE>lUiXrK?0$0iA7m zH#NC6-BFbYoo&He6$zNuMb!h^+SMWzA=&?rs51|%scZkZsmPEal%!Hph6)XwVeOS! zk)fny9@0Ef(p-p;DJf-2LPd(C&an1A&7%wn84DFcG7sT*@4bKTVBU!9iLBJXlwX3e{&y{{q{qN|FEgDN+;2$432u&TX-tbUEOC z4V6X%S3^%sxu&=D9I#&lWG~9!CFQ_I)v%u-@wwzB@IwZ2lGZxOUts_1aL%zWk!V0> z^&lJas|%MTroexoC)WMkNy#kWJEtI{P&y=W1fByqTmFt6Tu;mfa<)-Uev)nQygm+k z>Cr1ByMY^^Cl<4Fo+N>NA9A*fT2m#dz*>;AT{JS}a<)aGFb}HWdtwbikQc@E<9cG5 z0nooH|5M23Y$cGhmEU>A^~AIxXR}PY%k{+aAZL58Tg>Hb5sSP5in!BjbyvrPt$^}EjX#4bU$=JobG*Ap`b?mn6CiIqW~_H;L&v#kME)sN(I zww}P0qZ^mAxQWUPv7#C;}*!lR@U+R=M}(Fe`Q>@b_&?@1m6>j0KPn*-#@<|cwxdp zE>D{WtfISv<4M4EX}j!W-n-utU@+U6)Vso|v*)xvWp4f7wYL3~Q&FkU6o>;u)zn<6(`d?3Ms6C&p zg~9vpMkaDU%jRq+Yx$k?n}P4`nZiA1bGGDtjvTuIw{5cE^05uTI%#t`UJbmW(2V01 zz^O|{aO?=Y(|;Jp4!|oHWO4Zq+i#Ca>&`u21l(q);GVPn_N&GGzIrxi(+T|7Z(n0u z#l6GkY#X1P;h4?Y_6|wonC*!rKk?+4&C|Xg<1;swL$o!yEQ{^5U$nL5-eGgLE5i?S z&snay!tZ2Yv$e^_{9Xt)PfP8}&9G@Tsvuigni7jJ}yQZqD*h(Egw4h!1OVxxSM^+UGL;pvVvZFq*FDma&4~);9!y zu`pDGYCj^kcf-tJdp|{iVV3+!Cw%|GPZ&|*Xw(Y6K67pgGc4Z=1;cmgi&tcH=lL@6 z+qdxjEqWprq=yqBd_T9}^cepZ&!>g2LU5+fB&#WNis|OA|W~&7M;f&enMOf$4 zF{`5yHcVuy7GCi--|A7OKjYYuL46)uXSMJrWOTiq=nEDsbtuB=hqOW*|Gv*iWS{>N|_XzF_XMXO?v+}!DK)rhJ z!3wiNl)+|h!5!n;$8_y=nuyqP#R0N;+bLl=!2&+sK~iNI5~1B9rW=K z^=IHVoYpg(F3Jz0Jo4b4<%-Sp?@xBrAVDyGr0PNYtTm$yt_EY1#&xt!q!HDq6N1f0 zJJYN5w5eS?LvXh$J6cIFoZ8tGg8Meirw4UYrDW!zFejZ&4_~iL)kcTnobH(ZHTVx& zRT+wJY6|E^qYtRN3hZf*F{7WgJx3O^A&WCIp(C0bk#Tq!^rObn=B2mL^ebU_nc5iI zZ*(QP)(n2=s6%fc460HM$8TgFT|R z=d04mHfK=p^N`nV>q|e~l!A`J9QOE4WqMTA5!3})+=zueX=mU4Xw#o?Ot<_c<&L}2 zSIFY(xBVa&BcstRQ}8sqPo%gy2o0G79_agywD$K#4suoC90gny_<+s8{xBiSTQLzGDN1}TD=C+q%wCjx&$7QH(pBW9kkE^$l?aN zUMEQ=>gcHwWJe`eiH`9Qlnz_S2u1X*!yKae-A&aYQJWS5USBW*(z`0w`gXH;xV(~J_;u41J zCuUA^@nU!APu|!|eh#=U?&lMUcO8!<%YWpE;~ zK^7PPWH~9wqr?->!QWL!9LegCsbZxIaIf?l2eNqQBymLse3!SfCr)?Ai377Bm#|zy zdT!7ct6qX#+;|Z=J86_SAsg;uTWL%3gzDlxIj~=O-+a;)K3MDlS=`)OYf}HcpO`=v z*F0(-S(&LU{tH=LZR8wMx4*mC46-<{&RJyDoF5`*$l?q)&m@hvJ4Blyi}UV2gXCUs z6-7c8mwU>JxO{mcii9lA-5L`~Y=dYEWN~WUDMI_)5UqkN&Z10AI#SC-2(q}vM@7U} zj~1yx{`S>RNK9T|7d->M<|rU5zU7F{LKdfEJ&j~pXNp!s7I$OTR8sLcO*9ztw^cTl zMD6kkksR1}xdnMBO%$z#{Oz2-IoZ(Tu;@2%X1p1B8o5t&1hO~-`4m!Nwo9ZB`CHk$ z$;5YLv?v=`Y&e;0-n30L8S*!w+a#j)%SV(89F}WJa$dTK#zFp;|JQ`%PFy8A34Gqc zgs7A*74?VAt^ZYH;-9lX6a<_x)R>%nGfVUY7==$Hmi|bDA#+P;pFk?amZFou{%apa^D*f z-@rklUBJg9jmWLY(r9fs+(vDaNqfcgbw&7JP6#;>7{;%Q^aSNq385%BRB2E_YAz0eO>JKlh}y{r+Y0T;|PAiKwv z3hRMwzr*g(D{^5E$j}ryV~F;ye4#1uNB1%0)w#<;XW*M-#}Mk*1>p{0i&lNo?aUeB zMc~01`lKo3xbQZxwU<8WdHAUCD{$o$ee$5`pl}3y4sZFTM<)606^ekx<$7e^7=Djv zpCfwYl2(*36rNYC(<2dqTZPHME>rY~sirr#NAy-NJ+e)GBezHN^MldkV$cfVTX?7J z@@R5%h&{JQ)MOXz4%M2^?GZItGn#C7m?^Y`Oe|3_n%sZK?-30gHkx!+@_R({KI)QT z9sC~A8Mk$b^D;wW9K5f7MVBaj;rED+jn^f5cQm;yZe4&b$@w;v%i;*^5lyw_v$#oO zUGn`2zeh9&_K0Su@_R%l_0c8Y^!Y3AV&A-iJL5BL<{Bp3`r0r>mZR|A>PyV~ z)agvhRzvKRypypv#LVV-(hdw9ac`3 zK1|;j8Ew2{kJW=iOPQt&Ri<&#UaRfeQ<$7*QyH_^T~-_1`!ZuzI5Me~;Z{-J#q`rV zUW`(*n^lg6D?JM`yPal>temnNh+RqqQ=B-;>f93*^7LUOb750HezPD%?)*KHF|d|X zQn@t=%8g_M156mD?<%xsRygBw?-4UZZ7=<4$5y6b*Ca*d)R(l+I2Xp|fxqJL%`wcx zmopiqZ%GROoTUsEs>=Lo%Tt_-+{)aTyqCW9pjshziDVXL#i1*04;2eN-I;i+JJhO% z=Zfq5ESV=EW|+7=SFAezoX$Mxf={R4Q)qRKpsR+5JW0M6=?^vq{eP)B(^tAAk>IsUCy_e&@<-M_o z#&>3B=tgY(zLlCMdd)bdd*P%-C6xE45~jcYX1v$zJlv&ooOzHGi0dK`Q4W)SBKzTNeMIx0OIyQm&*$1y_F4n_j%+3Zm^ei z`CuyfQ8!wA9A=$){U{r~mn5k?9GhQJrhZY?R(^^+ zhu&IT`WN){VjPL0pa&Juf!ggi7u>1Wx_adGqe(7;Jk9a> zEi~d>r99#aWMUb0Xw0Xp^0or#x?ieARmV=t4?~`2+g6RrmK~5MK%O?lz6zy15103X zJT3N31^VK(UjDHfdSV&n=x~R%d~Y4>#fmCJ2VMx|wYMSf+ER*s*o~8yK%SNzR)WeJ zH01%1r$rtwMyBfq$lJipN^caQU*o#V^&n4sFt`Xcer}hIgFMZ2lLF<%-k0@&JZ)VS zgWf+YmE}U7Hde?Wsyq%#RMj_8_5vI)?G8aR`tOnThdk|# z4?!ubLu8ter`=P7K3n!i*lfjq6D z1NO2S>&OfsLwlPK+1kdzvLayRXc=;<>m^$R8Ct<&8N!D?N^b!tjFBPw_!H?|$k1kY z!7kSI)zUoRfcsK3{ZXNG802R4`H-76W=MU3wV=1QSdbzu0#=3ITK7kB(*EG3KG0jc zav@5(1Xu}rYZC@~N)G~`Gnb;-8Ox-Vz}nDTOCLN-+68P4y|vI`X3~j}gZ+U#?c@=C zsUxs9^ww-#hDjrVcRh#mQ;~h7XMwfu!MVcuKP08V<&dXs&3VD~);yrMc1-1#uM1O0+~Ba;L@6Te}^VEinQ1gx=cz{ih@|fh|r$kGlF0*IPSt46*|4of0>AeiHJu zx{Ll?o~8}GwUmsNTyISidTVYm)?A*p3-YwBclkVR8RTgKbH2B>6Y{kDXuh|mybb#B z=6r9hApkNHW4^c64td(W->(bn;D2id7&=PoZnp5|7`=V=ciL#wOiduy7&;*Jkop5_U8n&Wpq zPpgFt?WJlZm!}DUmvk0zdD=B6=-#xP=Xz@*U^jzf+_}pd$jvTK;_q{G0lsh`>c8Ha z@_zo@Wgg^aiWo=k+~p?VZZ-V5OC8|ZxqNT!8RTQzf9Z00S~@WL!1vaCfQy#!y)^`U zW8uHv+K_I1Z><&bu9S;)T!zNxY4t1k`y5XL7jMkuo<{=LYM$Y;GB!_}ANwy)!!bMm z%hQT)@%K5hy|o7;|K({{8Gc6uo2LyK%irht68OnPen$kGr`6PHaM>E0r#*h~FHh57 z{gKPH*gUP%<~he~Z;iTG!!etu#ckoUwRqqjF8p4IJ-{=6=W*}s0M;G3m*Y_2vI_n_ z$3WnizaHFk_T1&&n=3hH^RzyfCUe=>Cg6xtKaSS{pS@tnG22_4>B{emV0&vGWHk4D z8SscDd~c0Ccey@>&&Sx_TIAe5+&gS+K^LhCZ1x|+j?G-bru0bb|-}FevU)z}(zcEq%%&XK<%;n8;#YxDoR@t7Xch}uj z$X-S=!xy|2Z!>9CgzxucEVoxuUj}t3(hDsaU0XBkG_*tECa^ zYaNcQRmv32*ZNS-`QbRH^Qyu|t(aQX;)VNZpH+<8Fa&G$vcqX*af)e|&2h{M3#>t} zQAj4u$J&yScv9YYh0Jm}o)OX;tF8UYTsyK6FW=uvX+Lgb63e`>;pJj#5LL!JGu@13 zug+07WXa62vw^t5^bpnO(+1{VM-cA$GlG(s88hRZgYn1*uG9ph_mH`S;Oq7dRA)Y+ z-StAT$<;a3j#Wo#v+JSQJ6%YX1qRYm(=hC)K8dPwUq+ug5{5->V=0G?Li$J>I76{E z74mxwec3o1&cUfu#|{jlm%2k{Vl|kelDpB}PK4uQC;L&toEHQRW@4|C%9P!MDnh*t z$B`yIDAaJ3{029;6xD?!fv1SAA)HN%{Q|q=;>crggApq`kY&j>B7#|)=8M;;YTZiG z0&bAgrv(|Vn@L>24J>n;(AHKHq64$GS*4GW-;Ghk9Nggi^hWe;>Hu;R+~An*J=8A! zCD(^p+Z%^^WV^pfz5?99{{hU}W>v~luE1y3={lr$@~XTW%-YVS*CO8qr{x*o26LLK z(V!s*<{P3D0bGCPa_qjblF*OgO7+tH*X!4 zy#hDryhTv-gIL*MaD&y}1P$#GBGUmk@EStU%Vis7!@vie89BOnc(LpY@U|^-q_>@t z6@wcXnaGj4l8G!F+~DDR8Or>iEi+_&0Nmi7@nBgAuz8dW9Zl&aTLM1tb&(9!h(Aj2 z0JrGN&@uc(IuCr{{4cocd1$rt8u0UbQlyzwC{+gsSOjkHGBHEy2b`7&pYPpMq{YCe zL!_uSBThO1KI{8{8`K9!N$r3$tflB!o`>`h@FH-7(W{q9tAKC9tZnwqnbP0D-N6k; z+?m3;fgIdm;WB-x6MVim!>sM%6y6OMf*ZVE&_|jM&tEsdeCPFdNf~ewxWTDaFC;I3 zF}T6(oSU2*)PWmZK1Vn=mf$fd~kz3R=gXG05|a8%DcfXaD!%5-VI{F4c-{> zZqNtZV5l?i2Fl_Fm{!Hl+A6>e3cvGikOFS7VFd36vET+@UQggU?fbzE z-aY5t05k}#59ZzA9{9kAPTmdFfn$UDS(_WU!6)>Z{RKz{MFwhh2%mhx`U8+h<6-VLsT1ALvl>_0bn`4MyTHP#Kv+9z}T z6h8Nx<$S08EO2Js5N_7y4Q!diyMY*ZjnO|hc>I;0wXtsC&G4Oe)(tj<^E(;XS)1t$ z{;p@%4GM?wop#m@-uwM?1L>-NZm@avKR4L;%AWhI?*s3T%$&~g7x-M;H=CHI`|v?pCS%Q3r? z;eM&f4w_Kg2ORYrELR-}TJ8!Oir4cRlYMz|YrMH*ob@`=1-^DChUO zvuu=BNUmvXqzde#l5%#(A>_SnPT^6#_r zwf?em+;eummS=zVKR0Nn+&N~u>pjLsaLmrvc8oFMn4PbUzCZ9kwwdoH{HBr6w`LYnhB~&Wc;HhGdA0%F`FEFDLj|kFcG)37(G>?B605q z#^mH1`s8sBMe~XvW?ghR!sz`;g)^ft<{+v=wx_^OAf9Q`r9TF5ZaX(3+8tfpOv0L%0 zZ!EI%jl@UPHY;YI^rC!*1mnqT9TW}_Wm>%S#xtJ?6p8xZD7o2MJj7pDVe@(jUUPm4 z79^`E#%(viYiwuYjBjrk)#>I~xzYmn8db@(f53Q{%Q)PBX%_QWWQ|8r+W3R%VP@r} z#W;TcP`q->Hl`wH8BW>U57&QlVCqh+zy%NR{&k+34a3!^RUoBk@efU287Et}KrPGGcfnOoORO7krbXyOYovE5r3e64lD4#H# z?LMCBRX&prs|>?0?~JA_hMUk>EgWks*QA1%s?+c7!g1UsHA?bXnSK`=j`K?fP~$4z zlP}l9@r0N@l!v^Y%zqk=zdr3r?N5}E9^GJzQW@PWD5s^_S;iX~|ZgFl~ho+ADDG35B3 z2<(vj5cPegMoJUl+@k$`$SPNdlm#kK43gpB7^6D z1L3nWv6rM2xN9?XMYKN_)&h(Cpo`M~Nnt&3p*MVv+^s5n2<+tvf493A7B&IfyTkjZ zG74LO-CdzWl9J5b-IEEvw?Y!f-Q6gEN%{{M|hR z!2N1>&n)}{?{tFi)izG%?(TUDzIT8c!<}LL3%=I{hmn-w^TGgFE0e#wXASt??~3o- z?$9joy@!WiaJxg5fR!5RxZR;X;CsEd5iSdQ363{=em0i{xd6XD#NXZXk@Y>7LtHMj z7g#-K2bTpI0iXM{h3i(`2Cq}mappK0`0osB&i$qVcP35ceD5o`+~=YE-93e@*ZGd% za-nG8!d`tj_ge(4wD`|;P55`w1vc5k-`(>SeC);U2Cipy6Sz69l*@mzfTym^=Xfvh zOxPVd3VzlTSp1pa$F&5w?dx{#xd3=fEZ?ot2VUO1igUSvz!w+Wa@+- z|L*P?vFil)ob|vm^)QZE4>Zi?&nmJWXcflq3uQB+$^MDlJFEvrr8#iSdSFz^M2=Yx zR5tkMfhlADd0^)#c^>OUZ0G9tnJ|u757bKIosIRtKTh%7bCw(JA92jOUmfN>lXX9D zHDB(`Aj>7DPq=qj53FEz=B-+_8BchcPL*tN!6UMLu(5%JDyw$H6VH3#=Db>J+Ae!6 zR@sC{Txy~o{8@o@9M|F=XTMU{w*=u)5+~d^qYqwSmWU-6ZE=c^2JYWpf*&0bNs;|TDS$na`=N%y4B8$8SV4k>ZgMmNot5>RQ9x3DdomeoAS3Z*MF5*m9OuH^FmfJ zc{9#hY1&M{304&2)wJ{xUi(RUNp&S;{0TffB` z2feW0^%8oP;uMzJ`Qc`dT)GMRTYFw_#uX>d&|ez0u=rX4-r}A}$C|ZM!G8krO?p4w z*?5h5*CPnKhwh>WKTf2MJ_y3jlcQ*pG25vHySCvo=L6}TTUJr&YQgwntQXysETaA# z490z?Y^1fVCQwP;Lh#uYE9sNxb*cBRA^1_tQra{_gIZZ0g7-Gq(k*s_s2bQ8k*q(L z_D$|Xz3>dhLvL8o+YP!?w%0RQklg{`O?^xLQBo6;sGkI_`` zF#IKAJUweS>|#g@!>UmRbVGbKYOaUwQ@$>3IH?%5!!GweqqOMyZc-b^6DI ztLPlui5(cOM&Cb~g(`x>aqQ-SwDzjAXeH!w)RBI4!-f+mULKBHp7f@NUp)$UZiVCK z#l2|%SqIVKui-f5O*guH#2%D62)fPozsOY69q6wSWJelbh^=xcx(WvZL>J$p*0% z8hi<6b9T4L^q)eMD24r{_iD(%W#-7K58Iuf!Ej4w4Zp2XmOJ(+!eKTA8BhY5NCTqPl?(?mXa%C>~eeVv5-D9E8;}Asr)Z)aM`y%m<&s)g-^}EGI2jCo2t{)lyaJxAFFg%a- zCKo%x#M=|#uIES(a!7rPcp`M1P=YJDsq7)XmK=#S$~F?8;p@aBPry#O!RyJ*WGAu9 zDd;Z+ts#$BFBZqALI>&VN^&54o;W=Xx+n*n$)IK{@riUe(}$c$*b#v^>^$^CdMqQo z_Dm7a&Vb(36MJ&4bb|OtCiG8kEFtF84aCPTLMP|;B4YVlTdWTqr(3UVNy}#q@rlcD zHgm`VQedbi?gbqu<%Kpx^T+`43g|fHr_3YA&H9MbpyTx7+Z?h;rKk8|9(0g4&L;15 zxjkNr?p-)NV)TC(PZd2#Vf&n->4>$1$3M?Uc$uS=Y5eebe!g| zrASNVO_3&aoNnqO67#Y`)CKJSPDEN4Dnt#?cOqp%vbcvtlrD$=4w(Yt@#~7n13FGe zlBSVU!iyp!=s3+gG?h3@(nU{zf5uyq(BM;|eb8~5f7*gP-*QYe8G20*ubC68i}9jc zz)R}Q$SIBeA~)zbE&n-%WXX4negdByH-)$#-7bnLhCh32CzIvVLq+|d*L33aBocbv zU$hUnxW$x6cDad^q1W_viYfV&w?-5S{CSrNnQHDRdJ7!d40k2>UL9O5 zT#*9UAaf#-rC^ahbeV1qn@G}^P7`eh9vaJboFxi!7kabRcXzIjS{A zv?GY!O44l&d{iW<(LObA=GkU~1AzHW@Sj|t5e4ZaHJOpfDrAG$e z^%Z6V_ZK}pQ{iUd?+X2Ty-wU*XJ1cbH{`3~XMBv9)bjadvPXq$slPBQ) z)VqQ?z!PGjAC*)qumg?`&><&lO9iWelh)~w9SexS9eBec9dd2#bwL2|bEHG2ndS&0 zfmMukh|0+f!5-jyS~^5YJxve~Y&AfK*!(^&H~~EUk2dK&Fi~(0xS>Ov>|1_FpcIfn zuVwt1GtN`!j@_kn#s)9ur8Q($%fHh0o@<$fxUZr7E-O-+BbdPH403dnD=Z#*G8P&Y)PkZC#j2+> zm>a#uV)}Q9;z5}T^Qy!VEA^rkAAAneaRGsN;Ho^u&JFGI&X;f}V#hf}d$c`O84`kj z?@dxzi0)83yxj4gb9)q(>xbe;#~0(bwZV$O-e$P1%M$l!pQ})JpNl(Ub@76Hbw%n$ zNBp2&1y?NXr}#2u18(nVr_6S?GOPM|;R`0^)VSTZm~SWj@iMbaN;LO4qgWh>i`K+b z55M~|>+*uIWKlF#U_6;opAw8?V?3w;`|q^FtPq?K=|}~4E1@s<55;+|^QbU`6uK}y z6pzvpQ~m)V^qSFOc<`FZ)YLi7^uFC;IKHnDwPZ1(Q=Ww3ql^v}p=?B(8i0F5YEb5d zLukGA;rK(JA(VM$5Blj**nhRCKlN^A8|hIDeIZeAs-^D@Qq&fXt)xAu6`A=&uMeF0 z+V&gSe@`Vp^&xNB_!Zqad4T*8!JQh~A5g@#Fv2W`9O>X2G{0#Lk*|mO&Y2d}?mh?3 zrox;^*o=;vPbNN5uq(;x30nDEhe*If@^c%}q}2mSbP{ANJMN*f@W1jusca9V9%Z+` zkUM2Uj%0WnO`lyOzn%+uPHP=HY?Cja3f-agFKSUq&Kda^IeZ`2s6j`~4$1q%d@w(v z3O!AUlJA9`R{?`7QOE`t`L1fnXKKoka>4?+VI6#rPAx-cj)~-(Z$svAs1%LSnIQLv z`QXx|67Abd#Z_TWh5kfPEiH(SQ=Ev@c{qff6Z-PRx?J0DGrMk+k->v=CT5LW<06 z4oG`J{$sXLiZ1_-mRbWJSRh4feY~Zyz@IIpsG`M5S_~}Im!iYN=19K+TMm|@@K$rF zA>=$o;K)bj8c6Mc3p-)1^mVv21o-z0xa;JRiu5$_miv(B-2Ej{0RM%ZSL3_2N}d7l zDT1zo)*Z<&;GYHXeeD|~84B45&Vij#wmFgsz;iA@o}is7nGXC1=7TL%ykse`V={D& z4#!9~0na)D-?e{jk!%Gng!$m2`>Q1}z~^B;7z0)i59Y*gj5@ z1^g})<~ZXnc>TnF>Pw1eqfcc=sAgB7b2x$ck<@*;x)dkR0mI~QR-Xn7-~ z@G~$4c~NJ~MsDX-CuBrdgiE-ycnr)3YwlyNJCp@^QSYfH+JFgUw5j`o+ zh6cxQwU)a-p<(zB}X#d_#}lc{LdLTZ1Q;5y>DI8sxyw2YrCG*7Ila#sdFT zx8U-k7RY}rJNfxwCh(k8{w!VquzHmemlw?dcCP%z+Q8rS`~diM)o|{4HL%aLLEL3_#3atMoi{pL3bL<(8cLJM*9^p6~SWffV(N^Fa`h0fe4?Mz8$i3qY9Ps7e z&Z}~}&0H?T?!20=Kb~XuEZ*lfV~(AHqgV5tBK9nv`LLec^QFL-DjT@0hRuis5&X_8 z_AH);MJ)Gx0dV=^PaLyn@ml`>4rn$bS{s(aJ!dl_713^v*&b1)fIoA`W<=CYeis&d zE^oS#5BCn65oQ13pR>F}c^a47uvw7Nm`&U}ESKnw=CU0&7YbR+XFe>y`KkV2E~L^h zfqS3Lh~BO~!R>ozGoq;yes?;{o!&m&b2b+`o5k90r#~#e$ekVIOR6jPB z`<*Pi7!`9fL3VCv7?aGs!_M+TR9A5Cu)KMYvDyD-eA8W&x##Tck8;lD-e-B%+8!L6 z1J4ZPXPqn;%$UvnEc?!j8{If&pKJI}%e!k~O`4&PU3_BzPVALLj@m{tx^Z2!kHZLB zYg9Pneh)g#&*SI`+FO|@&oPQ8LC}cr(9333WsDnPOyj%q-qA9>2NtOtDD+ zJ3aK>8oX@EeMQ&r+4RB*q1bg^g+lIk4UOpz-u(NTLhVB~Wn1otx34{?7-`-Q+dWu@ zFOG~?JbP=3?S2UGz31+V-d6K)beIml`o&B!DB2M(HtCBMLwYLSoZSGsKHgA=Ej}^o z$2{@6#g){1CmCaM(I1z#Wl$OJ8O#wX5U*>Dry8HTG6mpQ<87mG)#6QGktpo|`3`<%rTYQxlZO%M zV))!S^ajmsTSE%Lue8p#pbx%tNYG}u2S?P5RthE)Pw=bH)1N?}N0(d&ze>2$h(gy7 zB$41(Av^D(DKUTLzre4$=hUOXk1yoQz^`6|U%j`fkzdONKLNjLU6e1k0KaMizq)hn zjQlhB)g|yN$<#w~74R#~$SRb3DoP#;epLs4RqWv+j{(2>3x3s_yg)t{{7QJH3~8L? z{pu3<)dl?tazF5^!{ApI?ppG3;8*>x6{CnoRry))t0^yw(ESMBuN=Uyu59G}stx?A ztf)~|2YwX-es%g)xhxv|ss#LMdoJ%+N5HQXUwFT20Kb}?$othE@T;sK-mhxFuhx9v z{i+Q7YHEMpudah%z3XQ$YXrag0Dg6{F|oW~Wq@DBhVy=v1%902t@!6xZrL9>zX}JxdSmnC zKffBKRr8-;t-j9tRS`IqN$x+t+F{T8)jjYi+Z5ife1ILAdA}M2oYI%~D=B!CTB;K_ zgYyPH^_Jf$Y5@G_g&F5pFTt05=jd}YIM%O*IsEghVWaswaag}nv-`>U)lgt_SqsN+ zz<+G-+~GW`40wG9zw3bYD|9%Ud%hibVJP3fV*TpCphKKT%?D=I@;gP%fYa#B+;eT< zgSAUJUt)KPPK@H`ao^x`Epn|n_q-KYzj`9a_kj%$@OR==0l%L+nDZ++aP#P19OnZ6 zO>5@-=R9ymS~bTffK^iX`*9M0OONt9MdN_~lw9QA;rwdcQI1)^3eo-7zlxf}-|M#- zo@?2Pxp&xZ_J|xe&XHV!ZC2QF%=*>stGrXOepP2b;Xl9H_*s+VW$;`)VI;>(fx8S# zI3Hl=aTm@ganD)5Iy07^ow0s396#XRVY}IXJRWj97g&qo=W(o4dG6+SCa^QOBgLWI zJFHV##qQvk^(dn8|1@%JgSGq^r!Te){wr^<}ucObAHwIIiud(LunnTYco)}wB_ zYIDz7e*89$^A^^ll-l?i96M|KP4hE8meYIwf${YEDvd>-$w;f zU%R>D=~<8Ipid4|-(GImY3&2L{0gFc-ne0L@Ljs)^#n?TxZ@}Fx9F%Ix>VB+5BzZP z4f&sn%>}ro7NT6jy=ax&n|o88>TcJFw}yw zIpKp#LM3#q$c9on>kHkeYqb7X7pl3!4=-uUrc+kzq;dvqhF#z1=`a10sSy7y*lztP z`ueCGYI#!tHnToTcdw+WxB6T0ElC_5w&N=GL?;LjKOaMzyosmkKEPSFHxYEtK2cOg z@-`gg6+oA|J5i_ggK=kwCq3%VR4V0EFupZ;10Ab1p87l>1V_28pm!YBp^O4T@a(_# zbk=EgYTxY;-2c}CdX&RJs*hnP&RjZ&uDj5injRR6EmW-NVYnOBEDy!nLxr?->qiv& zCln|8o6|EiTF?qn81CNRlpbdG2=xsJ!(ETZ(IcGiAO`l+?|wOkHjIV)`5MFU5M5om zr$G_&>>ZAE4veJLdqFpMayVuts?*mkuON@*Fl+lcgjUJRL{lTe@q^E*^wW?u6an`Y zKGy6zf%)s23*JQh`|f%C-vB*sD8 z(d!A&y;=5|1fB~65IKQ&xmwqd-N(&PPw=a> zFXg1`oiX|VU8Wo5#UxY12$?{>lq03dmXms@95Ni{mXtJ38-?yalJ$meN~WH7qWMaOrqA@3#A*uuDqA$NKH^T zbaGN8-dUSQ#=CwOn@oe5OWkSGI_86TC5ByduTKztqgP_%IgvPPR0`?o(0A?lb zNo2z32jW_o!Ku_H5Fg2Hak>-CTxP`+Ygx5;@@hC!Uw@F4eJc@f+W@nYt^3JAZz2wN zgLBO$`-r1vfq15OB-Z~COY*yN#W!FE_xj#0a&gE-vCdYQL6q+#r=8Dq==tK!};{CaFVp>sMrr?aJSZn5S7J;#PzXoX1Q%E*%!J`tQrS* zB<m7u1$2NZC>-_EF!SRte%D|h*ABTz`!VIoS*MrzT@E1qI3@&?`EAjc@ zChm~}yG*?|l89ex#G7CSw@|*0Ogro-zH}-Q(*|qEgO!WK_fp~CC1WKiikT~Z2{X8d zGn@(fgvE{NFeCfyNV>A8iLalJ#P8(}r2Nukad-yoM@g|K13!!xn`FVfWB(Fj5I9C$ zeG$%XA6Z1!P16?JXT#pqOSZ&snufUgGW_g=`J}{uh@vEPraWI2>cx5Ju+SnG}sh!cerMdG?=Q^=p8yG8wA?lx@D z6k_-(T9gP(&6`ZjRYF7~Vea;4_avgX$4_(|xX(>fvdP0$G^`Z%E{-xK?@q23?FD}8 zZ$g^JFBAO)o_@oacquOwxxn1*u8A>GwwNQT1@=yyNakLmM5ZuntLr(D-13_$Isja} zbplzmb&}{6@Su+IM6+z1$O>j{JH5t}$9DRnBfuT+$B~&@qeL%&b+?WqmImsgNtG~% z>OPLdxeXSD01uBhB7>gy6BPmP8f!$}9a0u4!Az|`V@Os6bQjG54qstN5=Z_ZFk{qEu@XyI(NY3a?VHohY5Bj7t zBTbkN>~U3}WJH}1)&Nsm^$8u9DEt7tLaa}u4TpqkweV-Smp;*1x=&~Uta($998%sT zTn2pbxE{IjB}%vzxXWFSJRPu2m;gLas7FHbeS}wlUHj`1$HOkd8^AN0Mw55XRtjGM z*X55U`-7GWd%(==W87#`=(j+q37qLNnp7su5>5erfJYO%sYqxI95Qk=@$Rw^t^p4J z4l}i(rosT=hI_hXzN?XN5Ac@jx@3GmJ>d!9g-N}Ixuy21|lIz+{*b`=3icdPEWWYDU5a4c)VWyV( zPM`~HSf)cJUU(@m0XELjAurxP5{Q8Nr05XC6ZL|5z&SBGM0CDJuoPHpvku98Rw7sf zY`sQ@oOh86Jb@?L>X3Oe^95Uh6(Swt>2z5T1^j2c4sp%9AlM81R8xnTyPOdu0I%q$ zLsHF;3r+(2c4?DtD~<}z1FOB)Cf%{;3K-xi<**m@ zNu;10_?1MP%Y}7Q?NEkXqzGU4E)Vkn`B%P34Q{9+N4baqs#?=foHGQCS6yJ1=7+O zs&Hfwb25J#{WNV6m3TRXdGj-wd2ofG*{u=GtyERTk>`gR6wtMbV11;U~@$IP!o$3*IZN>sT-f5S@aJ>MJiJOG8bLNfuf;Iao z-ASvM5hmMkgviS{yr?)`1=A>Z!x2 zG(%O|!5_{Bt{p@zjPD}#Y0zc5*OyAW{EVpGfOp<0QEIcw3F-{TM)BP#or^hS-XQ4u zdj3K`&L1b;z>Ag~`Hc3r?IEh*MQgXeM;6Wj`ndB{aLj~{glq4%ZoV^<+tSW<^N(sJZYaDMRZ>RPlf{e;|y2B%7^M*H&i$sJ4J zZn$Ap$lNqoo?8LE^t=kxE?g}?SOYW7t>tLvpE>doH(@?#SB84&Pn9pc19K(oQlz*$ zRxW_(t>_+>xVE0%q~K?+yBTy9!KD#pA~S%>Xj_yDa;?| zD-gZ>u55l2^sI6jH2Zsz>=Wcy_w^a1WPC*y2>#ZQMx#CV&d3^IJ~+vkMj!7Skqw8L zU|JDDPnCDegz)EX;~IjRGPlZR!A$Ui5A#;J5psBSCjZ*56 zz68!6B}0#FA4->lPyYELMIT)%q$R+Gx25Qd-gW61m;)x}N|B!Pd1*MXeY_M|cO*&c zfOED&=e%aGR0HOHzN@4t>Oi=31@PKAaJSB0S7|cv;>l8UF~VMY8(2*nc79HtF6{-G zRb+oD3JRMfH3Qz#1#>t3(bCnx)$bsa7pO^NfHyV48SNltX(sT5yU@Q){UWIX{#yz6 zYdAMa+JI|l=ux-SN_s%n6r2y=-Hc?Ck-%RsL00fSOEMXF(mBW(bWTX-01rO}^N92V zlI6fDNpN1zbi2d@`0`=+{`lEj5&}Fc4xX=G&fV#}bT?!m>*q)k;rXrYa8Ke&3rQMq zZUlV4&Nh%_1HTP{Jj7gGQUDwp1T(%leI*KD#{f8|wy=x4(>d55z6+bT7T$vA4}Bot z$hcE@A2<-s58l>PaCbV-hWX%x(j4wi=h={789Yhlc6Dxn{7P+5Ja?yaFf^q z)ucrux!nS>?0nFjztdR)`PG8F?%aIvH)K}%Z`!&1YBBKWM-RCC>MG0xy;S*KonwFp z%*x~X1+giT_cg34@w}X%ChCp4=x2BsvE}j$$vsNrTKURHy=C?obr?3 z)wvuv$%;QeI28EFeG@Lfx(j*Krz(C|=W*a2O#``^pbK#7RzAP70RC0|fy=B^fc+HD zIDQ8ClIGysTuvorv!=Zgj+23R+&|B82=F%@em=Mgc;pTK{NOC$eH#3H&=|PJ*oDil zG=OF8i@9t{3Ank0-!1SFGKBo6BJO!J@QX=&esu@9;6A^rvlRHp7XD7>LSXauE-q8b z2Hv&yKF4XmznXYXX5a67g?oM&*!2`YAB+WlxQgG^84Y}QY!dfQD6rsAFvkJF-yOGb z%$^@iJu!o058xJq6&aoGzyA6(_m_r}@X0@qjZ^Fg*lZhq?>_YRw1eIWnt#2Hf0=T7W=&{v&*pUtnf zJdEbvXXk^@-??$jcF3n%g>%eiS?kaI>yVpe4B(!#S(e7~r(CwfW?2)hU;M}ETDv)B zv#i)8eh(*`Us3XW?m5enXZtv2v#cE7ha9u{)zk`phRAa5ORN8~EW=S{+&gTRwK?=F z$846B8Bp;b|54-58?sqeeHGtbXEP`(#lQLB!m>MN|I4fh6b>bh|4Pp1q5H z?MA3W_q>^F6{nc5^LJC5TemV3X;sCGFurG7C`yM~(bob(@$lz26o)lS&PbOjap#tnN#ZA%k={)S5uZ=T&rzmc|bi^~`RdBJSyCUwz z27GhIYs${ElkvFgiO-u=P}ZF?W^A25*7`rr-U2v^ZF}EtTu*Sf#)G>hnM@zt-E~6< z5G1%HL>hD&k|uQ+?Y!h%;5*`)e^SkZW1Wj0>As<5swdU*3Ub!^5#T$z0EBS>vi%opw_;I3vX^-G%$P3?dl!&ivp5R_# z;nKGqC1(^d)6M2*OO{`E^ndAL9$(78Lp1b?BWdsNMDI2HjLpi6jytspT+7h z%Hp2O^@N+;D{OHk$uV}|v4q+DUh6}HB*zr*y$N~wy;j~sE=Q@Eu?afA*IL)asU4Gy7 zEI85eps|*)jo)j1s-EcB6;&x=5Wm;T`YFMYd9a$0hu>fAis$FAre{ys!{a_v5*)>^ zq)Dj9@2_^YPjEzre2hQF& z;+ygKW3zb2yE}v9 zBY51OdxgFHI>#U8aa^%@N4u2`;=l6P${O!*j;|i?$?umsaIY}xW{LRrJnqQ7!jp@0 z$B*Z6%memRkylt?A%E>KI*YY{ zdxh`XlUF#Idxf!i$t!$3Db7)MNS(MS{@ShFD;yb4Ug0I~6&9VIA7`;zbFXl9Yw`;7 zjpp}zxydUm%e}(&XJ6nf)_Cp}K4?c?VFvCMvbE$Dp62&j_YUmFS*(NnUMsB^d4&(e zz1C;?{eut`Mp+|d9864>j1ykdcVLIXR%`V zy;j153OI|kj^Asoyj2)yv6A?`*3S2I7V9~`*ZQ)Iyuva(zO+$$>efs@_7y12F{j1~^4(9QOL-eeMEIjV=*FfBB z#qoQp&6(*rPJ?;u7fffdO7PfmpgQig9`Jjo;JHQN6|U!TF`wMH*BZ{_Y0c$ z^xZw-72a3=>lGI6L(gguXR)3hB(Lx**Sjo}|LYZw9$4W&Ug5xp`49`QFlTByin4-*4|zl5l`W9&)an7DvZYw zW9b>`V|m;n_`hedT;;mpdT|zu?ef9Blkf_&HV8m0yuy#Ot0L~n+cNY z35t8Iv1exBeS~j#!9o6@xYwFmAqMN>UMry1P{iV1>vGDXh{gTY;MH`mCGM|Ec;Cmp ziio>xA%9KWUrqA-hIJ7yPFjap++St5pBwKZ?yoLrldvx0p=*C37WY>}o;>+a{9_YMu#r>7_iq2w*d#bnXYvVmd{Nwd>_OJJJjh~ty z>zYHH)uvjm`kSXZy)F-Pc8uKWYNR)HX0AKZd3WR)wgPyvCiLYiYs-Og}yOg#yThIVXjAGLVYJkjdT9aJj&H}Vkh73oMF%-6KkDOZeYTA6>ukZ!H$}R+)_523Jv}zq*+0IWE3!=<-@BKBx!2j; z^(uW9-<)N~JMG*JUB`Q+^UXAFyffj9(>3_xAIH$7@y=7X>bRbKc;~pFggEOts`KZu zKXlA;ggAq*S9Fzmdc%=@Oo(&MmNKs5$_0KdFvOXEUkTTg+W$Ca-3)Oq{7}Tz_Oj*h z$Pnrr<5$2n^}qo~K($ckom6>TvtI3RT<$8KQJUR#Z16@$M0lvP{aFv!z*^CcxHX~9 zSD!PwGB;i6SisMT)oPs1)i`F6!+AH9pD|12O48;yo_!B>4(zSC#;emE`*QLbOY`q$ zTWzA_czOOjt3n^mhu%RBM?HRTQ{}aJHZagpqcgvMnD*3smb0(p)F7_81s|9x%64_+ z4ddSB%iE^4v9+VxTz)_E`I@<5UL%JiD$H5D#wBw?d#7XkHa-toeAZ0$w2tF0_aYk= zIc0|Rt>&1>@86!CK4#X~Tfs4a-<$P|I%KwZP}*Ve`>REZT;{I<#T-@n{mH}4@!VS} z%}F^N(&eYP`ZH%|!mauEX_F$H$o8TFmq*KZ}2-X5dJ3Va!w?U+zVQmm6lTEjrPs z0{0@{q#I&3jTrCqk$aKhsRx?vf`Hs*s`C48=L4tL(wTbb{E74qq` zm46R$WeYRvPadCZ+qh46yqQ_ZC%cb>dy#q4HZ?nJ&+Idwdy(NC8k+;Vr1QDLy~vh( z8=9+Xru50oy~xKU8ki|(efO@;y~u4b^~|~%-+8y>USy6cb*f7nyxaS3_)M>C4zDuIJBr73PE<1ev-kJT$34e6xht6?oA&gc z!{gP1Dw+>&b@2Yp+ppUe3H(y|VX99%p{epL0I7jCVcmIqvCS*6fy}xc3qsH-FB*5BRX4_hTM! z8eYbn{vx+`wG;f`?=Md?xJEYbP#%An?P)&RlF9opk0XkCnjKkM?{wT-tdUUKtkf`t zcVix(=~UV*x$mpjG#*#{TFNY4|BcsS9#>jb$~;lwvDZ%?Z>v|zd_L^9S9R_!&U{_c zJf7;ZR{)P=R`Kr!zCG==ipMuvlr#^jN4@^#amJJ-&5&)T*H0d+aV5-&f&0A5a6j?O zh!W=a8QZ_AaDsHapu*B;f zk867sH`_+e^UB42!__H^o81e~^s2>U_1|LVhD%etI`Mep@?vJHBf8gE9+w_a%*>fM z)@w13r`IlKZf+6iwTs95G8QwV8u)vi;c?8JqGr80-Myai*s-UmIlfeTuTeu9j5IbZydjedKX?Ce>{2Bro#%`yyt)&7a{#7QM;81K69q$ks=Sm~+~Z7ujPQ z_ZGL27pW~TVm4_&UgYb^+-K}YUZnr|Ix#d0i?=dVyUgYHFMa+)h_P~oQ z#Jxz*668hp;a=p?q2xt2;$CFka^yvx%vi*1k(#{72R{m%_luDiIp7CK{>blURH?O-pYilWd zuYU+l@+n>0)jZo&$B>cXNn@L=N=kb6w>f!Vcv8xstX8iSon0Lr!Aa=?+gYpfU3Q&3 zIw0xR-UzG5`{GF>BI_sB$+O9Nl&N#l_4XN(8s>LL>EX{wg`f0y*12`fH}&5Slh&;abY=^W^IgAqQ&RM_ zk2aR)Qrv2R=uEaLuohx3{^_`o2rfb#h@y=XLYx(}!G1#@fRfsdZMg`v-iOpU6wuLw| zv@PM=-lw|j>8}vy&B+CQi~K0$O3*@`XIJI&HFsrl1@mVbq#mEe_s69#=CO@D&Xm!2 z$Kso2>WiVyh}vm!rOVxi1}g8yA7{79(7M|x>j;eP`m8N?)Z=xw>FIbzTgXv@ORe|qqlG$t<*Wk z>X3tpk-Pcx$y1zhM9tfhcs!2ZpXBDx8hx@n(JP71xO$&-6t6oYG4l~VAG>wJG5zAG z#MUSHGne$^4$sbA6N{b>bIxvb%yD^q{lwL0`8j;gqYnSD>WRlLa6hZq5l5rxB@);1 zndOwKhaDXPawpci#-FL)>5!vdw+x9f+$+2{_n_n4$L|UMa<8z>b<5Gr>rui{?iJ3e zYB@gnolls@y~3I+k{liCCM8t8&u2xEvo2 z%}?Ndxbrmk#Wxn8lHkw1!dI=iM_y-S!eBnL8vd1^Z};q((2dWmR zo$8V3c;Bf`!Y>|o&!6Z>*`iFsEVdpIKF^o8T}uy@>z9<5qbR98c<9jUUKoR;Av?JAOnRiNDC>KBwayZ5Hp2ug32K z_ic`Mlu5rfK7z-0X2(0KUtJu3gU690;vF5XPLD6n=TZB+#5)eA3Xb>Z@%Os%j;ZbY z#z*tGW<`G1J)(8|bsjqk#5)R3@Qu&R=T6Tu@MoT(lRw`k?a8>be5O=j z4?mwg{Xkq{9`E1GpCLJWLtG6WXI>lU$oO`7ToVyT^8RMbBR~Y}^R<+`B+j!h7 zn4ja#mn-f7kAIBeJ+Ei_xPv^tKazU^@4p`ShsPe=E8Lyu!GZHU4&q*6qv>Z4T;p*; z?iE(vV;;D}qpZa;jA=S|h(aqBym;1#aoGppw- z4&gcE9y}hsYZtyhIE&A$Moo>z@Ab>gg9r|-|n-?I^q^^QUC3SaTr z)WhAqF~3^DCuagJ!rM^5q6q^%qFCNFF zsg1ZBk8_SAKT*uDDlf~6buquH8gm#knKnF*lyfaHze*cQ&zNe#axaQu*PKd>N@pF#?o)&ecw$`E7-ZWpmArdAM)I5{RQp!3H`DD;C_Ih@+tRV z>_6@hi1phohY6}p#tawKdmAGJmE2cGV*SFSQG(XZo1?*f|BL}cHjEWCrUZ`@w2L@{ z1lfzvpi(uVRW)btO1dWFqKx^t=TF-ru z);FD^ywhdMtK0#VrjIG#`3h9We58EccaXJGCgA5Cp9WNFW(3vg9&$Z9sOQN|xnDle z=wA?2J&SW~_AUFw>&KUeavTF8}&MD~JcG^>qubuH2ODCww!b!`HXxn%yCsF(4g z{mzn;i0USya)zkCmU(7xy1q2gc1m`X>w}0aOmePVk0KgdiF&-uk4c`F>o;Zokf^;P zDxZkf51FU*!Ovl*lgv!CvJti1ay>s$EiBiI60H(MR$As|hUCUaF%lQbmtWOT2)Y03TMwB>qoD)r^hnT$;4|BIU3|9_>L?Dg)?alfBC zcT<;_Fu&_fhWAu2x>V>D9980e?dLW zI_!g>KE2XML2K#3Z^)~)O)0K37Qe_Ss5Oej&#SM$RzT!RkKDxt)l)^w2-?#&R|0zu zDKDsh*E|Ka%O-wK^`C$7I(^KEoMN5bc##GB6_2JBwC}Y0h0mW^;ypfp{gFq4?0D~c zf@dO=7W4+S6d4l$}qH_g}t%0)z71#Hff?63fLeN^d zX@;QP>%erZ=Xf|x(8yK}RJ+WWDsuJck12v|ML1~9$PQ{Nc1_0X^7jO-#W_GD)x}A; z{^$}=Ga0B%ss!2(Q-W6K8xwKeq`jb?b`j+ZM}x-QE}*(eqy7D5K;=SCkey5cS|i`0 zo~r9@P^o(X)QcVkjk0mH|Mxb~Zm|}$yjBw5FQ9$@nZyZ`K~^h_^5Aix;TQ>8qXTI_ z-#}0=)DN_S`%qq{7ibmjPU}6ofXda5luvIDvLS6jYeH*KwOWFD$riM~y&3IyZc4e@ z1XNQsru=t9VpgJEvjK8@Sbb1Qs0XUKiF#OFOCx#5f$I$Z=p_96UO}`&h)N&1-h^mXC8~vqc1D?h zr~0Hlmv#4+tXF5{`eB(LAX?kxdaPWJBKw`Ga(^Px3XvR3G)77eC8~pEK7h#l ziB=z?-AnHGAnM)Zeix$BnaDa4jrK&no!oCL*@mdLmTX1TTM}6dqS2gaHzR72iknSo zU6It9$XwEBEMF(7NLr0(U6)iORY|KM?c0(}(!Fjy-hujPC*B9G9Z9I;TFN`9>(<*x z=`B%Te$>w{s3(?$F4#wMq7GY`)1fZwB^Fl{`*wy76$F)Oe`wufC+a#&3@jwp+4&!& zPbFSv6}j^B8Qz~AsfN$f+SY<@7)icQ@%Q-d$NPd>u0K}=EyuhI$WMnJ1y?*a1zDks zy9Jd`ySEA2Rga=xt1qshUbC8oqs6*);Wp~E*0S3wk*jBiqh9NdEKBkFzy4Y*sJHJy z_4@Z))N4B`5%rpl8-jXm)!B}E&E8a*h3jj*M7_3uUPQe%Uf)8!R&J*Pt;-FmUawh$ zdaY;5Ms>U40@P{sLouq?nGd2qtCt6Y%K5^em2?aBnB9p2)kgy;e_xaG=nTXlo9b@P z1klL69JDJ0Q=X+Ks0P;umC6-B{YM^J-<+EA93M~z^h^&xZRjOXEqokQzQ+@vZU@=f zSWsKB3RJ5v0__>IKx5Vv+AkLlTAhPHJ^d(JuQU{7hp1j#`>9^5>HX;XjlJl)rQJdM zgsj(fI??)ls@HlF)ob-M)oYfz753G>RIjZkRIlw>RIlw;RIl}lRIim%jc~nHUDoSP zRIjZ$RIjZoRHu!KM7EgfwVFY42GwaJC(+tSby{mI`G)GUvYKeMBeJYS^#avneL2zg zm#it7iO3#Oy=DB^sQCM5L`hB{D*cFB3%OpCs23%w9z^>m)d%aPd9+mi5?> z)RNU{Mdt20{h#_Q>$RS&elwYCl6C|6=S`Mda@|c$=7yvy$s}#rcO=h~U+3;m^y#Zf zKL+jkB>o<1L*jAYtxZa#{$O5La!)QJCVB+ikpjx~y zXl-G%KB)(27+pc-H|d75qyw${wWI6$v;o!Gq#N2j(haq1b9&t;(hYSx=?0r3@AF5K zZYZIo8`=ue4fPc1hUy{Nn{-1zOnPBdBPu&cFYH=Gy#TX*Y(`#MGLGfB5TsQ*9fYR*a?7O#hv z{u0!t4#1pADf|U<9j#yy>NgtsK?m6PPMBA*R|)7Z?2tmBb)g{ign22{mwdZ}enUIq z3Eg0S7s0&AcAfZ3d>*UxHLai?xH^TP_3xUmqAuHx^lt?98ZDoqe)o;Ohy4BFYl6z4 z;B$i7@uf$QH!G4Ts2WuG9ux_jCAK?58`sM$oo;p#NZv-_gA2dI9tw z%Bf?R7a5(;(Y&Z^S?Gvr9ff`sEm{IqOuF=b<1d8r0kfCob?F^anb7^hp(>#N9lQ5^LjY9G=O zR)%!M&PY0qOp>wg%NG{yr?PVRyDaU=S50p%9S5f zckSo0PTwZ#XXUz_7a0dAch8ITSjx3XqOq8$&ynlXiA>ImG}(V><7nNM^CEkwyiWEX z_5jKaf1)D$4^8$Tb`M&&Z|fR9qP9I@hAEcqv)XDsKbZPr?dDr%la4f4<`meSFC=K z&le9X@2Gw?`L?dg z?6{@qhxGg3p5gOnj(H$xOxgk8L2KFfqR8z%GmnAk_;+7;uJv2A2iF}A-HzP9<3>TX zV9i)T>!5$Mpz^Xb`Vl)zJmy&TNEgkquC_uyqL!|Qenfi~0UgowJk*agxD6fAlvtW$ zt++$JLtt0vh!y97e#B_~9y+2Q_yQfVOBVpO^4&;B0(MhBvRb8nZpG5A!w()LY#jBw3;V^TA`hw`fMF>WhAH4)~W)RT3xAIU4Z zl=Qr3 zK(t#Ct=f{s<$4yP@<-O?*F@DO>KBOY7*R_gT04lwdYQ{Pmb#R3doGd9kk`pMmMwLJ z$vKuS=UB!tx=tHH)C1(}`^jADh%I$QlXEO4`w>m{BZllp{?{DKNH)iE>j;xN;`SX3 z*@swCM-)l7j;K;kRN0TXsmp#uk<_K0Xp)LsU*x>XtsidM?)oqHb(vd|EEzTT^^&Tj zE$hFVhRiKVP13!t%A85M`;+8(^6Ru)TT)xRoZ8``m{(bmK^a8O4)(;{O7%Mize2h5 zwV+tnhdzT|*d9ONpW9RYFuzjUrG`#exrU$*u}_{XiudUsfY&J=p487|S%|rnuFSyP zN?Ew_hxqTx7;qB4huvT*`VXU1+!L{`Hl21)kS%IMy7AYl^CGu>CY=zpx_&<>s9bcS z53y3u-Y;_F=p53K*^PH0FFtaIAj_2l{)kfj(q`m0Zb4s^MmaW!Tw643ouKOZeyyOs zW>E~TE7>6$Tvv4s_FbOPAEU9~YLQ!qmO_V&2`@1hW3_uhkBr1u&?DPp3Hlq>sw2(G z4wXlrqy3Wy`lLL{1%0x1mPEg!J!(Mx&Z_5_ms!#N&?)VL^v4@)pnk`DFm%ew)d2dW zUJK5 zJnQz6f?9PC(DoWV0_*!83>UPtE}%N@@-UIBDLaE!)`LTF-N@U4g7(7HAiGy%2(BwN zY_On}dha0YXG;aDmAeiUIol8y02VF^syXKk5V=x1E%6P1s0vTD>}f%@*4%y~S2Gm` zwYt0fMQ+b;2CDm>^%Xe_oCPXj)j)mI9Y4HJ(rn@k4P;k7_rd#x>;SFiLqNND1(02N z(_8Et4fcX|lThOEMj(sK2`W1tFkJUw4`>yd4(g41fJ&q4pq=3_+JAedm$=^kGZi!n z)CKjz3aCA|dgA@MOeVH#O5B$nWP@(^5c{m{CSs=`Q0v_kG&&aoZO`}Jab3a*kRPN0 z)%(Gq)v_b4*RBTI5!opBde=?7POotRWW)A=*3G4q4-O&b>H`|58iUHj%Ai&`AMtcb z&}#Ckt9UJijubQ*$rmz}#Ed=q=%Bb;wCdgOvmv9NdF#pfCm7rw>k&z|-`P|2F@ilDu~ z@1&r1V$@;e<^Gt0Y{J?Dg8KYsdj+kGcc2g2`sX{ae(yN+LI2%)%Mj~&+Rtj3rPc9c!9=BPB z-1`IcK}oR{`k)ODg+3UM`amD7E99pr*ZV;qtd$eziPzbuyP=O!DxZZu*iCw%kI~Df zMjxZ5KLmYH>ntXHs6&1VJ2?jWpje^M2QB9U=mRUbdlG)0?Bt`Xt@2J3IV;m`f}oy( z&Jn8zeuj(OsFDySsDws@3aaY@LXe;AG#<>-K3GuO(j!Pvzc&*4z6}(Nl@S_f>-&qZP(As4Jl@DRi2cye3=mIMr3@X`EfX0Xd&7UVqYuzNta`b}Z?Fs~PFUzn}cXKNstK3}`ItKzx^xxb-mfK#dLu z?O0#Xny-M`-$$VX*8EwZ(WfJ5FDeG=ncku9Ynu*&YNth@{cQlK2RUi~U>;f@^?>wX z-3rip*`D%}*+Ev}0(3xsvTL0GvR1@=qn#Xt4b$#m%P+O1)Dx0D}>-i*FZyW#`yIRqHsamu@ zy9mghrze*AfO@SqyhC-n#!2GaeV{&gEirllt%V4#R^ch2Jt>S>b{sLw2vDyw7*uEV1C=7ZLH4*CXx-~b>mF@sJ)i|>d}vJh z#`?5BO#}6LKA>&Zru7^(Ko(Jj@=_IPf8Y*F{C%<8^*9J-3O^*M?s$6`%o%+Y>(3V- z7gT=S`$y24-}hfZ*0uR%L48We`(Q}77lL->%b&o)L6}Fef^=?ItK1uXh~8ul{1M|_ zB=kldRujHE8kAzw-AH!^x}iS#JPqrUyg@BtDfC0@m7a8DQ^XW}e!YUA zRwiLG@>qY6Ir39};@Tv!&dRI;^#%UK=hZ;%L0VAxetRN5@9Y7PrCmyFF%C4kb_eYj zbwTA=IZ)r38??ewfh@)Q3F3X!?9}Hdvo0bxS{|cy2c6^6y|>eP)mUQ2RiM3NAu&6h zLTPeU5w-WgN}F6bH?})IxIpm5b(ItQ5_^lx8&l(k9aUOF2z* zFQp_=omCe+YOVpmzoQo|dYON$Q6YVoJ-%^(l6+fa@T`~ia z-KY7L>XLJ`?O~!4adXA_aA+k8h?Q(w|(T*f4 z@*I~c=U@7Cxi5VbUCzHO>7%G}{-w+Lmp+)T*W~=meU3|&^DmanM^TcU<8q(7wUYTL zmh@3{Isa0U`SF^Ze`(2l6!-kg?W4HoUW(gKNjCpdlg+;jIqzbUww!BOlB#>oC8;E% z;ht~Fb@%+slIxnJo-9{oZoB7Ml1j35b;{VZ7XRuTjmp@!JJdtpp;v335BptKp^s6E6@ou+54ez8tZQ$V zeiwB`AKmn=pmufNLqX-#B3sbU1C40~3; z^^I&Q6-L+soI)XsT=#+jc~r_Wyk)zBTp(Q`p#&~Vz% z(~;KeI6!T2DbW6sjac~))zMt9K`s0aXg4_r8XXUV%Jlu9es~M0y^E&(pUWvfKOeNa zM}Yd=Ng(SMO8L&QpgMH~XrCEE`+5NFFYu@JAH6|sZ%@$LPkod9vol>6Mt-?co9et> zoa#LDr8=)qly&|U`5V@F>6e$KI&XZU`mWxh`mW!Q{>EFX??yhN-ht}89ZmIJ`$KhI z87O(5>N@k6b^asOb!C=h1)_e1>N%T6RGgB(sD9fP(V9WjI}uqKqM{JB>r}7xeMDsm zQ4NyoJ!Rfd?pG#i1&DTfx&M{wtNxUz-XOAniN-;qvY%*eA*ySM_DZ6*NOHF1G$NZo zR6>aQSh+6!a(yV}_8_7-xxjdESckkn7SfH>6)~Nxxi`bzYa}t(dIyN;1FP zlJ(u~m%GnfY0~Fl(%&#-U1yTItnW3$3y?4`+_1H*8 zCUadx!)monupbcCbn22z|1@Nq@fnP~_@C z^5>PuhA3=ZE5c20)#z^Gqu~1?M^5@wo^5@wj^5?A)6-{zRmh*$f38DrY>A}nE0RCY0?D7ZyHCZs_AH#3HW*aalRs}Ikw4EG zN`JmG`SbQ@KU~K=7-+xm4jKi?pVy{Pf1-JkKX3mg-Lle>KX23_f8JU|{RzuS`o;E= zZt0_`KQUU9ep&TNzwFkeU)FG`TkA--*h{Hfb&1A$*_Y%a+RI3{^kPI~AL*4X{dwg( z>69V;c|-d1YF@c6{dv_OeNqP#4e8JGU!Oz&+@6u{=+d9pq(5&-e_ogVywaMkQ|b^c z>Cfv~<+}9e4e8Hw0~7D>_UE-@l)L?TTl(|*dRn*skN&(R`xCc6Z^{0|{XLWa<^_a|;&UXl8x zC+kmisaNX%QMVMSW46>ED;b&04M|nfz3$Ex_kNoh@IBN_gVI{O+!_6*qTX7gGg18y zTAxp>vk7TXr|l(QQMdJxgV2AdrypbPWY=qrK13O_jOI*xox{!#tB+E*X>2_Q3`V?&9lT#tb3|d?+0&3zhc#j*(BDDLMJu|Dz9>(e=%y#fDY(8 z3$Mldbh{WW$P(7B!S(YNkS>(-#QaJ<*)kHZ-?0S!jUDt0I-$ML(dQ`N3PUffU6-L3 ztaS|f9lg|4(v3|a&<$ho6!bl6z9{I2^>iNe!`iE$|Ix?K#C*$YP>K4VhR>lN>})*g z$1elAVLYO_mho{Fbi&@S9Xg@qI7>P(=R4{<>s1BR9#cP{Pj>0z&!KI|0kSy{!bGmR zc7zJ*&u52#6@tg(x~-#v1=;G5AVI@9AHIloYbSgW{p4-=g9#gH(EMCJ79l*k*ld{gUTUSKkT<@23oyu z`y<~l3RLfA1+~LF`-*ivcPG$_R6woxHb1e>hW7&1PC1F|PWKV(TD9q*dZ{63_el@3 zxYNDGzOr{AXw>KdS_R60tnn8n_N_I?K_l}DP#+cuvfcGT<#0h_##g=Yb6ku8jlDfU zZC-xL9XH7Th+0Kl)EiV%lmXS_?|b0qJ>w#Nn+2*hdVos5N+27T3e-DZ?~dzV?Euv> z5uoz5FK9LX8#FQ%0qqLEyNT%?_fwzS#H7=p-75~%53d8+{YA9CcM_=790?lT{6Jl852~RJKy7d>;?pvq^}HZx z49yC%VX2AFzIMUqUwQ=^K`+!{{^%Fj&Mc?# zUXb?zF9q$Q4IW|rVePwu#;Dv^us<;A4D#bQj)IH&TY^fRj`7%E-D4l}?fao0O8;fh z54Fxk=!ZVSxfQQ_Uvx9Bi}2cr{9+jN!}|I(R^w+xMLEK+8T;%GJAEAOqhRY#fq&Xhf#q0?d)SAZy z30jvm_H3ZBvjOx&eLo5Mq1mUPANHq$ptfTS>B#bH&<)#B7qqJFhHj|2 z%Ynv}jnECPOhwS>G93D0>+_)>R@Fr4hnn;j`oa2F1eKj*pdb3hD=(9B+>Bjv9_H;hW1h=I4D8`^^YpwaZJKmPp9=74tdGN6+AALs>ZI)r#C7pQkU z1ijD>i~x1B6y>$*s*_j%lFrT?dtjU{LKeir6QRxM2XXq#vl<=s~&F z8PsmJBbIChT9Hjby>3HL%~2OLGWybfIWOY5Klv>F_fPG!3UebPZ#O!pySEbc55eIy z&l-M~=2=U&Lr3g_w~*^8pJ89ydK%YT?an|y*qGnYA*HfT=XRG2fsSbRH)C$43>=Sh z!gjcKTJiaM%k1z)Y_k}sZ)}!MtXms*;(B%PN%B$HZ2X+|wrTiWOLyf_Ame=!c9{Pj`u2jeWmE zP|tg5n;^SCe2btmY49ej&sefSkk{dL$gN(ng6!1S7(rv-j%ch8nzBYvnKs(Me)0FK zu|BV0B-VfRUnyv0zOYFiQKwBH&jqL8WCC(z7Qsp<}GH4IR_&`G9KF8t52%{}<`munEvH zJMIVcOAibo)=32_vx-2^w0ZTQXX^9e)DNxM2pzK}zX3&0rgmmkg4jTVDL1k+SP;YgNbc;XKUc8Uqr4!{7iW6VaIWc46A?TG} zaxrKm1yEj71FbQ6LFN2I(zEv~iRC&HJLDj?xd^>dek}&oI^96)X)#)V_Yyi~Rf_}l zRntHtOJ~Z*lm%7uH+0E9Md!q<1zV6CKj@s8_Lm^fx);&Z2^<8vbFr5=)!|0rtvWL!zDJe(36Mr9+ z+`%AA*ZdRyo)t{>TTnY!HLb;|T=9cXp-DX=X$N_ zm1wSYCLi|sL3;Qms%I7QH;Na9KcU{QiE~r7;r$1nw{YMGK`Wj26G3%Ty<5mTOt~zm zrycUIprPbEiv9Ipld!++VjR{#W!@*KjSt!_XxHesQ&91px*hBDQ*1>Z@q+60pbQ&D z&Q7&ikNw+8v4YmR)@#AkDPjbbN@vyx+A#+Vs${qp+xA~!sfP_OMRr>R~C)<*wfjZQ+nX2*J= zUaPb7M2PFvypK??ne^?AVkYXf;$cm}{_As8ucy79Byz1&UXaagF;V1f8Tkg<>8rZP zjg{qyZ?lFYKX@|~uiLpVM9{u!j2Be9E)NC+qJpqre;4YtUhO>UHJkMV^;+Lt8D!sw zqF(Dy4xnBuuQGzhOn=mCquB|n(+O2Ub;R1?;(d*bg+QhBD%5FfNKsJB+XeMn@efA5 zw#%=hdcEl;>b0Tg2UXJ#_1eC%7xmh{nw9GI`;n;E#*I6u(|VRRpi=WB>a_8w38jv8AU!p$SJtl$1gTkO%Bnfp|x#S1xM>12M5J&Y{9|-D?3xjIH71U*RaXx6I zX-#>#Y?K$ejJj;cuLO0wFQ^Wy3|h^8qYhgg&k)BNpuKPu$QCuFymv9$Kl`N@{&^PL zMqJb%v{RP=wdM~{msyKgPrs^2Qpdcb$oV_Q8&{JjuV-}-^t%^IMwF$3*4x=VG~ z*avEB=7Ls@fgo$s5LE9L2aR(nX+QS^)LSj~2&fEP4;tNO()!?GpgOlB?Z-PPzh4s6 ze|Qjoe?{H2?>qq2C1*h;emWH&%N=p1N$J_hRNO=24AKiGmT$k~Xspc=gjR8-l2 zJef_`f1U~&O{o8{ZU-T^c8vtJ!$Uwd3-urRfNhUcOC{dNPG|lSf1h>F1>aGB zir@Sxs8sV$X^Hhg!MI+1l?ghdXKRrU>(TY;^Ilq|M6Omn58cvpmaZUj>ysDx>^o}X z=VM8&(Rb)xtI>C;)dtc$O?id)x5j^ND|kr~?N-0PP>w1oe&$FCxF* z`j{XaOTG&`HDC{NwGHW0#+uM0gB6Vx>&8j?-l5vRfPw33#I6$5S8QF5{g}U@FIL@J zi;+Lnp({$pEYKAt-xcTy`*#`iM5}sfwzy82(FS^AluSo@vf;%Hv94Wx2R*Se<_3+u z9jA$Pb>epDie0S`XuTzWL}^!k3O={lKhPN~-w06mDhX;W?@z+#Wr+p#SwldzvNz?y ze}VQF>LYB;HBnrze_IJ!|Av6tNCvWX4Jj{6e!6xdALXscPgfRvoFHCr^?wMeTQ7r# zQ~K#C6KVh24&o;A)3rX4blvkspi+f&k(D4n-QG)nx_(uD-#vuPq&7VpRVMRe)=o&)3wiZ4oodaema{*e!7;P{B&&-`RVpR z^3#<@(ogr1etKi_)0IKwrz=K%e6IGGe01GGw4%vJ*KmlF`y1mwq}MK)EWv?{3$U*GWH}$?v=C zzkTS>CH-{cF6HV4qH>IA#}k?K(>3X*8`4jAKev&|^S=M)`(1IQJU!A|vccZv06vEGT*b>(0-3)d}u6(?x@E{HzFt~+%%*82`aAELiqj5=>u@IW78#e7B|VhziI zy087{iatcuPN4p4Z91i0T2f2+mZ z)Wy$j_*Me>xrT6&>rL;6;?HwGF+@<=zivF%U#t!WcdiW*G#c$kAHqIeMjxVQRfwOe zQy-Ff6#5Y5SR(oldxZyRWegZ8Uav--LjS=Y)c}>z>(PIxPm6%sz17rzq$>d$nR*Tt zuVV$nsSnw_34Mt5`7ZhodtPBsS=k?bh&m;X`jB=xLACDK0K8tgKL9_!M|;rr_!s?$ zv9dX+^|;Uv*Zu4PTApwGMXoQK0@^8yf=a1_eZ{(c&>yr`dVnk>!B4C!6$gWQxC&Z- zU+aVG8!rT{fHt5Jo*iU;uJjiB>bq5-lA#}{&8h<0UH>rbcRLHRp=&^6!e~$*+l=U4 zoc4!(L%*Ty+)m690J7mFL3`6f^c&Wyb)Z&y5as2og7*9$=r5S}aiYg!Q2*E$R4>&8 zwPhJ;y}XUS!U*0E>LcfYYKlR$o}&?QSqV^?oC?$qQy*eAK8k+AO1}YAK2RT`{GvXD z73@U&zP_N|w-m_6W&yP^-_Q@(Z61Ow%{kDTM16>Qg8C5kAL>JlFzQ3B`_zZ9SJa1C zOQ;XAZc-nj?4~}1lT1E|lc_e#`fqwW>dXTwn!^;xf8Vzap3i1a~y zHV)|PMQ-nY9xKSsj$JFLoGlT9>z=+|gZ(;J3_z8VkpfyL)ggR-_dB$UU>(AA5|B_j&((zpgQp zthG1i>2u#}&Y7&O;=YGI+oesYPITx#^jS3@1br6E3qYUs-RQ&I=h^o6hJev7L!Wi& zD}!9jwmll?s2;}vZ3p@t4A!Pegc}#-Bm0BRA1kcSQW%tJa`khuP5H4eSm}Hp@br$} zj`Gm@UWglSfj;wVN1)HV-$Up!o0$+4<4ZxG&B1}tXS3`mbXjjqMLON0JM>wVxddI- zcc@P-Pg9>-FQY!SO1uQR%+^q!nl_sm=F! zFm5(R1=$ear*2Dq>M#2~pvO9OB~WgqKDGIlAr>h&kRIo45Aqt+r?wTTPp!XN20fP5 ze4jc^Uc|gA^{Le%-=}U%eQNzvOXxAX==;>2s84OK`#yDyt)#z~sZY&H_&#+`>Qjqp z)TcIK)Tib{s86k*`#$vq>QnQk)TidPe4n~5^{H7K>Ql4s)Tib>s87urQJ>oUau50` z4pE<4=cPWiYDIl&S$8VtH5&?=n%zNJh5FR`SuMIg9rdZjbLvxzvec)RnW#@KM^m5L zbf7-9JxqOSGnM+({K8%6CJ*<0>e1Av*6bk0*-6r8``*`y`ca>n*O-ra(Pt*8UXVV^ zRiw{$1L?Dg+8^_JEa|gsKz(Z6q8(kog7n#DqCT~`PWr6(lRjHZ`urt7#d;Iz>qMof zPtB4Qqx;0CKDEtO05R*D2h=xn(0tph6#tN!_#`7}uBM~;hiO2Skb|stDv)nVLE|}- zfnr}`8t<40lsUd7#)=P`S8+l6Cbl2{8synyQhYA;KTe-`+5DhMH}Rv3+2RW5D~s1j z(7zU!j#D4JYzow=)bW+nKd&?s^&)xeKF*EHn7fdVuujV}m@l^x%~PWOWqw?Wx)^V8 z4}EYOvm^2l_16b{4(odQU+86@PR||Hj)`{=*XVB@?VevRI+{NY9COqK{)E5ry_vRP zU4h(d99j6TWsYh`d-xPD_MUtxtnC~(E=KH`1t#w>-BFfaI|b{qo# zzp+ur!EbcV*6u1E~=a29y{?j>7 zA6Nyd&0|2ZxFgM1rt^fN4V@>nd(vav{+JNdwLbU9=j5aFglzV8#Ju@QP;}fw)Ehx_ zX&Ev4TpEu*4P>_{pOI~bBepXK5S#Y}zx*ORXvWh1VR5l7Vlj-)6Uu2#Y5iA?iCY^G zxBK_7d`0KR?EpGYXbV=yyv*q9NX4j*BnQ)ZLiU2{N4y`MCp4M;xr~2&{ph-{A6=#T zk$6e^Mu-;C*=M- zA=^cDA~u|8{CPqha-LB6^Mux)C)6S530Xs5H}dBRZB~k{KTl}><2<1XIZtRq&J&8| zzP{tn6Y?1pbAO&tj`H(EJpFk>9&(;ggq$Zdt!ce%L1ayR9CDse`SXOKzthR zgfiqjq4no6Y-PHy4mnTAeH|${PpEty$@uzFP)D-<9ESDvqJTji$@scaP)8CzW}eE| zkN(#>QcyPv>PXVpj{D`*i_>>)7>w(GM`~_EBFT zO+x6q>Tw74Cf+?a>3;mj=!e(`&EXroNE!G8A6F4nS0__Hq}*QAt?cCc@ELvRPxM3d zPy1+paHEnq2cibILETKw`3wCHUaJs%OVywH2Kv=w_zOq2r`=;my?@1BN0~b8rlT2M z_$ubJ%|tzm=Sht`N*+kC3+u0p-QXx9m#sql%lsvdrgYo|j#9)SUrD%FyI8FpF%$ER zT2FJ-LvA3SVVAZ}bg}609C?f>)E2%XAJTgcd65M075<ey6_cNGBJ73wWhicuoOt3X`9g|=2Zt(K&UqhWZjbyc*_ZuPUIJ>-!R~sV|}1kgtdsJO>eFKced8$GZ`2N1_S(60Il}%{{}2U*0!O|GPIN z8sC>N{+u84=hTHi=NJ4gNbq}7%%AtuA?N&*_Z98^Bsk~CD)`Uyz9PM^h=AT#g1&_M zznt^a-bVsI5k6*~*8718q4IG+8R8ovSnu`TdKyn1!oUZl9}kU#^XS6Q^N@8Wio|&g zap`dk^F=3F_my!RRl&RDCmS}?c@R?({voqcUz+Xv19^wOk`wucHb>witVv$#TQ^*Q z{aNbs^5pJ*az#S)!R74Z@C`9F|e7yzvhyMQc z1sCg13r~WFn;*b@?^3%QP3dM^9c7W|8!`Sq`#MKm?IY@HYFS?Ri2QLg)zwxFTZ(o2 zrYv?;-=13tZp#aQVR?7V!+gf3bHN=yM}n>5%yG2UqrrFd$kfPZ?4duXuJ&p*{73E0 zIMuB)Nw>m>?2Bf|Z)}fW;79gVROC74=nKko2EIg|!?#BRMb-@PC0lznd`T9}hJ1&! zL+~ZFuP1y-o)qLuPw4!)z8w#~WHQBtAK8S-;X`ao4)UMJf52Dx^5NtYJr3aihkDvK z#K8@f``)~2XVlfqr+ndv6UFZf&VPlvnmGHQmy7N3M?D?oiFZ95_4kQE9<5+^%-?C- z4f8)PL0ygg{2cW((Xj|9drU@MP3(Ky$*og&8iJ0)^@4k%9cMqN$ZeA(QM z^C=yOvtBjBx~btH&;Jc5vd(Rab-4?HHu}{t7u!bth;cH2?C9wxZk)A=0L|vy#DPy5 z;vld`9O2+4eDni_9jqY=?$_h#c2FdY#M)huD<&`nQ<=2dvpTrq2i#9 zkrWikpP-&*9`6Q4tLYRE=}K{?D#YKj(D;eCAY1jMuDd_Gd<;}#6(}!`r}1$;K+(7X zXbYC4IN7f>|1dFe!RI>eKDO8+P;Wj*{JaYkaaU4&VFqaHjsVT5UZ85#isJiqC}!nB zxv~(*|H=xowP`^8DKU*7{F>s}pQz5W=OyvceNgth2HIX{D86`z=BF5nS8W7M+LfSs zumH4CW>eg3GR4WpQk-BIC@V*R{A6#C{n?c`u03cDwWRq%VW7O%fX4UK2KAZhp#82g z$Oe|9`P8LBd5`L9_5#(_^fRifiBXl`;_s|tymu6FIr0IU^aS=NiHM=leXBDe53$?m zeIaanB-N(|KE%E!oxTWY=RHLq-8?x9A5rhl!bjx7_wXU!tRwa1*Bpj#@w|`mx%_JW z7w+@*oqBg1`Qua<997$uM-UeY+Y2VeCk&bHW@;Q$B&@}C6y62tk$fMSu=_nu0 zo$hG&eLc;Q)g6gCn4IzRWEZO`H{cU;@G|&>+)VE&5eo*wFT~Z6<8Xb91@H-dW+wGv zOkDVd+BgY$jMaSlGAKQT~r z&l};!b^{NJ%lpEm_qDdO^i#rqG6SB}ZAd5d5 zKB2z)jyR+U{6fZR48P#7N5dyX`+e{UJ}5dUOeOdQzaI&oV5dI8AJpl_pc!`@KEWpx z1zE4H@CkMEH)4m~@CS3cBB(Z6_=C969W?h65f`ir!{6gVZIBg-N}Rt6{=m*R0@ds! zAU}5;zQD^22kogcpeYj@WW$fc4@}32AiLgx;#I$Z^4LGnf0g(UXxmQ*&7Srkdsh;a z?@|#PJcBQYcnd&#z9Dg1N*d2`6@DQ5<E!LfrTZsN23GACLxQeMf_QVFQW}Wdr50 zXrP*Tne;!y8j#l*0h;8^KvAz4Xusp2{`GTR{C70<1}J~u1+pCTC@wJ+G+o+KyuKPJ zKGS(~TQn_V);%t9{2S=D7x(2=a||-rSz^=glY4d2{`g z&YPP{d1+mhUp!OM^~dSFIXfN=u@dh{Z-03T>hRm3DsqY9uoDzN*$0{vblzMiScllo zqx0rs%v{9sz;uvRngEKFv|m@|r2V>LG@UnRnR?Ro(K-`TQJ>tjZH`#IYed&?qVwiv zX)VO&q(5(-wjyG^uq-HRlmuB;>XUz|dm zcvybuy*RrBIxpkafzE%~7f3qaWIXiUoOuO(7kB=IzRN*j!*Rb!^@id8tvi#>f4>Mi zFBZQcomX{1KH&`X-c+dv%7K3mbl1t>CxbdhDdMJ21Kc>Dyc3i)2T^>jGAL62Nb%{{ z5m?vrI4CwPA?ERU#{4!kZ)m@jDUlyB`;Z1ytG=Q2xjyvAed<33Wwfgl$2?AP>0O{* zu$~xqDX1IG0om9opd2_B6u%AwZLbKLZ_tN$q#LN$b_C@&)c@e8s7}RSQk}}QY=n80 zwE<`gQU61ZqB<2zPW_KB=Vvi5PEei7Jf}JpFG&3lv7G8uR#2UazoI&o*-LdQwvy^p zYBklV)M4NEcr_XnKEoycDo#NUnGBiai@ zdBk(4A74l0OZ|AHkEeN#C)yF7gNRBIMQ~l_q9^_4>^n_?3G92>XrMvmUsQZZ;O* zL+!1K`We44@-uXD&0O-&Swrr-Sa%wE%TayLFFLZT@lQM28;SN|K3}=*;Lwq49mV!G zD;(LNaf>j%W8*wWyE|GWIB(r-N0mSS3`d!*=2S=X<}LinjC@Cab+`O@H!i-v4Zq@- zR>7}W``XA$B%g))6|0gKz9o0vfM4-ghu~Md=o$DG>--*mCHoWsS+42uE7>XzsB4TO z-GW8Rd=OzYAm1^I)hAZz@Re4^zo&|EnK@+tc%?zaV$JyufOaz3aE%>en0 z@gOTSl2~dG@o_lK|IibZXF7xWQ#+cU)QZN(G^6--V^9rk2-+U?z%SbF>$6L?-erUCH~_VDDEa$ggBZ z&oSgzCMr=5B){Sbh;}~tlrG`@>k0W2pYBtqW153XFJJv z*evfq{yp!kDaF>m=Uw{uyi5O{cNvf7#Rt;!;63m58pZM?QSJ5dW};c?;{`{LZ2JAJ2U--(L~F zZ!f%GsgQFYCgj{l&{tvJzkfkZv}n(|MD#z;#)TG9Y1b-9E>X;2jjxW!FUh{ z)PKLh^S#b&??Kn{Z+`*Ke*4~0Z@Ue>w{_-2f9>F&@CQ?)26URQ8U;Pq@fq}-hyRW9 z=elz(>+o#|*w zWI-OHCNHPD)0T0lJMs9(py#GuCFCJ|dR*wb?fshSOoh@S4`B%>LeJH5fjop|q4OA` z+Ygk7oG%DnH-Gkkp7WH)NY8m*kgr?|9cL8F|i z=ywEFz7mM#lEffu`51bvqwWJm>PXV(rV*eT))eHW%h7nFoS>bRisIv66L-CZ-myye zL0jb_$QK_b9n7_Z#xJd*@qUXy8E-boI!pq^gwddCF@$(cf%mNVMDh_!^>FF&6${Qk{VA z>#sgj|NOTqs9%W%b1C1r7#+{~=FOnw=8GPy!zJJkOs%54rczDBUw-ER{S(oyKJCk@ zc!d1qKm*ESYW<$xUC-8CMO{o@+<@<)_x8a$*Pjo6n_t%Xnzd7*~zQ$X8Mt-Bx z){WurBlBFQ`dfqU6hAHupVD$8_6682lkol6v;wrRY@t7|o~9Z01*jDCeqodS1N@Qg zt3&m=tNrkOSoYoc_v)svP>f8+~~O@*BJ36MRs{o&z6L$9f>Yv0wiSACzOtBfn8sufYdZ|9Qx7slZ`91k?}j*$;OA4mRI zs~)HaXQJ^^pW$O7{smADUPE!EaiB`k8ML!&5oZ<#<>d^-)QLb*m=WVVgYW1DH$av6 z6etty1$p*OpsBx{=ELXGc;9Ihm--X52Zn?4#Q;#O>kG1|JwSD`6EPv>H+FkV#O82Q zT9>skXm2+F^)0H$nY5JOs7R{EsXr*cVa0rYQ=9S|HJ$Ps6^;DRj`j7pLga@whWEqA z2-e6Ky8XC`5k6``IR9;g3f zKQi>g1bq*6y&dHv{08|? z)#C6CwO|f(R=4~Y_tn|ELEq)g#Q0n@_0BVVk2M4DIEr*FptJJxw)6O2x!WAW{N?Mr z9o40X&5r!Yv(=7veY0g?rkv1OHvG(77wggG=QxUWW2o;jzXWtve>)aBYc5uX&e|Sr zNoV(;ht9Hs{h+ffWj*LD|Md`b)@)8gI$LoI^*z!LroKm>UeH-KZ4~M3%^lEJHZC@3 zAGLwbnoGAxXScKjS*6d=Q?+ak$g)%d?SdGf{IH+&^q&!+yP%&aXWzWLUqt4E(nT|>4-7DrSa;YNY~2$MY?wI8p!9Kpz$5MLGf_|vE(vP zhev{H{8UhO97p5Pz0L~KS(UIa###IBG+);1?BuqHO$E|f5k@+zPBo(O(G6(*1h2DK zsqY~gk=`73Wb+#SpEW1Ma25(I|Yf^Zfy-)cDKS4UnPms=j`Q3T?-1uH+ z%ahKkX{4{_E$J(7;&t{4>8ox?to3~l5u&sI^*d6*xsU%>on=1n z;6Cq=Av$Y33bspY9;vNOk6{i_L*8cs{pFa_x4p99ay$VZ|l#jY*~98*0f9@D2Ob{<*kM zv!ZjbK0!EqLtf7f-;hZL!Z+BqQt%D)F$})JXPCaf#~8BX}%Wu2A}gAV)-NahMu1Q zvHI{4I>A0Z0Y$%Spq1V?`jcW9^aGe}XzQInCZc=kZ95q z)k*&x-k&H6`1l|41+$GPyl)8a8#=w8|3G@L&l8#V4dH!5c;8U6V2Op{{G%K zf_}O2zQMe2g!aotUAivlm#bR-e!gEWe4R@8=kwrPhw*&}>;1xdzYv~5zg(85`{@wh zFy1$e_X+J8JfDX?mmBW~%9DErJ`vD*-8X^$hfw-B@CW8&?r8)4_tc)oQ-q8&A4|_r z-}pa%5OO^aSs&ad7#Eugp`Wa3M1rz;4(Pl}KLT|gQ*k~0o?wpg$Uj86k5uP6v7h?b zU&lkKASnV^2S-bs?`g)9=VBhd{j;u-Zm5$=)Qi~n!hD`Gvxv3us&i_$^ z(^sO8Euw6g>SDF24Ei2ATOss4z{ke+6yl!|)IDLub(P^yDXr zZ*uSox=-XYz;bPlvF4uUMhHj4jUMe*SU#C|hD5p5!<%8UYS{=uL;)DPqj zd(!yGE}&Z2p2oBJzDLUDh((hoH2<+7sBhP!b>C3m!}OrOhe%0%5A}+C#C#wh(b+1| z`jHht7LWWytso!K?WoQpekVV%MaWNVIr07RXzV9-!T6Dh1S2nP$i*pd6E3W`u7*g);{*{FJ%7r0Ih$2A>T`Wq5S&`rGI~+ z_3tl~{{4j_pI_(SUuZ+#U#OmvZkiiJahk~Y6ZIBi@OyxAp^tqZ+f4H7#t_9Yq8i}G z`x5`__W)&EzrLkk*NkYI5Je+D@B1Fo_dT@lduU(h3HDzp?e8Q zA7KG~9wPo9{e%Vn;`0vS$vgu;5h1=}y&sqmDj&-b3LkS%8|b^I@-&{(Q+x7|@lYRO z|1lq27cf|7KK3GCSl^EN8woQY-;g!QCs@>U$S-V*x74Q?Sep7HS0dmK`a(xs&tkt$ zZk%qPTnWEnOSe;BphFJ$kSd%7{Q=qG0`eVpKPvo#Wy+0M44zB-gs*48b*92@>a+j! zFTNM+UJ<^;QgietMBbyI?lU?)KKJL$)W>--oBkcm=i_=cBN?4vNf!hC4_4>>S8l!P zQUUvvb=nHpw=8OJ=W!MdkYR$=^3xfPBqZdBw;Vr5L~@3$zh$c>vC6Bam%vkBpQEPTye zT-T{XB<8D?n*+`*0v{ANM^Ro?ZzudvRr?nC73+p-k$ zEwMB!?GH$k89u377NB}vuG-|6)4zdV%3MRpFVm)gU#fols4p^T2>Ips2JlI?v>fGK z^Gm@WZG+0>i{H?`F5Z#yC^?$;Y3a*f^|Er|a!#rv22*kuS*B6XO}m_HeXq+TuKlIx(Z0i`DA$T^)756rft(yo-y)rtO^_ zW!jXW?j6wy<5iz`1VvMj-?1HBtZy|2&4F|6UCgq*Xy<4fB?ZOt(rsO=D)n!J^?CQT z#(ckoAUo5d72-b+v~(1IWC8V}87&Z}N(h=Nqno>!JxBn`Ayb>Vm|xETs+n7xy4d!q z4(i-5!!SQ=0?6|H2FkDRHF4wezyxC9(x55)v9TLhQ#XJ*U1v~k%mIqbuN&e1^|pZW z=Lk@@D-Wt~lhgQ%`_iowZ#IEE>PU*CG$LNgOXFPQ zmCi%sy}koQoL6<-b>h)k(8SsZ$~x0%{8Tu|8i#?3l>@cTLG$^)2hGlCH2=%9I=El^ z%b*^(pBT0lWYOl(e1kEdX%PhC?>?E@ofy$ zf4r`ZzgP1|ptyAd)cekXCf-rdZrDxn=FP<9t3iEe5zU|0p!#Vl#rwvAX8CZ6;}-qo zK8N*;K;MJq{Teze`_g+%^!!PvW3k*Z;Ty8qB;*-p;9~5z5*u3M{pn(BUz{7%ksYA( zW*+su?N?o>kDe>ui`qn^jdb#LV7)}Al1q8)E$fa)JX`vwrhq%uT|4j&}%;YAoN<-8xFme z1sXxGMe2&sYxBO$V0S$mUln?7(zQh1Vp@$Hfbq6lBOLAQ*Zm!Nftr|I*KlN`(Qp>#@>$dLHb^f=3I`Rhzpd1UbCj{q1SxHEaoYf94V zGA*IkrtnVaG@qObG*<_ZUPr!wPBYaE)Zg8LPV;DCpm=@(dTk2*4V~71BnRcPve0Xj zd;s*CKiE$?o$@Q zGf1!HD$;8+iu9WQ>h*dM=`|lkdaa6*Uh~PM*K(xS>m)^?!#oG+wYorht)nK#I9o}2 zZO)Qjs}7{sES&UOy(PWoS4gkbkEGY^5a~5PN_s7RA-!f-Nw3XK(rcZQ^je?sdcBqO zT0I;9-4=EG6619T^@k21|D`p>qngruCJCB<>wxxi4I0l?1(Z|D)BMk6D865u=8qKt z)z#lXn=l`-O)ii<$wqO@GS{6R@RlWRK^NvXd+ey5wtnrXr~ZTbl9*KqTWc+@`#mT8 z!)$K>zpxEw&cnK~&*2N|$@tkW)){|*AMnCrDz58sm-Ij0Bj~<4S7bb{`}QLA-t<`r zy%+tHXaNph!9iy04$b09o^4(0`WU zdr)TGGSGdlIT!|t-pN76FTxkZ$myVp-W24ma)P>D43Lez7J=*AZvy$sNyJaxL6xu` zD3=ri?XXP5UP(Y+fzD;9voGK`;=xT~voplZ`$3ax3-O1QpiMd-WPeYmc-na4rxC=s zgFvw{9Q<-VhsGCn2IU3Xx1>9^Laf>~qxrp!LEVPxS+Ze08lOn}mPBl-XPJ%E7g1Au zJ!_Hgi`=HZh%80*EPJ#Zt`}XXp2hN0JLr*R#r$r1gsGS>_Pcv3Odd z8cuaA{h8`lT6xALvbnx5Qqulj>7! z2T{x<>V8BS=EwcH43mpuo0@3i67_puH+oFe{#*w0=Q8A88t0omR}$F*qMb=J6aBca zXQ`onJc1aU%P>7C=3R)=pUaSKC}zH%rJ7P~eP2ZQa~aInv#jrn*xLR&U(eEh-xBln zEaUqkGGyOUP|p&+KcajcOZz%ja4v)UdY170kzgOM4C$*2U&jilL+V-9*RQmv^kkmG z)A;&SK<#7YDLsWJ_cXr##C&XhtUQBx?PC!#&qBt7`WE-&0fTjRRQ!|B%^XCPzXD>N z=^Uu;UxrTeq`S^Qj~+F?;HYN|Am6#x5Bkn3UwGlh`G%w)aKFJTkZ0Hh?cfipSpn3O zc(;7CFDqAH%42pegU{&NWyyEaY50&FFfzSypYt{xc@NK@lKLoR&(paPUIg_o)vYG{ z&9-Us%6+cd+V_E@Ic%>v+V1u|;#bv9IO?Ro?*}K$HJEQYdyAtOKYW9uOmrFkBMPir zjqw*BS2~(0jg}+6S!AiB9am$qBbz>Xp`)DqdA_5*KO8=#i{+V%_}ZsAShw(w2G<(+ zmYsEVri<;E6!0&Ttj9F0fBh19jE*yGvWsQoeDE`q?lbw>oGavKMUNtnF{4hv*Vr$2 z;A{F!EYR-gF&fu*d{4f%WAX^x|42Fbo4uJB{-*N1hM)0d58z{F!~^oNN^jv;`glT+ zuPH#jl&Bs2MK`8Cx_R|Vx%-*|r9oMyWIx39;)Oekjd%Mv@^;6N$MCs(dSQIXfu4@6 z#zo{YqQ-0FG4fI>&=#)J&CSclqmjq(iszBXsO#y8DOG1TuSefR9;5gC4ysC9JGyao zEC(pBuj+vNWXw%m9*%rQm$I*8kQWRB+Uxm1SvLkT-g)WP z*$WGak-b4yqY5Z5WdwP$uW0<^X3AThbpplhEFjzXR|9;X(knsHwKK@m6d>k^3hLp< zk-yk)XMkpDYl=%2BJN87vK05~;eMI6gZlnNP!#L{+GOQH)9PoCrHw`7IUgWj;Uf=$ zGW9az%`u?b-G$~i*8$CzqM+XVGtDncNb#@_$S-WE`=GdT8svp{f~@&6P*t1;%187* zdX}dLt^1_~Xt(`A>z>g2=0`d$V-P4;d|36@db7EeXxljF%9fy;b~)O3 z!!|kUbi?5@oLz^nu>KbpxN)^`@?5OX^!*%gV$oTSCQsDqj`mX>_=Je}6a0bSD^328 za3g$yw+w?X=o%%-7aB#v5BTgT$an0`neYR4uPyvQTnd99@XfuD@5rtz;0rp>2l9ow z5|kG%404~Z;!DsRe*=GD*`|SdLK#p#W1v{LYk*tNvJCKI zTMEjeBS1d2EyXjdg6f+BpkA96w6)@c=IDq1?mqm%W6(xiCH6W_T(yfB!|xvsTZ&k% zo&%bTQ;7S=(z=$k56rHPpmk&W(ELB$D8AMa)VXLM7=P6QF;Cc()(vh1ir*U$YtlY2 zHJA2*sb6UynEtC8=9R4iN=EsP{GIY0zJ>bsqJqzNK2x3}k5itbHu*ef3*|ZDw9j)s z`M!NYq8&kbj($XWj;!T*vM4@R*C2|!KF~WB6vGjv$IE zM3a^%|D`-do%MOkYNGtp$6blMu4i$g_?2jr5oHV_dqeqxxJNV>J&zE%-v=hwQ*4)d zMtV*o2K&I&NFNXO^NOhaJ}~b0fmy!~EZ9FRTGP7FePG<@JKCSq5dNG-=zCK__kjiH z6?w=$Fcq>7EXZ@L&vRHv-(LAVM+WqHj_{Nrd5-mYPH4XKU;XZ5n4MSboJ(cwQj z-!3}$F@HAov9GN{UtJf7in^8g_cVNhZG1w^*AwG>V^{Kxq^Ie;U_@?wFI_qUzQtd^ zrMxB181(gdx=;8%YCt`F4|#nI`Pa*>)W;v+8u^NO&=$U>ipM~mjLkoXyhZKG_OH_| zd-dCY9QA{&?;YhI58y9yMP=kU`chiD&(G76n=kXC_z3#D<;#rkW4kn_eo)21pvsm7 z{>J})N4_`dCjDJ9m&ErnmD9pcMeIK)k7_y)--mUZ_X?k1{s84sadX^uvG_UfMMwV6 z)zglw!nu7|x2Nt7N3$yKI!7J-CF*vp!HY#$SL5|Otb3a?($NlJ8si;$%y8r_hfPKN zV_M`pd_$^<7;n&;@|?>b;A3*de)t%l5IzR;XSTz~Ov}Q^Z`kEG@G)NV8s#Uh7ZOO-K{|MR_*Wp*}@f^@@Z3W8N z`9PCC4vk;F2|waBwt=F+G-BS~#3&8HFTM=gx4(jNbuv&@iB4SdH~GQD+n{}NmN@nR zC>n1imR?0nzW~$^XMnuV1me+=G=7lkcC2wf#AZ0{Llb#uADaDx_Mx!{RJXI2scxq- zG{Jhizad?>x*pL|-Og0>`_SG{-ARiNkFjrvc9i$CWJJE)`&T)lcuBrxG*Q+hs)R&w z*8A0TqHazU`G_hW(cC2;GP{UM`#8e08If1?aUP;bL)7087ejl3hbvy3scFgZXV}2i+^mRMq z>vqQPXSV;Bx*hj*JL&6o!uy!=^*ZDIi+S3RdY!D81^Olr-X>p|-4oY zml>DgI$mTO?kl3T!soLJ_23V(#8prnU5@W*#x)^7Ntqs>Z`v%z=jn9);6JS0VcK`R zr!f4&6pe{|L!Y@F)qO9Mcsu#VhWj6!4w?_o-a!u^%>#Azs-Ije8;3=6>v`BI>}S@0 z^`vt#Lr3D@%SV+ZUs#d^KEa~aK>dxUe3i*vr%OJDukdmw>3jbhi~P064SY|%a|^zo zfSW0kE{(JGQ%IhhggAe$g9-JD)1vVJ|prgdpi+)Nt8&4JWEwh z1ApQ>i;+KVzk@uB{Vd^6e8X$xSzlg*34c-tn!}&iYXM&}S+h}|)h{#UR~zz@AFZNu znDUP<@D(!bFJ|2OE$BgqnIGW9p%(qeI0eaWPKd%*x0=hpNQSd zk^h>kC&r&-@8QT~E!5rQjUlMJspGp*chl2if_77lF1UWdGSuD7gE%0M+qo0&6M3_v zBQITxIQdKm#QACx7i~w~&E~q?4)^ID1vG!?pX$Pd(Nh4u9| zwsbVle*krq(JgRYmS~`k-yd~1SvDG|299cm>)NIS*``%ZT`W`lPOSVO4A&J2l1Im1vLG$KmBR9|6tpi!#KA?zN8dNtEf%3yG ziOYm*m)YF-aetS<|)wJB+Q*o%7ZekRR9VjB&L8ofZfuLdaB=Kxu}ZzZkgaP3%C==do-rHoN-~=7@f9fEKS3Q#SHB4I{(C{yc{OM<&ZhYZ zqd>c=53yStn!i~OWOpmjc>f|4FUwAB{1b6{Qc%3wmE3&!ciRCwq2uiIb?CDEpy>H} z%17v*9`=Hs_s2w~`c;qDnW_2YKvw4Pl6_YbV!95asWUuc>I@*4tG{*mKFw;@hE;Y^3RM$f`KC}g=&7uq0eUJYrH7uHyTzfWa$7j* zY4~aAsk-nRXisf~uCnLFL7njWK=*xk^MS;Mxj|9xIrLVhUPCP26Es&#f;N3pig!PW zaM!cK`$1iBE@)Z|0A<%^p!%UaXn)E@^Ob)9d573EUj3i`?mqI|eUKfy2%2O^D4xE9 zn0GDl>>^OsnGKo^lPEqr8q{-#fILxuP$lUN+Sy$}7TJNAxD6=(Y7UAtVKlx>f;yr; zjcYn@B0u{6{6so$!kSRs$~L09l^RLU`Rpb==j+;3w=%EjIp40J=X^ehp7Ui_dd@d} z=sBNFqvw2ngr4(FJfdhs&-rE#J>Q$0{yBf8f4O@wEC^8VOf6tck@7dxn=($?o zBAT;AdC{Dr^gUa`_veGUm8nYimsLD{-OBjqeD0s~jepJ$>Q+I2KB!x9|GXd6t5`_g zDyUZ}U$?SB-`!Jr2K6c7W9{os)>C?#kT@6@!Fu06XCbjTv(mc%{|Xi7HuR)B>8Z#+ z`ZdNoM2TX)%(LbdvHyyl-Uwe%jfdemoZY)Z&*3*}pzp0-7Ql13$#n{SaT{|y`W5;X zCm)*92iMu}DpI|wWMk^DPuU7T5lPp6f}Y$@@VBG-c;=p?jgkD8BTrrzbsSx><|!Am z6WjM<{_>h_m@i*;EjZ-I6^?RQy+xSsHF2J!82)IEqe?e?HpUYrnE|fMkLPFk;s&0Z zMVq^LUN%pE8}H`%zO&GEwQ3%8o$n|?b)4=a@tiF3eg}QGH%~*?&4%sJby@TfblsSj z&~EA78hiE00ps!#i`>{{A?#ZJ^E9dAqfuS}Ip6qlj>SLO%Wf5n!(ARXO(lUV!= zXyWb%6{G!EGTKTS|2z-0SEo}vcswYci~!k(fgoQL4ocgD;_00!KGF_k&8d!K!l;hJ zwl&7M3Tp_OTJ=CXn(8<#8tFSFr*xXL$Yg`>&Yaf5rU%EA97R8NdHZh3vnQk4g8$ zHDa*;DtIsMf9=0AGikk@=sB8bhI&R2g|FiT@5N=lj-z}XCv^XnZc5iNU&oOlb(~=T z758-<9#Y2%_Fn~c9PRa;d3_K15#8y_oA=_x$9r}a7?Q2SVgkoj182ItR%ICS4tFdnSq{yIBhFLawf zK0*1x+CTBUZa06R{z2_8Z?OHMpXMF?ZmpP79e%+7%7Q#V@Y@;Oyq(yb@{%GCQ0KC7 zPon=}_a>)2B<~COkD50O^%^;P@CT>MI>#{hl(}2`IdnShst1lHetGzXV<{D{1P zN2^Ny@?h}-H_k?+pO5=Q?49dq9;rygdF#xK}o8gWah?b(}`BB>XExd3JGYBK$>#?S)UUl%GhCYm@HjVPlp1 zzC6dtevX=r3kUl(?h9@!-UmFFv$rFAoxK-Wr4Z^k{MQ<&={G;uP zb)|m-`MVCNdD)VjbsU-GV>?{G zISpuLRz)30FCNhb>pvbx{l*^u9ux~Yw!->%Ct5nHs(Cz#(7pH?(D3I-LN^#Zlpt+k9 zR2@@N{5U!&%RZ<2%D^kc(FZ`;WF5%g(RmQ_`&b$;(+^Z{={$%k)ey1GRTZz55kIe#5iwF=Rw4AIuBx+(s>Y; zr!MAIo|>R&Mdv~E5jqbd>e6`-o1_HY=U+MxVqz6UEDO?k5WS)q^jowZ^AZ2uc3mIc zeEE0UY0;4vFrFE8AhzH)_=0J38}%ZS?04FCyD0(k4ROCc@(*slO^@r-Mq)iXTOEB4 z`wR84Me3dKDL$PRYombdu3{vQ1a{=1vA|F)w@vg?{7|M(ET!7{dmZ-_3Lj2mZp z5~GeJN_T)i=w`Ly2Ws_Y=s&A>H`1*$T}Eg}JFo6cM>W0pG{gyZqK?G6Y3RCXe~I+` zWNqlV?wS~S&P#j+Jy!{{jmGscHFR9Z`km@XHPS=R*|K!dbCrVXNG3Mbk>u@D&~saf z>PV&z)sgfNsw1fl*N|86BvePTNvV#c;!zz*-(5YxeXfpAbtJKz>PYHC5{%pFR7Wx? zsE))^Q5{K_qdJnPOLZh3gX%~uzON${q&gC7Ky@Tl!q<`Z-|z1}kL{#7l8Q@pBtB*b z##QFEpg2r*Bvy4cjjy0Ok~l_nBsF6Q#(BK{piMw^BsPueNO~sKk#quIM|#*C>+}y{ zbiYNC;(ql(F_Y>@`d{BK9#3^7(Wn~cZ9}Rfi4neEeBI|6e^4Ds{!Mv?UQT(27)W^r z??QP7^K~RX)#n+9DbG+r9Z6E2VR!pH!`G3duOq3vlxLVjKEG&6WWJ6hd>zTOr2N9B zC2C(s626Y4d>u*qI+F5rB;)Hy=CIE%d>x5})RBa*BbkDJov$P5kUEllLC^J}btH9= z#)J2@YhOoVi~V|EN0Ppd6uhrp`#O^Gb)?{Z?Y1Xf7g|TsA$6qSeeEoa)(7t`3EtOk zeI3d8JmbH9-(2{PXVpk)*F51@)xR{ZIdEz7f=s zLh}ye^9LP5>EnRH$J~>7njnt|q42TxWS-J9$TLD?9gWbmUu- zY<4v1XRZe`rCRH#BU7!${GP-s9cAi;%N*IY>7?7eci}l+U5LLB>lP0n9iNqao{PoC zg7&S7zF8vh{WFmsil!a`-FBh)Bb3EI58PD-{;J5TV-?(a5Tz7B=p5sl9=XieC zY088A$5nWaXFI$wbG#V+4am~w#`C;L^9P>e^`Jp`ju*|gwQ--r zK7YXTyO~oO{PKHLt=zZ{e@oBr*Xn}e)d4)e>$1OrB78lb-*whJpoq2|&+mG1Sx_Cj zg6DUhp))8t#0PEIDm=fdLp4AnKR0ooCtocCZRG~U;)y^#`v{)fWxgSxzEcu3ePa@@ zA8CYt$DKck?dpN5UPg-ld?WGi`FlU8nob4H$+pB4B|w=iCCFbs#`C(^9|`jH^*}i_ zIkD;`Jg@6*)9JZ=n*?R{j38q#>$}h6@ppi#_(QM^xpeAEv#zTqRDzirm*#OFIfaW|6U=tDqLv<;1qtqQ8!`H4Bw(0s=@AfNgg z&(mhQrRVA{M~O-4cVT(I1&Hn;RkKz3UM>(C@;2Ik$>fKCJ-S zPV~F5EL};&;-diBSMX8c}`T05e(sJ#;=u`7=hM{g{zU9a}*dH+wi@Lkf=aA2O zBLC2dwxEt>UjK@Ihg}zeyhhINfxfwj69ajOICu07bb`Hl45p59&(U1oeZx_oEOQ<# z`{IZrPhMj;;_jn2fky_x-_)EdOI>UmpI_i8YfhT$$iGQ3$B~^cGRslzh%z1H$7{o% zY@D={F#ipm!%+1$z>nU|aDU5rmuUc+>UBXG`3KEsu1VuhC=Zc0C=bz}DGyO)sqdjSQy#+0m&1Dd$@jDU zISjke=OO+ahB@W)5PuFs`g0h3B;_I8pTiLT9ER}cFqA)sVej}n#Gk`3oMIVr4nz5K z7{;H&VE!D2`5(_=Sbq*f_;VQApTl7O9EL4Mc?kFCFnDqw`*RrPwSV5fM^qO*j}V#h z^XrLbDbf0K7-ky9YCKVo^zmR%<;VRw4BL(3;2ef-M{#ft!#1b*zuw2o>(e~<=gzf1 zcOIO>;C}zA_IZf(`&U^=-y_IFSV&)+`@V; z^N*n4VS+ruQ+aAn;VC_N2(8Z-m>)Mj4k&%BJ-KHv9-4=+|CkT13n-SqAwL+o3KTiZ zgX+am+Fx}u4`|Mgh98JQ>uA4Kk;2p$seS@h}M`SMn z+8-BzDrL3g=8I0T7lm-WX^|24=S5cI^Xo z^93^duh{o%W5mJz*g1M1y)E1n-&1AZjPJ!Ztw0}0?puy?AEMP+>^l*iAt3ghF}E_c+i2Ekv|;0cSdF6*gE}+sGn}6d@)KGd|7YH zfV`2ljDoz;wtWVFHkF>kpY@8bKvg0geA@0`4xbkHGgIDpXWs~SUv<43>V;o^=L~rx zZ=C{pBkvz)h@0n6zJ^b$7fHyMH)Nx{F>0*=Zl2v3N`AU$AACf8hzp8O^%bsf-JzeO zEtDtR(R7d7*HLDE+1ruzxz`Kv#0NbQuYHSrQKv`*ic|%VH;N=}y19APY7z29JLDecTw|E7}6kRBQsu$!S5c z>0To@&qgf+`RgvAK2e0?&v9wK`BmxGnMcb(*110@?$)F@a~4o$j|rL`dypU6GJQaH zJ}+p>zG>j@Bl~V7R_je%UX<82HnHb9f5|{NBZbm&gz4hiU2e{%jKRL*Ld7((k=?YW&{imelyY%iMIHtB6SFxvJU6 z@Ox+L3lOW&d9M0h3H<)~6gtmU*BUs)eLlX7&U3ZTAHyH;Cu=}mu?N`+{dum#{dunC z9}RNXsk{3@6L~(!D-Qx?*A~Ql6+u>&&U2OHQp2`?(Rr?N!`p$l&(HTjUG^f#=NCbaz{ybN+kLm-=pXX}p(Y)O3^7R3Ko~!idxr&hUTx}DYkBgA=T-E<@o~sTy z&y^)Dj=x_&p?Nj)^#SS6b5;I4SLM%hH6iD@a$g@1zCIxQI@8eeT=iK$PyQe31IpJ2 zg7aL}pLAWY&Q$*o>r7>5KmYdi0rorDL4APx`ap1=tM%(l|EKzZ4q0c){Jh-w`hX5u zXKH<2AXtwS)CZKGms>wC7a{X==I7_u&&P$Q_49HSGCyZQyI+SSJ%f3AFh94!ygG!+ z+cJd0+cubQhuFrqYflx7^OT+}#17`^B4m6pj{EkYUJ%+I^oO?p*Z5#u&>uWMV9+1j zH()S6u!C_ydvJZwA24VS#s_vNgMPKV{AcGE&Eu?}9Bs<#n4hbLDvELK;a@P1S7(#b z{JupNpT`=Dcz~xUOY`lbw{yDjY!Y0USF5OL7rJ&cY|K1x)2lg-tkR5`j&jjiilBt=pBQXx*-sF%jd76kY1`kDSyR^lU~|rq?bCJbdo)!^}5EN_bM_`9*Z|2 zy%ei_{wfAh`}1CnKkrrg^IrJ}(nsyjdsY6tSK-flHKVD1&PoxLKkt?A_j>5hd*$`K z?azB<5y=+*yw`8%_t3waKkwD__Btww!FjJXH`zLsAMek5HSfGGJ|OZdo+o_!UZUPY zG^@P5(A%?!!FjJ{tnVN0`-AhO`ucHx9}(Hr+Z~Cb9Z|O?2Ky%Jrerfov_5~Oeg4XX z?3<`U@>lvl@>ksJWstwpUN5!JUxlvQ4Rq3m=wqOlLH^2kJ=Fh8o#Y{UX}rz_x*6zW z&@TT&Cz)^OAv$Tjo@r0zDMIW(AAd%G9 zM{yPxRM&39|MQPaVYBsvFrKx|gM5z7{T=d7raGMyZkt9#{)V?ILV2eIbtn&Z?iA&{ z=0(7LWXl$m*UFxX-tTTvjPgZUR*`OPIE^}qNp>@;`R4Ccl^xI(T~ezrj!kX1T_d=oEF98}wPbVC1t5}=e5k$1B1)^@<>$$h!Kqv#$7G^#xE zPFhW9>)Lfii+q#KR~Xd4gtc+)ylNy+Z|jP@lgRZ5`6g4g4X74BZt2F^H$6apFB$4Eztaw9b~^oq5j+kc_wXpf@;!_pw0S{ z@=EgWB&k0NLqMWbeoZ+8K#K+3XAQK`ibA zP)|5ZykUqRR)PHVOi(l$MfS{Ipi*r>8L;=35s zFF*h0{tof|3(!=)NA|s|WZypn@=AXb;~S9G%1ZT&_=QMEL>cIU{pB~ROKj~6KX2;p zq`JoXqM+K-85Fa2p`X`GkL&sPgYd(m?<44m?AnTSB=-P%Kjd>5>C7jMaXNQd(yd)> zlACXzUyV79I7bwm2|bX-HsZZ>lPV|G_iN6EZm9B6pdF;=4f%K@ z_Uhevxc=n{4ZGF!xv(>Cne8aHzMTnfs1xR>&Qe@vqO^ye@M>wGC*sy!#Ai140qBYN z$?y00eh2i#J~|B@5sRN9ula4CPUs1<*O1p#nfpRdSggFz6Ls!0bi{u6cQ~H=$iFu~ z_3Th*%jUO-INESpMhCIm+3ELDMJO0B4&AulhNPQ78I> z-L~{`R7Y3$cC=ClP)F`cdXn-S zbi_O=PP!6vEp&t>&H~z{i=iW|V>Z&2%=iS4}wI>L&ELq}}-ABgk1Ku`FG zeb5n8CJiVyDCmg%^bk72r#Apq&U4Ta`D-oW)=SV2_PIIn-0K$Z@6|6ygEB#8vL79U ze#la7L2)$^sQMeyk=LC-9xo%PXI+JE@Xpgf+q5?6NX74nkuF0oOlu9Q-`Wtj{0Q=< z5vgCCk?!-z{0l*yr6(~$70@or2#Ta%pc^{lMq-`zpc#>sIQc&5N5kcy{;LDX=jI35 z^)Ju~)BFf1lTHW4l~$mdQuD%03 zP-zc={KPU)FCI(nbGv|IWnED2D*@WGnW_Csd{7&f7vfF=v@=il@+|6+R{gJ0o^wvKe| zs?2`)7uEI&{0mR{BPhk6!(2aGACb6vDEy7Rkrd=rwhVFovP4r*6i*7WT<76`%#InL zXweMRPx27Iivp@TR|nzwHMf9l)fA8?>H*rK^!~QJR}!|l_yedfB>~y?h@h(Sd?4=A z;RYz*o*^Eh`mNZr4Yob9n%a*pBzxsdP}QGA+&>y*7l)8NtUsvtQXWVT=n9*!?*NKw zzk{YKy}xai`aDq0#%O21Gyt{o?{B}QJP=##-`^fVc_0?%^FZgT(0z+g9*FIwJdpUE z@<1#%<$**3UpI+G`5={w@m|zPfuyGish0$KAnEf!%v1Y(kMjI~mH)9mAM-!ue{@JbC$NKjj`aOO z{wHV;7_^6y`RfAySAS@GsQv%y`q0lC+&7f6edP!6Zv~^ibky_aeuh2bQ&jWK7P}f! zKB-2N?zuK`bU)3qDU&fmPz0(Q# zM2sIv=W4L}>!5c!!vpA@>evi=$6J1f`Lu}p9(re2(tMiL=FmO9t}*FdgDucGlQ;wE z-G}+mIi>S};>~f=y8?fZ-d)K;de`+1>Dreipvl<@}+bU zJ_VHH$AYT&Fk)my?cdWn0kf+cwV&+>+Pbt(K$UC-+YD_+OeKk58-O|strHLv{5pZW zv`&CWr*#50F0B(Vg4PM>nWT3*1+5bhJ4o+LFVZ_++v{C<(mP#?^iFmsy;I9b@8na` zIabDVIq4lsMKobv=Q4P1C7n~XiQ*&anqBJkt|5^p_x5G4bMrjgdln(>FI zT|ksWiR^cxs^;4Z6Rki0+{E|oU&-IwCq!w9<_u9EB#IqGzRq(gQO@<8=G!L_?MNaU zLNs3Qg8is?cR${*6Hx8_xHg_GiNStU!Fz=N+x@7NUnju4?pd#Q+UuS4dS|`f1$7VR zb??8{@5&I}6M_DD-IJby?kTT#!qa-a3-nKf=pXa8@%4*<+S|%gdNNPpX#(By3~cRf z<;gvzXP`fU&Hkf5xGrEY&fb^<-H_b|zjgkSH!Xv_j4Dd|n%HP9;O}kTaO839i(jB0 zvPgX7dyMT5{V>_TfIQx4s;Aqj$XD6c=P9ps{4DKTesv`7$JZn!{V0(L`eDw{d+;{n zPUxAg+wm4YPrizm9M!a1&<}aEHS~i;hyeZI(|bcdShHr(4_&Gh^g~_A3jJU;8q9as zi(#DfW7jGlFKs0K=vof?A$U>fhy6SR`XLnU4=bWyLcFAo%!Yo5ZWk$D%3hoFqeM*T z2XFEO`eBN{f^O(^$tZ3bQ5X85Q>-K12ulOnALc+eSgRbQBgKzEFZ9zcq#JK3|F56l zB%N5gh;$-J2T-s42~>~b5F6bl|3Bw1P*#}*@|69^-X@86%YwRjF5>6p!~s!3{?{w` zX*JClyb0g`7sZM0?NGI$f zBCk&r-+5jneb94=qOI49B19X{^Pbm(eMB{%D28~uHBnae?S(u8{fOtseIY+By?&VM z-fy2K@`FU?^+T^EJJ`3}&hg`?63uwu@AX6Zeai#=5dJ-M)6I|XuUWbtBLZ<@LjQ-3atUc>Rze@sjcD%Z%3x;c5Sub@M$WYjgx%#>6= zxVaSf=M$!)o*@prKwa8IZXMCxM}^Bz&d=)#J>NUZ@JAnEk9iM$;o}pdjxLH^Aw9d! zle_C!|9p6!owGHQv-#?Cw6DsOE~IBQJ44U-n>JKOuQ7r2?EOmUnd;C1_fvn~q5IE& z4E;3Y^C2EG!}>taMD6Cc+~={qpIvlR34S6yhs&U6c6f2h7LE(u(wxc%X0hg?Xj`41(NY~2GB0bxk4dh1- zL&x}%&ZKMSG7#U~AidhP5EP}_gYq$*PiTvIJu|mRkK&P@v12pIUf35@l}XR+VA3-g zi}Z}GBt294NzY7g(lcFy^vuj4J+nDT&&=~3&=q-v^i0hrJyXBVM!ULBdS)|`p2?J? zXL{8D^y`zPXR15tnVRVJEEVaQj7fSXYLcGWCyhzR&Nl!>MA9?W-p4};NzddXpZ|MB zdSsV3G`J`hyG0{%) zI+lj0){~C$YDE2pbjvLC{EeuS5ZMLNE9v!&{r>;eGvW12cs=7@&$!n!JJ{=%*E8$S z;jjg%oq0WzUeBc0Gw$_Fc|Bu39%2VcH_UdT3ehv;^-Oy`lU~ob*R$Xp4&~#aK+klD zo^c-!Nv~(JB|T4u=vfdCh3c8EOXCAQ3-)ge^h|p_3-W)$>zeX<#=V}Y|K&O`=5;M# zunx?6{nG!JaS#uQgRIvl?WsIv(Ef>&|E=>6>cxij07dt>piNi=`6ugjS|9gyc6M9gT=Z+}io*XP+r_y7I^)zME?LY_+(843Tc>n}yS z`e7Z7+wwb}r#DPUZoau)k@G$DjepvM`nWy*8G5AJbV1!*p1XqjI`3Ev^>uZi2kPtM zx6M)A^*V1(tk*KxhU5Bg?-fDclxc$JX_En;=i9lvRA0aK0o0TFP<{Oxoug&<7Nvim z!f9|lS7&IyuqwCl96qNCbI)TNXP~|=CoX>Bbi*dE6z(X#&vplPtC-gv&BmAKVCNi% z`nr9&?SQknt!>agPi%Ko)vKYtt_H2z;B1y{!aDTNJP5tw)$^~yxR}XTIGO=@pojyO^ zkzelsz0=V->R!CxeX4tnItbmZ87{{<%)^+=qV9 zKlWEX)WK}quh2cy#Zn%y`dNzK?wy0qiG_EdYcgd-(A@X|dZts-IZ?8}9MXvq_mum* zc5o3;=gu(zf6wqY{lJ8$`Z~({Tl+Yg>}z{F+IX9Kq5tGT)YsL9+dW{%iwi38Gu78u zsqU^_9yr|1(L_iA+8b0~H;<{lZa0+Z;`-U&RA1+RQ+=J+UeXEICCUzR*}kK*?bflV zuYcQ5us!SwkK5t;jM+djwQF0n-`J13x=i~$Xod`I+KFTckOx?)z?||#IVH^UtgDg)D6 z)z{??s;|qrzP?`TauYXRZqlHgPxW>2nd<9eaYVF#`&~&lPIRUEx@<=Ebz7L~>)+0C zLBHwe>+2(_zRosNeVyH=`nnFM`Z`-n^>rDqBh}TzslKkWe5JbiDypyBdQ@MxsavC6 zU8VXuS5#j&Z>YY`vTSdFzdQ0IVh^gX%Z^lES68XNF4t0hU0-;Fy z*Y#dsUq3*giZ*Y$gB_byk> z$M3+b{T<&|^;Z^rpLOJlSVtlvcE|T$d|1-eeLh=gAN^kXZ^3o!&!zNxIyC~nFZQwl zes{K6di)M;oNJ&-GYY>?kuw{9uXdLKW$TLg9kYW+LDl7F`h7=V3#v3p`n%_vvR#OA z4ukT;ckl;lbYoB!o=tvsg1;3$mM$ncmMtog^+RwHGO^jZ|%_BkiX*#IiE+%{5 z24b(>)SmkY*gME<^oOa+@NTb2eei5 zQh)Y*AbUd;tAB*8e$7wgo)Tr>0w?t zd_<9-s0;Z1LY{>^i+KJ-G@hy`*`gSc7bj{@R>Iq!T##)%SxK_3x23mL2-(kmoNt%j z7M?oj53yw_x=wfow(+*|)Sf|ms2#Kiw0?X*R+^r}J;i@e`u2b-#Ma&prSa|7Gc+$0 z*uiyy9gv6Qk%IdL?ZLR9J+MRjL!Tdv`>*!U`?00b5f|8DaWT)giBco3kgG?t{33)$4sgxC?VgK|xPrHxhB}GKl^Ah_xIYT<1lw>VlDp2{j~vyJukD8T z!#2%`>&45)hzmrrym+4Y@e@9W?NtNuglX6S>vr{_^N1_d{mkeWD+Xh{t}&agualMP zHDNjMeAa2xSEpa{VoJmnqDEuH6~=sge(1~=_%q0+oW2UvqjVs6j!WkNpVHH zWQZ$7>l>4C{fph0XQ)2w5m)FjTM$>+W5*F!sJHhJSI8UH5m%Tz7bva>?~b@a7S4{i zLbiN|xI(_Vgt$VbJAt@DBtA71pCgS$JfUuWLOj8rWu&;GeLdvA?4cRZ3H|FW=&%@7 zfVeax<_o6TQ<`s7{u}cU+iyMQC+fT9n75enYcP-DwfA6tqt$iHcg*)Oh!cuo9;6EQ z#k@$3+E4SOPf0)>uM_4^y5bqkr%dsppc=3W^DMqJBdF^wq`0D3R?xn0g}8!E8iBaN zuGxTjnw)W;;)%_fK;5t-;tF-cAfC`QQ-b_{Kg1QL#(l&SIzc^996Ez|Ld2;7^3fL% zPsm42iC12>aR06<;V96Q%?Ppr2M|Z7`E5W}B_U`c?nXSpM|TAEru3kyaiyud4=XSg zwE1g+I$IJ@J-gTh&uKE3*r+vV59R|!zX;Uc{ItZlW(z>sxCdxNWspD5K=$TOjomo$ z&w9`%Zbz)1h1%QQYlMEW43ulygKEZ)pt<|Gq3f63{|0s5X~eHBL2H&4(L^ zBSb-3x2sapx?M4&9oo(GUqGIK;tKvSGTEspt`L(B)_2d-W&OI{3_h+%OK}DJk>Uzb z#m5yb{kq-G6jzw$KCUQ8afP~ZsvbUn9f~XXBwDwt$531$f1^V?BDTbkkula$u&^7?+=Zgg6=%Tm$0UGe9k-|)FQ zZo>D{#(WEkZQtYjDZ<{+_ws03V&cE(`)RU)YSB)7FD)+(iqeVa}i zCbHkX!uL+KJpjt5)9CxyrX6wr&!D}Rg8KVE!1vI!)%3mWRu5DilY(4a!1s{vok8En zbB)MuoC(w=pW%DQo9!en8wHAw^*~lS2PoS`Aj%8)zNuJi=zCXh1ldKKfo4t#VwcpQ zSo{g!N16Q^eJ|hq1==_Bh&~>FDx2FBHfuxssmc?jVe@?jKvjRpdEmXN4= z-y{3MUC=fp>T`Est6H8HZo`(1iRRHQ8sC?w;uGbHn`md{JRjU3dn{4sC(7#dllp5a-tpN zS&wM)6GZ|de{zM!A1AU^-X2TjorvG&4fHt+5p60W>sRdq^m6sHFOK%`O3d%&t;})E zH(NwoLGOi+Hi#E=_oj$1q|S!AwAk1*mm8<+@5Fpw)nAYKyeX6u@rIar3-OBRTLAZw zMc-iG6195<>Jv8l>W_HtjcCsudA8%X9c9$D7Iwq87adia;h4XR)(Q4IoAo@q-BCyH zyB__YQel41zOG#2Y+f?`LPuL~+&o7S_I8e=-ZFD0?3q4)-*^n>*QUu_%&(PYm|vR< z^D(bxwR>Y;Ef;>md|Do@GS*#h{<@C&v`W2rl(Si#sUscvAB#tzf56${j=Fnl(01-O z4E?`8AL=N&(7q+SAMIOW2h+YK;tK6sVt$A_#EoNLj}ON9lC*D$p6B;1`J47FF@tE| z5?1!YAdKHi`19i|ZO>xk?&kWk1Xx|c9m-a1@>7EXB_tD+1gFNeL zP^Q}ts*+nl)_xUn%mU)5Fwj(=2+A{~sQu$$;;w$6j@c757rKBp8NIK<_P2q}PqhHm zk4-^+zY&eQTc4QuH;^s}pxyX=OQheoMEiY9l;5|6clC8@zi$a^@9Wfl-xBNhEwO&z66yCX5o4%6 z&HcV5#_wAq{k|pE?^`1Mz9lR>)vdYTw?z4UOQheogiZJL=suo)-x5=fY@WxrrzRS| zZwY%(`5Eko8xg>vm)}Oly(&QKh2`f=xWB5m|1&;Mq)sm! z?Y$THT;{@#OR!6yIO8baF8dqfHt*gGX3o9~{TujJM}FtUMo05t8tKiT^=qB2Yjs)e zC|0Ih=_qGqSnkNq)mrMP`m9{+Xl`d&g#M)m7oh#dp!tsWbNzX+lULQ~U$`7PrIKHs zuNXbI>S%ly+s*RERr0v*#uTSCXw z{Y=OY*=w_*W1?Ix1V!R5$P2NVhmaSNqcVc3-RLg3&)IjB531W9 zWHas~AEXNXPTX^g@2V<;IBu$w1XtBkorHbAtRaol9s2)N6tJJ@e-hex-8>d3({^ zwaW;P5NE3)bS|OVPv;Waada-B-MYQ08^;p&0Bx@VpxpPa39di73*?=Kg67Yv)E++- z*(d2-Lc77AOSoVh;%qjA&L!lc2<&h13n*{WxrC}0ol7XvS3=yacf>-^?sJha*gz6BTOQ?@5MtsdW(Yb_j zA)QOeYx{EvyVALY>M5N|sCUx2gyP`V`uO*WF$)xJ>0CnfxCLz0rxM8H{s`)6smM+c z6%_5CAr4lH{JDf{4v{^0Bgm7^2U)8LplLAx)CoI+LN*3@4tiQN<13tlhoeKh(F|t{fKXLnKHC)X;f)iKivKXUH>@_ z>MG{pajKgnO@X*Z)vE*ju`8QqGT;6mbk;KTxgw;;=TWmO<8!d<;S@KOOON}D+~c4} zth8b7I#Ijed-wk+mM4KOitnF?JKOeJ34Ia^FJ5=HJUaC}#{Jy(B>IO|I*9g73k}+j z=yADUza(GgwvNe^2ls4SaCGsCOx|V zbjsxZIuGqHZfi$Ve9v4*&9BXNRMAsHr|gKHVa{faUXnhw8;Sab-B}1a#d?2*KCx$4 zCgHkK$DmK<^hxNGY(wu!>bNnWQ#?m6#9Qj(N9dDEGad1k%vcFJrSpFWo#Mk@L!WGu z`@`IQ<>~v-C-LW7=o62V2vmN3FR$1EI;Ezq9O%ZIOs|zA|GgY2=a(6P`>c-xol?>7 zLZ8@<<9%Ga2;bKm{l^aVax_yfLZ9TM*HpJioCXv3VkUkAR41Ho_KS7_==)$0=JP`WC zZk>ic=>ge5Q+h1)Nk5_dFnisKbn5eU=#rV+2xNnAL6>CJ4xrie1-fKfPX;B=1@f>H zq)St~fc#<#P-i{_o#NGdfZqap(ydlENtfQu0?mqgAp12X@!Y?pLy;DN*0d)(yb!3{ zL?t`jR0s8~ETByn5#$NCLyvgGuAqFA6I6#ELzi^jHJ}{Qm6)dp z$bOCls_7@7NBa9&pxoM)^r>bsvd_c^ZN|IMB~f4(Xr50Ymgz+8=_--kB`c`1MJKz+ zebSdne}gj9N>JS!51PNbf!x&dED74(SwXfwA*jZGf_|_{_dt3549H9ECcEuQP}c|p z?c)*DU!*75Ia-5aPhC(xD^K?NpFkElC)w9HsEZ^fCW%h{Z9c)z%e>D)*7`1}VqGOB zIYa$}4uhi7Zeq91Ab-9J)cY5K>h5f^>rMq(qVb?eIs%lNGvmDnd+##Uspp+Q-C8G) z1OKZ_-A!)3{SIx?)$q@9^>-9EJbej2&ifSvnSDX+BPYP$+r58KU4B(r=z%;^o8Gh7 zH3!dQed0%S_hp0Qe8l%~O!HUxy$^i!#L*Tne$SD8$aKR|mRWz%QDn|^+EJbSa0pzw zV2`8W7j`(>jup3nv72sm6g=a4^q>26t)m=%AAVd#TL(XGHtZxne(&`X*UxsS%_zC_G-wBPf2j$&+5?Wil4ngcsp?^%xO>ZveCGpNiANBPe=_;Gb=0QvFR zB@u7f{>dl1ettO${JG8(h5UKC@8Hi(i-PduV)9A&aoN7oSlqAjE%VyDF$^ucLV5j}!3Yw!$0uab7A5 zF?BQealL6N{5Y>e^*x=SD*5q5Yv9L4f~3Tu!{En7yw9!h_x;iv)aO6Le}DVpfO_(G z#EdK8zxC15AS-zbe%q8C2FkfPK#|}Q{I+O40<;}}0?oVU@Ym-23Q%2ZP4?X^WFL9d z#C;CYavjL0_X16^(!`$9gwD>t=Qi3iFgPstBwItA+P>p}iz3TS5ZCf1gqOkIw6Hz%kUBn5fZ2q3%qi2Ul$ z7eL)}A1MD=OYQmR5SNbu?a4l%p3{~XzX2%HR0i3e;-Gnz8?Sr}m1CL7Sl-DD&0^MTcr2zfzI@!e{{*Vp zb7}s5FCHiwO7j1mr&1i!XDf6=r<_S~%J%JuH~6FLSbrrJr@(xlzv_kcO8Q|;=mn2( z73--~$9$mfv6gH#4*mMVLAtKR&$zG5))vo|spdh4sJ7mi}@ z#OIDSUBj2?KePKi+Gp-0o$Iq1_m!7_qPQl?PSk^Vj8*t|>9?|1Nrdx>PQjr{-WF%jyOyvTOG+=XKzHtb8YPz&`~+%&JBEyxY5tz zb4@yV$dUiHVvnOPdu<2Uvnq5`A8Wo5O|xPW z>E_qE&`n!DA9R!DNI%@&M-}D6@cg9NhvGRKN)K^l&q+7!;jlr@mfOw`bX2iZgED`6 zg>hmmbkj_z-rw1}VWxf8AMVbu&tT=%(qi4Z3MI ze}P`=GL=C&XCdijnaH3#OuDJJk#5@cq?@ePap)!gxf;kSuZM2RrYE7BJo{VH%M@8b z`+#&)^jrqrl=0s|FSQ}v#Uod?jeow;?-gR2c0TE* zJVUyvyOVCp&ZL`mG3h4zM7qiAkZ#)9q?>9d>874Ry2;BPA-x<&;rYS|b$x>W~F6vB6KvtP_ll|d!a}4RG=t;V%vmPW}97ejy2a#^dXthWu zqvZiv7t&2rfOJ!oCEa9Gyly6*O1ik2bklYs-BblgH`N!?O|ye^leHq89Lq75;~kRTQQ=-qs^&ghabYvNC zP6ty>g&z^4myrM18x8)$E?Ww}q00<_-_UWQjCbQzq+iG4x^s8nH(2!*@EiI;82knw zxEy|iN4f~Vp@(x&q*d@AcI`{}4>q_bsH(&!f0B9?{E0068>pJa19iHSgWdCF*-4-o z-w?DqJIKm0P`sl$wf$|wAU9sen@Ied>eQ@6UD!NV31XuxAe&BgYPEvu)T|@bsqMDw z@L#4i)v0*{U#I?q>eOl$)v3kS1?1<}QJq@+L3L{NlIqkl`4IH0i~T^Gp6b;03Dv1} z4yseD3sk2TH>gf6N>iPhziou;#4BH?&PR1>zV27FvzAn+R#m7@ZJYb|suxk6+Qgwc zHJ?FsYF>uw)G{vBsl^MbQ_H9HKDCHQR6kI?S~V|?=a{urcVV%Kx;xdWML5-`Z3m+I zMDJ0XNks7@(OxZq`|zsg18w z3%{?T^>u37mc|A9D)JWox{x}x@^xxe-;e)|7+R+`exH!wd=2jF)XeWQ#eAJw`Z{&6 zzm)LrRR?uy?e_=aA^U^`?^6f+DhBUWn~?XagF3YdsZ$5_Y2n*VP;d6O^mfo5*xI*? z5VGL<;5uJd)*%$$R-VjLdWP1exo;2Z(ZTp&+ryrZ@>AE_f+H+c^Q5) z#>ktFqSBIZM{{cG8?#;=c zvzULg%u}(?qBz_K<3zfyh-XBk`iMhJ-RH=c$)?{&anG?$B7JnvWe4X!18dB@h0if7 z*?C8C@$q4_XHB{nywY-~qt3R7=HCV8ZbbX!+R!^by5Cx7%WdgaqdoNv%)iZ&`r zcxjfpcGaQxV)SSI2t8z1XDx8HSkYiU*tPIHjEj>?JDMmRG5=O8=g&g_k~d+Fc1df@ zzs2A;n19)^vrA%2bu0qjpLW=qHzSjw6pz5_-vp)+L=>-xvC4N3MjP=@IwfN5xzJ zK4JO3n174Y%P{|z3)<2AJDR}!Tf|G>*F9feOx(v&k5Am&QM6Bs`8V5C1bHjHsc{dC z`+NK!j=bg(%)jklaX~$(0p{O2#Rkl~S?q+MxY@G{uFHL|v!fZ`0Mv6Xc0zl^`k**; zkn&b{Zesqe_s0O`KSgN%eX|?#R=nRf%)eR9Xdo}#i00w_ceQc%6ZyRDyM^OKkkZks%zWckyt1}?Wyb08!r-LSOKTvLM zN^Dskv`O=T!XyWEtw_{=;&DB9Kh7_Krt|^O=3Eb|YjcTW9QD`fNB!Tm2U)L%)ZViS z*>MH+=gSMK+ZjNfEE%Ye$0C0G`Wya#^(#7cFnC)q_tfu`MHvTysm)eOp8@$roz z75|s=R=Nz;$=PMfTiGzmTiGEca2=mYc`JFcAl>J$Hh0|Lt8TTpiT}S;&0zChF`vTj z`u;8YpC3XVN9p6(|AWVBg}f1OxR%}@Y)kuoh$j;3c*Tl*$m7_k$6(8n+mOf6$+A$M z>fK++U#ZS7Q8zcUhts;=9Z8`h>hs$V?ztxBm}g+LS+~LA!>yw(+VG+y`~J~!u;QwH zjv}n`c1QJlDd>l|{?AHho9KO)puIw*g^oIAw|R~>+KD-i{C3Zo=x@0l@e-fd4SxSy zU7Y-V>}TZXXHABmx1t05yh?PR{CxUi@bl)%Da1>n#SDs>o%XQx6pEMBB8r!I z9Ez93fkt%wL5i1nOp2GxD2kWt&puwtN%4{_NAZ#vP4SX^T?yB-!4xm)+!QbIPqhD( zyg~62w-hJIS3XWkP2|5(yu=q%oFpO=RXd88_-%@lbSob(z4r0aSfbA9?F$qasS!Rt z5=8r%;v&1p$48@xysqaDp3L`OqIk(}Cd#Qq(Tk`XdAlsp=JHHQG|`Ft9mN~+zUO74 zI8M}ih<3B*N+R>|lAY<>C;4_CFEJl4aUU<)KGZLKyu^IGBz(N2eZ0i|x?bDdkN5GC zX-u~C@sjlMlJ@bEsYCtT@2jYMyd-NLC7;v~;tAF3c;3ihE7jh9TwdR|+e z?$11fcuD!VNqE|jcqxdJxNi?=gLo%|%G)x8!rL~8e?n~I+qI|il%D)Q7#hC>wvN*Q z`e4tueeL{&jGp<8Bd@yVqa!QQ40(Aj6GJz|*pi4p#LAJB|KHS}^8XLpQXPHhO~fCn zd2GZVD#LTi|0g+5`Tra#k^i@wA47k{+mp!utM)VS9Qp9xJ3RMk=O_3)n~&Xaw3VLx za`CHHzJ8Jj>wC5~8-%*{*JkQZ=Orst3tZL95)@s-+XWNEX!_c3<+6?gE z^=XbG;YjEZFH(WxkHKl7N48oV#2+?8Z0M4lm5Snz4#l8L^6X{OrAL&<<4GSwmt?n@ z&?R14k}gFo0$s8bvqFz-sZ7u#aUu`&N2jO&z0q+yLSML^OFB{I3jC*TmKLRBlmHX3nTXiYb5OD$Qx%z{2^1+=;3U0Z4lxQ5$7+& z9rC+KAn#Be@rU_yDdG+jEjp;`ckF`u@qZC_sHZhS-sV&%*RFHd1o`bPh(FAxvxqxb ziBE_-uf z;V8r%dR=nRrdr(s{d3BJ?B$*2&Q=#j5EJGmwz|^Hwe$I-Krx{h$RfOIitz_mfpW|5 zpkDq1wfA}4#P!>V8$gk+4=A^k0nNgM#A7!QSBNAVK-+8>Xmov0uFp#x77OGtj!~RZ zWC$oamjLCY&lF$u_zM(~2Z1KZFQA+lpIHA2;tN@SDX~irQ2+T0$ih;By#F)A6Ef`~ zQ2j9%WUYFE<~HU3)n&^6n_}^4+&jwu+X$x-KiF~`KxKUXzg{2MJYEyfoTU7}9iNNZ z%O?ZvBg+5luHp6EzoR)r`F|T}KWy=d^8b7j<^N^IvD99+FEM^QVt-#ZA5Qsyo~Z=d zZEec`t2h*Yuu4hME~8QWAxcpE!5>oHoJXVhLrgIeD)y-uX)y-8T zia*#Ms++UZb7`KRgW?Z)aRO{}*w@V?Qv9KMQ~V+GQ~Y6bQ2b#e#UJ(r)y+j`ia$&R zia%5>UpJpX@rU?8b#pa|;tx@a;tx}j;tyTh#~%|Y{*WaSLI+s=Fsg?a&H`Jk+Kc>@ z8kQ6JCcE+p>es4PT;!qHQ`!$iEGrLPFzI`vpFO7i7WJi(xF4?;nf3vBb{M+Dhde-? zTXb)actiAVhq|<~6G5@@4#gqA@5Z`c8+Qw>-?~EkH?neBNUy@^Jw>6fL$`E}zcZO{ z-xuC%1p3*qviRJ*cQcA}%HGHGZRd(u&#Tg=$2u_6J2B!aTk{rl)4WO=?!I>-N9wzd z?1v~8-@~>w&pYbhsvUzprPE$Vb>iSwNAYI%I!F8J6ZDBS4`1wT{&?X6j7ykl9{R7= znB!=zHCTL@N-N_dbwmG+V zu)AKD7(pCd6EwrpgDk?kLAZanQ=lG7c`|W%G}-BC-L6bo6Sf#w1Z1f)Q2*w5)SmwH zKzAQgAe?yQDkyiJ0PUkaWEa~Eeyit#`rmnEN1Q?Z;S-2sMuPVAAW*I93w}EX3^cDh z6D#<5Cz`JhWuSOROlv~pe`^HF<`nOUwRNezFvUCK9i2bIA67@ZjzRH`tU>XP-b3+@ zsY&sUj6(5_I!p16*hTRU+wJQ@=PAx%5s6Yzyd%c@c;_+2Ijo-NKPB;8Q->(-QGCM{ zQKj>7&oLkG^!IU20iu5GN-qAkZF(L7etwQ62`jGsO`Vgx~ z<3i&d?cw=4$5q;|%D!y}eUbMIQv8wk1ZcLlq&!w^+TV&N$wPT6@iX+sHe5<|k{AsB zUH?)HdZX7|!*$|n1?Y`^c?){MvLAxKmn&n@`y;~#piW{hABE1Cfl1*1bwSz(p6C3E zcA4M@=#y+4oz5G%Hl04_oqG5@DrFRkhlZ8PX1@6;TQDW+Gv>ixq>FuO<8ztxQR(mM zGnnG7YU7}5I{Fjj*UaL{U*S(5T}Aw+Q>T34Y?iazBS*1&z->pH?87xjJ~7=nN6FeA zcU0Zq?nnQ{i@U*=W}Bl(8)35}yV!AqqnX|ax}^W;y$1cM-cdd-|E=ZD)^{T;!??Q@ zmN?3Z+ZJKm-3klQzW3vN*z)grV8xBvQQc`d*HNY%IUDT{jzQ1Vom^qgHYeARu1%|e zI7*iLg7}Fg{u}zHD=$O*q+85}&e{75NaxfJ(z&Y##^e5p^HLl&V%r#JtK#*bcf46b z=$$EJp>t-zKIojewUzWO&Q9o>O-JWy*=G+)r(PrmZQTl_KVvB$rXQYFxWCN;^8K*} zI9psk-w&T7*80A%JI?9@W}DL6QFor%3;k*};wPhzBYx7E-~Hj*O_v-Xf7lN3lm4;^ z@sr9L9b}K1Qv7uE0OBWJKR0M|&hL!--bw+o6k!xU_5L1|vNqxWu zZ0D}yU6X?5tZeISmV5)^Cs8OaXu5Vr{KWfSrTFPY6=M9uh@1G8a-g|zyrsKdt@;fV z@gB9n{nrizRr%B)3)|Hk?Twp)vS}=`TW@WK=NE4S+O?@cHThgq*KW5>0L{B9Apapg z$g-Smg8q|XAY;uzH6s_u`+t_M-%LCX${lk-Zo7i&etF`qw8Y788oTlQ^-557YYEz? z>8SnZn~0Ni)rAxU~3ZJ*#j4)OjX>HfuAGr_N9Ii|C-4_AlZh{caN| zzl;OLtTv$9S%z3GJ;=&OBzw|L#6c{}e$YH$OuRRW__-q}GW-hKn#G7JBlXXTOZI|y zh->u7TNK}vItj9)J3yXv8QE#3f%eK!Vwvus__YP~NBfoR>g7P0qcEtaXCr%58nQnp z0L8N?WY_&baZZ7!ARBlacm`&8^#K3xF~8h)6!!|<0I#jQ>S)duxCmC*au(bee%evp zseIB=9vgNP99HYFBda^@0PMl}_Bra!w~eDs@L~tr`z77zsP1i9?Pw-mSn9|--CPJ3 z$TZ(kR(m+tQJiTp%TZP6J;PDA_zwP7#7YEz%bPTXpEW4grGh$X(&F&FByo1_71`4 zxz-jG+rJ0R$ZLaLy9v|8akQ?Lk0}V-=7vI<5$qDh5iAc;PNO(N#PS?X zaRmR4s8>+@V9WbB;u*yaaxT%-BJu=8_7BAiDvW4adb^;HBVv2rrZ~VFBGcX;NR%x- zD-%@#Z>J^lxJ2{G&yT~2>R+NgMdSy(y^Uzr5cOiB^yhb|sbs71L_31W2mAJZMAnNa z{rMfd6WOL6QMB>nT6((~F*uKkHzGSYzau!mSNiiijIWz;A5Rz`NBq}$RNU81l#eGu z>n7I64=SLqn*{rz7#~N7kh)0_M=&2xXdf@A{~?YD;)@_|FhRT!!XTbtzMXqoUk3@O zy&X_^``dd@m^bqb5#GDsIWLo)@;O(&V7--?b%^TQy|Q6GuJ+YM{9xBA${TImiF$|m ztr6-Sa^a7d&&%FxpeHtb1L6wx?*_^rjX6T=t#;3iYQ8;B9Z2)pJ(rzk_#7a^xNNLJwHcf%{>%n-71_+W)g2<4=!S<;ar0TjHn_)mjL4+&s@wJud)% zZ}y#<>1;DP0{QzHYmqn7yLU}??YwUa_=Fz6- zHu!tlUVXi^ZZs8P;?#+Kd+L1fPc5?`h!d)08Ni|@b5fDLr`x@2&$jX zke`n;6%R^;z>AM*ElyU!bO^7nQ*`FmB1 z{Jl;^{@#2gKW{#epBHgFe-m`}smde#86s zKZ&-S_w!MR>M;3pGr_YVk>?_^D4ze4zqZ?nEX@1wzMf5ddwFl?^>!Mfjp^IplmCpPc z4cY_R*JTg~m^vk*ns5G7r)dJ+V3D7pP9U#!q4(VK?LZtNTUVp{Ljg&7pFuZ~2V!}L z&^p~lPmu@WJSW8~;mIj4RrxLDqnc%=`xa;s%{@=9EcnIwZFY7S^h2iWau;^Vi#HtQ zvM|IKEa$aTu)~(_chrko?R2y(>jp=0`5pAbMkTy3f&O9lY%PO7Sf9hO+lV1DcLE`lU^*H0qUB~ zNH_k?L+#O{fV{$0_)`4 zg7ky!I{;hnBK?quynY<^`mv1k!_=LGaeOc7hdD?3p@#HFJKID0!TXbb*tMh|whHNo zu0r}@mXLm!8jb0?at%N;fb>JYA^lK`NI%SQ(hoVq#|!7ZeiSDCFndTpbQ{tSm5cPl z#`pDySfnF1CFzGP>Gh*G>4(@)x*^hd{TNF6p+9=P=u4C_h-@zD2Kzsxy=AmjHy5@Y z+$ppar=+;M779TMMT!=;;9B(H7Tn!E_<^Daw-VgFxCM8oK+%`nGwaX(M#uBM7TRWl49olLZBbk_Z>p@BRKExzw|@+{zI@YCD0G;`wqeRwX7n2 zuJHO1=m__|Az^}J=tMy7=WUSpJz0pJ7(XsOwI}yfp3GBv z2D%cg3m7`CvW-SvpZWI|vhUN-bGfg3qW+{mhNC~CBGy9}WQ}a_9j0|W@)JBnlH<~rI8 zQRaa4s*tbwZae8x($dqhuK8W)6aQvD>RGaSXXum~T^l-O@>ZLOb=Mn^UKOMF{qp=3 zp;vmbfnLcim7!OB;9KaGD6kQFWpa*$Uhyblq*n?5fIji5VbCSpbOdyW-Ca(4Q{e)1 zg1<}v>RkT!dx!Z7-y{F?{`h-puI}f^ME|~y{7b_=;OgIcgT2c4a@3Q5@9D@&wC&-j zj*LP7fREnR4eM^bLf=3YDFCuq1H;_7+;^@Eu6vUg6lrI4Mr@-I_w?+9b!}dE#CXrH zpw0Df2N$b{--3KtLFylLYVilwFP_^D>+f6Y8{Ei7JU5^Xu4{0;wWD}h8k89$TDe${ z%>dfH^IN*uwoVK3jDNOpv0PjTv@?!0$Na{opxDAd)o?*GjJNs~G;?1zbumAvLA9qV(s+7>~aP)ZIsdO#Tk?WgJxbo}n+m@9zXv_(WoZmY{w5 zGqG%9P|mlF+-%kMTLq+q$I)dV$r1`~F zL7lP`#cA?`YC}elok&h`tN0-A8yVCw-_~(|50CK}RGn^6{L6XJ_B%%7N%m6w%{EZV z2#`lx4jQ(A=F7|k)fIYAqTVu!#;*+qW!Zi-|ExRlJiRB8y>E+{)owxS9@Bdg^@e(g z?Yf$vw)CDvTa3;r;D>(2xEfFzG*S@T6b0q1LZE0d4!cT}*XX*VV!{(6h7*6l);F;c`uEi#N$bt3w8fI}6 zliosi%&t+;C$Tp_U0 zHb!EKcRU)1`&Fg)?26_K5bH$)L9wSfXnR+nctT!K9!>?Ce`10B&f5XFPse+p?Qj8< zdk<6m+g~*QA_CNt!a>33fpWl98ecdTwB3eL{7}*Si(a7W+ZE)4I)dWgwiKUf39>lN zh*KpfJ2aqpY+cYkrhbMUT7%|mR0l;3dOnH|pne8FNB%@qq35IQBl0I^3HcM|6#+u4+$g6QbeAFD4u!0ahRyWiDrc7AD-2TqA1a3AjJm+DqVUg03E$5Mo{zG=z9s$hQOf%hQ<<)lzMm2J6YG76^}ZzVC&6=3!uyk; zz9s*ozGZ#=%6Ljo>-_`wu@3x%rwXC)aX{wdfX4fYfXc_(lX=Sjhy%Y7%m*fEc**Jg#D;5jE1qd)o}y3%j-JX4O{sAEYHA9|qQJb*sP5y|ns zc3J-f{E7X??+@w5;7fSTmDEq~uo}8!{%jM|xX*pK>I*)1!PZxfs`|ovj(p>+n~t_% zY}B#%hIG&gQ6tqpH!c>|-GTK}C#}Q!TV3EY?Aoc}E|%YJTZH*4F%~%L{hQ~3i;B*6 zWN&KEa5NR)!zY*lAIKk!ssx?j>NfO&#f%v5*745upcDMUJgQ?IN(Y@_k#CSbq&W^xh2kNvvY5qbN8jnJKZ#I+aSbP%I zvGm<0n3tm((RID+)B4p^$6{%`P8=m4C06)4)>dD~dQEjKR)cgxUGjA-Cqxy}2|0}PL7gOhkePiwYdq&F&UO;jTu()m&562#kMsMO6Gc2C_kC~nnDQmN=JTfS zd+WUvE8q9FzK*4q`1Nx=ecxM-qd4e$i$N4iU&s2dzPIvqEbeu}HmB=&pc5f=EF01X zVO}Txs}CZ*PFSxGK^=>Eoe28gD&+auKqrFwl?~B{KqrFwl?ka|1v;U<9th7sA6STP z7@z;Gr}PZQxsR2n@C?RHpaXu~`dE1e^V-KEWIoV`U_JNq0a<8VvM%|D+MVeAgGUpi zPobVxgdgCIBhmAX9^gbss9%mBt z!(Lgi9oH}GN&1n$0`!CT?F0P~+n14kWO_dz>zXcve((=jpdWHUdFY4y=_&L>GhqtqzUjYBDk^R|&*#A`vEksM@6FG3$|m)WEnXPbj2V?IzOk3r0Kjr8Et zW>DlJ{oq}CP~5jZsN#@*u$x&aK9U&ZQ%OHq64DQqp7cY{A^i}INIy&k(hpwF>qjxt z5BvRW%J17qKX^+2+*C%=4|}2?%||2sklRT=*hAk38A$pe`jLK!Go&B7XCu0pr{ZN|pL$4wIFb{nnq$25uK27=|dXj#KVx%A92htCog!DsXB>k`zNI%3N z?=y~)Zs_#hXN)1;(2+a`dY=*B`;0|iKT3Ij@sM;v%^;e}K91|-j?L>fu9J`kN>43#_K?!7t+T8MTkzYkl6Tq zuRWEg^yL4+Ku7+I%wNZTXo9@YM@Irp!QoVYO7I?aB^yx>)N`8AzVS#gXkSR_<+MK{ zb6tAAilw1`Nz}N>%-3{pZ)Jl1s4@r82eH?>A!hGe(7Fnvs2~647VgiFb%&o(m78R6 z*YoMSso!#U4t>AP&FTAeZG_L27t_=IL|N*~Z@17V6)y_)Sw7T8e_ln|1f4SNqDI1f zW!7rv*Sei7eKL>^Ahon@^~ek^N~7@y^Mp$Eg-) z|8}wJ|K+Ho7_nxrqb)pgC&pil-{Q!R-9mj%f2alh)Y~eo#eDe&t1-Xat^mg$U+!p2 zK7+2>6NQ($nEktKv7=d7bdjUj`g8%}9y{h^e!w!S>s_h_-BsPYQGIXnwpnhTA52Yk zzSEleJxhwB-p4DyK)p{yrsvvJ!nvf!&n8a9eY4JlF57nG>%{Z*&}H*m8r1*9spZgR zJ*Xn;e`Z27=(GII`??96Ntf%af)1Nh5zt?|X%F;P#kxs)Iw&q^8tlfOm$t1jKJ#2FuwXfm?cCkc#pXy! zVzfgoFrTCbXx7|q?qWH#FUYDT1I4K=&9H87L(sm6K{4OZ)Q#JeEkLzCIdSXhCKzX9 zLDQ%rC|AX!_~5C=_?%JGL4CF{XohAd4*DQ*{fZ-?el!OZ={ggO{|cH69JIqp>kh24p|BqVX!FiLZVH<-d$r?FRZa^2KgYA6^Wy!y`ccq&NJQV--mR*3e~iFyAZpPSO#sc+sYT?X^@ z`|5d(kylNhvB>Y{?-|e&U7|0Z+u{@7k+0cS4tZTijv3uuCx*mF9u*B6zIT7OSlITp zqkVt)nWKF8^u8lMwegmt{#@d^qdJ%nbu5u_CVYr0D-U3vmDmNYZ?w(PW{tGTQRc|G z9`UR9$gA>v{xvQZl{c;ge;@WIICttYN0aQ#Qb+kb{}M+var+{SFKxQe(KgJq0OQ$W z&qtg+igpyOQq4ttq~>f#nS9Mm#Bnmh-{`(ukXL0`bNC#VI5YCAS{`{auAf2g*HSHB zAg{`ZD4;2jVLa|Pay9a*9G!!FPrC!itF~efvWa_hj z&TD<{!I*ztYmg(`Gh!e(i+qJW7;gZsGYyrazSyb1qn%N(AJ*-P*VoZBd)3>KFS^&u zQLTD_ysCD*LtfQM5`i*a5#(3-z8&(aF1ZYORn~Zhd@7d~1J#zPlvlrbi+rjJHUiDw z~fy!ZuFOXni5s^!~}SMBe2D6b|>3bF;&kym-rnUq)CK0rQIS4x0l z@B-vjnI;Zsv-Cz@6{TMypME_*0W=9-BcF3w5>QNU3d(C~LH6M;@+UjK0yKHLf-1HEb-{QvKKlyg z%^y|~7Y+dB_q9M?CkKt!k3r+#?nNFo)B1oiZ6Q!hdV~C__G|*#wBF#?{luX8Gd5_~ zokiZ1&lZ42bOzOwQXv03F{tl7LY`zhc7wLqEKt|$O5;(g()f=#Xna{*8Xx@_c~NaV z26Daz6q_f3tV<72mu?73{tL~2%0}^t?`eM27vw*c^&w~$oCWoRT@=4rMe}=SgR<-> zkoW0DajiBWyHJpH7BSSr2)nB?`eE%ERcWxRLA}Q!)|&BitG149(EPf z9nXO5_#x1aF*F{&iQ=Sm4hXxkgyMH|LDOg&$P$bPWo&w%2`@+Ifat@$Y5l0KpcvHw zRC`;~`hv}fHyVO`XC0b9@jEdAz0XAVr}vqN6lF1PZk7banPQ+$_7C#Ds=SC;i{AU8 zS8Rjd(1owSZ`kes(C_f?6M&*aUg(Rh)0+Ip!9C*ICy#9W z(YSxl*YBY_EJbtFzr=4d5vzV{G0#$Vr8-!u@wksoeu;GLco_Yjuhx@vDeeeJlc5#8Ni9eWwoQCztc&5_l6fq8y096p7u{(8G2}5 zBwXcUQR)oo;pfZHL)P!xa5t{5bbuZT^WQVHhjunS2W_|I9O~|8_Wv{l-(yO(!T7wy z^xS|hymTNwZ@|p~jyzu`Q0(unF#gN@{*G!yvwmQmLVdCBK#D$&`gy$Gh@-^s&W=OaB#S(o&%$4Ka*D6@}z#;aJMdQ}U0$oH)xJ$w=m)NjH_54+wXJ&aNZls}(^ z4(h|TK(oY<&xn7O^e}H!;*k8%Lv_3Z`HYD5&_lgDGAQoUAzhSPNCz)*P@fqGJ>(Cf zfolCg=pnlt4V00`K?mi|9Qw!XP}0LsB|sjD(fA2N`d54~sD3IB>UrOS^7pHxcRw!&MX8=3t6U!BWm17Q z@k{8N`12rWpJ`B@>P2z!niOZw3-Z1RL6PkR^h{*-?-y>m9Dazp&aJnbwIX&?i0p0w{LT`@QtqwTM+ydcUwaO7Hj5_v!s!b~(M@OMOf4 z7uJdC{la<`z28e-%#G{W7<#`K-%IcJ(tYC4`06jv4N;5UFRUZqd+GjrvMgyp-h2)6 z9qW?dqZ^lDeUXP{wS4i-*H{gEKy{tomq}O3KZP&R(TdPMkPla}pHRL}f%xlt#jsCZ zrhbdMj#yq3dZI=ir2X#W7hu1Mm{Jvf#75il4?g#J{)diy>+Nffs$=JK7>{)MxT9V7 zX`iE+)yp{Y)_-hu6t~)LbYwGjuXEHz=C5@$#;yh{m0yYZ{#lV{S*B9RvvTXur5Mlo zd@*>s&mu?BG&Az7O8RQPi+Pkw8sjfk%)`3khvy*f6>B!;3$&W)sB_+)j<`~9e2n~R#(xj8#^sP_Rp()pU-O-y z{F<7BBBCeqtLS=}^6NjPL2-Bk<=N5ML3{O2t-y^TG z{Nq8HIx8p+9Y$WYFWZBHYun(UO^sZ zTNe-~wgt`E0-$XjmEv4~OZ@jpumrSEdxC63Wg0J+5tK6-X!s`NQ<0}5<<-*JK%Vyz z@+iNy0yOD6f$VWXVxmZ(8h8|WRQ@m%6vtZ=dlvys{BI}@yN$f5r)?uPoeYYD?LoP& zJjfDd0@bDHpnZE6`O(xn2-*+JL49y6s5W+?@lAC=wntEWBon9)CIr>056E}C>s?SJ zJPoQoe-T&w3EEjRK>qV^P)_I$iV-bAmA*Eyb~&0)TZGsnJ1FYVIkIx=cNEWx0os=z zkY}ZN4yq4#K(_EQXx5wp#g7MR{`p^^O}>%lXVE#bsxzGjj#yFi`euPxHH4(Y$C1ikA(D7i!b^%j%#iQkljh%7eOQ8IWfn-(gaa?-0d) z!Z>R&5x>h>mA~;jp6A&@`!yC7M}I;8+mU?8_&8L*8hRVQ$MxN8sQb$Sk209A`9)S8 zfZy*ne+u{*8TUjoH?C@xgkKOxo1?Fwd$mDdLN_n<+5PWc)ZY)?vIR%nb+MlR{07D& zH^1m;%ilTa$m^%r=g7{S-H!QFze68X*4(RHtW&fM$9T=zi@-h4<~#EF6X$`6Q_XhN zjf&53RNHSOpUaL9kk5J5;*;FCoPQp9T&G$}`TP2>(2J7fFIV&ceeh_`?tZ+<8Bk}Ux|T^s{c@I)`sMt4>X(b>v~SQ(pM>@H<0w$Xp?X++|)GxQ~TF|<^O=!MtBTzN0PvcXlUv6Uge)%Tqm$T{AFBjp|FSoa-U(U)< zzuX+9emM)HemN^l{c@Ac_shTY&s(J}gU^w_Qoo!l>X++7)F)?YiFzdU$?X^Fk4r^V zafxOD^~rS!B6~o6aXHdn_sfHQgLX0XvsFmH-1vRx!M;K5 z`{msC%T-9fJb2GY@VpiC&s&-1bbscbw+h}fVj9r6@XzH2`_6@b-YR&{$p6}R&V9c; z*f+@hbGb6)d8?pbu6*BI`98S}>6eR;=W?a*lN;Y34;b{vl^co!8rHh z$}@p89E{U9f`V=>GKiw92r&;bsFCA zU+99~J~M;)npe!-;m{HL-S6-dI@&i>_bNCa^&Gzb>&A<(>va3U@E5Es?Kii%|Af!r z|Nao&&9gQ$sLm7p%NLig?BQ-7!F*vKkPjc##JFlS68=ZWpNakn&zA*y#B(tC7+vKC zeUBoesLoVv8T#5L<3aL6(@w$vs2BT4-xju_y4XLtP`}bo^1@fiDwm?*do9fUFY;&c zy-&fRiEn~suAg&c8~%l!eXTzpaIrbnZkMBaJ87GvnE2x+tZV(tdd#1U7Xh{^y~a_m zKMMb&W6gyBQLC21|L}D;mtsCw=_QVG`XT5b8`oi>i>=7Jz>!5sG#~So<7!9MEXQ2L zQ(HhE?ZLlhx>&5s2c6Wp_QU^}(w(4}JW;+WZrzrGIy`pLJXhklw;iJ_Y&K_cj-8q1-R>S$ro$+?Z7 zdpgPl=o{~O40+R(OGNqeK{JKFXK3I4_@2v3_H$&#lJ-Sh<5O?M-@fRDc;3sNj{K)c zpiG~Vd{9J5_#ggr82O(}Yv6y_t$*Nq_|4KFTRa>7$E^7X-=iir1Lf5-@I5ALd61<# z&=H?ot2}6;FNOaxi}u3*u;-8Ae@yMvAe&Sd{zop+@IP|dGx#2Us4U1bgv0;vz6ppW z75tA(@wO%Yp1EP5==`pQi$$@4#I*@Q-FHcIH*V?)kVn7X4A&JO2+IALLDS-FQ;gpq z4BDiHKy~nG6F07ogcJX14w}>%K#}%AV_bK26{xaw2le9;ppEhk$ZA}JuhDx}gR0;l z&`hZfio-dHJ7UuOhW(A)edQ1RK|S^-kllUT*Ez`w|2$3dQTEoe4R z23hN#G@rW>D591D)%on8o}U;rH5kaBP~U|$I7j|u_HIxvSPkmdb11&+`!0!kBQ}qy z@4}nbqjlXY5_vK3>w7vumeQXi+cYs^lQ}lA<>xx??-!|FfxN_hP@ST_i#kkw7m>lg zNB#!&UCdkRyYN=jcQIL(;yNwnfpQ`BT}(CVyXb8>kw<0TDbx?Jq$lQeZRmk$KLhzz zT<(HAZ8Hv{e#P;G8O+!3$A3GGyv&DngWl**ndy1obz_scc^kh1>RtBCK=dobzZ0PY zvT7Ol5Z){ynPJ?e&fjZr+(*X7na33TRd%a^EEa{Kfu?B zD_8LSZP8=&eP`Ch_hhO1K}S^l9H^_=KSq#ms@*k%yPmPu^mo;LK>C@O-X|$eM}sdj zC2}ygPNm5H8lT^x;C)B4a`9D1Jv{=tqW6D$!o}>*H2X2%Ypih;ONMN9R0n!(bd;Zt zk#FjuB5LBT~Y7GLRa{Pw~MhZg5JxbR^(jhVs_!(d`Fr8 zx^@)PHqOJkf@kJn{&d3Gj^=HLnU1o>Bh=Mc)Pc|yb|Lpv%zyJQ^hCWq3m>LF>?d7W zbQpS~re24hu<=nraik-3g~fOcKgQ3Dhpw=izd%>a#c!Z1YSA<3i8^?5C_aDWE$E3H z{}Os)s>KI+mjZ*_yoldsAUHXEfFrB>LOI%#r9gJFSbxkHiO~=9_pkRs{OCY$N7eeT zUXFIc?w%N*e+GIYu04mIsM*Pgg?{UXbxB8&uBZ>&@^^pdFbV)PFpNZpb*RKwh>p=?E(fvQ&{lG2j?< z!z7qR+|&kSb&7)O4%O9Ei965{U;4V* zM5?Q)o4&4gp6Y74ldr33s;lXizOJ^7>S}fx)z!oss;jAUzOI(#BXoejrMjBTc^9$y zo9b%(2G!MAWvZ*06gz4CFH~3Kd#SFbr&C>x_b-6HgQ`{mzw_0tG4KgyLl zCE-8RUpb)@x3ENOYlqxJV9f66C|@Oxb3x{AEXKGsLxwCR!}Z}QQU zFZr9i$d{t-LgY(xi=Hc0`!XS4vU3@cFZBoN_v%&skvDm@Gsv4_LQznKZ64yjhwWDy zRO7D=cCkD+82tM01loDekxzB|2vCgdNpY$&plO^0BF^-E zj^Y&&o09oJ)$Rw7kBCj;~m`(Q+PQvy1kX zn`>if{fc2APdNazse048CA6l-&g)s7wEsc z-&bz@zH;`vzn_0!ZgB2Ku-`-Z{es5VuZ*u>1^ddm-(N06_I+?)zX~Y-W8a7Nbu1QA z&kC(yiJ;Eq>rmEHd#VshA2UzxX?@1Oxm@w>^Mt%l!K>fu!U-qLMe(C@F-$?-dl z|5XJ^Bq1hC0gAV&KsAMf`h6OT zv!n-2=8T~HlnE5!S!g~-HkzN9o#G2QKpQC+#R+qREOs7>9~0U3ytJ-IKAO*vAC!BD zrg{Oy<~&hWE=chXB2QBYvF=M$r-Z zvyW30q3iMyO+}(?LeyRT{4k=LP83W1_97oOVFhQy+jzptnC490_4`El)O zLTE!`UfSQ+Q+NjBK^#!}`TwHw^E!ma#{sR6gFGMP?|{L&U_M}QT_}V3fWdqabFUAf z|RER~13s|SB_J5AJmadzPjjB*dIrd?|9S&^(&cn7sw_~Mt?+peunjI*#X?g-ua08%SH?F`Q}DA ze2pkRHG}z@-`Tw*_&)ml6Iyq_DEc6>U?h6J_f-RY9{=td)yYP8i0-a4^QyyV>0%q+ zJDo65=D&8dIbuF{RI9T;a1=FT!~d|Vr>s}9`dQtrc@INBX2-J&gs`})Aa@2tTVYc0HtZ%&l{)er80pDZN)dKDA6YxFq zZEa9Ycn-f~)=mc1_EMnO@sWJa_8p*JIf(pD-O8XcscC%DYw|O-j)83LGEkJIeI?>( zTg3c*70`|^M68vD##6)x<%$o;=iqFzpv3y5qcQBCyoqlk70kt-tW zO_bey+?lA_6Sen0()%CL%&%`u-+b{`yc*)>3@RvYH8oU*WUlw5dXux4+`}^ z!uufM{SWh0-v2O9<^2x-fAl>;KR@t0#`_xS8H@)p^W!{N_c87#mv3b5=N}x!(7enz zW|Pqz)v8N)E=!J&f`z`wG>f=Dtm0d+MyLG(rzvx@@AL(2_-nJC_)~x$^=#HI1 z{drxe5OhV4e}}%czBUV=W4^4x=gT{>UbydJ(;P=0mwVP&7qd<8E;#BKBaS=rp5N|u zl#$MDbrh@mL^zsLsi==IcI8qRtGQ_xVSee@`Ht+ncgW)=gLMzDBaiEnOOVG+_o>L^a?%pyaXbBQpQhTnV0$lGRAS_Yw_zuVt9SZ<0rBbhkrpH z78TBeW_tu^74@mvuU!zcL$yG)rx>U|W(0Zh?`Xarqd5ID;@K|_$= zqdd+t)uHhvl*d_pdLE1aQjONtuR@$ldE7*&dX}B&pT{a*9`hz9<#Y9f^0;|Od0c+> zb*v0T)tK_QTuFJH#q#;QGv#spfbzF#N0je<-kw0zd5H2dZz9T- zM779swx6Hu<1s`rjA#ZBSs$Y9PUQYQ?zV#;Z%Yi`_nWypj+xon1Lh^V}zY54g^11YN zs~~R&bu8`kaWEd_YZK(@5DFh#?-#g_jgNzI?c;#L$I6p=O3%P|a32T!|M(6+uP@!B zx__f_EnPmebLNzGRMYPkKz^*=9pt}WDC}bK=b>VbY-RhBjwW)9GLE)Ok@A=y!z+XH zT2^z^MK{(!%>O_iMtr1ws(Q(B>Bgkq|mjrml?P%kqXdZJ#Y zPwhaxOeT%i3G*d$pkAiV(0d{HmyxKKvFv@QUe>>JH{9?08mO1C`Pon>({bN`Y-a@O zWoB&?)XCJ)=%|y~&2vF^D{CKjy_vNNwEZ(ueJs;7(B}9Ivh)p5FHs*feB z4Duf)QJrksDbVzYhWeB`lp6f{oIS|nRRTqgCN%yi4AjqufNIzj;<1IGxJLCdbDHX9 zb`RCd#D1!miKkRAv&q4|1CYum!ob>Vds+Y;ZR4MCifCWrb4){9z?X~h%7DD z#Z)VzT}os(i8?XWzj#@q=t8u!d~7^#5)CVY&*7bPLy$oJOR-pA_ny`mWpD*{d`)Y%-~~RFEd$v z?CWL5*UOBrmq}kQWBL8{zFww%y-fLfnep{9?dxUI*UPl8mwkP|J^mf7r}1^NfYR5= zOh~=V`g&PF>FZ(vgF2b<<3W9lht$QSkAr%d@v-!EE*?_v3dWTm*CF%9$2Nq_*N3>L z@RXkFKdAk<@eGXvod_7{LTDUZA37ea51m&}Bjb0!zS;9%PvQC8~6|1d@%ayMt8@!jQa)a^t=-EyzP&4z6hIK zjP`-Yqx~RaK(Wur^KEv&bX21IT}L+X@(o9sWfJ^{NOt?Ai+SUvdodrY&2~qXBFj2Q zQSd$akC*-&srU4}lE`^=zMD7Q!{%XK=BTqBZThS;9NAhrN6Kcr4FAE(=7p|`Fgizy z^`Ud5Opc$%;XYmH94Rr7&XH1;=^QEcjLwl_8TP_|uqt$p6pNA%{zGS_bEM=vI!8** zrE{dz8G65nDM9B*iF{4qKSVw{M@na)bEND#I!8)2q;sUieL6>qC!}+vST#CFN>$nf zAECpifZ`k455f!6Ia2yIog<~rX2Co^|2?hW6q(jne1ZSJ>UKAX|C|QJzI~wCxdl{* zR?+z3MWFt37AWgZ0{Na%6rUdqsv-SAwz~(#!8uZE$$#+5Z7^;sw*W=B_aD_8(RkVV zbe*aLYJZND_2)>5;p9JzKSxUXbEMc$-hcRWq*xpBAJ(5EB@D` z`E#VWKS#=@@;+p!_aFWoDdW$P;{F^d;m?sW#k>#k=SZ>tagLOoL_ULsoFk?EIa0=w zf3Vw$%AX^p`%x_XIa1o6Bc=2Daet1KjpMI>PkC89BL1&)r0gnMrx*L{=J_9;j2v&gJNN)|eMGt$Fhf( zZgjD1{~UUvD(y#qg2jrr2IFJ8lfG=OhJFQG)?yj17fY97{zkkdj`q#8MUEm*$%Pm{ z5Nm;>8T?cuj(P?<#KWJ=!FUULpRYYV6#Wer&PbOIO~G?sx@hUCZXM4a8_z4~J9nT@ z^5ofxZd`|5K)-`^eT;qwADaLanTDZWrf$X@5Usut>H@+6%nVt@YvePWxb z-@)fneN5i}0v*!N=smu=SxMBpOueq86ThxQ9%g+%z<=mAzkwohRrn;^Gb#L(6wl$m zWZU!bWjf_C_%%7`WKaBES1kOTY4-^}&kj#des5H5_&;`O3jCnBeTDqtkJ*U{hIVn+ ztAh97BX#;Jplom8FZs%X#DN<+;&Uby21U|g@S&#QlJ@v_d2!+oN3%EzD2j=8xbLcA z@UQCG`8F=r#dCvd>qPil#XsV?5PiEHDAwGD57$YWf_Be6_+iAPd5LxXmVvrJUyxm>28s$VFH$dH3qOb!OgQAgeSDRFgY_w()PE zUXq34s^ZjJ}pmaa4(UJo?0OVaq1EX4lb(R}q!b=`ertotCF zdWQINC#b$%N%OB~f@b&#&>rsr@@=gsE?)-}oy&tPPf;50lY`>wKhpg2M4%ZE6VxZ^ zIaxL3MIC&PgY=xNXn6&(X?L2&&(U+TY#u!)Yj^qQWQ(rCypFpBWZC9|d=~9LXVu3c zw!aSt#Z20NF4OcztRB+-bM=h&pR1ho-Yc`z??12A5bM}a^xi8`>36zr3hh7VG3mWm zc6k|$f87sAY(x9c`7po#{HLPyd@hSddNC^+^1pdE0lHy&B}bpb{{9)y?dl!zLGkNj z_zJms9oDhGU&CLp$g6Qbxq2u19OgGc{qkGk^xW>Hi0J0)e^=J_MpQ@nDtmNCk$xeb z8x~D|ruF%$ug<%-M4z60*pBZZzg#0<6Sh4ouFLW}Vzz4|bc}buf$yVAcB8+iPA}@W z>`~Y!A|rLi=b0GSKH`7hKc9W!$g*^TUa;HxpCEI<$N$A(>(C+y|Wzkt+&%1Sy(vq#5~#vzazIMf}U8t z4m!do4TpZP+lk_ZE5Cas^sVFwFiTYpi58|Qs5tluW6N7Wt zZP0J=eupildFK6&@P0>(_16ve^nSAY(X8r3yCv>$H(eb%c9-~est9OZv zxb$$utm9Vr6m~xsuH&D7!2Q_ke)POmEc#xoaa_`qHFfCRs?4|0&o_~BW^ngoKeWU5 zH1k^H`!RL`dSWNm#PeC=@nU?gsaouv%Ug2gq?eAiVc*A&YUT{+imY_|x{LMv>E|3- z%g)dh-LcAk7mK4y4906M-0G-4jot`8z6>8^H*Z+$Vx5|;akTB4LU(MB67WGPaxM5E z_GCJA$R1%!us+gg=#ea4aG{IEp)d0tS)V%^^Tl>UpG^E~b6jliq?nEInmuPa%2cnR zSN4aI@IkUkVdxf5^z}rQuk*V973daAaBQNBMWvI_FLCuY^h@`O13(N@F~wk1BtHU!14 zTP<8HMz#m_lh4gv%;!!9W%Zn(K770xzR%vyppKdX6x9wi#dy!|peU0SG^1`dapOA0 z9MBxC3$ku0K>qq#W6bl#puO@3Xkruw#h~akp68r&>+FZ6pxDK*MDlm#Lq z*7>(Ka_dFLE}%)06SNPWz~`85tI78)>_V*k6Q~+Q0d2%__#9qnHt|$jP_+ITl=l;W ztjJyX8eU-s$f8fBxK2lk^H&7T;LM;Z8k6QL+=q`b3l9_#vug}-v z-$keVLjLB|MSKq)Js#?Swpc3Yo=kY^ll%XNKG5T(BcGDyuA{BK;0EF^$1Wh=-{YjC z2%o*zkqu0<-BEpv4c!s(&p>BH^NitcT(0cA$k9$eG2hWFX*kc3$9g%-QFTo@1FUoa zI$`#ogumg#vOp(n{Qb}elYcsNfe*+@{-$Ox_#3k^D)fOZ-v?b#i6fv3=EGm`H~RDg z=mSfV3)DNtkWS3`GQ@qZem@Z81HT7Z!3~4mxM?XtHurnt{=cCgw#{_V6lenS%ejcD zqJlc?@<4aJ9lR0bFD8ScRX5PguS={;{Tx=C`Z>B8^>ajJ-_LpSe1N+TPkaNEOQ@ft z`%*uL_oIG}9@d+Z)9fj zHzqdqb5u0)IXW@<8~HQ&8{3uqjWFbERC4cc29m$w@5s;CoOG#D{W|Y&l=nB>`x_PFZ^Zwjzu_VNM*WAsF(LjYw4W0^Po{i7NBif= z0)G=cPiDQZk)GB+4=g>E_cc1CpJPJ$Isf%Mne@KK2L8oU-+#=^*Z*IMtG)0$TpdV8 z`R`7A@(VYr((nE`Uy#35`JX7ywx{z4<+t1MyI+^co(1d86D5%CnCPP@Ww`R zc~-17$g?_p67nqDoe_CfZ0UkL%fI=8-{1DUL7p`iRwB=eqT7&X?YO(hulDEclxK^N zLZ0OvJ|VA)1Oq^Q`a4i=TSs{{StC$)O9ZO@XDE;Mo(3w}n3#m}tZ5sC=FeP09#t^$S^bRq95OHES@A|-o_+Flq=b}bWfY%h!zs_o^A>qc{y}+Gl%qVWD^Z^1O(@Tr zwv=ae4a&1N4&_tlxM{-%Clx4O`Mc%MqE+v*r-xQ9Xgk zeV*mHC}uv->T8ro)ixsYc~t*-}}5UP;6k@T_fs#g=r8xk zFSM?P`jt(Y9KXxW+cX)>*ZeH1^?|PFSi7;#gk`{We0gfzM`c}r`>Ruvv7bbLC<>iY zEi;mCHLm#)`95#%H;yvZfESKz#ob3>zoGd3u6_@@iTRrwuQ~F4Z_uaEv&x=BoV)QE zNAWb?DXdFZ@i@j;B|YM(`qet_bxD9WaFsk-iAK$QKvV!ST)VL z2J@feFL&e-;fpcef9C?kJO0p)Y(>^Nj$(HT)Q=ROi@K56Js9;Ok$yMy$)qnc5!WA$ z3Y`)K?n9s0lO(7U$(Ez2PSm*&bV|NX44o3+CxuSg@&%z&a$6VZld%V(PoiC3@&oPH zK$m!zpF!2&0_l_N4~plxK-=Xp^hbK=su3+507;@!AieJ1Xv8P#2p|oIZfY zPc#F~obsSJkO$=7rlPn~EKpT^3mq`G?}GZpd5WtX_TxKfe0&5biiQ(U&LtL_3d+V~ zLG{xxiq|R7{MC!bD|ZEXosJZrZVQSvEkXUTDad+Cn*Y54D7)4ro~s3l&NV15Ssk>c zs?vC;${;^T`ov0Ar1|TlPkNTur!J&VtU2kEYESya$B;gmzet~KWFo6Y`oy++eab>) z;iOACm)EI1q)V!i*QaPiz1HhfbE4uzV@ZeX63@;=U4qCH6V(&a8GDe(mJ;=F&vt&i zI#CrN@(e`#Em1O}eolE`-yrh8y$&28%I!oELA2pM)_#6Ekx%gBBZ+FTpYKPsJ$>BO zvlCJML1b-+rUlV9CGy68-0PFB@8h~eU7ILs5oHY@dq2RuA5gx}A-z5suTR0g66X6I z-0PI^Iwie63D2OvA-ykaUqD}EpBdzX`qv?y*_so6NR3WTdec2A^oA$N1ij%u{t90t z_dkW+h#{@vi*%>Y&>Ob&Px3`gJ5c>8=C7nTCkv3?9LxiqQA@nORIUL%Vaw?~TWt9< z%KIm8Q(kPE1ymP$D))Do+>85zC0g}!6t+lTFm>uajxuG!-iV_m?B!?@{LmBQgA4X> zw5#f)FCia{?uPN{2dFQRAued*)D3gvYWJEhj^fleAm7uiGuCIj(+T5?>VoXZxsEQ@ zrR#va`<@Oi<~y#pcl`SPe9*iu_=k&C+Ro@p*xMW1V*XN8kln1;#>K4kw$_efX&R6X zpU?{9BV&ME3~uRST|EY9Ta9ml`JAaiS!-Q$7ps{SK@;(?nTt)sF`#Oi50pc$H+AD; z{8(a@62vKQo49eFdo3tF`~j+i*+JR$d1Kt~@&=G!>I;ghztTAW9<(7`LzJ z943B_&S7Hb=o}_nCyHyhe@3J zQU~9=$7@iJdjOh**FpB>Z;C4(0qv(|M z8b8v9#s_u-b&rn3@HRC6U2~d`Xaw33b%_&dfc!`mQ0A=&>Q+BcUXB!*>i54T#Phbc z!yfVOwKj zl&{al2X)Qy@CBy$kDwmCbFljyHmEhom!=}_xID;>+sAW37Oxe^v(x)(`Lmda<+Pgb3Yudt2jKIL+yrI*zljg_gY58DkZ)fN zilvKbyxVMwznu)4wxdDWaR{gq_NTZ+Pnv&4^(&jA1I26FfOcsMkpJ5RWOEu(JgPpZ zcToL`1m58!jWAE-u@-w^dF|NDPB zQ8Xu-{63CD)VJt&z1r!2-_Io)<>Tf=QPIcwiIx*hJU{=@|DJyAe@|Z{s*^;$*T-9k zYz(bra0L5A-z9PzJ4XVKj7XU2=5Q1 z_Xo`TgV6fbf9?CwA@wWeeS!AAz=Ze$>-|9B4+3)U57>Xyu>xNZ)Ujkp{Yv;)2lXh= zzy}25B4nKTI2boUT`Gji$2x@E$H9CMGd~{0LH#Ni4;a+Hc*S4PUuLVWfHKBRPzeT;9@I9^G>kr4Qdkye%dAAF^Uo_#u|I<~}#h3#{CM z`R}(tKji)yq#s!$pdWVAQRoM|MEapt9Vh+RR|)zdm$rm{=vAa2`UdHTDOU^np>C0W zmt5+9_`qk;} zeqVRef6nQ9?_t#wK|f3h>W7|%`oR~Yez0FrKe$BwP+L$xRPBzSAG#yzhq+4nkxBZ| zm-M3$^+V*KeyER7Kjbdd4}Bf=gI7cS5Uo%@p z>Bm9T53vmOLk~jz;CoR&oZYA&q7~|g{u%Yde2MzOHllu*cSt|77Qp^3E0KOAqkf1q z)DKzlC8%c|P(Rou)DLk#>IeG}^}~H02gkXF`k_ca*!1V2Tx~%8(4-%l^n z_m*&qFBvbcMCTvgIdkBBv?Aa>T2DV1=?M4YN*)7r#EUO^aV14@Bu_Uq>4W+M-O!{1 zjOr!XUb$y`6jX1#eLld}RPGQJQ4&P}J$>L*?vauGpQx5h+hzA*{kQLT!hXDR%nnPF z)nmIQd$0R8OY!K?FD!ZYH}U`f8@_^lT)tiwC@!@7+}1m{r*DS#hjTu&R9jbU0=wx) z+EORVjbQJ-5B7gEB;jLgn_iDVT*;hji*cpDW8NiRzQYPz&k}dOXQ}4pEVXn-7QF+U z{^Jr$^I(S}OSyO(=!SSdWwEtI#v=um?5T>2EcN2M97|rO5yX|8`oWxX!D>S~~V6OLnLo#FbQ5Rg5d;-WUU)N0z*3DX*M+0ovsF0sy-cgbmld6%4Vn0HC;c@pAE&epA|_B!G=%)7*g z7C~G|-;H^foH)$8B=*!uw(V2}%)2BW!n{kODdt^rVleNL{A9@x+s;(Qyi4NfOGz-k z{&g_)?~HkuoSKw(sboT;E!T;dcZs(sO2Gb@cS&tM5^rrDhIyC7bjrKbc;6sfE>}(l zs-IdQbIuNg@fKj-CA~cXY;ma$(79e5XY19P>&Ii>CH^txUHS&|F0t1!?~?O1=3NqFG4B#f z$Gl5=9_C$AhcWLGuZek=bXUx~#Cl@hC3!FAUEMT+F*9`sYEtJdAml)SY9%c77ZR6wmd;`joCfQx)?rv7VH7sUqfGa-PS$OM-`E zdx?3MWF^eIB%+FAU_G~E-X*aa^Da3xFz=E+gn5^o63n~AB<5Xm9>ly$GHN0A&&Rw= z;_2C7vrbciX2L||Eqw0JY{&$ge=-87FVJ&;@$pz*9^*=~7@zyom+`qjr#Z%zcp*La z_gH6aU#0`lxq#38v2u@M`I9YxZ0TQtvPmS+d>etb(*Ve))y48z4*;E&9H`IV50pEH zUx)d*!NCt;4~;>8WN}@1UR-|D5#vucN5Xxsy6R_mK5=O(#;=-Pf%lf^geW-2U=x~v zUt-#Q4E~48dko`P(|?Az7+*FD$1VOR++V97+;(Ep@+UA6lxVo0b6&j{rSkeXcLIHp@(2WGUX-40@p(r{-E)KesZ+ zQs$?CKCsj&aNgkTKZCkZ?sd=w@#rv!UzvX#1wD}KT7n*!TDx9@{>|s&IYZx9K@ZG* z^HC2rZU;Ru6)FKmR3_+xsC^oALDWnInt$Ae_QImc@VTb-0*aJyv?uPEWXnaZSwLr7 z4BE{a0A<6QpeM4+n`*fzHAs z$iaJ%BR2z;vlhq?Ed!b|i_yMkKJw`6Ks9_C*5^$^4ju;-pN>X*b{dd{>S=Qu+69auw5ziKb%Q;|CQ4k<5#>s`X9VK`X77>#;;6CSL{C?<5x}u#;@cR zy6@@;#;wd@@;lCB+)7qQvS%@VB?{61kPOL(Vcd!z!+4cQMCyweuQJmqe$@ym50KyS z3R1R3s+$;>G8)OJA=R@;rvcJUzzE+%9wdKb4bqv5ETeXXNRx|XbEw@6;wwlw0cpk{#b~Oh`>*5(w4Gs8o`lr# zWYhgu4n4;w`eV8D{ErxFPjM?j{)cy;t9P#L-RG*KX)pP)Ckdz&O^bd$!ner}X3C$FN7HK^#l>ABu6TU9;YX@e0=zTAEX( z3oKQql?$O?m6mu8(y{kEYqQA9pd<3c70?kL(-q=artm1}h|X96I>J7G4&qpHW*+E> z{H8XXgP1-)ppLw|4Rz$~Ueu9>*Fis=Hf@3K^U|OrEb1;Ge`p5iha6P{$nN_Tbi>39 zM*Y}O9Vn_CLj8!#L;ZL+5ok^|MSI5`$S;qeF3kK0C|13RJd=gxr!gNo8_@x5(;DMg z=6;N0IX{-h_WjPoe#PT4j-~d0jdu1{pcq4OtPG4}>4dkST(??){4N`4T206H9bN|V z;_*OL9phNy?-<8YH&URS&A~X9nvsb8encHHQwCuF(a!^&rKlsK2A+e+?W7~`ppKZe zs3ZCuorCnmIF|gD&Oyebj_CGy4kByQeNxrwKBFM4B_G8+ty{iAKuuWba0u5N{&QAYxN04@b(Qr~}RhB%?SMr*jZP z`OsAt(hG`X2|5Si6vtu|$1-PVKmMNf**!=vj^*V;7Zk_hMObh0kX{^%Q5?&A|CJZV z^3FkYKpac`hd36eIF_Vy5FT(2!UE1g9MTaM5XW)??&B4tBi=cPrz74uh$bB|q$46g zPrUPw|E8xaq#J=c!l+!4ZioOKF|_~d06JtVq6i=-+ju%awkF%7Alo5wq9n2aJ5XOd zJFuVo{3-Yw>cSg$Xm=YGnd9NPY`J?N=!Ndp1>Z-q@+{m(r5aCz`*)qFBJe-h;vMkZ zhny3Se#iBF;GeK|-QXNu4LXX?`(0G{oL|O7&bu@j72R9|<(nf`S(+19KCtBNo35~w zKdgKY?5AFaIGFfs&O6q2692x$QV(oe1oidSgYM{l0~cFcK3uQBl2t3a$WlC9%CS^4 ztAk&oD)t6FQfm2pTdrr;0bSzN*I^v2VLa%QI93nhV0=ax=#-rG3-~)Gr37_qXDOgF zpbqGjbM-y&dz>nbP_HU%MZf2c(V$nn-D99va%MHqD_w9G=#;rD9P~-wL+@qWi}&lQ z8qb2x=qs{N(@$%N(*2Xhvb!#G&?^J8qi%scU-rC443 z0({>+mm&ToT2w@~j2dmrS>*6hmS*DH5C?Pe&t_O#U26lBmFA{HecG>Smb@SqC|i6r z(%R0>jzD&6Q!4Zu-3jPy%!4?Xvuk~dE!UHdCtI5CRe|bgPq@EI4w^U2mh+9pL!p1G zcF5vIL!jTxaG=V6F$vmjI5*hROd0`{Z(c~Ww#**~>!}de*kDUo`{3-vzGzQ^$Z~2-xes! zln2V;hox<2O5Ov?(G!5;bRVFKY>aGn2bO=a8RB0udMuFt&;rPM{2FV=VN=!uotQB| zwW=LZr-uWj+SeaG*GC1&3iv*4k~suIS*_{@D^ zvwfR@=Gbze{$K%6w7@u+8TulYcg8rF`l2t^|JVhnX176m&%;3Tx7uhQuMA|%%OcO; zjDhdJ^gK{~eGWxjmLceY_kJ&fq%NQ2ZH#}X%dfo%@r z^BMYDcd&UU^gq;UjAN-M$p5&Geh1r0e#dI`JNR1kJLGQkJKTK4Fpi2snyKh_m}2rb zdL#MncF;~fgXG7_?-++<94U8@zcH5ljiyL;5&a6a4#_8y9ZmKFNOP6^j<1pO1M)xK zK#EMN?~By!ktTxddy)Khq;m=V2Yv#nz9sHNnvF=g8mX63c>&q;kxn*JO(%N_)hi;! zu{g!C7{#%43f7BZNS;LPDUK!nAdV#{j-@D$FAg+Hj0g@7oU(mD6L);uh%-UWxWVqFL6X#Mp|6T zfDvi&3AX(4xZ&vuZh3lATxx=A*KZOT8POnukK;lA33p#R6!x9D=5BC3`}B)V){Ip? z8P+A%Wuv|EwJhJ?`oj7CF5mif=PK9M+jdS|<=S#{{aSC?@~D$HnhbDxvQloz^Dgg; zXs~LS+wRNp9Xq=9;_2^B9dgUn@%XGU?)dsx+|RLg+zxredJlKGr+Gw}wI}y}HN_s_ zJd?YBptW@#|BA1l+E&kP?}W1p)9rXM4c8X9?VK3}FF)*lezkgRwXfZJ zeIcpd6QkUu;Da8`PR?}8XVz~+p;UU|xnyT2sopdF`WR^500>CRt# zR_dK@eb(;Pjk~-3-1lBZzIMwkZ}wW%0dD#1D{J;0Ox4Uh)W6N#k#4=3ojbxl=()nw zf6}dIDXWf^v3#QC-l^_9t!NomZiW3m{9x^c?)ucfyZ4vnY(I8+K>7XdxIfjnhq>)V z{W+&EyDYhSiM6-$Q842#$?oUc)~(0j9T~QN+kJm>=T+a>QgFbIU+((DmTGSAq%GF2 z^~=p&?)9=RMyHfYbL~fKF57I&D_`1XzYi;4+<%ulp3YnF*e?6MqkbqjXUmsd>ps)+ zMqK(rd%dOk^XIzPzCdB6*{CYJ8jot_S$M! z?ay0s?5uHad-pk~RdcUybdTN6m0NA+JEs3nakk%_Lp8s@?0({1>;q zdTqh=``vLW{Is`OId>e<^+dL@^YulOw_#lxwq4)eU02zpUBk!i&u8nzzMbuLiYLX| zp9gkLHEn1ABlk;_{>9ebdn>b>JHF}{UO2?su?hQY#Oi*CQ0O z8vL04dIUdrq3G$aM<`}B_%Z$U2!8HD(bHd#P|RxZWBTh6{M?12r@tPdnAPCN^w%T! zxeG;4e?3AmtHF=yuSf867mA+#dW2$DgCEmhkKpGn6g~a*2*s=hKc>GP!OvYNdiv`T zidhYQOn*IspSw`>^w%R4vl{%E{(1yIccJL%uSY0mHTW_8^$33MLebM-k5J5N@MHSx z5&YbRqNl$ep_tX+$Mn}D__+&3Pk%i^F{{Ck>90rda~F!9{(6LBR)ZhYUytDDE)+fe z^$5kR20y019>LFDD0=$q5sFz2eoTKof}guk^z_#w6tf!qn9*IrN>wWTyH`{`duJqT z<*t(Z@2=kst6<^c24xHxfiJ2I?3iEYU|IIA`(jJ?-yQ$bv4K0(h=K4nyuePM^)SoS z$WqMy``4>=J9ZmOOBfxO7XNQM2EIwtyPyiY{LCHy?!B6UR}Or0-){qKd+xUZetVB! WbeA%>+css~zxCa@$XQ~) 0``. - :param save_path: (str) Path without the extension where the expert dataset will be saved - (ex: 'expert_cartpole' -> creates 'expert_cartpole.npz'). - If not specified, it will not save, and just return the generated expert trajectories. - This parameter must be specified for image-based environments. - :param env: (gym.Env) The environment, if not defined then it tries to use the model - environment. - :param n_timesteps: (int) Number of training timesteps - :param n_episodes: (int) Number of trajectories (episodes) to record - :param image_folder: (str) When using images, folder that will be used to record images. - :return: (dict) the generated expert trajectories. - """ - - # Retrieve the environment using the RL model - if env is None and isinstance(model, BaseRLModel): - env = model.get_env() - - assert env is not None, "You must set the env in the model or pass it to the function." - - is_vec_env = False - if isinstance(env, VecEnv) and not isinstance(env, _UnvecWrapper): - is_vec_env = True - if env.num_envs > 1: - warnings.warn("You are using multiple envs, only the data from the first one will be recorded.") - - # Sanity check - assert (isinstance(env.observation_space, spaces.Box) or - isinstance(env.observation_space, spaces.Discrete)), "Observation space type not supported" - - assert (isinstance(env.action_space, spaces.Box) or - isinstance(env.action_space, spaces.Discrete)), "Action space type not supported" - - # Check if we need to record images - obs_space = env.observation_space - record_images = len(obs_space.shape) == 3 and obs_space.shape[-1] in [1, 3, 4] \ - and obs_space.dtype == np.uint8 - if record_images and save_path is None: - warnings.warn("Observations are images but no save path was specified, so will save in numpy archive; " - "this can lead to higher memory usage.") - record_images = False - - if not record_images and len(obs_space.shape) == 3 and obs_space.dtype == np.uint8: - warnings.warn("The observations looks like images (shape = {}) " - "but the number of channel > 4, so it will be saved in the numpy archive " - "which can lead to high memory usage".format(obs_space.shape)) - - image_ext = 'jpg' - if record_images: - # We save images as jpg or png, that have only 3/4 color channels - if isinstance(env, VecFrameStack) and env.n_stack == 4: - # assert env.n_stack < 5, "The current data recorder does no support"\ - # "VecFrameStack with n_stack > 4" - image_ext = 'png' - - folder_path = os.path.dirname(save_path) - image_folder = os.path.join(folder_path, image_folder) - os.makedirs(image_folder, exist_ok=True) - print("=" * 10) - print("Images will be recorded to {}/".format(image_folder)) - print("Image shape: {}".format(obs_space.shape)) - print("=" * 10) - - if n_timesteps > 0 and isinstance(model, BaseRLModel): - model.learn(n_timesteps) - - actions = [] - observations = [] - rewards = [] - episode_returns = np.zeros((n_episodes,)) - episode_starts = [] - - ep_idx = 0 - obs = env.reset() - episode_starts.append(True) - reward_sum = 0.0 - idx = 0 - # state and mask for recurrent policies - state, mask = None, None - - if is_vec_env: - mask = [True for _ in range(env.num_envs)] - - while ep_idx < n_episodes: - obs_ = obs[0] if is_vec_env else obs - if record_images: - image_path = os.path.join(image_folder, "{}.{}".format(idx, image_ext)) - # Convert from RGB to BGR - # which is the format OpenCV expect - if obs_.shape[-1] == 3: - obs_ = cv2.cvtColor(obs_, cv2.COLOR_RGB2BGR) - cv2.imwrite(image_path, obs_) - observations.append(image_path) - else: - observations.append(obs_) - - if isinstance(model, BaseRLModel): - action, state = model.predict(obs, state=state, mask=mask) - else: - action = model(obs) - - obs, reward, done, _ = env.step(action) - - # Use only first env - if is_vec_env: - mask = [done[0] for _ in range(env.num_envs)] - action = np.array([action[0]]) - reward = np.array([reward[0]]) - done = np.array([done[0]]) - - actions.append(action) - rewards.append(reward) - episode_starts.append(done) - reward_sum += reward - idx += 1 - if done: - if not is_vec_env: - obs = env.reset() - # Reset the state in case of a recurrent policy - state = None - - episode_returns[ep_idx] = reward_sum - reward_sum = 0.0 - ep_idx += 1 - - if isinstance(env.observation_space, spaces.Box) and not record_images: - observations = np.concatenate(observations).reshape((-1,) + env.observation_space.shape) - elif isinstance(env.observation_space, spaces.Discrete): - observations = np.array(observations).reshape((-1, 1)) - elif record_images: - observations = np.array(observations) - - if isinstance(env.action_space, spaces.Box): - actions = np.concatenate(actions).reshape((-1,) + env.action_space.shape) - elif isinstance(env.action_space, spaces.Discrete): - actions = np.array(actions).reshape((-1, 1)) - - rewards = np.array(rewards) - episode_starts = np.array(episode_starts[:-1]) - - assert len(observations) == len(actions) - - # pytype: disable=attribute-error - numpy_dict = { - 'actions': actions, - 'obs': observations, - 'rewards': rewards, - 'episode_returns': episode_returns, - 'episode_starts': episode_starts - } - - for key, val in numpy_dict.items(): - print(key, val.shape) - # pytype: enable=attribute-error - - if save_path is not None: - np.savez(save_path, **numpy_dict) - - env.close() - - return numpy_dict diff --git a/stable_baselines/gail/model.py b/stable_baselines/gail/model.py deleted file mode 100644 index f5d62022..00000000 --- a/stable_baselines/gail/model.py +++ /dev/null @@ -1,54 +0,0 @@ -from stable_baselines.trpo_mpi import TRPO - - -class GAIL(TRPO): - """ - Generative Adversarial Imitation Learning (GAIL) - - .. warning:: - - Images are not yet handled properly by the current implementation - - - :param policy: (ActorCriticPolicy or str) The policy model to use (MlpPolicy, CnnPolicy, CnnLstmPolicy, ...) - :param env: (Gym environment or str) The environment to learn from (if registered in Gym, can be str) - :param expert_dataset: (ExpertDataset) the dataset manager - :param gamma: (float) the discount value - :param timesteps_per_batch: (int) the number of timesteps to run per batch (horizon) - :param max_kl: (float) the Kullback-Leibler loss threshold - :param cg_iters: (int) the number of iterations for the conjugate gradient calculation - :param lam: (float) GAE factor - :param entcoeff: (float) the weight for the entropy loss - :param cg_damping: (float) the compute gradient dampening factor - :param vf_stepsize: (float) the value function stepsize - :param vf_iters: (int) the value function's number iterations for learning - :param hidden_size: ([int]) the hidden dimension for the MLP - :param g_step: (int) number of steps to train policy in each epoch - :param d_step: (int) number of steps to train discriminator in each epoch - :param d_stepsize: (float) the reward giver stepsize - :param verbose: (int) the verbosity level: 0 none, 1 training information, 2 tensorflow debug - :param _init_setup_model: (bool) Whether or not to build the network at the creation of the instance - :param full_tensorboard_log: (bool) enable additional logging when using tensorboard - WARNING: this logging can take a lot of space quickly - """ - - def __init__(self, policy, env, expert_dataset=None, - hidden_size_adversary=100, adversary_entcoeff=1e-3, - g_step=3, d_step=1, d_stepsize=3e-4, verbose=0, - _init_setup_model=True, **kwargs): - super().__init__(policy, env, verbose=verbose, _init_setup_model=False, **kwargs) - self.using_gail = True - self.expert_dataset = expert_dataset - self.g_step = g_step - self.d_step = d_step - self.d_stepsize = d_stepsize - self.hidden_size_adversary = hidden_size_adversary - self.adversary_entcoeff = adversary_entcoeff - - if _init_setup_model: - self.setup_model() - - def learn(self, total_timesteps, callback=None, log_interval=100, tb_log_name="GAIL", - reset_num_timesteps=True): - assert self.expert_dataset is not None, "You must pass an expert dataset to GAIL for training" - return super().learn(total_timesteps, callback, log_interval, tb_log_name, reset_num_timesteps) diff --git a/stable_baselines/her/__init__.py b/stable_baselines/her/__init__.py deleted file mode 100644 index 6b47d6e7..00000000 --- a/stable_baselines/her/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from stable_baselines.her.her import HER -from stable_baselines.her.replay_buffer import GoalSelectionStrategy, HindsightExperienceReplayWrapper -from stable_baselines.her.utils import HERGoalEnvWrapper diff --git a/stable_baselines/her/her.py b/stable_baselines/her/her.py deleted file mode 100644 index 6a9e89f4..00000000 --- a/stable_baselines/her/her.py +++ /dev/null @@ -1,163 +0,0 @@ -import functools - -from stable_baselines.common import BaseRLModel -from stable_baselines.common import OffPolicyRLModel -from stable_baselines.common.base_class import _UnvecWrapper -from stable_baselines.common.vec_env import VecEnvWrapper -from .replay_buffer import HindsightExperienceReplayWrapper, KEY_TO_GOAL_STRATEGY -from .utils import HERGoalEnvWrapper - - -class HER(BaseRLModel): - """ - Hindsight Experience Replay (HER) https://arxiv.org/abs/1707.01495 - - :param policy: (BasePolicy or str) The policy model to use (MlpPolicy, CnnPolicy, CnnLstmPolicy, ...) - :param env: (Gym environment or str) The environment to learn from (if registered in Gym, can be str) - :param model_class: (OffPolicyRLModel) The off policy RL model to apply Hindsight Experience Replay - currently supported: DQN, DDPG, SAC - :param n_sampled_goal: (int) - :param goal_selection_strategy: (GoalSelectionStrategy or str) - """ - - def __init__(self, policy, env, model_class, n_sampled_goal=4, - goal_selection_strategy='future', *args, **kwargs): - - assert not isinstance(env, VecEnvWrapper), "HER does not support VecEnvWrapper" - - super().__init__(policy=policy, env=env, verbose=kwargs.get('verbose', 0), - policy_base=None, requires_vec_env=False) - - self.model_class = model_class - self.replay_wrapper = None - # Save dict observation space (used for checks at loading time) - if env is not None: - self.observation_space = env.observation_space - self.action_space = env.action_space - - # Convert string to GoalSelectionStrategy object - if isinstance(goal_selection_strategy, str): - assert goal_selection_strategy in KEY_TO_GOAL_STRATEGY.keys(), "Unknown goal selection strategy" - goal_selection_strategy = KEY_TO_GOAL_STRATEGY[goal_selection_strategy] - - self.n_sampled_goal = n_sampled_goal - self.goal_selection_strategy = goal_selection_strategy - - if self.env is not None: - self._create_replay_wrapper(self.env) - - assert issubclass(model_class, OffPolicyRLModel), \ - "Error: HER only works with Off policy model (such as DDPG, SAC, TD3 and DQN)." - - self.model = self.model_class(policy, self.env, *args, **kwargs) - # Patch to support saving/loading - self.model._save_to_file = self._save_to_file - - def _create_replay_wrapper(self, env): - """ - Wrap the environment in a HERGoalEnvWrapper - if needed and create the replay buffer wrapper. - """ - if not isinstance(env, HERGoalEnvWrapper): - env = HERGoalEnvWrapper(env) - - self.env = env - # NOTE: we cannot do that check directly with VecEnv - # maybe we can try calling `compute_reward()` ? - # assert isinstance(self.env, gym.GoalEnv), "HER only supports gym.GoalEnv" - - self.replay_wrapper = functools.partial(HindsightExperienceReplayWrapper, - n_sampled_goal=self.n_sampled_goal, - goal_selection_strategy=self.goal_selection_strategy, - wrapped_env=self.env) - - def set_env(self, env): - assert not isinstance(env, VecEnvWrapper), "HER does not support VecEnvWrapper" - super().set_env(env) - self._create_replay_wrapper(self.env) - self.model.set_env(self.env) - - def get_env(self): - return self.env - - def get_parameter_list(self): - return self.model.get_parameter_list() - - def __getattr__(self, attr): - """ - Wrap the RL model. - - :param attr: (str) - :return: (Any) - """ - if attr in self.__dict__: - return getattr(self, attr) - return getattr(self.model, attr) - - def __set_attr__(self, attr, value): - if attr in self.__dict__: - setattr(self, attr, value) - else: - setattr(self.model, attr, value) - - def _get_pretrain_placeholders(self): - return self.model._get_pretrain_placeholders() - - def setup_model(self): - pass - - def learn(self, total_timesteps, callback=None, log_interval=100, tb_log_name="HER", - reset_num_timesteps=True): - return self.model.learn(total_timesteps, callback=callback, log_interval=log_interval, - tb_log_name=tb_log_name, reset_num_timesteps=reset_num_timesteps, - replay_wrapper=self.replay_wrapper) - - def _check_obs(self, observation): - if isinstance(observation, dict): - if self.env is not None: - if len(observation['observation'].shape) > 1: - observation = _UnvecWrapper.unvec_obs(observation) - return [self.env.convert_dict_to_obs(observation)] - return self.env.convert_dict_to_obs(observation) - else: - raise ValueError("You must either pass an env to HER or wrap your env using HERGoalEnvWrapper") - return observation - - def predict(self, observation, state=None, mask=None, deterministic=True): - return self.model.predict(self._check_obs(observation), state, mask, deterministic) - - def action_probability(self, observation, state=None, mask=None, actions=None, logp=False): - return self.model.action_probability(self._check_obs(observation), state, mask, actions, logp) - - def _save_to_file(self, save_path, data=None, params=None, cloudpickle=False): - # HACK to save the replay wrapper - # or better to save only the replay strategy and its params? - # it will not work with VecEnv - data['n_sampled_goal'] = self.n_sampled_goal - data['goal_selection_strategy'] = self.goal_selection_strategy - data['model_class'] = self.model_class - data['her_obs_space'] = self.observation_space - data['her_action_space'] = self.action_space - super()._save_to_file(save_path, data, params, cloudpickle=cloudpickle) - - def save(self, save_path, cloudpickle=False): - self.model.save(save_path, cloudpickle=cloudpickle) - - @classmethod - def load(cls, load_path, env=None, custom_objects=None, **kwargs): - data, _ = cls._load_from_file(load_path, custom_objects=custom_objects) - - if 'policy_kwargs' in kwargs and kwargs['policy_kwargs'] != data['policy_kwargs']: - raise ValueError("The specified policy kwargs do not equal the stored policy kwargs. " - "Stored kwargs: {}, specified kwargs: {}".format(data['policy_kwargs'], - kwargs['policy_kwargs'])) - - model = cls(policy=data["policy"], env=env, model_class=data['model_class'], - n_sampled_goal=data['n_sampled_goal'], - goal_selection_strategy=data['goal_selection_strategy'], - _init_setup_model=False) - model.__dict__['observation_space'] = data['her_obs_space'] - model.__dict__['action_space'] = data['her_action_space'] - model.model = data['model_class'].load(load_path, model.get_env(), **kwargs) - model.model._save_to_file = model._save_to_file - return model diff --git a/stable_baselines/her/replay_buffer.py b/stable_baselines/her/replay_buffer.py deleted file mode 100644 index 736a4993..00000000 --- a/stable_baselines/her/replay_buffer.py +++ /dev/null @@ -1,184 +0,0 @@ -import copy -from enum import Enum - -import numpy as np - - -class GoalSelectionStrategy(Enum): - """ - The strategies for selecting new goals when - creating artificial transitions. - """ - # Select a goal that was achieved - # after the current step, in the same episode - FUTURE = 0 - # Select the goal that was achieved - # at the end of the episode - FINAL = 1 - # Select a goal that was achieved in the episode - EPISODE = 2 - # Select a goal that was achieved - # at some point in the training procedure - # (and that is present in the replay buffer) - RANDOM = 3 - - -# For convenience -# that way, we can use string to select a strategy -KEY_TO_GOAL_STRATEGY = { - 'future': GoalSelectionStrategy.FUTURE, - 'final': GoalSelectionStrategy.FINAL, - 'episode': GoalSelectionStrategy.EPISODE, - 'random': GoalSelectionStrategy.RANDOM -} - - -class HindsightExperienceReplayWrapper(object): - """ - Wrapper around a replay buffer in order to use HER. - This implementation is inspired by to the one found in https://github.com/NervanaSystems/coach/. - - :param replay_buffer: (ReplayBuffer) - :param n_sampled_goal: (int) The number of artificial transitions to generate for each actual transition - :param goal_selection_strategy: (GoalSelectionStrategy) The method that will be used to generate - the goals for the artificial transitions. - :param wrapped_env: (HERGoalEnvWrapper) the GoalEnv wrapped using HERGoalEnvWrapper, - that enables to convert observation to dict, and vice versa - """ - - def __init__(self, replay_buffer, n_sampled_goal, goal_selection_strategy, wrapped_env): - super(HindsightExperienceReplayWrapper, self).__init__() - - assert isinstance(goal_selection_strategy, GoalSelectionStrategy), "Invalid goal selection strategy," \ - "please use one of {}".format( - list(GoalSelectionStrategy)) - - self.n_sampled_goal = n_sampled_goal - self.goal_selection_strategy = goal_selection_strategy - self.env = wrapped_env - # Buffer for storing transitions of the current episode - self.episode_transitions = [] - self.replay_buffer = replay_buffer - - def add(self, obs_t, action, reward, obs_tp1, done, info): - """ - add a new transition to the buffer - - :param obs_t: (np.ndarray) the last observation - :param action: ([float]) the action - :param reward: (float) the reward of the transition - :param obs_tp1: (np.ndarray) the new observation - :param done: (bool) is the episode done - :param info: (dict) extra values used to compute reward - """ - assert self.replay_buffer is not None - # Update current episode buffer - self.episode_transitions.append((obs_t, action, reward, obs_tp1, done, info)) - if done: - # Add transitions (and imagined ones) to buffer only when an episode is over - self._store_episode() - # Reset episode buffer - self.episode_transitions = [] - - def sample(self, *args, **kwargs): - return self.replay_buffer.sample(*args, **kwargs) - - def can_sample(self, n_samples): - """ - Check if n_samples samples can be sampled - from the buffer. - - :param n_samples: (int) - :return: (bool) - """ - return self.replay_buffer.can_sample(n_samples) - - def __len__(self): - return len(self.replay_buffer) - - def _sample_achieved_goal(self, episode_transitions, transition_idx): - """ - Sample an achieved goal according to the sampling strategy. - - :param episode_transitions: ([tuple]) a list of all the transitions in the current episode - :param transition_idx: (int) the transition to start sampling from - :return: (np.ndarray) an achieved goal - """ - if self.goal_selection_strategy == GoalSelectionStrategy.FUTURE: - # Sample a goal that was observed in the same episode after the current step - selected_idx = np.random.choice(np.arange(transition_idx + 1, len(episode_transitions))) - selected_transition = episode_transitions[selected_idx] - elif self.goal_selection_strategy == GoalSelectionStrategy.FINAL: - # Choose the goal achieved at the end of the episode - selected_transition = episode_transitions[-1] - elif self.goal_selection_strategy == GoalSelectionStrategy.EPISODE: - # Random goal achieved during the episode - selected_idx = np.random.choice(np.arange(len(episode_transitions))) - selected_transition = episode_transitions[selected_idx] - elif self.goal_selection_strategy == GoalSelectionStrategy.RANDOM: - # Random goal achieved, from the entire replay buffer - selected_idx = np.random.choice(np.arange(len(self.replay_buffer))) - selected_transition = self.replay_buffer.storage[selected_idx] - else: - raise ValueError("Invalid goal selection strategy," - "please use one of {}".format(list(GoalSelectionStrategy))) - return self.env.convert_obs_to_dict(selected_transition[0])['achieved_goal'] - - def _sample_achieved_goals(self, episode_transitions, transition_idx): - """ - Sample a batch of achieved goals according to the sampling strategy. - - :param episode_transitions: ([tuple]) list of the transitions in the current episode - :param transition_idx: (int) the transition to start sampling from - :return: (np.ndarray) an achieved goal - """ - return [ - self._sample_achieved_goal(episode_transitions, transition_idx) - for _ in range(self.n_sampled_goal) - ] - - def _store_episode(self): - """ - Sample artificial goals and store transition of the current - episode in the replay buffer. - This method is called only after each end of episode. - """ - # For each transition in the last episode, - # create a set of artificial transitions - for transition_idx, transition in enumerate(self.episode_transitions): - - obs_t, action, reward, obs_tp1, done, info = transition - - # Add to the replay buffer - self.replay_buffer.add(obs_t, action, reward, obs_tp1, done) - - # We cannot sample a goal from the future in the last step of an episode - if (transition_idx == len(self.episode_transitions) - 1 and - self.goal_selection_strategy == GoalSelectionStrategy.FUTURE): - break - - # Sampled n goals per transition, where n is `n_sampled_goal` - # this is called k in the paper - sampled_goals = self._sample_achieved_goals(self.episode_transitions, transition_idx) - # For each sampled goals, store a new transition - for goal in sampled_goals: - # Copy transition to avoid modifying the original one - obs, action, reward, next_obs, done, info = copy.deepcopy(transition) - - # Convert concatenated obs to dict, so we can update the goals - obs_dict, next_obs_dict = map(self.env.convert_obs_to_dict, (obs, next_obs)) - - # Update the desired goal in the transition - obs_dict['desired_goal'] = goal - next_obs_dict['desired_goal'] = goal - - # Update the reward according to the new desired goal - reward = self.env.compute_reward(next_obs_dict['achieved_goal'], goal, info) - # Can we use achieved_goal == desired_goal? - done = False - - # Transform back to ndarrays - obs, next_obs = map(self.env.convert_dict_to_obs, (obs_dict, next_obs_dict)) - - # Add artificial transition to the replay buffer - self.replay_buffer.add(obs, action, reward, next_obs, done) diff --git a/stable_baselines/her/utils.py b/stable_baselines/her/utils.py deleted file mode 100644 index ff3d4d23..00000000 --- a/stable_baselines/her/utils.py +++ /dev/null @@ -1,103 +0,0 @@ -from collections import OrderedDict - -import numpy as np -from gym import spaces - -# Important: gym mixes up ordered and unordered keys -# and the Dict space may return a different order of keys that the actual one -KEY_ORDER = ['observation', 'achieved_goal', 'desired_goal'] - - -class HERGoalEnvWrapper(object): - """ - A wrapper that allow to use dict observation space (coming from GoalEnv) with - the RL algorithms. - It assumes that all the spaces of the dict space are of the same type. - - :param env: (gym.GoalEnv) - """ - - def __init__(self, env): - super(HERGoalEnvWrapper, self).__init__() - self.env = env - self.metadata = self.env.metadata - self.action_space = env.action_space - self.spaces = list(env.observation_space.spaces.values()) - # Check that all spaces are of the same type - # (current limitation of the wrapper) - space_types = [type(env.observation_space.spaces[key]) for key in KEY_ORDER] - assert len(set(space_types)) == 1, "The spaces for goal and observation"\ - " must be of the same type" - - if isinstance(self.spaces[0], spaces.Discrete): - self.obs_dim = 1 - self.goal_dim = 1 - else: - goal_space_shape = env.observation_space.spaces['achieved_goal'].shape - self.obs_dim = env.observation_space.spaces['observation'].shape[0] - self.goal_dim = goal_space_shape[0] - - if len(goal_space_shape) == 2: - assert goal_space_shape[1] == 1, "Only 1D observation spaces are supported yet" - else: - assert len(goal_space_shape) == 1, "Only 1D observation spaces are supported yet" - - if isinstance(self.spaces[0], spaces.MultiBinary): - total_dim = self.obs_dim + 2 * self.goal_dim - self.observation_space = spaces.MultiBinary(total_dim) - - elif isinstance(self.spaces[0], spaces.Box): - lows = np.concatenate([space.low for space in self.spaces]) - highs = np.concatenate([space.high for space in self.spaces]) - self.observation_space = spaces.Box(lows, highs, dtype=np.float32) - - elif isinstance(self.spaces[0], spaces.Discrete): - dimensions = [env.observation_space.spaces[key].n for key in KEY_ORDER] - self.observation_space = spaces.MultiDiscrete(dimensions) - - else: - raise NotImplementedError("{} space is not supported".format(type(self.spaces[0]))) - - def convert_dict_to_obs(self, obs_dict): - """ - :param obs_dict: (dict) - :return: (np.ndarray) - """ - # Note: achieved goal is not removed from the observation - # this is helpful to have a revertible transformation - if isinstance(self.observation_space, spaces.MultiDiscrete): - # Special case for multidiscrete - return np.concatenate([[int(obs_dict[key])] for key in KEY_ORDER]) - return np.concatenate([obs_dict[key] for key in KEY_ORDER]) - - def convert_obs_to_dict(self, observations): - """ - Inverse operation of convert_dict_to_obs - - :param observations: (np.ndarray) - :return: (OrderedDict) - """ - return OrderedDict([ - ('observation', observations[:self.obs_dim]), - ('achieved_goal', observations[self.obs_dim:self.obs_dim + self.goal_dim]), - ('desired_goal', observations[self.obs_dim + self.goal_dim:]), - ]) - - def step(self, action): - obs, reward, done, info = self.env.step(action) - return self.convert_dict_to_obs(obs), reward, done, info - - def seed(self, seed=None): - return self.env.seed(seed) - - def reset(self): - return self.convert_dict_to_obs(self.env.reset()) - - def compute_reward(self, achieved_goal, desired_goal, info): - return self.env.compute_reward(achieved_goal, desired_goal, info) - - def render(self, mode='human'): - return self.env.render(mode) - - def close(self): - return self.env.close() diff --git a/stable_baselines/logger.py b/stable_baselines/logger.py deleted file mode 100644 index e094acce..00000000 --- a/stable_baselines/logger.py +++ /dev/null @@ -1,745 +0,0 @@ -import os -import sys -import shutil -import json -import time -import datetime -import tempfile -import warnings -from collections import defaultdict -from typing import Optional - -import tensorflow as tf -from tensorflow.python import pywrap_tensorflow -from tensorflow.core.util import event_pb2 -from tensorflow.python.util import compat - -from stable_baselines.common.misc_util import mpi_rank_or_zero - -DEBUG = 10 -INFO = 20 -WARN = 30 -ERROR = 40 - -DISABLED = 50 - - -class KVWriter(object): - """ - Key Value writer - """ - def writekvs(self, kvs): - """ - write a dictionary to file - - :param kvs: (dict) - """ - raise NotImplementedError - - -class SeqWriter(object): - """ - sequence writer - """ - def writeseq(self, seq): - """ - write an array to file - - :param seq: (list) - """ - raise NotImplementedError - - -class HumanOutputFormat(KVWriter, SeqWriter): - def __init__(self, filename_or_file): - """ - log to a file, in a human readable format - - :param filename_or_file: (str or File) the file to write the log to - """ - if isinstance(filename_or_file, str): - self.file = open(filename_or_file, 'wt') - self.own_file = True - else: - assert hasattr(filename_or_file, 'write'), 'Expected file or str, got {}'.format(filename_or_file) - self.file = filename_or_file - self.own_file = False - - def writekvs(self, kvs): - # Create strings for printing - key2str = {} - for (key, val) in sorted(kvs.items()): - if isinstance(val, float): - valstr = '%-8.3g' % (val,) - else: - valstr = str(val) - key2str[self._truncate(key)] = self._truncate(valstr) - - # Find max widths - if len(key2str) == 0: - warnings.warn('Tried to write empty key-value dict') - return - else: - keywidth = max(map(len, key2str.keys())) - valwidth = max(map(len, key2str.values())) - - # Write out the data - dashes = '-' * (keywidth + valwidth + 7) - lines = [dashes] - for (key, val) in sorted(key2str.items()): - lines.append('| %s%s | %s%s |' % ( - key, - ' ' * (keywidth - len(key)), - val, - ' ' * (valwidth - len(val)), - )) - lines.append(dashes) - self.file.write('\n'.join(lines) + '\n') - - # Flush the output to the file - self.file.flush() - - @classmethod - def _truncate(cls, string): - return string[:20] + '...' if len(string) > 23 else string - - def writeseq(self, seq): - seq = list(seq) - for (i, elem) in enumerate(seq): - self.file.write(elem) - if i < len(seq) - 1: # add space unless this is the last one - self.file.write(' ') - self.file.write('\n') - self.file.flush() - - def close(self): - """ - closes the file - """ - if self.own_file: - self.file.close() - - -class JSONOutputFormat(KVWriter): - def __init__(self, filename): - """ - log to a file, in the JSON format - - :param filename: (str) the file to write the log to - """ - self.file = open(filename, 'wt') - - def writekvs(self, kvs): - for key, value in sorted(kvs.items()): - if hasattr(value, 'dtype'): - if value.shape == () or len(value) == 1: # pytype: disable=attribute-error - # if value is a dimensionless numpy array or of length 1, serialize as a float - kvs[key] = float(value) - else: - # otherwise, a value is a numpy array, serialize as a list or nested lists - kvs[key] = value.tolist() # pytype: disable=attribute-error - self.file.write(json.dumps(kvs) + '\n') - self.file.flush() - - def close(self): - """ - closes the file - """ - self.file.close() - - -class CSVOutputFormat(KVWriter): - def __init__(self, filename): - """ - log to a file, in a CSV format - - :param filename: (str) the file to write the log to - """ - self.file = open(filename, 'w+t') - self.keys = [] - self.sep = ',' - - def writekvs(self, kvs): - # Add our current row to the history - extra_keys = kvs.keys() - self.keys - if extra_keys: - self.keys.extend(extra_keys) - self.file.seek(0) - lines = self.file.readlines() - self.file.seek(0) - for (i, key) in enumerate(self.keys): - if i > 0: - self.file.write(',') - self.file.write(key) - self.file.write('\n') - for line in lines[1:]: - self.file.write(line[:-1]) - self.file.write(self.sep * len(extra_keys)) - self.file.write('\n') - for i, key in enumerate(self.keys): - if i > 0: - self.file.write(',') - value = kvs.get(key) - if value is not None: - self.file.write(str(value)) - self.file.write('\n') - self.file.flush() - - def close(self): - """ - closes the file - """ - self.file.close() - - -def summary_val(key, value): - """ - :param key: (str) - :param value: (float) - """ - kwargs = {'tag': key, 'simple_value': float(value)} - return tf.Summary.Value(**kwargs) - - -def valid_float_value(value): - """ - Returns True if the value can be successfully cast into a float - - :param value: (Any) the value to check - :return: (bool) - """ - try: - float(value) - return True - except TypeError: - return False - - -class TensorBoardOutputFormat(KVWriter): - def __init__(self, folder): - """ - Dumps key/value pairs into TensorBoard's numeric format. - - :param folder: (str) the folder to write the log to - """ - os.makedirs(folder, exist_ok=True) - self.dir = folder - self.step = 1 - prefix = 'events' - path = os.path.join(os.path.abspath(folder), prefix) - self.writer = pywrap_tensorflow.EventsWriter(compat.as_bytes(path)) # type: pywrap_tensorflow.EventsWriter - - def writekvs(self, kvs): - summary = tf.Summary(value=[summary_val(k, v) for k, v in kvs.items() if valid_float_value(v)]) - event = event_pb2.Event(wall_time=time.time(), summary=summary) - event.step = self.step # is there any reason why you'd want to specify the step? - if self.writer is None: - raise ValueError("Attempt to write after close().") - self.writer.WriteEvent(event) - self.writer.Flush() - self.step += 1 - - def close(self): - """ - closes the file - """ - if self.writer: - self.writer.Close() - self.writer = None - - -def make_output_format(_format, ev_dir, log_suffix=''): - """ - return a logger for the requested format - - :param _format: (str) the requested format to log to ('stdout', 'log', 'json', 'csv' or 'tensorboard') - :param ev_dir: (str) the logging directory - :param log_suffix: (str) the suffix for the log file - :return: (KVWrite) the logger - """ - os.makedirs(ev_dir, exist_ok=True) - if _format == 'stdout': - return HumanOutputFormat(sys.stdout) - elif _format == 'log': - return HumanOutputFormat(os.path.join(ev_dir, 'log%s.txt' % log_suffix)) - elif _format == 'json': - return JSONOutputFormat(os.path.join(ev_dir, 'progress%s.json' % log_suffix)) - elif _format == 'csv': - return CSVOutputFormat(os.path.join(ev_dir, 'progress%s.csv' % log_suffix)) - elif _format == 'tensorboard': - return TensorBoardOutputFormat(os.path.join(ev_dir, 'tb%s' % log_suffix)) - else: - raise ValueError('Unknown format specified: %s' % (_format,)) - - -# ================================================================ -# API -# ================================================================ - -def logkv(key, val): - """ - Log a value of some diagnostic - Call this once for each diagnostic quantity, each iteration - If called many times, last value will be used. - - :param key: (Any) save to log this key - :param val: (Any) save to log this value - """ - Logger.CURRENT.logkv(key, val) - - -def logkv_mean(key, val): - """ - The same as logkv(), but if called many times, values averaged. - - :param key: (Any) save to log this key - :param val: (Number) save to log this value - """ - Logger.CURRENT.logkv_mean(key, val) - - -def logkvs(key_values): - """ - Log a dictionary of key-value pairs - - :param key_values: (dict) the list of keys and values to save to log - """ - for key, value in key_values.items(): - logkv(key, value) - - -def dumpkvs(): - """ - Write all of the diagnostics from the current iteration - """ - Logger.CURRENT.dumpkvs() - - -def getkvs(): - """ - get the key values logs - - :return: (dict) the logged values - """ - return Logger.CURRENT.name2val - - -def log(*args, level=INFO): - """ - Write the sequence of args, with no separators, - to the console and output files (if you've configured an output file). - - level: int. (see logger.py docs) If the global logger level is higher than - the level argument here, don't print to stdout. - - :param args: (list) log the arguments - :param level: (int) the logging level (can be DEBUG=10, INFO=20, WARN=30, ERROR=40, DISABLED=50) - """ - Logger.CURRENT.log(*args, level=level) - - -def debug(*args): - """ - Write the sequence of args, with no separators, - to the console and output files (if you've configured an output file). - Using the DEBUG level. - - :param args: (list) log the arguments - """ - log(*args, level=DEBUG) - - -def info(*args): - """ - Write the sequence of args, with no separators, - to the console and output files (if you've configured an output file). - Using the INFO level. - - :param args: (list) log the arguments - """ - log(*args, level=INFO) - - -def warn(*args): - """ - Write the sequence of args, with no separators, - to the console and output files (if you've configured an output file). - Using the WARN level. - - :param args: (list) log the arguments - """ - log(*args, level=WARN) - - -def error(*args): - """ - Write the sequence of args, with no separators, - to the console and output files (if you've configured an output file). - Using the ERROR level. - - :param args: (list) log the arguments - """ - log(*args, level=ERROR) - - -def set_level(level): - """ - Set logging threshold on current logger. - - :param level: (int) the logging level (can be DEBUG=10, INFO=20, WARN=30, ERROR=40, DISABLED=50) - """ - Logger.CURRENT.set_level(level) - - -def get_level(): - """ - Get logging threshold on current logger. - :return: (int) the logging level (can be DEBUG=10, INFO=20, WARN=30, ERROR=40, DISABLED=50) - """ - return Logger.CURRENT.level - - -def get_dir(): - """ - Get directory that log files are being written to. - will be None if there is no output directory (i.e., if you didn't call start) - - :return: (str) the logging directory - """ - return Logger.CURRENT.get_dir() - - -record_tabular = logkv -dump_tabular = dumpkvs - - -class ProfileKV: - def __init__(self, name): - """ - Usage: - with logger.ProfileKV("interesting_scope"): - code - - :param name: (str) the profiling name - """ - self.name = "wait_" + name - - def __enter__(self): - self.start_time = time.time() - - def __exit__(self, _type, value, traceback): - Logger.CURRENT.name2val[self.name] += time.time() - self.start_time - - -def profile(name): - """ - Usage: - @profile("my_func") - def my_func(): code - - :param name: (str) the profiling name - :return: (function) the wrapped function - """ - def decorator_with_name(func): - def func_wrapper(*args, **kwargs): - with ProfileKV(name): - return func(*args, **kwargs) - - return func_wrapper - - return decorator_with_name - - -# ================================================================ -# Backend -# ================================================================ - -class Logger(object): - # A logger with no output files. (See right below class definition) - # So that you can still log to the terminal without setting up any output files - DEFAULT = None # type: Optional["Logger"] - # Current logger being used by the free functions above - CURRENT = None # type: Optional["Logger"] - - def __init__(self, folder, output_formats): - """ - the logger class - - :param folder: (str) the logging location - :param output_formats: ([str]) the list of output format - """ - self.name2val = defaultdict(float) # values this iteration - self.name2cnt = defaultdict(int) - self.level = INFO - self.dir = folder - self.output_formats = output_formats - - # Logging API, forwarded - # ---------------------------------------- - def logkv(self, key, val): - """ - Log a value of some diagnostic - Call this once for each diagnostic quantity, each iteration - If called many times, last value will be used. - - :param key: (Any) save to log this key - :param val: (Any) save to log this value - """ - self.name2val[key] = val - - def logkv_mean(self, key, val): - """ - The same as logkv(), but if called many times, values averaged. - - :param key: (Any) save to log this key - :param val: (Number) save to log this value - """ - if val is None: - self.name2val[key] = None - return - oldval, cnt = self.name2val[key], self.name2cnt[key] - self.name2val[key] = oldval * cnt / (cnt + 1) + val / (cnt + 1) - self.name2cnt[key] = cnt + 1 - - def dumpkvs(self): - """ - Write all of the diagnostics from the current iteration - """ - if self.level == DISABLED: - return - for fmt in self.output_formats: - if isinstance(fmt, KVWriter): - fmt.writekvs(self.name2val) - self.name2val.clear() - self.name2cnt.clear() - - def log(self, *args, level=INFO): - """ - Write the sequence of args, with no separators, - to the console and output files (if you've configured an output file). - - level: int. (see logger.py docs) If the global logger level is higher than - the level argument here, don't print to stdout. - - :param args: (list) log the arguments - :param level: (int) the logging level (can be DEBUG=10, INFO=20, WARN=30, ERROR=40, DISABLED=50) - """ - if self.level <= level: - self._do_log(args) - - # Configuration - # ---------------------------------------- - def set_level(self, level): - """ - Set logging threshold on current logger. - - :param level: (int) the logging level (can be DEBUG=10, INFO=20, WARN=30, ERROR=40, DISABLED=50) - """ - self.level = level - - def get_dir(self): - """ - Get directory that log files are being written to. - will be None if there is no output directory (i.e., if you didn't call start) - - :return: (str) the logging directory - """ - return self.dir - - def close(self): - """ - closes the file - """ - for fmt in self.output_formats: - fmt.close() - - # Misc - # ---------------------------------------- - def _do_log(self, args): - """ - log to the requested format outputs - - :param args: (list) the arguments to log - """ - for fmt in self.output_formats: - if isinstance(fmt, SeqWriter): - fmt.writeseq(map(str, args)) - - -Logger.DEFAULT = Logger.CURRENT = Logger(folder=None, output_formats=[HumanOutputFormat(sys.stdout)]) - - -def configure(folder=None, format_strs=None): - """ - configure the current logger - - :param folder: (str) the save location (if None, $OPENAI_LOGDIR, if still None, tempdir/openai-[date & time]) - :param format_strs: (list) the output logging format - (if None, $OPENAI_LOG_FORMAT, if still None, ['stdout', 'log', 'csv']) - """ - if folder is None: - folder = os.getenv('OPENAI_LOGDIR') - if folder is None: - folder = os.path.join(tempfile.gettempdir(), datetime.datetime.now().strftime("openai-%Y-%m-%d-%H-%M-%S-%f")) - assert isinstance(folder, str) - os.makedirs(folder, exist_ok=True) - rank = mpi_rank_or_zero() - - log_suffix = '' - if format_strs is None: - if rank == 0: - format_strs = os.getenv('OPENAI_LOG_FORMAT', 'stdout,log,csv').split(',') - else: - log_suffix = "-rank%03i" % rank - format_strs = os.getenv('OPENAI_LOG_FORMAT_MPI', 'log').split(',') - format_strs = filter(None, format_strs) - output_formats = [make_output_format(f, folder, log_suffix) for f in format_strs] - - Logger.CURRENT = Logger(folder=folder, output_formats=output_formats) - log('Logging to %s' % folder) - - -def reset(): - """ - reset the current logger - """ - if Logger.CURRENT is not Logger.DEFAULT: - Logger.CURRENT.close() - Logger.CURRENT = Logger.DEFAULT - log('Reset logger') - - -class ScopedConfigure(object): - def __init__(self, folder=None, format_strs=None): - """ - Class for using context manager while logging - - usage: - with ScopedConfigure(folder=None, format_strs=None): - {code} - - :param folder: (str) the logging folder - :param format_strs: ([str]) the list of output logging format - """ - self.dir = folder - self.format_strs = format_strs - self.prevlogger = None - - def __enter__(self): - self.prevlogger = Logger.CURRENT - configure(folder=self.dir, format_strs=self.format_strs) - - def __exit__(self, *args): - Logger.CURRENT.close() - Logger.CURRENT = self.prevlogger - - -# ================================================================ - -def _demo(): - """ - tests for the logger module - """ - info("hi") - debug("shouldn't appear") - set_level(DEBUG) - debug("should appear") - folder = "/tmp/testlogging" - if os.path.exists(folder): - shutil.rmtree(folder) - configure(folder=folder) - logkv("a", 3) - logkv("b", 2.5) - dumpkvs() - logkv("b", -2.5) - logkv("a", 5.5) - dumpkvs() - info("^^^ should see a = 5.5") - logkv_mean("b", -22.5) - logkv_mean("b", -44.4) - logkv("a", 5.5) - dumpkvs() - with ScopedConfigure(None, None): - info("^^^ should see b = 33.3") - - with ScopedConfigure("/tmp/test-logger/", ["json"]): - logkv("b", -2.5) - dumpkvs() - - reset() - logkv("a", "longasslongasslongasslongasslongasslongassvalue") - dumpkvs() - warn("hey") - error("oh") - logkvs({"test": 1}) - - -# ================================================================ -# Readers -# ================================================================ - -def read_json(fname): - """ - read a json file using pandas - - :param fname: (str) the file path to read - :return: (pandas DataFrame) the data in the json - """ - import pandas - data = [] - with open(fname, 'rt') as file_handler: - for line in file_handler: - data.append(json.loads(line)) - return pandas.DataFrame(data) - - -def read_csv(fname): - """ - read a csv file using pandas - - :param fname: (str) the file path to read - :return: (pandas DataFrame) the data in the csv - """ - import pandas - return pandas.read_csv(fname, index_col=None, comment='#') - - -def read_tb(path): - """ - read a tensorboard output - - :param path: (str) a tensorboard file OR a directory, where we will find all TB files of the form events. - :return: (pandas DataFrame) the tensorboad data - """ - import pandas - import numpy as np - from glob import glob - # from collections import defaultdict - import tensorflow as tf - if os.path.isdir(path): - fnames = glob(os.path.join(path, "events.*")) - elif os.path.basename(path).startswith("events."): - fnames = [path] - else: - raise NotImplementedError("Expected tensorboard file or directory containing them. Got %s" % path) - tag2pairs = defaultdict(list) - maxstep = 0 - for fname in fnames: - for summary in tf.train.summary_iterator(fname): - if summary.step > 0: - for value in summary.summary.value: - pair = (summary.step, value.simple_value) - tag2pairs[value.tag].append(pair) - maxstep = max(summary.step, maxstep) - data = np.empty((maxstep, len(tag2pairs))) - data[:] = np.nan - tags = sorted(tag2pairs.keys()) - for (colidx, tag) in enumerate(tags): - pairs = tag2pairs[tag] - for (step, value) in pairs: - data[step - 1, colidx] = value - return pandas.DataFrame(data, columns=tags) - - -if __name__ == "__main__": - _demo() diff --git a/stable_baselines/ppo1/__init__.py b/stable_baselines/ppo1/__init__.py deleted file mode 100644 index e04efd2a..00000000 --- a/stable_baselines/ppo1/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from stable_baselines.ppo1.pposgd_simple import PPO1 diff --git a/stable_baselines/ppo1/experiments/train_cartpole.py b/stable_baselines/ppo1/experiments/train_cartpole.py deleted file mode 100644 index e3d2fa30..00000000 --- a/stable_baselines/ppo1/experiments/train_cartpole.py +++ /dev/null @@ -1,9 +0,0 @@ -""" -Simple test to check that PPO1 is running with no errors (see issue #50) -""" -from stable_baselines import PPO1 - - -if __name__ == '__main__': - model = PPO1('MlpPolicy', 'CartPole-v1', schedule='linear', verbose=0) - model.learn(total_timesteps=1000) diff --git a/stable_baselines/ppo1/pposgd_simple.py b/stable_baselines/ppo1/pposgd_simple.py deleted file mode 100644 index b570df26..00000000 --- a/stable_baselines/ppo1/pposgd_simple.py +++ /dev/null @@ -1,370 +0,0 @@ -import time -from collections import deque - -import gym -import numpy as np -import tensorflow as tf -from mpi4py import MPI - -from stable_baselines.common import Dataset, explained_variance, fmt_row, zipsame, ActorCriticRLModel, SetVerbosity, \ - TensorboardWriter -from stable_baselines import logger -import stable_baselines.common.tf_util as tf_util -from stable_baselines.common.tf_util import total_episode_reward_logger -from stable_baselines.common.policies import ActorCriticPolicy -from stable_baselines.common.mpi_adam import MpiAdam -from stable_baselines.common.mpi_moments import mpi_moments -from stable_baselines.common.misc_util import flatten_lists -from stable_baselines.common.runners import traj_segment_generator -from stable_baselines.trpo_mpi.utils import add_vtarg_and_adv - - -class PPO1(ActorCriticRLModel): - """ - Proximal Policy Optimization algorithm (MPI version). - Paper: https://arxiv.org/abs/1707.06347 - - :param env: (Gym environment or str) The environment to learn from (if registered in Gym, can be str) - :param policy: (ActorCriticPolicy or str) The policy model to use (MlpPolicy, CnnPolicy, CnnLstmPolicy, ...) - :param timesteps_per_actorbatch: (int) timesteps per actor per update - :param clip_param: (float) clipping parameter epsilon - :param entcoeff: (float) the entropy loss weight - :param optim_epochs: (float) the optimizer's number of epochs - :param optim_stepsize: (float) the optimizer's stepsize - :param optim_batchsize: (int) the optimizer's the batch size - :param gamma: (float) discount factor - :param lam: (float) advantage estimation - :param adam_epsilon: (float) the epsilon value for the adam optimizer - :param schedule: (str) The type of scheduler for the learning rate update ('linear', 'constant', - 'double_linear_con', 'middle_drop' or 'double_middle_drop') - :param verbose: (int) the verbosity level: 0 none, 1 training information, 2 tensorflow debug - :param tensorboard_log: (str) the log location for tensorboard (if None, no logging) - :param _init_setup_model: (bool) Whether or not to build the network at the creation of the instance - :param policy_kwargs: (dict) additional arguments to be passed to the policy on creation - :param full_tensorboard_log: (bool) enable additional logging when using tensorboard - WARNING: this logging can take a lot of space quickly - :param seed: (int) Seed for the pseudo-random generators (python, numpy, tensorflow). - If None (default), use random seed. Note that if you want completely deterministic - results, you must set `n_cpu_tf_sess` to 1. - :param n_cpu_tf_sess: (int) The number of threads for TensorFlow operations - If None, the number of cpu of the current machine will be used. - """ - def __init__(self, policy, env, gamma=0.99, timesteps_per_actorbatch=256, clip_param=0.2, entcoeff=0.01, - optim_epochs=4, optim_stepsize=1e-3, optim_batchsize=64, lam=0.95, adam_epsilon=1e-5, - schedule='linear', verbose=0, tensorboard_log=None, _init_setup_model=True, - policy_kwargs=None, full_tensorboard_log=False, seed=None, n_cpu_tf_sess=1): - - super().__init__(policy=policy, env=env, verbose=verbose, requires_vec_env=False, - _init_setup_model=_init_setup_model, policy_kwargs=policy_kwargs, - seed=seed, n_cpu_tf_sess=n_cpu_tf_sess) - - self.gamma = gamma - self.timesteps_per_actorbatch = timesteps_per_actorbatch - self.clip_param = clip_param - self.entcoeff = entcoeff - self.optim_epochs = optim_epochs - self.optim_stepsize = optim_stepsize - self.optim_batchsize = optim_batchsize - self.lam = lam - self.adam_epsilon = adam_epsilon - self.schedule = schedule - self.tensorboard_log = tensorboard_log - self.full_tensorboard_log = full_tensorboard_log - - self.graph = None - self.sess = None - self.policy_pi = None - self.loss_names = None - self.lossandgrad = None - self.adam = None - self.assign_old_eq_new = None - self.compute_losses = None - self.params = None - self.step = None - self.proba_step = None - self.initial_state = None - self.summary = None - - if _init_setup_model: - self.setup_model() - - def _get_pretrain_placeholders(self): - policy = self.policy_pi - action_ph = policy.pdtype.sample_placeholder([None]) - if isinstance(self.action_space, gym.spaces.Discrete): - return policy.obs_ph, action_ph, policy.policy - return policy.obs_ph, action_ph, policy.deterministic_action - - def setup_model(self): - with SetVerbosity(self.verbose): - - self.graph = tf.Graph() - with self.graph.as_default(): - self.set_random_seed(self.seed) - self.sess = tf_util.make_session(num_cpu=self.n_cpu_tf_sess, graph=self.graph) - - # Construct network for new policy - self.policy_pi = self.policy(self.sess, self.observation_space, self.action_space, self.n_envs, 1, - None, reuse=False, **self.policy_kwargs) - - # Network for old policy - with tf.variable_scope("oldpi", reuse=False): - old_pi = self.policy(self.sess, self.observation_space, self.action_space, self.n_envs, 1, - None, reuse=False, **self.policy_kwargs) - - with tf.variable_scope("loss", reuse=False): - # Target advantage function (if applicable) - atarg = tf.placeholder(dtype=tf.float32, shape=[None]) - - # Empirical return - ret = tf.placeholder(dtype=tf.float32, shape=[None]) - - # learning rate multiplier, updated with schedule - lrmult = tf.placeholder(name='lrmult', dtype=tf.float32, shape=[]) - - # Annealed cliping parameter epislon - clip_param = self.clip_param * lrmult - - obs_ph = self.policy_pi.obs_ph - action_ph = self.policy_pi.pdtype.sample_placeholder([None]) - - kloldnew = old_pi.proba_distribution.kl(self.policy_pi.proba_distribution) - ent = self.policy_pi.proba_distribution.entropy() - meankl = tf.reduce_mean(kloldnew) - meanent = tf.reduce_mean(ent) - pol_entpen = (-self.entcoeff) * meanent - - # pnew / pold - ratio = tf.exp(self.policy_pi.proba_distribution.logp(action_ph) - - old_pi.proba_distribution.logp(action_ph)) - - # surrogate from conservative policy iteration - surr1 = ratio * atarg - surr2 = tf.clip_by_value(ratio, 1.0 - clip_param, 1.0 + clip_param) * atarg - - # PPO's pessimistic surrogate (L^CLIP) - pol_surr = - tf.reduce_mean(tf.minimum(surr1, surr2)) - vf_loss = tf.reduce_mean(tf.square(self.policy_pi.value_flat - ret)) - total_loss = pol_surr + pol_entpen + vf_loss - losses = [pol_surr, pol_entpen, vf_loss, meankl, meanent] - self.loss_names = ["pol_surr", "pol_entpen", "vf_loss", "kl", "ent"] - - tf.summary.scalar('entropy_loss', pol_entpen) - tf.summary.scalar('policy_gradient_loss', pol_surr) - tf.summary.scalar('value_function_loss', vf_loss) - tf.summary.scalar('approximate_kullback-leibler', meankl) - tf.summary.scalar('clip_factor', clip_param) - tf.summary.scalar('loss', total_loss) - - self.params = tf_util.get_trainable_vars("model") - - self.assign_old_eq_new = tf_util.function( - [], [], updates=[tf.assign(oldv, newv) for (oldv, newv) in - zipsame(tf_util.get_globals_vars("oldpi"), tf_util.get_globals_vars("model"))]) - - with tf.variable_scope("Adam_mpi", reuse=False): - self.adam = MpiAdam(self.params, epsilon=self.adam_epsilon, sess=self.sess) - - with tf.variable_scope("input_info", reuse=False): - tf.summary.scalar('discounted_rewards', tf.reduce_mean(ret)) - tf.summary.scalar('learning_rate', tf.reduce_mean(self.optim_stepsize)) - tf.summary.scalar('advantage', tf.reduce_mean(atarg)) - tf.summary.scalar('clip_range', tf.reduce_mean(self.clip_param)) - - if self.full_tensorboard_log: - tf.summary.histogram('discounted_rewards', ret) - tf.summary.histogram('learning_rate', self.optim_stepsize) - tf.summary.histogram('advantage', atarg) - tf.summary.histogram('clip_range', self.clip_param) - if tf_util.is_image(self.observation_space): - tf.summary.image('observation', obs_ph) - else: - tf.summary.histogram('observation', obs_ph) - - self.step = self.policy_pi.step - self.proba_step = self.policy_pi.proba_step - self.initial_state = self.policy_pi.initial_state - - tf_util.initialize(sess=self.sess) - - self.summary = tf.summary.merge_all() - - self.lossandgrad = tf_util.function([obs_ph, old_pi.obs_ph, action_ph, atarg, ret, lrmult], - [self.summary, tf_util.flatgrad(total_loss, self.params)] + losses) - self.compute_losses = tf_util.function([obs_ph, old_pi.obs_ph, action_ph, atarg, ret, lrmult], - losses) - - def learn(self, total_timesteps, callback=None, log_interval=100, tb_log_name="PPO1", - reset_num_timesteps=True): - - new_tb_log = self._init_num_timesteps(reset_num_timesteps) - callback = self._init_callback(callback) - - with SetVerbosity(self.verbose), TensorboardWriter(self.graph, self.tensorboard_log, tb_log_name, new_tb_log) \ - as writer: - self._setup_learn() - - assert issubclass(self.policy, ActorCriticPolicy), "Error: the input policy for the PPO1 model must be " \ - "an instance of common.policies.ActorCriticPolicy." - - with self.sess.as_default(): - self.adam.sync() - callback.on_training_start(locals(), globals()) - - # Prepare for rollouts - seg_gen = traj_segment_generator(self.policy_pi, self.env, self.timesteps_per_actorbatch, - callback=callback) - - episodes_so_far = 0 - timesteps_so_far = 0 - iters_so_far = 0 - t_start = time.time() - - # rolling buffer for episode lengths - len_buffer = deque(maxlen=100) - # rolling buffer for episode rewards - reward_buffer = deque(maxlen=100) - - while True: - if timesteps_so_far >= total_timesteps: - break - - if self.schedule == 'constant': - cur_lrmult = 1.0 - elif self.schedule == 'linear': - cur_lrmult = max(1.0 - float(timesteps_so_far) / total_timesteps, 0) - else: - raise NotImplementedError - - logger.log("********** Iteration %i ************" % iters_so_far) - - seg = seg_gen.__next__() - - # Stop training early (triggered by the callback) - if not seg.get('continue_training', True): # pytype: disable=attribute-error - break - - add_vtarg_and_adv(seg, self.gamma, self.lam) - - # ob, ac, atarg, ret, td1ret = map(np.concatenate, (obs, acs, atargs, rets, td1rets)) - observations, actions = seg["observations"], seg["actions"] - atarg, tdlamret = seg["adv"], seg["tdlamret"] - - # true_rew is the reward without discount - if writer is not None: - total_episode_reward_logger(self.episode_reward, - seg["true_rewards"].reshape((self.n_envs, -1)), - seg["dones"].reshape((self.n_envs, -1)), - writer, self.num_timesteps) - - # predicted value function before udpate - vpredbefore = seg["vpred"] - - # standardized advantage function estimate - atarg = (atarg - atarg.mean()) / atarg.std() - dataset = Dataset(dict(ob=observations, ac=actions, atarg=atarg, vtarg=tdlamret), - shuffle=not self.policy.recurrent) - optim_batchsize = self.optim_batchsize or observations.shape[0] - - # set old parameter values to new parameter values - self.assign_old_eq_new(sess=self.sess) - logger.log("Optimizing...") - logger.log(fmt_row(13, self.loss_names)) - - # Here we do a bunch of optimization epochs over the data - for k in range(self.optim_epochs): - # list of tuples, each of which gives the loss for a minibatch - losses = [] - for i, batch in enumerate(dataset.iterate_once(optim_batchsize)): - steps = (self.num_timesteps + - k * optim_batchsize + - int(i * (optim_batchsize / len(dataset.data_map)))) - if writer is not None: - # run loss backprop with summary, but once every 10 runs save the metadata - # (memory, compute time, ...) - if self.full_tensorboard_log and (1 + k) % 10 == 0: - run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE) - run_metadata = tf.RunMetadata() - summary, grad, *newlosses = self.lossandgrad(batch["ob"], batch["ob"], batch["ac"], - batch["atarg"], batch["vtarg"], - cur_lrmult, sess=self.sess, - options=run_options, - run_metadata=run_metadata) - writer.add_run_metadata(run_metadata, 'step%d' % steps) - else: - summary, grad, *newlosses = self.lossandgrad(batch["ob"], batch["ob"], batch["ac"], - batch["atarg"], batch["vtarg"], - cur_lrmult, sess=self.sess) - writer.add_summary(summary, steps) - else: - _, grad, *newlosses = self.lossandgrad(batch["ob"], batch["ob"], batch["ac"], - batch["atarg"], batch["vtarg"], cur_lrmult, - sess=self.sess) - - self.adam.update(grad, self.optim_stepsize * cur_lrmult) - losses.append(newlosses) - logger.log(fmt_row(13, np.mean(losses, axis=0))) - - logger.log("Evaluating losses...") - losses = [] - for batch in dataset.iterate_once(optim_batchsize): - newlosses = self.compute_losses(batch["ob"], batch["ob"], batch["ac"], batch["atarg"], - batch["vtarg"], cur_lrmult, sess=self.sess) - losses.append(newlosses) - mean_losses, _, _ = mpi_moments(losses, axis=0) - logger.log(fmt_row(13, mean_losses)) - for (loss_val, name) in zipsame(mean_losses, self.loss_names): - logger.record_tabular("loss_" + name, loss_val) - logger.record_tabular("ev_tdlam_before", explained_variance(vpredbefore, tdlamret)) - - # local values - lrlocal = (seg["ep_lens"], seg["ep_rets"]) - - # list of tuples - listoflrpairs = MPI.COMM_WORLD.allgather(lrlocal) - lens, rews = map(flatten_lists, zip(*listoflrpairs)) - len_buffer.extend(lens) - reward_buffer.extend(rews) - if len(len_buffer) > 0: - logger.record_tabular("EpLenMean", np.mean(len_buffer)) - logger.record_tabular("EpRewMean", np.mean(reward_buffer)) - logger.record_tabular("EpThisIter", len(lens)) - episodes_so_far += len(lens) - current_it_timesteps = MPI.COMM_WORLD.allreduce(seg["total_timestep"]) - timesteps_so_far += current_it_timesteps - self.num_timesteps += current_it_timesteps - iters_so_far += 1 - logger.record_tabular("EpisodesSoFar", episodes_so_far) - logger.record_tabular("TimestepsSoFar", self.num_timesteps) - logger.record_tabular("TimeElapsed", time.time() - t_start) - if self.verbose >= 1 and MPI.COMM_WORLD.Get_rank() == 0: - logger.dump_tabular() - callback.on_training_end() - return self - - def save(self, save_path, cloudpickle=False): - data = { - "gamma": self.gamma, - "timesteps_per_actorbatch": self.timesteps_per_actorbatch, - "clip_param": self.clip_param, - "entcoeff": self.entcoeff, - "optim_epochs": self.optim_epochs, - "optim_stepsize": self.optim_stepsize, - "optim_batchsize": self.optim_batchsize, - "lam": self.lam, - "adam_epsilon": self.adam_epsilon, - "schedule": self.schedule, - "verbose": self.verbose, - "policy": self.policy, - "observation_space": self.observation_space, - "action_space": self.action_space, - "n_envs": self.n_envs, - "n_cpu_tf_sess": self.n_cpu_tf_sess, - "seed": self.seed, - "_vectorize_action": self._vectorize_action, - "policy_kwargs": self.policy_kwargs - } - - params_to_save = self.get_parameters() - - self._save_to_file(save_path, data=data, params=params_to_save, cloudpickle=cloudpickle) diff --git a/stable_baselines/ppo1/run_atari.py b/stable_baselines/ppo1/run_atari.py deleted file mode 100644 index 692f9678..00000000 --- a/stable_baselines/ppo1/run_atari.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python3 -import os - -from mpi4py import MPI - -from stable_baselines.common import set_global_seeds -from stable_baselines import bench, logger, PPO1 -from stable_baselines.common.atari_wrappers import make_atari, wrap_deepmind -from stable_baselines.common.cmd_util import atari_arg_parser -from stable_baselines.common.policies import CnnPolicy - - -def train(env_id, num_timesteps, seed): - """ - Train PPO1 model for Atari environments, for testing purposes - - :param env_id: (str) Environment ID - :param num_timesteps: (int) The total number of samples - :param seed: (int) The initial seed for training - """ - rank = MPI.COMM_WORLD.Get_rank() - - if rank == 0: - logger.configure() - else: - logger.configure(format_strs=[]) - workerseed = seed + 10000 * MPI.COMM_WORLD.Get_rank() - set_global_seeds(workerseed) - env = make_atari(env_id) - - env = bench.Monitor(env, logger.get_dir() and - os.path.join(logger.get_dir(), str(rank))) - env.seed(workerseed) - - env = wrap_deepmind(env) - env.seed(workerseed) - - model = PPO1(CnnPolicy, env, timesteps_per_actorbatch=256, clip_param=0.2, entcoeff=0.01, optim_epochs=4, - optim_stepsize=1e-3, optim_batchsize=64, gamma=0.99, lam=0.95, schedule='linear', verbose=2) - model.learn(total_timesteps=num_timesteps) - env.close() - del env - - -def main(): - """ - Runs the test - """ - args = atari_arg_parser().parse_args() - train(args.env, num_timesteps=args.num_timesteps, seed=args.seed) - - -if __name__ == '__main__': - main() diff --git a/stable_baselines/ppo1/run_mujoco.py b/stable_baselines/ppo1/run_mujoco.py deleted file mode 100644 index 77bfd065..00000000 --- a/stable_baselines/ppo1/run_mujoco.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python3 - -from stable_baselines.ppo1 import PPO1 -from stable_baselines.common.policies import MlpPolicy -from stable_baselines.common.cmd_util import make_mujoco_env, mujoco_arg_parser -from stable_baselines import logger - - -def train(env_id, num_timesteps, seed): - """ - Train PPO1 model for the Mujoco environment, for testing purposes - - :param env_id: (str) Environment ID - :param num_timesteps: (int) The total number of samples - :param seed: (int) The initial seed for training - """ - env = make_mujoco_env(env_id, seed) - model = PPO1(MlpPolicy, env, timesteps_per_actorbatch=2048, clip_param=0.2, entcoeff=0.0, optim_epochs=10, - optim_stepsize=3e-4, optim_batchsize=64, gamma=0.99, lam=0.95, schedule='linear') - model.learn(total_timesteps=num_timesteps) - env.close() - - -def main(): - """ - Runs the test - """ - args = mujoco_arg_parser().parse_args() - logger.configure() - train(args.env, num_timesteps=args.num_timesteps, seed=args.seed) - - -if __name__ == '__main__': - main() diff --git a/stable_baselines/ppo1/run_robotics.py b/stable_baselines/ppo1/run_robotics.py deleted file mode 100644 index aeab9aaa..00000000 --- a/stable_baselines/ppo1/run_robotics.py +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env python3 - -from mpi4py import MPI -import mujoco_py # pytype:disable=import-error - -from stable_baselines.common import set_global_seeds -from stable_baselines.common.policies import MlpPolicy -from stable_baselines.common.cmd_util import make_robotics_env, robotics_arg_parser -from stable_baselines.ppo1 import PPO1 - - -def train(env_id, num_timesteps, seed): - """ - Train PPO1 model for Robotics environment, for testing purposes - - :param env_id: (str) Environment ID - :param num_timesteps: (int) The total number of samples - :param seed: (int) The initial seed for training - """ - - rank = MPI.COMM_WORLD.Get_rank() - with mujoco_py.ignore_mujoco_warnings(): - workerseed = seed + 10000 * rank - set_global_seeds(workerseed) - env = make_robotics_env(env_id, workerseed, rank=rank) - - model = PPO1(MlpPolicy, env, timesteps_per_actorbatch=2048, clip_param=0.2, entcoeff=0.0, optim_epochs=5, - optim_stepsize=3e-4, optim_batchsize=256, gamma=0.99, lam=0.95, schedule='linear') - model.learn(total_timesteps=num_timesteps) - env.close() - - -def main(): - """ - Runs the test - """ - args = robotics_arg_parser().parse_args() - train(args.env, num_timesteps=args.num_timesteps, seed=args.seed) - - -if __name__ == '__main__': - main() diff --git a/stable_baselines/ppo2/__init__.py b/stable_baselines/ppo2/__init__.py deleted file mode 100644 index 6eb9f827..00000000 --- a/stable_baselines/ppo2/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from stable_baselines.ppo2.ppo2 import PPO2 diff --git a/stable_baselines/ppo2/ppo2.py b/stable_baselines/ppo2/ppo2.py deleted file mode 100644 index 2f533db1..00000000 --- a/stable_baselines/ppo2/ppo2.py +++ /dev/null @@ -1,541 +0,0 @@ -import time - -import gym -import numpy as np -import tensorflow as tf - -from stable_baselines import logger -from stable_baselines.common import explained_variance, ActorCriticRLModel, tf_util, SetVerbosity, TensorboardWriter -from stable_baselines.common.runners import AbstractEnvRunner -from stable_baselines.common.policies import ActorCriticPolicy, RecurrentActorCriticPolicy -from stable_baselines.common.schedules import get_schedule_fn -from stable_baselines.common.tf_util import total_episode_reward_logger -from stable_baselines.common.math_util import safe_mean - - -class PPO2(ActorCriticRLModel): - """ - Proximal Policy Optimization algorithm (GPU version). - Paper: https://arxiv.org/abs/1707.06347 - - :param policy: (ActorCriticPolicy or str) The policy model to use (MlpPolicy, CnnPolicy, CnnLstmPolicy, ...) - :param env: (Gym environment or str) The environment to learn from (if registered in Gym, can be str) - :param gamma: (float) Discount factor - :param n_steps: (int) The number of steps to run for each environment per update - (i.e. batch size is n_steps * n_env where n_env is number of environment copies running in parallel) - :param ent_coef: (float) Entropy coefficient for the loss calculation - :param learning_rate: (float or callable) The learning rate, it can be a function - :param vf_coef: (float) Value function coefficient for the loss calculation - :param max_grad_norm: (float) The maximum value for the gradient clipping - :param lam: (float) Factor for trade-off of bias vs variance for Generalized Advantage Estimator - :param nminibatches: (int) Number of training minibatches per update. For recurrent policies, - the number of environments run in parallel should be a multiple of nminibatches. - :param noptepochs: (int) Number of epoch when optimizing the surrogate - :param cliprange: (float or callable) Clipping parameter, it can be a function - :param cliprange_vf: (float or callable) Clipping parameter for the value function, it can be a function. - This is a parameter specific to the OpenAI implementation. If None is passed (default), - then `cliprange` (that is used for the policy) will be used. - IMPORTANT: this clipping depends on the reward scaling. - To deactivate value function clipping (and recover the original PPO implementation), - you have to pass a negative value (e.g. -1). - :param verbose: (int) the verbosity level: 0 none, 1 training information, 2 tensorflow debug - :param tensorboard_log: (str) the log location for tensorboard (if None, no logging) - :param _init_setup_model: (bool) Whether or not to build the network at the creation of the instance - :param policy_kwargs: (dict) additional arguments to be passed to the policy on creation - :param full_tensorboard_log: (bool) enable additional logging when using tensorboard - WARNING: this logging can take a lot of space quickly - :param seed: (int) Seed for the pseudo-random generators (python, numpy, tensorflow). - If None (default), use random seed. Note that if you want completely deterministic - results, you must set `n_cpu_tf_sess` to 1. - :param n_cpu_tf_sess: (int) The number of threads for TensorFlow operations - If None, the number of cpu of the current machine will be used. - """ - def __init__(self, policy, env, gamma=0.99, n_steps=128, ent_coef=0.01, learning_rate=2.5e-4, vf_coef=0.5, - max_grad_norm=0.5, lam=0.95, nminibatches=4, noptepochs=4, cliprange=0.2, cliprange_vf=None, - verbose=0, tensorboard_log=None, _init_setup_model=True, policy_kwargs=None, - full_tensorboard_log=False, seed=None, n_cpu_tf_sess=None): - - self.learning_rate = learning_rate - self.cliprange = cliprange - self.cliprange_vf = cliprange_vf - self.n_steps = n_steps - self.ent_coef = ent_coef - self.vf_coef = vf_coef - self.max_grad_norm = max_grad_norm - self.gamma = gamma - self.lam = lam - self.nminibatches = nminibatches - self.noptepochs = noptepochs - self.tensorboard_log = tensorboard_log - self.full_tensorboard_log = full_tensorboard_log - - self.action_ph = None - self.advs_ph = None - self.rewards_ph = None - self.old_neglog_pac_ph = None - self.old_vpred_ph = None - self.learning_rate_ph = None - self.clip_range_ph = None - self.entropy = None - self.vf_loss = None - self.pg_loss = None - self.approxkl = None - self.clipfrac = None - self._train = None - self.loss_names = None - self.train_model = None - self.act_model = None - self.value = None - self.n_batch = None - self.summary = None - - super().__init__(policy=policy, env=env, verbose=verbose, requires_vec_env=True, - _init_setup_model=_init_setup_model, policy_kwargs=policy_kwargs, - seed=seed, n_cpu_tf_sess=n_cpu_tf_sess) - - if _init_setup_model: - self.setup_model() - - def _make_runner(self): - return Runner(env=self.env, model=self, n_steps=self.n_steps, - gamma=self.gamma, lam=self.lam) - - def _get_pretrain_placeholders(self): - policy = self.act_model - if isinstance(self.action_space, gym.spaces.Discrete): - return policy.obs_ph, self.action_ph, policy.policy - return policy.obs_ph, self.action_ph, policy.deterministic_action - - def setup_model(self): - with SetVerbosity(self.verbose): - - assert issubclass(self.policy, ActorCriticPolicy), "Error: the input policy for the PPO2 model must be " \ - "an instance of common.policies.ActorCriticPolicy." - - self.n_batch = self.n_envs * self.n_steps - - self.graph = tf.Graph() - with self.graph.as_default(): - self.set_random_seed(self.seed) - self.sess = tf_util.make_session(num_cpu=self.n_cpu_tf_sess, graph=self.graph) - - n_batch_step = None - n_batch_train = None - if issubclass(self.policy, RecurrentActorCriticPolicy): - assert self.n_envs % self.nminibatches == 0, "For recurrent policies, "\ - "the number of environments run in parallel should be a multiple of nminibatches." - n_batch_step = self.n_envs - n_batch_train = self.n_batch // self.nminibatches - - act_model = self.policy(self.sess, self.observation_space, self.action_space, self.n_envs, 1, - n_batch_step, reuse=False, **self.policy_kwargs) - with tf.variable_scope("train_model", reuse=True, - custom_getter=tf_util.outer_scope_getter("train_model")): - train_model = self.policy(self.sess, self.observation_space, self.action_space, - self.n_envs // self.nminibatches, self.n_steps, n_batch_train, - reuse=True, **self.policy_kwargs) - - with tf.variable_scope("loss", reuse=False): - self.action_ph = train_model.pdtype.sample_placeholder([None], name="action_ph") - self.advs_ph = tf.placeholder(tf.float32, [None], name="advs_ph") - self.rewards_ph = tf.placeholder(tf.float32, [None], name="rewards_ph") - self.old_neglog_pac_ph = tf.placeholder(tf.float32, [None], name="old_neglog_pac_ph") - self.old_vpred_ph = tf.placeholder(tf.float32, [None], name="old_vpred_ph") - self.learning_rate_ph = tf.placeholder(tf.float32, [], name="learning_rate_ph") - self.clip_range_ph = tf.placeholder(tf.float32, [], name="clip_range_ph") - - neglogpac = train_model.proba_distribution.neglogp(self.action_ph) - self.entropy = tf.reduce_mean(train_model.proba_distribution.entropy()) - - vpred = train_model.value_flat - - # Value function clipping: not present in the original PPO - if self.cliprange_vf is None: - # Default behavior (legacy from OpenAI baselines): - # use the same clipping as for the policy - self.clip_range_vf_ph = self.clip_range_ph - self.cliprange_vf = self.cliprange - elif isinstance(self.cliprange_vf, (float, int)) and self.cliprange_vf < 0: - # Original PPO implementation: no value function clipping - self.clip_range_vf_ph = None - else: - # Last possible behavior: clipping range - # specific to the value function - self.clip_range_vf_ph = tf.placeholder(tf.float32, [], name="clip_range_vf_ph") - - if self.clip_range_vf_ph is None: - # No clipping - vpred_clipped = train_model.value_flat - else: - # Clip the different between old and new value - # NOTE: this depends on the reward scaling - vpred_clipped = self.old_vpred_ph + \ - tf.clip_by_value(train_model.value_flat - self.old_vpred_ph, - - self.clip_range_vf_ph, self.clip_range_vf_ph) - - vf_losses1 = tf.square(vpred - self.rewards_ph) - vf_losses2 = tf.square(vpred_clipped - self.rewards_ph) - self.vf_loss = .5 * tf.reduce_mean(tf.maximum(vf_losses1, vf_losses2)) - - ratio = tf.exp(self.old_neglog_pac_ph - neglogpac) - pg_losses = -self.advs_ph * ratio - pg_losses2 = -self.advs_ph * tf.clip_by_value(ratio, 1.0 - self.clip_range_ph, 1.0 + - self.clip_range_ph) - self.pg_loss = tf.reduce_mean(tf.maximum(pg_losses, pg_losses2)) - self.approxkl = .5 * tf.reduce_mean(tf.square(neglogpac - self.old_neglog_pac_ph)) - self.clipfrac = tf.reduce_mean(tf.cast(tf.greater(tf.abs(ratio - 1.0), - self.clip_range_ph), tf.float32)) - loss = self.pg_loss - self.entropy * self.ent_coef + self.vf_loss * self.vf_coef - - tf.summary.scalar('entropy_loss', self.entropy) - tf.summary.scalar('policy_gradient_loss', self.pg_loss) - tf.summary.scalar('value_function_loss', self.vf_loss) - tf.summary.scalar('approximate_kullback-leibler', self.approxkl) - tf.summary.scalar('clip_factor', self.clipfrac) - tf.summary.scalar('loss', loss) - - with tf.variable_scope('model'): - self.params = tf.trainable_variables() - if self.full_tensorboard_log: - for var in self.params: - tf.summary.histogram(var.name, var) - grads = tf.gradients(loss, self.params) - if self.max_grad_norm is not None: - grads, _grad_norm = tf.clip_by_global_norm(grads, self.max_grad_norm) - grads = list(zip(grads, self.params)) - trainer = tf.train.AdamOptimizer(learning_rate=self.learning_rate_ph, epsilon=1e-5) - self._train = trainer.apply_gradients(grads) - - self.loss_names = ['policy_loss', 'value_loss', 'policy_entropy', 'approxkl', 'clipfrac'] - - with tf.variable_scope("input_info", reuse=False): - tf.summary.scalar('discounted_rewards', tf.reduce_mean(self.rewards_ph)) - tf.summary.scalar('learning_rate', tf.reduce_mean(self.learning_rate_ph)) - tf.summary.scalar('advantage', tf.reduce_mean(self.advs_ph)) - tf.summary.scalar('clip_range', tf.reduce_mean(self.clip_range_ph)) - if self.clip_range_vf_ph is not None: - tf.summary.scalar('clip_range_vf', tf.reduce_mean(self.clip_range_vf_ph)) - - tf.summary.scalar('old_neglog_action_probability', tf.reduce_mean(self.old_neglog_pac_ph)) - tf.summary.scalar('old_value_pred', tf.reduce_mean(self.old_vpred_ph)) - - if self.full_tensorboard_log: - tf.summary.histogram('discounted_rewards', self.rewards_ph) - tf.summary.histogram('learning_rate', self.learning_rate_ph) - tf.summary.histogram('advantage', self.advs_ph) - tf.summary.histogram('clip_range', self.clip_range_ph) - tf.summary.histogram('old_neglog_action_probability', self.old_neglog_pac_ph) - tf.summary.histogram('old_value_pred', self.old_vpred_ph) - if tf_util.is_image(self.observation_space): - tf.summary.image('observation', train_model.obs_ph) - else: - tf.summary.histogram('observation', train_model.obs_ph) - - self.train_model = train_model - self.act_model = act_model - self.step = act_model.step - self.proba_step = act_model.proba_step - self.value = act_model.value - self.initial_state = act_model.initial_state - tf.global_variables_initializer().run(session=self.sess) # pylint: disable=E1101 - - self.summary = tf.summary.merge_all() - - def _train_step(self, learning_rate, cliprange, obs, returns, masks, actions, values, neglogpacs, update, - writer, states=None, cliprange_vf=None): - """ - Training of PPO2 Algorithm - - :param learning_rate: (float) learning rate - :param cliprange: (float) Clipping factor - :param obs: (np.ndarray) The current observation of the environment - :param returns: (np.ndarray) the rewards - :param masks: (np.ndarray) The last masks for done episodes (used in recurent policies) - :param actions: (np.ndarray) the actions - :param values: (np.ndarray) the values - :param neglogpacs: (np.ndarray) Negative Log-likelihood probability of Actions - :param update: (int) the current step iteration - :param writer: (TensorFlow Summary.writer) the writer for tensorboard - :param states: (np.ndarray) For recurrent policies, the internal state of the recurrent model - :return: policy gradient loss, value function loss, policy entropy, - approximation of kl divergence, updated clipping range, training update operation - :param cliprange_vf: (float) Clipping factor for the value function - """ - advs = returns - values - advs = (advs - advs.mean()) / (advs.std() + 1e-8) - td_map = {self.train_model.obs_ph: obs, self.action_ph: actions, - self.advs_ph: advs, self.rewards_ph: returns, - self.learning_rate_ph: learning_rate, self.clip_range_ph: cliprange, - self.old_neglog_pac_ph: neglogpacs, self.old_vpred_ph: values} - if states is not None: - td_map[self.train_model.states_ph] = states - td_map[self.train_model.dones_ph] = masks - - if cliprange_vf is not None and cliprange_vf >= 0: - td_map[self.clip_range_vf_ph] = cliprange_vf - - if states is None: - update_fac = max(self.n_batch // self.nminibatches // self.noptepochs, 1) - else: - update_fac = max(self.n_batch // self.nminibatches // self.noptepochs // self.n_steps, 1) - - if writer is not None: - # run loss backprop with summary, but once every 10 runs save the metadata (memory, compute time, ...) - if self.full_tensorboard_log and (1 + update) % 10 == 0: - run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE) - run_metadata = tf.RunMetadata() - summary, policy_loss, value_loss, policy_entropy, approxkl, clipfrac, _ = self.sess.run( - [self.summary, self.pg_loss, self.vf_loss, self.entropy, self.approxkl, self.clipfrac, self._train], - td_map, options=run_options, run_metadata=run_metadata) - writer.add_run_metadata(run_metadata, 'step%d' % (update * update_fac)) - else: - summary, policy_loss, value_loss, policy_entropy, approxkl, clipfrac, _ = self.sess.run( - [self.summary, self.pg_loss, self.vf_loss, self.entropy, self.approxkl, self.clipfrac, self._train], - td_map) - writer.add_summary(summary, (update * update_fac)) - else: - policy_loss, value_loss, policy_entropy, approxkl, clipfrac, _ = self.sess.run( - [self.pg_loss, self.vf_loss, self.entropy, self.approxkl, self.clipfrac, self._train], td_map) - - return policy_loss, value_loss, policy_entropy, approxkl, clipfrac - - def set_env(self,env): - super().set_env(env) - self.n_batch = self.n_envs * self.n_steps - - def learn(self, total_timesteps, callback=None, log_interval=1, tb_log_name="PPO2", - reset_num_timesteps=True): - # Transform to callable if needed - self.learning_rate = get_schedule_fn(self.learning_rate) - self.cliprange = get_schedule_fn(self.cliprange) - cliprange_vf = get_schedule_fn(self.cliprange_vf) - - new_tb_log = self._init_num_timesteps(reset_num_timesteps) - callback = self._init_callback(callback) - - with SetVerbosity(self.verbose), TensorboardWriter(self.graph, self.tensorboard_log, tb_log_name, new_tb_log) \ - as writer: - self._setup_learn() - - t_first_start = time.time() - n_updates = total_timesteps // self.n_batch - - callback.on_training_start(locals(), globals()) - - for update in range(1, n_updates + 1): - assert self.n_batch % self.nminibatches == 0, ("The number of minibatches (`nminibatches`) " - "is not a factor of the total number of samples " - "collected per rollout (`n_batch`), " - "some samples won't be used." - ) - batch_size = self.n_batch // self.nminibatches - t_start = time.time() - frac = 1.0 - (update - 1.0) / n_updates - lr_now = self.learning_rate(frac) - cliprange_now = self.cliprange(frac) - cliprange_vf_now = cliprange_vf(frac) - - callback.on_rollout_start() - # true_reward is the reward without discount - rollout = self.runner.run(callback) - # Unpack - obs, returns, masks, actions, values, neglogpacs, states, ep_infos, true_reward = rollout - - callback.on_rollout_end() - - # Early stopping due to the callback - if not self.runner.continue_training: - break - - self.ep_info_buf.extend(ep_infos) - mb_loss_vals = [] - if states is None: # nonrecurrent version - update_fac = max(self.n_batch // self.nminibatches // self.noptepochs, 1) - inds = np.arange(self.n_batch) - for epoch_num in range(self.noptepochs): - np.random.shuffle(inds) - for start in range(0, self.n_batch, batch_size): - timestep = self.num_timesteps // update_fac + ((epoch_num * - self.n_batch + start) // batch_size) - end = start + batch_size - mbinds = inds[start:end] - slices = (arr[mbinds] for arr in (obs, returns, masks, actions, values, neglogpacs)) - mb_loss_vals.append(self._train_step(lr_now, cliprange_now, *slices, writer=writer, - update=timestep, cliprange_vf=cliprange_vf_now)) - else: # recurrent version - update_fac = max(self.n_batch // self.nminibatches // self.noptepochs // self.n_steps, 1) - assert self.n_envs % self.nminibatches == 0 - env_indices = np.arange(self.n_envs) - flat_indices = np.arange(self.n_envs * self.n_steps).reshape(self.n_envs, self.n_steps) - envs_per_batch = batch_size // self.n_steps - for epoch_num in range(self.noptepochs): - np.random.shuffle(env_indices) - for start in range(0, self.n_envs, envs_per_batch): - timestep = self.num_timesteps // update_fac + ((epoch_num * - self.n_envs + start) // envs_per_batch) - end = start + envs_per_batch - mb_env_inds = env_indices[start:end] - mb_flat_inds = flat_indices[mb_env_inds].ravel() - slices = (arr[mb_flat_inds] for arr in (obs, returns, masks, actions, values, neglogpacs)) - mb_states = states[mb_env_inds] - mb_loss_vals.append(self._train_step(lr_now, cliprange_now, *slices, update=timestep, - writer=writer, states=mb_states, - cliprange_vf=cliprange_vf_now)) - - loss_vals = np.mean(mb_loss_vals, axis=0) - t_now = time.time() - fps = int(self.n_batch / (t_now - t_start)) - - if writer is not None: - total_episode_reward_logger(self.episode_reward, - true_reward.reshape((self.n_envs, self.n_steps)), - masks.reshape((self.n_envs, self.n_steps)), - writer, self.num_timesteps) - - if self.verbose >= 1 and (update % log_interval == 0 or update == 1): - explained_var = explained_variance(values, returns) - logger.logkv("serial_timesteps", update * self.n_steps) - logger.logkv("n_updates", update) - logger.logkv("total_timesteps", self.num_timesteps) - logger.logkv("fps", fps) - logger.logkv("explained_variance", float(explained_var)) - if len(self.ep_info_buf) > 0 and len(self.ep_info_buf[0]) > 0: - logger.logkv('ep_reward_mean', safe_mean([ep_info['r'] for ep_info in self.ep_info_buf])) - logger.logkv('ep_len_mean', safe_mean([ep_info['l'] for ep_info in self.ep_info_buf])) - logger.logkv('time_elapsed', t_start - t_first_start) - for (loss_val, loss_name) in zip(loss_vals, self.loss_names): - logger.logkv(loss_name, loss_val) - logger.dumpkvs() - - callback.on_training_end() - return self - - def save(self, save_path, cloudpickle=False): - data = { - "gamma": self.gamma, - "n_steps": self.n_steps, - "vf_coef": self.vf_coef, - "ent_coef": self.ent_coef, - "max_grad_norm": self.max_grad_norm, - "learning_rate": self.learning_rate, - "lam": self.lam, - "nminibatches": self.nminibatches, - "noptepochs": self.noptepochs, - "cliprange": self.cliprange, - "cliprange_vf": self.cliprange_vf, - "verbose": self.verbose, - "policy": self.policy, - "observation_space": self.observation_space, - "action_space": self.action_space, - "n_envs": self.n_envs, - "n_cpu_tf_sess": self.n_cpu_tf_sess, - "seed": self.seed, - "_vectorize_action": self._vectorize_action, - "policy_kwargs": self.policy_kwargs - } - - params_to_save = self.get_parameters() - - self._save_to_file(save_path, data=data, params=params_to_save, cloudpickle=cloudpickle) - - -class Runner(AbstractEnvRunner): - def __init__(self, *, env, model, n_steps, gamma, lam): - """ - A runner to learn the policy of an environment for a model - - :param env: (Gym environment) The environment to learn from - :param model: (Model) The model to learn - :param n_steps: (int) The number of steps to run for each environment - :param gamma: (float) Discount factor - :param lam: (float) Factor for trade-off of bias vs variance for Generalized Advantage Estimator - """ - super().__init__(env=env, model=model, n_steps=n_steps) - self.lam = lam - self.gamma = gamma - - def _run(self): - """ - Run a learning step of the model - - :return: - - observations: (np.ndarray) the observations - - rewards: (np.ndarray) the rewards - - masks: (numpy bool) whether an episode is over or not - - actions: (np.ndarray) the actions - - values: (np.ndarray) the value function output - - negative log probabilities: (np.ndarray) - - states: (np.ndarray) the internal states of the recurrent policies - - infos: (dict) the extra information of the model - """ - # mb stands for minibatch - mb_obs, mb_rewards, mb_actions, mb_values, mb_dones, mb_neglogpacs = [], [], [], [], [], [] - mb_states = self.states - ep_infos = [] - for _ in range(self.n_steps): - actions, values, self.states, neglogpacs = self.model.step(self.obs, self.states, self.dones) # pytype: disable=attribute-error - mb_obs.append(self.obs.copy()) - mb_actions.append(actions) - mb_values.append(values) - mb_neglogpacs.append(neglogpacs) - mb_dones.append(self.dones) - clipped_actions = actions - # Clip the actions to avoid out of bound error - if isinstance(self.env.action_space, gym.spaces.Box): - clipped_actions = np.clip(actions, self.env.action_space.low, self.env.action_space.high) - self.obs[:], rewards, self.dones, infos = self.env.step(clipped_actions) - - self.model.num_timesteps += self.n_envs - - if self.callback is not None: - # Abort training early - self.callback.update_locals(locals()) - if self.callback.on_step() is False: - self.continue_training = False - # Return dummy values - return [None] * 9 - - for info in infos: - maybe_ep_info = info.get('episode') - if maybe_ep_info is not None: - ep_infos.append(maybe_ep_info) - mb_rewards.append(rewards) - # batch of steps to batch of rollouts - mb_obs = np.asarray(mb_obs, dtype=self.obs.dtype) - mb_rewards = np.asarray(mb_rewards, dtype=np.float32) - mb_actions = np.asarray(mb_actions) - mb_values = np.asarray(mb_values, dtype=np.float32) - mb_neglogpacs = np.asarray(mb_neglogpacs, dtype=np.float32) - mb_dones = np.asarray(mb_dones, dtype=np.bool) - last_values = self.model.value(self.obs, self.states, self.dones) # pytype: disable=attribute-error - # discount/bootstrap off value fn - mb_advs = np.zeros_like(mb_rewards) - true_reward = np.copy(mb_rewards) - last_gae_lam = 0 - for step in reversed(range(self.n_steps)): - if step == self.n_steps - 1: - nextnonterminal = 1.0 - self.dones - nextvalues = last_values - else: - nextnonterminal = 1.0 - mb_dones[step + 1] - nextvalues = mb_values[step + 1] - delta = mb_rewards[step] + self.gamma * nextvalues * nextnonterminal - mb_values[step] - mb_advs[step] = last_gae_lam = delta + self.gamma * self.lam * nextnonterminal * last_gae_lam - mb_returns = mb_advs + mb_values - - mb_obs, mb_returns, mb_dones, mb_actions, mb_values, mb_neglogpacs, true_reward = \ - map(swap_and_flatten, (mb_obs, mb_returns, mb_dones, mb_actions, mb_values, mb_neglogpacs, true_reward)) - - return mb_obs, mb_returns, mb_dones, mb_actions, mb_values, mb_neglogpacs, mb_states, ep_infos, true_reward - - -# obs, returns, masks, actions, values, neglogpacs, states = runner.run() -def swap_and_flatten(arr): - """ - swap and then flatten axes 0 and 1 - - :param arr: (np.ndarray) - :return: (np.ndarray) - """ - shape = arr.shape - return arr.swapaxes(0, 1).reshape(shape[0] * shape[1], *shape[2:]) diff --git a/stable_baselines/ppo2/run_atari.py b/stable_baselines/ppo2/run_atari.py deleted file mode 100644 index bc026aca..00000000 --- a/stable_baselines/ppo2/run_atari.py +++ /dev/null @@ -1,48 +0,0 @@ -from stable_baselines import PPO2, logger -from stable_baselines.common.cmd_util import make_atari_env, atari_arg_parser -from stable_baselines.common.vec_env import VecFrameStack -from stable_baselines.common.policies import CnnPolicy, CnnLstmPolicy, CnnLnLstmPolicy, MlpPolicy - - -def train(env_id, num_timesteps, seed, policy, - n_envs=8, nminibatches=4, n_steps=128): - """ - Train PPO2 model for atari environment, for testing purposes - - :param env_id: (str) the environment id string - :param num_timesteps: (int) the number of timesteps to run - :param seed: (int) Used to seed the random generator. - :param policy: (Object) The policy model to use (MLP, CNN, LSTM, ...) - :param n_envs: (int) Number of parallel environments - :param nminibatches: (int) Number of training minibatches per update. For recurrent policies, - the number of environments run in parallel should be a multiple of nminibatches. - :param n_steps: (int) The number of steps to run for each environment per update - (i.e. batch size is n_steps * n_env where n_env is number of environment copies running in parallel) - """ - - env = VecFrameStack(make_atari_env(env_id, n_envs, seed), 4) - policy = {'cnn': CnnPolicy, 'lstm': CnnLstmPolicy, 'lnlstm': CnnLnLstmPolicy, 'mlp': MlpPolicy}[policy] - model = PPO2(policy=policy, env=env, n_steps=n_steps, nminibatches=nminibatches, - lam=0.95, gamma=0.99, noptepochs=4, ent_coef=.01, - learning_rate=lambda f: f * 2.5e-4, cliprange=lambda f: f * 0.1, verbose=1) - model.learn(total_timesteps=num_timesteps) - - env.close() - # Free memory - del model - - -def main(): - """ - Runs the test - """ - parser = atari_arg_parser() - parser.add_argument('--policy', help='Policy architecture', choices=['cnn', 'lstm', 'lnlstm', 'mlp'], default='cnn') - args = parser.parse_args() - logger.configure() - train(args.env, num_timesteps=args.num_timesteps, seed=args.seed, - policy=args.policy) - - -if __name__ == '__main__': - main() diff --git a/stable_baselines/ppo2/run_mujoco.py b/stable_baselines/ppo2/run_mujoco.py deleted file mode 100644 index a99efbca..00000000 --- a/stable_baselines/ppo2/run_mujoco.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env python3 -import numpy as np -import gym - -from stable_baselines.common.cmd_util import mujoco_arg_parser -from stable_baselines import bench, logger -from stable_baselines.common import set_global_seeds -from stable_baselines.common.vec_env.vec_normalize import VecNormalize -from stable_baselines.ppo2 import PPO2 -from stable_baselines.common.policies import MlpPolicy -from stable_baselines.common.vec_env.dummy_vec_env import DummyVecEnv - - -def train(env_id, num_timesteps, seed): - """ - Train PPO2 model for Mujoco environment, for testing purposes - - :param env_id: (str) the environment id string - :param num_timesteps: (int) the number of timesteps to run - :param seed: (int) Used to seed the random generator. - """ - def make_env(): - env_out = gym.make(env_id) - env_out = bench.Monitor(env_out, logger.get_dir(), allow_early_resets=True) - return env_out - - env = DummyVecEnv([make_env]) - env = VecNormalize(env) - - set_global_seeds(seed) - policy = MlpPolicy - model = PPO2(policy=policy, env=env, n_steps=2048, nminibatches=32, lam=0.95, gamma=0.99, noptepochs=10, - ent_coef=0.0, learning_rate=3e-4, cliprange=0.2) - model.learn(total_timesteps=num_timesteps) - - return model, env - - -def main(): - """ - Runs the test - """ - args = mujoco_arg_parser().parse_args() - logger.configure() - model, env = train(args.env, num_timesteps=args.num_timesteps, seed=args.seed) - - if args.play: - logger.log("Running trained model") - obs = np.zeros((env.num_envs,) + env.observation_space.shape) - obs[:] = env.reset() - while True: - actions = model.step(obs)[0] - obs[:] = env.step(actions)[0] - env.render() - - -if __name__ == '__main__': - main() diff --git a/stable_baselines/py.typed b/stable_baselines/py.typed deleted file mode 100644 index e69de29b..00000000 diff --git a/stable_baselines/results_plotter.py b/stable_baselines/results_plotter.py deleted file mode 100644 index 5631f7a6..00000000 --- a/stable_baselines/results_plotter.py +++ /dev/null @@ -1,146 +0,0 @@ -import numpy as np -import matplotlib -import matplotlib.pyplot as plt - -from stable_baselines.bench.monitor import load_results - -# matplotlib.use('TkAgg') # Can change to 'Agg' for non-interactive mode -plt.rcParams['svg.fonttype'] = 'none' - -X_TIMESTEPS = 'timesteps' -X_EPISODES = 'episodes' -X_WALLTIME = 'walltime_hrs' -POSSIBLE_X_AXES = [X_TIMESTEPS, X_EPISODES, X_WALLTIME] -EPISODES_WINDOW = 100 -COLORS = ['blue', 'green', 'red', 'cyan', 'magenta', 'yellow', 'black', 'purple', 'pink', - 'brown', 'orange', 'teal', 'coral', 'lightblue', 'lime', 'lavender', 'turquoise', - 'darkgreen', 'tan', 'salmon', 'gold', 'lightpurple', 'darkred', 'darkblue'] - - -def rolling_window(array, window): - """ - apply a rolling window to a np.ndarray - - :param array: (np.ndarray) the input Array - :param window: (int) length of the rolling window - :return: (np.ndarray) rolling window on the input array - """ - shape = array.shape[:-1] + (array.shape[-1] - window + 1, window) - strides = array.strides + (array.strides[-1],) - return np.lib.stride_tricks.as_strided(array, shape=shape, strides=strides) - - -def window_func(var_1, var_2, window, func): - """ - apply a function to the rolling window of 2 arrays - - :param var_1: (np.ndarray) variable 1 - :param var_2: (np.ndarray) variable 2 - :param window: (int) length of the rolling window - :param func: (numpy function) function to apply on the rolling window on variable 2 (such as np.mean) - :return: (np.ndarray, np.ndarray) the rolling output with applied function - """ - var_2_window = rolling_window(var_2, window) - function_on_var2 = func(var_2_window, axis=-1) - return var_1[window - 1:], function_on_var2 - - -def ts2xy(timesteps, xaxis): - """ - Decompose a timesteps variable to x ans ys - - :param timesteps: (Pandas DataFrame) the input data - :param xaxis: (str) the axis for the x and y output - (can be X_TIMESTEPS='timesteps', X_EPISODES='episodes' or X_WALLTIME='walltime_hrs') - :return: (np.ndarray, np.ndarray) the x and y output - """ - if xaxis == X_TIMESTEPS: - x_var = np.cumsum(timesteps.l.values) - y_var = timesteps.r.values - elif xaxis == X_EPISODES: - x_var = np.arange(len(timesteps)) - y_var = timesteps.r.values - elif xaxis == X_WALLTIME: - x_var = timesteps.t.values / 3600. - y_var = timesteps.r.values - else: - raise NotImplementedError - return x_var, y_var - - -def plot_curves(xy_list, xaxis, title): - """ - plot the curves - - :param xy_list: ([(np.ndarray, np.ndarray)]) the x and y coordinates to plot - :param xaxis: (str) the axis for the x and y output - (can be X_TIMESTEPS='timesteps', X_EPISODES='episodes' or X_WALLTIME='walltime_hrs') - :param title: (str) the title of the plot - """ - - plt.figure(figsize=(8, 2)) - maxx = max(xy[0][-1] for xy in xy_list) - minx = 0 - for (i, (x, y)) in enumerate(xy_list): - color = COLORS[i] - plt.scatter(x, y, s=2) - # Do not plot the smoothed curve at all if the timeseries is shorter than window size. - if x.shape[0] >= EPISODES_WINDOW: - # Compute and plot rolling mean with window of size EPISODE_WINDOW - x, y_mean = window_func(x, y, EPISODES_WINDOW, np.mean) - plt.plot(x, y_mean, color=color) - plt.xlim(minx, maxx) - plt.title(title) - plt.xlabel(xaxis) - plt.ylabel("Episode Rewards") - plt.tight_layout() - - -def plot_results(dirs, num_timesteps, xaxis, task_name): - """ - plot the results - - :param dirs: ([str]) the save location of the results to plot - :param num_timesteps: (int or None) only plot the points below this value - :param xaxis: (str) the axis for the x and y output - (can be X_TIMESTEPS='timesteps', X_EPISODES='episodes' or X_WALLTIME='walltime_hrs') - :param task_name: (str) the title of the task to plot - """ - - tslist = [] - for folder in dirs: - timesteps = load_results(folder) - if num_timesteps is not None: - timesteps = timesteps[timesteps.l.cumsum() <= num_timesteps] - tslist.append(timesteps) - xy_list = [ts2xy(timesteps_item, xaxis) for timesteps_item in tslist] - plot_curves(xy_list, xaxis, task_name) - - -def main(): - """ - Example usage in jupyter-notebook - - .. code-block:: python - - from stable_baselines import results_plotter - %matplotlib inline - results_plotter.plot_results(["./log"], 10e6, results_plotter.X_TIMESTEPS, "Breakout") - - Here ./log is a directory containing the monitor.csv files - """ - import argparse - import os - parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument('--dirs', help='List of log directories', nargs='*', default=['./log']) - parser.add_argument('--num_timesteps', type=int, default=int(10e6)) - parser.add_argument('--xaxis', help='Varible on X-axis', default=X_TIMESTEPS) - parser.add_argument('--task_name', help='Title of plot', default='Breakout') - args = parser.parse_args() - args.dirs = [os.path.abspath(folder) for folder in args.dirs] - plot_results(args.dirs, args.num_timesteps, args.xaxis, args.task_name) - plt.show() - - -if __name__ == '__main__': - main() diff --git a/stable_baselines/sac/__init__.py b/stable_baselines/sac/__init__.py deleted file mode 100644 index e727402f..00000000 --- a/stable_baselines/sac/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from stable_baselines.sac.sac import SAC -from stable_baselines.sac.policies import MlpPolicy, CnnPolicy, LnMlpPolicy, LnCnnPolicy diff --git a/stable_baselines/sac/policies.py b/stable_baselines/sac/policies.py deleted file mode 100644 index 7cc61e7d..00000000 --- a/stable_baselines/sac/policies.py +++ /dev/null @@ -1,351 +0,0 @@ -import tensorflow as tf -import numpy as np -from gym.spaces import Box - -from stable_baselines.common.policies import BasePolicy, nature_cnn, register_policy -from stable_baselines.common.tf_layers import mlp - -EPS = 1e-6 # Avoid NaN (prevents division by zero or log of zero) -# CAP the standard deviation of the actor -LOG_STD_MAX = 2 -LOG_STD_MIN = -20 - - -def gaussian_likelihood(input_, mu_, log_std): - """ - Helper to computer log likelihood of a gaussian. - Here we assume this is a Diagonal Gaussian. - - :param input_: (tf.Tensor) - :param mu_: (tf.Tensor) - :param log_std: (tf.Tensor) - :return: (tf.Tensor) - """ - pre_sum = -0.5 * (((input_ - mu_) / (tf.exp(log_std) + EPS)) ** 2 + 2 * log_std + np.log(2 * np.pi)) - return tf.reduce_sum(pre_sum, axis=1) - - -def gaussian_entropy(log_std): - """ - Compute the entropy for a diagonal Gaussian distribution. - - :param log_std: (tf.Tensor) Log of the standard deviation - :return: (tf.Tensor) - """ - return tf.reduce_sum(log_std + 0.5 * np.log(2.0 * np.pi * np.e), axis=-1) - - -def clip_but_pass_gradient(input_, lower=-1., upper=1.): - clip_up = tf.cast(input_ > upper, tf.float32) - clip_low = tf.cast(input_ < lower, tf.float32) - return input_ + tf.stop_gradient((upper - input_) * clip_up + (lower - input_) * clip_low) - - -def apply_squashing_func(mu_, pi_, logp_pi): - """ - Squash the output of the Gaussian distribution - and account for that in the log probability - The squashed mean is also returned for using - deterministic actions. - - :param mu_: (tf.Tensor) Mean of the gaussian - :param pi_: (tf.Tensor) Output of the policy before squashing - :param logp_pi: (tf.Tensor) Log probability before squashing - :return: ([tf.Tensor]) - """ - # Squash the output - deterministic_policy = tf.tanh(mu_) - policy = tf.tanh(pi_) - # OpenAI Variation: - # To avoid evil machine precision error, strictly clip 1-pi**2 to [0,1] range. - # logp_pi -= tf.reduce_sum(tf.log(clip_but_pass_gradient(1 - policy ** 2, lower=0, upper=1) + EPS), axis=1) - # Squash correction (from original implementation) - logp_pi -= tf.reduce_sum(tf.log(1 - policy ** 2 + EPS), axis=1) - return deterministic_policy, policy, logp_pi - - -class SACPolicy(BasePolicy): - """ - Policy object that implements a SAC-like actor critic - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param scale: (bool) whether or not to scale the input - """ - - def __init__(self, sess, ob_space, ac_space, n_env=1, n_steps=1, n_batch=None, reuse=False, scale=False): - super(SACPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse=reuse, scale=scale) - assert isinstance(ac_space, Box), "Error: the action space must be of type gym.spaces.Box" - - self.qf1 = None - self.qf2 = None - self.value_fn = None - self.policy = None - self.deterministic_policy = None - self.act_mu = None - self.std = None - - def make_actor(self, obs=None, reuse=False, scope="pi"): - """ - Creates an actor object - - :param obs: (TensorFlow Tensor) The observation placeholder (can be None for default placeholder) - :param reuse: (bool) whether or not to reuse parameters - :param scope: (str) the scope name of the actor - :return: (TensorFlow Tensor) the output tensor - """ - raise NotImplementedError - - def make_critics(self, obs=None, action=None, reuse=False, - scope="values_fn", create_vf=True, create_qf=True): - """ - Creates the two Q-Values approximator along with the Value function - - :param obs: (TensorFlow Tensor) The observation placeholder (can be None for default placeholder) - :param action: (TensorFlow Tensor) The action placeholder - :param reuse: (bool) whether or not to reuse parameters - :param scope: (str) the scope name - :param create_vf: (bool) Whether to create Value fn or not - :param create_qf: (bool) Whether to create Q-Values fn or not - :return: ([tf.Tensor]) Mean, action and log probability - """ - raise NotImplementedError - - def step(self, obs, state=None, mask=None, deterministic=False): - """ - Returns the policy for a single step - - :param obs: ([float] or [int]) The current observation of the environment - :param state: ([float]) The last states (used in recurrent policies) - :param mask: ([float]) The last masks (used in recurrent policies) - :param deterministic: (bool) Whether or not to return deterministic actions. - :return: ([float]) actions - """ - raise NotImplementedError - - def proba_step(self, obs, state=None, mask=None): - """ - Returns the action probability params (mean, std) for a single step - - :param obs: ([float] or [int]) The current observation of the environment - :param state: ([float]) The last states (used in recurrent policies) - :param mask: ([float]) The last masks (used in recurrent policies) - :return: ([float], [float]) - """ - raise NotImplementedError - - -class FeedForwardPolicy(SACPolicy): - """ - Policy object that implements a DDPG-like actor critic, using a feed forward neural network. - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param layers: ([int]) The size of the Neural network for the policy (if None, default to [64, 64]) - :param cnn_extractor: (function (TensorFlow Tensor, ``**kwargs``): (TensorFlow Tensor)) the CNN feature extraction - :param feature_extraction: (str) The feature extraction type ("cnn" or "mlp") - :param layer_norm: (bool) enable layer normalisation - :param reg_weight: (float) Regularization loss weight for the policy parameters - :param act_fun: (tf.func) the activation function to use in the neural network. - :param kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env=1, n_steps=1, n_batch=None, reuse=False, layers=None, - cnn_extractor=nature_cnn, feature_extraction="cnn", reg_weight=0.0, - layer_norm=False, act_fun=tf.nn.relu, **kwargs): - super(FeedForwardPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, - reuse=reuse, scale=(feature_extraction == "cnn")) - - self._kwargs_check(feature_extraction, kwargs) - self.layer_norm = layer_norm - self.feature_extraction = feature_extraction - self.cnn_kwargs = kwargs - self.cnn_extractor = cnn_extractor - self.reuse = reuse - if layers is None: - layers = [64, 64] - self.layers = layers - self.reg_loss = None - self.reg_weight = reg_weight - self.entropy = None - - assert len(layers) >= 1, "Error: must have at least one hidden layer for the policy." - - self.activ_fn = act_fun - - def make_actor(self, obs=None, reuse=False, scope="pi"): - if obs is None: - obs = self.processed_obs - - with tf.variable_scope(scope, reuse=reuse): - if self.feature_extraction == "cnn": - pi_h = self.cnn_extractor(obs, **self.cnn_kwargs) - else: - pi_h = tf.layers.flatten(obs) - - pi_h = mlp(pi_h, self.layers, self.activ_fn, layer_norm=self.layer_norm) - - self.act_mu = mu_ = tf.layers.dense(pi_h, self.ac_space.shape[0], activation=None) - # Important difference with SAC and other algo such as PPO: - # the std depends on the state, so we cannot use stable_baselines.common.distribution - log_std = tf.layers.dense(pi_h, self.ac_space.shape[0], activation=None) - - # Regularize policy output (not used for now) - # reg_loss = self.reg_weight * 0.5 * tf.reduce_mean(log_std ** 2) - # reg_loss += self.reg_weight * 0.5 * tf.reduce_mean(mu ** 2) - # self.reg_loss = reg_loss - - # OpenAI Variation to cap the standard deviation - # activation = tf.tanh # for log_std - # log_std = LOG_STD_MIN + 0.5 * (LOG_STD_MAX - LOG_STD_MIN) * (log_std + 1) - # Original Implementation - log_std = tf.clip_by_value(log_std, LOG_STD_MIN, LOG_STD_MAX) - - self.std = std = tf.exp(log_std) - # Reparameterization trick - pi_ = mu_ + tf.random_normal(tf.shape(mu_)) * std - logp_pi = gaussian_likelihood(pi_, mu_, log_std) - self.entropy = gaussian_entropy(log_std) - # MISSING: reg params for log and mu - # Apply squashing and account for it in the probability - deterministic_policy, policy, logp_pi = apply_squashing_func(mu_, pi_, logp_pi) - self.policy = policy - self.deterministic_policy = deterministic_policy - - return deterministic_policy, policy, logp_pi - - def make_critics(self, obs=None, action=None, reuse=False, scope="values_fn", - create_vf=True, create_qf=True): - if obs is None: - obs = self.processed_obs - - with tf.variable_scope(scope, reuse=reuse): - if self.feature_extraction == "cnn": - critics_h = self.cnn_extractor(obs, **self.cnn_kwargs) - else: - critics_h = tf.layers.flatten(obs) - - if create_vf: - # Value function - with tf.variable_scope('vf', reuse=reuse): - vf_h = mlp(critics_h, self.layers, self.activ_fn, layer_norm=self.layer_norm) - value_fn = tf.layers.dense(vf_h, 1, name="vf") - self.value_fn = value_fn - - if create_qf: - # Concatenate preprocessed state and action - qf_h = tf.concat([critics_h, action], axis=-1) - - # Double Q values to reduce overestimation - with tf.variable_scope('qf1', reuse=reuse): - qf1_h = mlp(qf_h, self.layers, self.activ_fn, layer_norm=self.layer_norm) - qf1 = tf.layers.dense(qf1_h, 1, name="qf1") - - with tf.variable_scope('qf2', reuse=reuse): - qf2_h = mlp(qf_h, self.layers, self.activ_fn, layer_norm=self.layer_norm) - qf2 = tf.layers.dense(qf2_h, 1, name="qf2") - - self.qf1 = qf1 - self.qf2 = qf2 - - return self.qf1, self.qf2, self.value_fn - - def step(self, obs, state=None, mask=None, deterministic=False): - if deterministic: - return self.sess.run(self.deterministic_policy, {self.obs_ph: obs}) - return self.sess.run(self.policy, {self.obs_ph: obs}) - - def proba_step(self, obs, state=None, mask=None): - return self.sess.run([self.act_mu, self.std], {self.obs_ph: obs}) - - -class CnnPolicy(FeedForwardPolicy): - """ - Policy object that implements actor critic, using a CNN (the nature CNN) - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param _kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env=1, n_steps=1, n_batch=None, reuse=False, **_kwargs): - super(CnnPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse, - feature_extraction="cnn", **_kwargs) - - -class LnCnnPolicy(FeedForwardPolicy): - """ - Policy object that implements actor critic, using a CNN (the nature CNN), with layer normalisation - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param _kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env=1, n_steps=1, n_batch=None, reuse=False, **_kwargs): - super(LnCnnPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse, - feature_extraction="cnn", layer_norm=True, **_kwargs) - - -class MlpPolicy(FeedForwardPolicy): - """ - Policy object that implements actor critic, using a MLP (2 layers of 64) - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param _kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env=1, n_steps=1, n_batch=None, reuse=False, **_kwargs): - super(MlpPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse, - feature_extraction="mlp", **_kwargs) - - -class LnMlpPolicy(FeedForwardPolicy): - """ - Policy object that implements actor critic, using a MLP (2 layers of 64), with layer normalisation - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param _kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env=1, n_steps=1, n_batch=None, reuse=False, **_kwargs): - super(LnMlpPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse, - feature_extraction="mlp", layer_norm=True, **_kwargs) - - -register_policy("CnnPolicy", CnnPolicy) -register_policy("LnCnnPolicy", LnCnnPolicy) -register_policy("MlpPolicy", MlpPolicy) -register_policy("LnMlpPolicy", LnMlpPolicy) diff --git a/stable_baselines/sac/sac.py b/stable_baselines/sac/sac.py deleted file mode 100644 index f466af76..00000000 --- a/stable_baselines/sac/sac.py +++ /dev/null @@ -1,574 +0,0 @@ -import time -import warnings - -import numpy as np -import tensorflow as tf - -from stable_baselines.common import tf_util, OffPolicyRLModel, SetVerbosity, TensorboardWriter -from stable_baselines.common.vec_env import VecEnv -from stable_baselines.common.math_util import safe_mean, unscale_action, scale_action -from stable_baselines.common.schedules import get_schedule_fn -from stable_baselines.common.buffers import ReplayBuffer -from stable_baselines.sac.policies import SACPolicy -from stable_baselines import logger - - -class SAC(OffPolicyRLModel): - """ - Soft Actor-Critic (SAC) - Off-Policy Maximum Entropy Deep Reinforcement Learning with a Stochastic Actor, - This implementation borrows code from original implementation (https://github.com/haarnoja/sac) - from OpenAI Spinning Up (https://github.com/openai/spinningup) and from the Softlearning repo - (https://github.com/rail-berkeley/softlearning/) - Paper: https://arxiv.org/abs/1801.01290 - Introduction to SAC: https://spinningup.openai.com/en/latest/algorithms/sac.html - - :param policy: (SACPolicy or str) The policy model to use (MlpPolicy, CnnPolicy, LnMlpPolicy, ...) - :param env: (Gym environment or str) The environment to learn from (if registered in Gym, can be str) - :param gamma: (float) the discount factor - :param learning_rate: (float or callable) learning rate for adam optimizer, - the same learning rate will be used for all networks (Q-Values, Actor and Value function) - it can be a function of the current progress (from 1 to 0) - :param buffer_size: (int) size of the replay buffer - :param batch_size: (int) Minibatch size for each gradient update - :param tau: (float) the soft update coefficient ("polyak update", between 0 and 1) - :param ent_coef: (str or float) Entropy regularization coefficient. (Equivalent to - inverse of reward scale in the original SAC paper.) Controlling exploration/exploitation trade-off. - Set it to 'auto' to learn it automatically (and 'auto_0.1' for using 0.1 as initial value) - :param train_freq: (int) Update the model every `train_freq` steps. - :param learning_starts: (int) how many steps of the model to collect transitions for before learning starts - :param target_update_interval: (int) update the target network every `target_network_update_freq` steps. - :param gradient_steps: (int) How many gradient update after each step - :param target_entropy: (str or float) target entropy when learning ent_coef (ent_coef = 'auto') - :param action_noise: (ActionNoise) the action noise type (None by default), this can help - for hard exploration problem. Cf DDPG for the different action noise type. - :param random_exploration: (float) Probability of taking a random action (as in an epsilon-greedy strategy) - This is not needed for SAC normally but can help exploring when using HER + SAC. - This hack was present in the original OpenAI Baselines repo (DDPG + HER) - :param verbose: (int) the verbosity level: 0 none, 1 training information, 2 tensorflow debug - :param tensorboard_log: (str) the log location for tensorboard (if None, no logging) - :param _init_setup_model: (bool) Whether or not to build the network at the creation of the instance - :param policy_kwargs: (dict) additional arguments to be passed to the policy on creation - :param full_tensorboard_log: (bool) enable additional logging when using tensorboard - Note: this has no effect on SAC logging for now - :param seed: (int) Seed for the pseudo-random generators (python, numpy, tensorflow). - If None (default), use random seed. Note that if you want completely deterministic - results, you must set `n_cpu_tf_sess` to 1. - :param n_cpu_tf_sess: (int) The number of threads for TensorFlow operations - If None, the number of cpu of the current machine will be used. - """ - - def __init__(self, policy, env, gamma=0.99, learning_rate=3e-4, buffer_size=50000, - learning_starts=100, train_freq=1, batch_size=64, - tau=0.005, ent_coef='auto', target_update_interval=1, - gradient_steps=1, target_entropy='auto', action_noise=None, - random_exploration=0.0, verbose=0, tensorboard_log=None, - _init_setup_model=True, policy_kwargs=None, full_tensorboard_log=False, - seed=None, n_cpu_tf_sess=None): - - super(SAC, self).__init__(policy=policy, env=env, replay_buffer=None, verbose=verbose, - policy_base=SACPolicy, requires_vec_env=False, policy_kwargs=policy_kwargs, - seed=seed, n_cpu_tf_sess=n_cpu_tf_sess) - - self.buffer_size = buffer_size - self.learning_rate = learning_rate - self.learning_starts = learning_starts - self.train_freq = train_freq - self.batch_size = batch_size - self.tau = tau - # In the original paper, same learning rate is used for all networks - # self.policy_lr = learning_rate - # self.qf_lr = learning_rate - # self.vf_lr = learning_rate - # Entropy coefficient / Entropy temperature - # Inverse of the reward scale - self.ent_coef = ent_coef - self.target_update_interval = target_update_interval - self.gradient_steps = gradient_steps - self.gamma = gamma - self.action_noise = action_noise - self.random_exploration = random_exploration - - self.value_fn = None - self.graph = None - self.replay_buffer = None - self.sess = None - self.tensorboard_log = tensorboard_log - self.verbose = verbose - self.params = None - self.summary = None - self.policy_tf = None - self.target_entropy = target_entropy - self.full_tensorboard_log = full_tensorboard_log - - self.obs_target = None - self.target_policy = None - self.actions_ph = None - self.rewards_ph = None - self.terminals_ph = None - self.observations_ph = None - self.action_target = None - self.next_observations_ph = None - self.value_target = None - self.step_ops = None - self.target_update_op = None - self.infos_names = None - self.entropy = None - self.target_params = None - self.learning_rate_ph = None - self.processed_obs_ph = None - self.processed_next_obs_ph = None - self.log_ent_coef = None - - if _init_setup_model: - self.setup_model() - - def _get_pretrain_placeholders(self): - policy = self.policy_tf - # Rescale - deterministic_action = unscale_action(self.action_space, self.deterministic_action) - return policy.obs_ph, self.actions_ph, deterministic_action - - def setup_model(self): - with SetVerbosity(self.verbose): - self.graph = tf.Graph() - with self.graph.as_default(): - self.set_random_seed(self.seed) - self.sess = tf_util.make_session(num_cpu=self.n_cpu_tf_sess, graph=self.graph) - - self.replay_buffer = ReplayBuffer(self.buffer_size) - - with tf.variable_scope("input", reuse=False): - # Create policy and target TF objects - self.policy_tf = self.policy(self.sess, self.observation_space, self.action_space, - **self.policy_kwargs) - self.target_policy = self.policy(self.sess, self.observation_space, self.action_space, - **self.policy_kwargs) - - # Initialize Placeholders - self.observations_ph = self.policy_tf.obs_ph - # Normalized observation for pixels - self.processed_obs_ph = self.policy_tf.processed_obs - self.next_observations_ph = self.target_policy.obs_ph - self.processed_next_obs_ph = self.target_policy.processed_obs - self.action_target = self.target_policy.action_ph - self.terminals_ph = tf.placeholder(tf.float32, shape=(None, 1), name='terminals') - self.rewards_ph = tf.placeholder(tf.float32, shape=(None, 1), name='rewards') - self.actions_ph = tf.placeholder(tf.float32, shape=(None,) + self.action_space.shape, - name='actions') - self.learning_rate_ph = tf.placeholder(tf.float32, [], name="learning_rate_ph") - - with tf.variable_scope("model", reuse=False): - # Create the policy - # first return value corresponds to deterministic actions - # policy_out corresponds to stochastic actions, used for training - # logp_pi is the log probability of actions taken by the policy - self.deterministic_action, policy_out, logp_pi = self.policy_tf.make_actor(self.processed_obs_ph) - # Monitor the entropy of the policy, - # this is not used for training - self.entropy = tf.reduce_mean(self.policy_tf.entropy) - # Use two Q-functions to improve performance by reducing overestimation bias. - qf1, qf2, value_fn = self.policy_tf.make_critics(self.processed_obs_ph, self.actions_ph, - create_qf=True, create_vf=True) - qf1_pi, qf2_pi, _ = self.policy_tf.make_critics(self.processed_obs_ph, - policy_out, create_qf=True, create_vf=False, - reuse=True) - - # Target entropy is used when learning the entropy coefficient - if self.target_entropy == 'auto': - # automatically set target entropy if needed - self.target_entropy = -np.prod(self.action_space.shape).astype(np.float32) - else: - # Force conversion - # this will also throw an error for unexpected string - self.target_entropy = float(self.target_entropy) - - # The entropy coefficient or entropy can be learned automatically - # see Automating Entropy Adjustment for Maximum Entropy RL section - # of https://arxiv.org/abs/1812.05905 - if isinstance(self.ent_coef, str) and self.ent_coef.startswith('auto'): - # Default initial value of ent_coef when learned - init_value = 1.0 - if '_' in self.ent_coef: - init_value = float(self.ent_coef.split('_')[1]) - assert init_value > 0., "The initial value of ent_coef must be greater than 0" - - self.log_ent_coef = tf.get_variable('log_ent_coef', dtype=tf.float32, - initializer=np.log(init_value).astype(np.float32)) - self.ent_coef = tf.exp(self.log_ent_coef) - else: - # Force conversion to float - # this will throw an error if a malformed string (different from 'auto') - # is passed - self.ent_coef = float(self.ent_coef) - - with tf.variable_scope("target", reuse=False): - # Create the value network - _, _, value_target = self.target_policy.make_critics(self.processed_next_obs_ph, - create_qf=False, create_vf=True) - self.value_target = value_target - - with tf.variable_scope("loss", reuse=False): - # Take the min of the two Q-Values (Double-Q Learning) - min_qf_pi = tf.minimum(qf1_pi, qf2_pi) - - # Target for Q value regression - q_backup = tf.stop_gradient( - self.rewards_ph + - (1 - self.terminals_ph) * self.gamma * self.value_target - ) - - # Compute Q-Function loss - # TODO: test with huber loss (it would avoid too high values) - qf1_loss = 0.5 * tf.reduce_mean((q_backup - qf1) ** 2) - qf2_loss = 0.5 * tf.reduce_mean((q_backup - qf2) ** 2) - - # Compute the entropy temperature loss - # it is used when the entropy coefficient is learned - ent_coef_loss, entropy_optimizer = None, None - if not isinstance(self.ent_coef, float): - ent_coef_loss = -tf.reduce_mean( - self.log_ent_coef * tf.stop_gradient(logp_pi + self.target_entropy)) - entropy_optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate_ph) - - # Compute the policy loss - # Alternative: policy_kl_loss = tf.reduce_mean(logp_pi - min_qf_pi) - policy_kl_loss = tf.reduce_mean(self.ent_coef * logp_pi - qf1_pi) - - # NOTE: in the original implementation, they have an additional - # regularization loss for the Gaussian parameters - # this is not used for now - # policy_loss = (policy_kl_loss + policy_regularization_loss) - policy_loss = policy_kl_loss - - # Target for value fn regression - # We update the vf towards the min of two Q-functions in order to - # reduce overestimation bias from function approximation error. - v_backup = tf.stop_gradient(min_qf_pi - self.ent_coef * logp_pi) - value_loss = 0.5 * tf.reduce_mean((value_fn - v_backup) ** 2) - - values_losses = qf1_loss + qf2_loss + value_loss - - # Policy train op - # (has to be separate from value train op, because min_qf_pi appears in policy_loss) - policy_optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate_ph) - policy_train_op = policy_optimizer.minimize(policy_loss, var_list=tf_util.get_trainable_vars('model/pi')) - - # Value train op - value_optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate_ph) - values_params = tf_util.get_trainable_vars('model/values_fn') - - source_params = tf_util.get_trainable_vars("model/values_fn") - target_params = tf_util.get_trainable_vars("target/values_fn") - - # Polyak averaging for target variables - self.target_update_op = [ - tf.assign(target, (1 - self.tau) * target + self.tau * source) - for target, source in zip(target_params, source_params) - ] - # Initializing target to match source variables - target_init_op = [ - tf.assign(target, source) - for target, source in zip(target_params, source_params) - ] - - # Control flow is used because sess.run otherwise evaluates in nondeterministic order - # and we first need to compute the policy action before computing q values losses - with tf.control_dependencies([policy_train_op]): - train_values_op = value_optimizer.minimize(values_losses, var_list=values_params) - - self.infos_names = ['policy_loss', 'qf1_loss', 'qf2_loss', 'value_loss', 'entropy'] - # All ops to call during one training step - self.step_ops = [policy_loss, qf1_loss, qf2_loss, - value_loss, qf1, qf2, value_fn, logp_pi, - self.entropy, policy_train_op, train_values_op] - - # Add entropy coefficient optimization operation if needed - if ent_coef_loss is not None: - with tf.control_dependencies([train_values_op]): - ent_coef_op = entropy_optimizer.minimize(ent_coef_loss, var_list=self.log_ent_coef) - self.infos_names += ['ent_coef_loss', 'ent_coef'] - self.step_ops += [ent_coef_op, ent_coef_loss, self.ent_coef] - - # Monitor losses and entropy in tensorboard - tf.summary.scalar('policy_loss', policy_loss) - tf.summary.scalar('qf1_loss', qf1_loss) - tf.summary.scalar('qf2_loss', qf2_loss) - tf.summary.scalar('value_loss', value_loss) - tf.summary.scalar('entropy', self.entropy) - if ent_coef_loss is not None: - tf.summary.scalar('ent_coef_loss', ent_coef_loss) - tf.summary.scalar('ent_coef', self.ent_coef) - - tf.summary.scalar('learning_rate', tf.reduce_mean(self.learning_rate_ph)) - - # Retrieve parameters that must be saved - self.params = tf_util.get_trainable_vars("model") - self.target_params = tf_util.get_trainable_vars("target/values_fn") - - # Initialize Variables and target network - with self.sess.as_default(): - self.sess.run(tf.global_variables_initializer()) - self.sess.run(target_init_op) - - self.summary = tf.summary.merge_all() - - def _train_step(self, step, writer, learning_rate): - # Sample a batch from the replay buffer - batch = self.replay_buffer.sample(self.batch_size, env=self._vec_normalize_env) - batch_obs, batch_actions, batch_rewards, batch_next_obs, batch_dones = batch - - feed_dict = { - self.observations_ph: batch_obs, - self.actions_ph: batch_actions, - self.next_observations_ph: batch_next_obs, - self.rewards_ph: batch_rewards.reshape(self.batch_size, -1), - self.terminals_ph: batch_dones.reshape(self.batch_size, -1), - self.learning_rate_ph: learning_rate - } - - # out = [policy_loss, qf1_loss, qf2_loss, - # value_loss, qf1, qf2, value_fn, logp_pi, - # self.entropy, policy_train_op, train_values_op] - - # Do one gradient step - # and optionally compute log for tensorboard - if writer is not None: - out = self.sess.run([self.summary] + self.step_ops, feed_dict) - summary = out.pop(0) - writer.add_summary(summary, step) - else: - out = self.sess.run(self.step_ops, feed_dict) - - # Unpack to monitor losses and entropy - policy_loss, qf1_loss, qf2_loss, value_loss, *values = out - # qf1, qf2, value_fn, logp_pi, entropy, *_ = values - entropy = values[4] - - if self.log_ent_coef is not None: - ent_coef_loss, ent_coef = values[-2:] - return policy_loss, qf1_loss, qf2_loss, value_loss, entropy, ent_coef_loss, ent_coef - - return policy_loss, qf1_loss, qf2_loss, value_loss, entropy - - def learn(self, total_timesteps, callback=None, - log_interval=4, tb_log_name="SAC", reset_num_timesteps=True, replay_wrapper=None): - - new_tb_log = self._init_num_timesteps(reset_num_timesteps) - callback = self._init_callback(callback) - - if replay_wrapper is not None: - self.replay_buffer = replay_wrapper(self.replay_buffer) - - with SetVerbosity(self.verbose), TensorboardWriter(self.graph, self.tensorboard_log, tb_log_name, new_tb_log) \ - as writer: - - self._setup_learn() - - # Transform to callable if needed - self.learning_rate = get_schedule_fn(self.learning_rate) - # Initial learning rate - current_lr = self.learning_rate(1) - - start_time = time.time() - episode_rewards = [0.0] - episode_successes = [] - if self.action_noise is not None: - self.action_noise.reset() - obs = self.env.reset() - # Retrieve unnormalized observation for saving into the buffer - if self._vec_normalize_env is not None: - obs_ = self._vec_normalize_env.get_original_obs().squeeze() - - n_updates = 0 - infos_values = [] - - callback.on_training_start(locals(), globals()) - callback.on_rollout_start() - - for step in range(total_timesteps): - # Before training starts, randomly sample actions - # from a uniform distribution for better exploration. - # Afterwards, use the learned policy - # if random_exploration is set to 0 (normal setting) - if self.num_timesteps < self.learning_starts or np.random.rand() < self.random_exploration: - # actions sampled from action space are from range specific to the environment - # but algorithm operates on tanh-squashed actions therefore simple scaling is used - unscaled_action = self.env.action_space.sample() - action = scale_action(self.action_space, unscaled_action) - else: - action = self.policy_tf.step(obs[None], deterministic=False).flatten() - # Add noise to the action (improve exploration, - # not needed in general) - if self.action_noise is not None: - action = np.clip(action + self.action_noise(), -1, 1) - # inferred actions need to be transformed to environment action_space before stepping - unscaled_action = unscale_action(self.action_space, action) - - assert action.shape == self.env.action_space.shape - - new_obs, reward, done, info = self.env.step(unscaled_action) - - self.num_timesteps += 1 - - # Only stop training if return value is False, not when it is None. This is for backwards - # compatibility with callbacks that have no return statement. - callback.update_locals(locals()) - if callback.on_step() is False: - break - - # Store only the unnormalized version - if self._vec_normalize_env is not None: - new_obs_ = self._vec_normalize_env.get_original_obs().squeeze() - reward_ = self._vec_normalize_env.get_original_reward().squeeze() - else: - # Avoid changing the original ones - obs_, new_obs_, reward_ = obs, new_obs, reward - - # Store transition in the replay buffer. - self.replay_buffer_add(obs_, action, reward_, new_obs_, done, info) - obs = new_obs - # Save the unnormalized observation - if self._vec_normalize_env is not None: - obs_ = new_obs_ - - # Retrieve reward and episode length if using Monitor wrapper - maybe_ep_info = info.get('episode') - if maybe_ep_info is not None: - self.ep_info_buf.extend([maybe_ep_info]) - - if writer is not None: - # Write reward per episode to tensorboard - ep_reward = np.array([reward_]).reshape((1, -1)) - ep_done = np.array([done]).reshape((1, -1)) - tf_util.total_episode_reward_logger(self.episode_reward, ep_reward, - ep_done, writer, self.num_timesteps) - - if self.num_timesteps % self.train_freq == 0: - callback.on_rollout_end() - - mb_infos_vals = [] - # Update policy, critics and target networks - for grad_step in range(self.gradient_steps): - # Break if the warmup phase is not over - # or if there are not enough samples in the replay buffer - if not self.replay_buffer.can_sample(self.batch_size) \ - or self.num_timesteps < self.learning_starts: - break - n_updates += 1 - # Compute current learning_rate - frac = 1.0 - step / total_timesteps - current_lr = self.learning_rate(frac) - # Update policy and critics (q functions) - mb_infos_vals.append(self._train_step(step, writer, current_lr)) - # Update target network - if (step + grad_step) % self.target_update_interval == 0: - # Update target network - self.sess.run(self.target_update_op) - # Log losses and entropy, useful for monitor training - if len(mb_infos_vals) > 0: - infos_values = np.mean(mb_infos_vals, axis=0) - - callback.on_rollout_start() - - episode_rewards[-1] += reward_ - if done: - if self.action_noise is not None: - self.action_noise.reset() - if not isinstance(self.env, VecEnv): - obs = self.env.reset() - episode_rewards.append(0.0) - - maybe_is_success = info.get('is_success') - if maybe_is_success is not None: - episode_successes.append(float(maybe_is_success)) - - if len(episode_rewards[-101:-1]) == 0: - mean_reward = -np.inf - else: - mean_reward = round(float(np.mean(episode_rewards[-101:-1])), 1) - - # substract 1 as we appended a new term just now - num_episodes = len(episode_rewards) - 1 - # Display training infos - if self.verbose >= 1 and done and log_interval is not None and num_episodes % log_interval == 0: - fps = int(step / (time.time() - start_time)) - logger.logkv("episodes", num_episodes) - logger.logkv("mean 100 episode reward", mean_reward) - if len(self.ep_info_buf) > 0 and len(self.ep_info_buf[0]) > 0: - logger.logkv('ep_rewmean', safe_mean([ep_info['r'] for ep_info in self.ep_info_buf])) - logger.logkv('eplenmean', safe_mean([ep_info['l'] for ep_info in self.ep_info_buf])) - logger.logkv("n_updates", n_updates) - logger.logkv("current_lr", current_lr) - logger.logkv("fps", fps) - logger.logkv('time_elapsed', int(time.time() - start_time)) - if len(episode_successes) > 0: - logger.logkv("success rate", np.mean(episode_successes[-100:])) - if len(infos_values) > 0: - for (name, val) in zip(self.infos_names, infos_values): - logger.logkv(name, val) - logger.logkv("total timesteps", self.num_timesteps) - logger.dumpkvs() - # Reset infos: - infos_values = [] - callback.on_training_end() - return self - - def action_probability(self, observation, state=None, mask=None, actions=None, logp=False): - if actions is not None: - raise ValueError("Error: SAC does not have action probabilities.") - - warnings.warn("Even though SAC has a Gaussian policy, it cannot return a distribution as it " - "is squashed by a tanh before being scaled and outputed.") - - return None - - def predict(self, observation, state=None, mask=None, deterministic=True): - observation = np.array(observation) - vectorized_env = self._is_vectorized_observation(observation, self.observation_space) - - observation = observation.reshape((-1,) + self.observation_space.shape) - actions = self.policy_tf.step(observation, deterministic=deterministic) - actions = actions.reshape((-1,) + self.action_space.shape) # reshape to the correct action shape - actions = unscale_action(self.action_space, actions) # scale the output for the prediction - - if not vectorized_env: - actions = actions[0] - - return actions, None - - def get_parameter_list(self): - return (self.params + - self.target_params) - - def save(self, save_path, cloudpickle=False): - data = { - "learning_rate": self.learning_rate, - "buffer_size": self.buffer_size, - "learning_starts": self.learning_starts, - "train_freq": self.train_freq, - "batch_size": self.batch_size, - "tau": self.tau, - "ent_coef": self.ent_coef if isinstance(self.ent_coef, float) else 'auto', - "target_entropy": self.target_entropy, - # Should we also store the replay buffer? - # this may lead to high memory usage - # with all transition inside - # "replay_buffer": self.replay_buffer - "gamma": self.gamma, - "verbose": self.verbose, - "observation_space": self.observation_space, - "action_space": self.action_space, - "policy": self.policy, - "n_envs": self.n_envs, - "n_cpu_tf_sess": self.n_cpu_tf_sess, - "seed": self.seed, - "action_noise": self.action_noise, - "random_exploration": self.random_exploration, - "_vectorize_action": self._vectorize_action, - "policy_kwargs": self.policy_kwargs - } - - params_to_save = self.get_parameters() - - self._save_to_file(save_path, data=data, params=params_to_save, cloudpickle=cloudpickle) diff --git a/stable_baselines/td3/__init__.py b/stable_baselines/td3/__init__.py deleted file mode 100644 index e8b55838..00000000 --- a/stable_baselines/td3/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from stable_baselines.common.noise import NormalActionNoise, OrnsteinUhlenbeckActionNoise -from stable_baselines.td3.td3 import TD3 -from stable_baselines.td3.policies import MlpPolicy, CnnPolicy, LnMlpPolicy, LnCnnPolicy diff --git a/stable_baselines/td3/policies.py b/stable_baselines/td3/policies.py deleted file mode 100644 index bc688900..00000000 --- a/stable_baselines/td3/policies.py +++ /dev/null @@ -1,242 +0,0 @@ -import tensorflow as tf -from gym.spaces import Box - -from stable_baselines.common.policies import BasePolicy, nature_cnn, register_policy -from stable_baselines.common.tf_layers import mlp - - -class TD3Policy(BasePolicy): - """ - Policy object that implements a TD3-like actor critic - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param scale: (bool) whether or not to scale the input - """ - - def __init__(self, sess, ob_space, ac_space, n_env=1, n_steps=1, n_batch=None, reuse=False, scale=False): - super(TD3Policy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse=reuse, scale=scale) - assert isinstance(ac_space, Box), "Error: the action space must be of type gym.spaces.Box" - - self.qf1 = None - self.qf2 = None - self.policy = None - - def make_actor(self, obs=None, reuse=False, scope="pi"): - """ - Creates an actor object - - :param obs: (TensorFlow Tensor) The observation placeholder (can be None for default placeholder) - :param reuse: (bool) whether or not to reuse parameters - :param scope: (str) the scope name of the actor - :return: (TensorFlow Tensor) the output tensor - """ - raise NotImplementedError - - def make_critics(self, obs=None, action=None, reuse=False, - scope="qvalues_fn"): - """ - Creates the two Q-Values approximator - - :param obs: (TensorFlow Tensor) The observation placeholder (can be None for default placeholder) - :param action: (TensorFlow Tensor) The action placeholder - :param reuse: (bool) whether or not to reuse parameters - :param scope: (str) the scope name - :return: ([tf.Tensor]) Mean, action and log probability - """ - raise NotImplementedError - - def step(self, obs, state=None, mask=None): - """ - Returns the policy for a single step - - :param obs: ([float] or [int]) The current observation of the environment - :param state: ([float]) The last states (used in recurrent policies) - :param mask: ([float]) The last masks (used in recurrent policies) - :return: ([float]) actions - """ - raise NotImplementedError - - def proba_step(self, obs, state=None, mask=None): - """ - Returns the policy for a single step - - :param obs: ([float] or [int]) The current observation of the environment - :param state: ([float]) The last states (used in recurrent policies) - :param mask: ([float]) The last masks (used in recurrent policies) - :return: ([float]) actions - """ - return self.step(obs, state, mask) - - -class FeedForwardPolicy(TD3Policy): - """ - Policy object that implements a DDPG-like actor critic, using a feed forward neural network. - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param layers: ([int]) The size of the Neural network for the policy (if None, default to [64, 64]) - :param cnn_extractor: (function (TensorFlow Tensor, ``**kwargs``): (TensorFlow Tensor)) the CNN feature extraction - :param feature_extraction: (str) The feature extraction type ("cnn" or "mlp") - :param layer_norm: (bool) enable layer normalisation - :param act_fun: (tf.func) the activation function to use in the neural network. - :param kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env=1, n_steps=1, n_batch=None, reuse=False, layers=None, - cnn_extractor=nature_cnn, feature_extraction="cnn", - layer_norm=False, act_fun=tf.nn.relu, **kwargs): - super(FeedForwardPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, - reuse=reuse, scale=(feature_extraction == "cnn")) - - self._kwargs_check(feature_extraction, kwargs) - self.layer_norm = layer_norm - self.feature_extraction = feature_extraction - self.cnn_kwargs = kwargs - self.cnn_extractor = cnn_extractor - self.reuse = reuse - if layers is None: - layers = [64, 64] - self.layers = layers - - assert len(layers) >= 1, "Error: must have at least one hidden layer for the policy." - - self.activ_fn = act_fun - - def make_actor(self, obs=None, reuse=False, scope="pi"): - if obs is None: - obs = self.processed_obs - - with tf.variable_scope(scope, reuse=reuse): - if self.feature_extraction == "cnn": - pi_h = self.cnn_extractor(obs, **self.cnn_kwargs) - else: - pi_h = tf.layers.flatten(obs) - - pi_h = mlp(pi_h, self.layers, self.activ_fn, layer_norm=self.layer_norm) - - self.policy = policy = tf.layers.dense(pi_h, self.ac_space.shape[0], activation=tf.tanh) - - return policy - - def make_critics(self, obs=None, action=None, reuse=False, scope="values_fn"): - if obs is None: - obs = self.processed_obs - - with tf.variable_scope(scope, reuse=reuse): - if self.feature_extraction == "cnn": - critics_h = self.cnn_extractor(obs, **self.cnn_kwargs) - else: - critics_h = tf.layers.flatten(obs) - - # Concatenate preprocessed state and action - qf_h = tf.concat([critics_h, action], axis=-1) - - # Double Q values to reduce overestimation - with tf.variable_scope('qf1', reuse=reuse): - qf1_h = mlp(qf_h, self.layers, self.activ_fn, layer_norm=self.layer_norm) - qf1 = tf.layers.dense(qf1_h, 1, name="qf1") - - with tf.variable_scope('qf2', reuse=reuse): - qf2_h = mlp(qf_h, self.layers, self.activ_fn, layer_norm=self.layer_norm) - qf2 = tf.layers.dense(qf2_h, 1, name="qf2") - - self.qf1 = qf1 - self.qf2 = qf2 - - return self.qf1, self.qf2 - - def step(self, obs, state=None, mask=None): - return self.sess.run(self.policy, {self.obs_ph: obs}) - - -class CnnPolicy(FeedForwardPolicy): - """ - Policy object that implements actor critic, using a CNN (the nature CNN) - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param _kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env=1, n_steps=1, n_batch=None, reuse=False, **_kwargs): - super(CnnPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse, - feature_extraction="cnn", **_kwargs) - - -class LnCnnPolicy(FeedForwardPolicy): - """ - Policy object that implements actor critic, using a CNN (the nature CNN), with layer normalisation - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param _kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env=1, n_steps=1, n_batch=None, reuse=False, **_kwargs): - super(LnCnnPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse, - feature_extraction="cnn", layer_norm=True, **_kwargs) - - -class MlpPolicy(FeedForwardPolicy): - """ - Policy object that implements actor critic, using a MLP (2 layers of 64) - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param _kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env=1, n_steps=1, n_batch=None, reuse=False, **_kwargs): - super(MlpPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse, - feature_extraction="mlp", **_kwargs) - - -class LnMlpPolicy(FeedForwardPolicy): - """ - Policy object that implements actor critic, using a MLP (2 layers of 64), with layer normalisation - - :param sess: (TensorFlow session) The current TensorFlow session - :param ob_space: (Gym Space) The observation space of the environment - :param ac_space: (Gym Space) The action space of the environment - :param n_env: (int) The number of environments to run - :param n_steps: (int) The number of steps to run for each environment - :param n_batch: (int) The number of batch to run (n_envs * n_steps) - :param reuse: (bool) If the policy is reusable or not - :param _kwargs: (dict) Extra keyword arguments for the nature CNN feature extraction - """ - - def __init__(self, sess, ob_space, ac_space, n_env=1, n_steps=1, n_batch=None, reuse=False, **_kwargs): - super(LnMlpPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse, - feature_extraction="mlp", layer_norm=True, **_kwargs) - - -register_policy("CnnPolicy", CnnPolicy) -register_policy("LnCnnPolicy", LnCnnPolicy) -register_policy("MlpPolicy", MlpPolicy) -register_policy("LnMlpPolicy", LnMlpPolicy) diff --git a/stable_baselines/td3/td3.py b/stable_baselines/td3/td3.py deleted file mode 100644 index 5f65d8bb..00000000 --- a/stable_baselines/td3/td3.py +++ /dev/null @@ -1,501 +0,0 @@ -import time -import warnings - -import numpy as np -import tensorflow as tf - -from stable_baselines import logger -from stable_baselines.common import tf_util, OffPolicyRLModel, SetVerbosity, TensorboardWriter -from stable_baselines.common.vec_env import VecEnv -from stable_baselines.common.math_util import safe_mean, unscale_action, scale_action -from stable_baselines.common.schedules import get_schedule_fn -from stable_baselines.common.buffers import ReplayBuffer -from stable_baselines.td3.policies import TD3Policy - - -class TD3(OffPolicyRLModel): - """ - Twin Delayed DDPG (TD3) - Addressing Function Approximation Error in Actor-Critic Methods. - - Original implementation: https://github.com/sfujim/TD3 - Paper: https://arxiv.org/pdf/1802.09477.pdf - Introduction to TD3: https://spinningup.openai.com/en/latest/algorithms/td3.html - - :param policy: (TD3Policy or str) The policy model to use (MlpPolicy, CnnPolicy, LnMlpPolicy, ...) - :param env: (Gym environment or str) The environment to learn from (if registered in Gym, can be str) - :param gamma: (float) the discount factor - :param learning_rate: (float or callable) learning rate for adam optimizer, - the same learning rate will be used for all networks (Q-Values and Actor networks) - it can be a function of the current progress (from 1 to 0) - :param buffer_size: (int) size of the replay buffer - :param batch_size: (int) Minibatch size for each gradient update - :param tau: (float) the soft update coefficient ("polyak update" of the target networks, between 0 and 1) - :param policy_delay: (int) Policy and target networks will only be updated once every policy_delay steps - per training steps. The Q values will be updated policy_delay more often (update every training step). - :param action_noise: (ActionNoise) the action noise type. Cf DDPG for the different action noise type. - :param target_policy_noise: (float) Standard deviation of Gaussian noise added to target policy - (smoothing noise) - :param target_noise_clip: (float) Limit for absolute value of target policy smoothing noise. - :param train_freq: (int) Update the model every `train_freq` steps. - :param learning_starts: (int) how many steps of the model to collect transitions for before learning starts - :param gradient_steps: (int) How many gradient update after each step - :param random_exploration: (float) Probability of taking a random action (as in an epsilon-greedy strategy) - This is not needed for TD3 normally but can help exploring when using HER + TD3. - This hack was present in the original OpenAI Baselines repo (DDPG + HER) - :param verbose: (int) the verbosity level: 0 none, 1 training information, 2 tensorflow debug - :param tensorboard_log: (str) the log location for tensorboard (if None, no logging) - :param _init_setup_model: (bool) Whether or not to build the network at the creation of the instance - :param policy_kwargs: (dict) additional arguments to be passed to the policy on creation - :param full_tensorboard_log: (bool) enable additional logging when using tensorboard - Note: this has no effect on TD3 logging for now - :param seed: (int) Seed for the pseudo-random generators (python, numpy, tensorflow). - If None (default), use random seed. Note that if you want completely deterministic - results, you must set `n_cpu_tf_sess` to 1. - :param n_cpu_tf_sess: (int) The number of threads for TensorFlow operations - If None, the number of cpu of the current machine will be used. - """ - def __init__(self, policy, env, gamma=0.99, learning_rate=3e-4, buffer_size=50000, - learning_starts=100, train_freq=100, gradient_steps=100, batch_size=128, - tau=0.005, policy_delay=2, action_noise=None, - target_policy_noise=0.2, target_noise_clip=0.5, - random_exploration=0.0, verbose=0, tensorboard_log=None, - _init_setup_model=True, policy_kwargs=None, - full_tensorboard_log=False, seed=None, n_cpu_tf_sess=None): - - super(TD3, self).__init__(policy=policy, env=env, replay_buffer=None, verbose=verbose, - policy_base=TD3Policy, requires_vec_env=False, policy_kwargs=policy_kwargs, - seed=seed, n_cpu_tf_sess=n_cpu_tf_sess) - - self.buffer_size = buffer_size - self.learning_rate = learning_rate - self.learning_starts = learning_starts - self.train_freq = train_freq - self.batch_size = batch_size - self.tau = tau - self.gradient_steps = gradient_steps - self.gamma = gamma - self.action_noise = action_noise - self.random_exploration = random_exploration - self.policy_delay = policy_delay - self.target_noise_clip = target_noise_clip - self.target_policy_noise = target_policy_noise - - self.graph = None - self.replay_buffer = None - self.sess = None - self.tensorboard_log = tensorboard_log - self.verbose = verbose - self.params = None - self.summary = None - self.policy_tf = None - self.full_tensorboard_log = full_tensorboard_log - - self.obs_target = None - self.target_policy_tf = None - self.actions_ph = None - self.rewards_ph = None - self.terminals_ph = None - self.observations_ph = None - self.action_target = None - self.next_observations_ph = None - self.step_ops = None - self.target_ops = None - self.infos_names = None - self.target_params = None - self.learning_rate_ph = None - self.processed_obs_ph = None - self.processed_next_obs_ph = None - self.policy_out = None - self.policy_train_op = None - self.policy_loss = None - - if _init_setup_model: - self.setup_model() - - def _get_pretrain_placeholders(self): - policy = self.policy_tf - # Rescale - policy_out = unscale_action(self.action_space, self.policy_out) - return policy.obs_ph, self.actions_ph, policy_out - - def setup_model(self): - with SetVerbosity(self.verbose): - self.graph = tf.Graph() - with self.graph.as_default(): - self.set_random_seed(self.seed) - self.sess = tf_util.make_session(num_cpu=self.n_cpu_tf_sess, graph=self.graph) - - self.replay_buffer = ReplayBuffer(self.buffer_size) - - with tf.variable_scope("input", reuse=False): - # Create policy and target TF objects - self.policy_tf = self.policy(self.sess, self.observation_space, self.action_space, - **self.policy_kwargs) - self.target_policy_tf = self.policy(self.sess, self.observation_space, self.action_space, - **self.policy_kwargs) - - # Initialize Placeholders - self.observations_ph = self.policy_tf.obs_ph - # Normalized observation for pixels - self.processed_obs_ph = self.policy_tf.processed_obs - self.next_observations_ph = self.target_policy_tf.obs_ph - self.processed_next_obs_ph = self.target_policy_tf.processed_obs - self.action_target = self.target_policy_tf.action_ph - self.terminals_ph = tf.placeholder(tf.float32, shape=(None, 1), name='terminals') - self.rewards_ph = tf.placeholder(tf.float32, shape=(None, 1), name='rewards') - self.actions_ph = tf.placeholder(tf.float32, shape=(None,) + self.action_space.shape, - name='actions') - self.learning_rate_ph = tf.placeholder(tf.float32, [], name="learning_rate_ph") - - with tf.variable_scope("model", reuse=False): - # Create the policy - self.policy_out = policy_out = self.policy_tf.make_actor(self.processed_obs_ph) - # Use two Q-functions to improve performance by reducing overestimation bias - qf1, qf2 = self.policy_tf.make_critics(self.processed_obs_ph, self.actions_ph) - # Q value when following the current policy - qf1_pi, _ = self.policy_tf.make_critics(self.processed_obs_ph, - policy_out, reuse=True) - - with tf.variable_scope("target", reuse=False): - # Create target networks - target_policy_out = self.target_policy_tf.make_actor(self.processed_next_obs_ph) - # Target policy smoothing, by adding clipped noise to target actions - target_noise = tf.random_normal(tf.shape(target_policy_out), stddev=self.target_policy_noise) - target_noise = tf.clip_by_value(target_noise, -self.target_noise_clip, self.target_noise_clip) - # Clip the noisy action to remain in the bounds [-1, 1] (output of a tanh) - noisy_target_action = tf.clip_by_value(target_policy_out + target_noise, -1, 1) - # Q values when following the target policy - qf1_target, qf2_target = self.target_policy_tf.make_critics(self.processed_next_obs_ph, - noisy_target_action) - - with tf.variable_scope("loss", reuse=False): - # Take the min of the two target Q-Values (clipped Double-Q Learning) - min_qf_target = tf.minimum(qf1_target, qf2_target) - - # Targets for Q value regression - q_backup = tf.stop_gradient( - self.rewards_ph + - (1 - self.terminals_ph) * self.gamma * min_qf_target - ) - - # Compute Q-Function loss - qf1_loss = tf.reduce_mean((q_backup - qf1) ** 2) - qf2_loss = tf.reduce_mean((q_backup - qf2) ** 2) - - qvalues_losses = qf1_loss + qf2_loss - - # Policy loss: maximise q value - self.policy_loss = policy_loss = -tf.reduce_mean(qf1_pi) - - # Policy train op - # will be called only every n training steps, - # where n is the policy delay - policy_optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate_ph) - policy_train_op = policy_optimizer.minimize(policy_loss, var_list=tf_util.get_trainable_vars('model/pi')) - self.policy_train_op = policy_train_op - - # Q Values optimizer - qvalues_optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate_ph) - qvalues_params = tf_util.get_trainable_vars('model/values_fn/') - - # Q Values and policy target params - source_params = tf_util.get_trainable_vars("model/") - target_params = tf_util.get_trainable_vars("target/") - - # Polyak averaging for target variables - self.target_ops = [ - tf.assign(target, (1 - self.tau) * target + self.tau * source) - for target, source in zip(target_params, source_params) - ] - - # Initializing target to match source variables - target_init_op = [ - tf.assign(target, source) - for target, source in zip(target_params, source_params) - ] - - train_values_op = qvalues_optimizer.minimize(qvalues_losses, var_list=qvalues_params) - - self.infos_names = ['qf1_loss', 'qf2_loss'] - # All ops to call during one training step - self.step_ops = [qf1_loss, qf2_loss, - qf1, qf2, train_values_op] - - # Monitor losses and entropy in tensorboard - tf.summary.scalar('policy_loss', policy_loss) - tf.summary.scalar('qf1_loss', qf1_loss) - tf.summary.scalar('qf2_loss', qf2_loss) - tf.summary.scalar('learning_rate', tf.reduce_mean(self.learning_rate_ph)) - - # Retrieve parameters that must be saved - self.params = tf_util.get_trainable_vars("model") - self.target_params = tf_util.get_trainable_vars("target/") - - # Initialize Variables and target network - with self.sess.as_default(): - self.sess.run(tf.global_variables_initializer()) - self.sess.run(target_init_op) - - self.summary = tf.summary.merge_all() - - def _train_step(self, step, writer, learning_rate, update_policy): - # Sample a batch from the replay buffer - batch = self.replay_buffer.sample(self.batch_size, env=self._vec_normalize_env) - batch_obs, batch_actions, batch_rewards, batch_next_obs, batch_dones = batch - - feed_dict = { - self.observations_ph: batch_obs, - self.actions_ph: batch_actions, - self.next_observations_ph: batch_next_obs, - self.rewards_ph: batch_rewards.reshape(self.batch_size, -1), - self.terminals_ph: batch_dones.reshape(self.batch_size, -1), - self.learning_rate_ph: learning_rate - } - - step_ops = self.step_ops - if update_policy: - # Update policy and target networks - step_ops = step_ops + [self.policy_train_op, self.target_ops, self.policy_loss] - - # Do one gradient step - # and optionally compute log for tensorboard - if writer is not None: - out = self.sess.run([self.summary] + step_ops, feed_dict) - summary = out.pop(0) - writer.add_summary(summary, step) - else: - out = self.sess.run(step_ops, feed_dict) - - # Unpack to monitor losses - qf1_loss, qf2_loss, *_values = out - - return qf1_loss, qf2_loss - - def learn(self, total_timesteps, callback=None, - log_interval=4, tb_log_name="TD3", reset_num_timesteps=True, replay_wrapper=None): - - new_tb_log = self._init_num_timesteps(reset_num_timesteps) - callback = self._init_callback(callback) - - if replay_wrapper is not None: - self.replay_buffer = replay_wrapper(self.replay_buffer) - - with SetVerbosity(self.verbose), TensorboardWriter(self.graph, self.tensorboard_log, tb_log_name, new_tb_log) \ - as writer: - - self._setup_learn() - - # Transform to callable if needed - self.learning_rate = get_schedule_fn(self.learning_rate) - # Initial learning rate - current_lr = self.learning_rate(1) - - start_time = time.time() - episode_rewards = [0.0] - episode_successes = [] - if self.action_noise is not None: - self.action_noise.reset() - obs = self.env.reset() - # Retrieve unnormalized observation for saving into the buffer - if self._vec_normalize_env is not None: - obs_ = self._vec_normalize_env.get_original_obs().squeeze() - n_updates = 0 - infos_values = [] - - callback.on_training_start(locals(), globals()) - callback.on_rollout_start() - - for step in range(total_timesteps): - # Before training starts, randomly sample actions - # from a uniform distribution for better exploration. - # Afterwards, use the learned policy - # if random_exploration is set to 0 (normal setting) - if self.num_timesteps < self.learning_starts or np.random.rand() < self.random_exploration: - # actions sampled from action space are from range specific to the environment - # but algorithm operates on tanh-squashed actions therefore simple scaling is used - unscaled_action = self.env.action_space.sample() - action = scale_action(self.action_space, unscaled_action) - else: - action = self.policy_tf.step(obs[None]).flatten() - # Add noise to the action, as the policy - # is deterministic, this is required for exploration - if self.action_noise is not None: - action = np.clip(action + self.action_noise(), -1, 1) - # Rescale from [-1, 1] to the correct bounds - unscaled_action = unscale_action(self.action_space, action) - - assert action.shape == self.env.action_space.shape - - new_obs, reward, done, info = self.env.step(unscaled_action) - - self.num_timesteps += 1 - - # Only stop training if return value is False, not when it is None. This is for backwards - # compatibility with callbacks that have no return statement. - callback.update_locals(locals()) - if callback.on_step() is False: - break - - # Store only the unnormalized version - if self._vec_normalize_env is not None: - new_obs_ = self._vec_normalize_env.get_original_obs().squeeze() - reward_ = self._vec_normalize_env.get_original_reward().squeeze() - else: - # Avoid changing the original ones - obs_, new_obs_, reward_ = obs, new_obs, reward - - # Store transition in the replay buffer. - self.replay_buffer_add(obs_, action, reward_, new_obs_, done, info) - obs = new_obs - # Save the unnormalized observation - if self._vec_normalize_env is not None: - obs_ = new_obs_ - - # Retrieve reward and episode length if using Monitor wrapper - maybe_ep_info = info.get('episode') - if maybe_ep_info is not None: - self.ep_info_buf.extend([maybe_ep_info]) - - if writer is not None: - # Write reward per episode to tensorboard - ep_reward = np.array([reward_]).reshape((1, -1)) - ep_done = np.array([done]).reshape((1, -1)) - tf_util.total_episode_reward_logger(self.episode_reward, ep_reward, - ep_done, writer, self.num_timesteps) - - if self.num_timesteps % self.train_freq == 0: - callback.on_rollout_end() - - mb_infos_vals = [] - # Update policy, critics and target networks - for grad_step in range(self.gradient_steps): - # Break if the warmup phase is not over - # or if there are not enough samples in the replay buffer - if not self.replay_buffer.can_sample(self.batch_size) \ - or self.num_timesteps < self.learning_starts: - break - n_updates += 1 - # Compute current learning_rate - frac = 1.0 - step / total_timesteps - current_lr = self.learning_rate(frac) - # Update policy and critics (q functions) - # Note: the policy is updated less frequently than the Q functions - # this is controlled by the `policy_delay` parameter - mb_infos_vals.append( - self._train_step(step, writer, current_lr, (step + grad_step) % self.policy_delay == 0)) - - # Log losses and entropy, useful for monitor training - if len(mb_infos_vals) > 0: - infos_values = np.mean(mb_infos_vals, axis=0) - - callback.on_rollout_start() - - episode_rewards[-1] += reward_ - if done: - if self.action_noise is not None: - self.action_noise.reset() - if not isinstance(self.env, VecEnv): - obs = self.env.reset() - episode_rewards.append(0.0) - - maybe_is_success = info.get('is_success') - if maybe_is_success is not None: - episode_successes.append(float(maybe_is_success)) - - if len(episode_rewards[-101:-1]) == 0: - mean_reward = -np.inf - else: - mean_reward = round(float(np.mean(episode_rewards[-101:-1])), 1) - - # substract 1 as we appended a new term just now - num_episodes = len(episode_rewards) - 1 - # Display training infos - if self.verbose >= 1 and done and log_interval is not None and num_episodes % log_interval == 0: - fps = int(step / (time.time() - start_time)) - logger.logkv("episodes", num_episodes) - logger.logkv("mean 100 episode reward", mean_reward) - if len(self.ep_info_buf) > 0 and len(self.ep_info_buf[0]) > 0: - logger.logkv('ep_rewmean', safe_mean([ep_info['r'] for ep_info in self.ep_info_buf])) - logger.logkv('eplenmean', safe_mean([ep_info['l'] for ep_info in self.ep_info_buf])) - logger.logkv("n_updates", n_updates) - logger.logkv("current_lr", current_lr) - logger.logkv("fps", fps) - logger.logkv('time_elapsed', int(time.time() - start_time)) - if len(episode_successes) > 0: - logger.logkv("success rate", np.mean(episode_successes[-100:])) - if len(infos_values) > 0: - for (name, val) in zip(self.infos_names, infos_values): - logger.logkv(name, val) - logger.logkv("total timesteps", self.num_timesteps) - logger.dumpkvs() - # Reset infos: - infos_values = [] - - callback.on_training_end() - return self - - def action_probability(self, observation, state=None, mask=None, actions=None, logp=False): - _ = np.array(observation) - - if actions is not None: - raise ValueError("Error: TD3 does not have action probabilities.") - - # here there are no action probabilities, as DDPG does not use a probability distribution - warnings.warn("Warning: action probability is meaningless for TD3. Returning None") - return None - - def predict(self, observation, state=None, mask=None, deterministic=True): - observation = np.array(observation) - vectorized_env = self._is_vectorized_observation(observation, self.observation_space) - - observation = observation.reshape((-1,) + self.observation_space.shape) - actions = self.policy_tf.step(observation) - - if self.action_noise is not None and not deterministic: - actions = np.clip(actions + self.action_noise(), -1, 1) - - actions = actions.reshape((-1,) + self.action_space.shape) # reshape to the correct action shape - actions = unscale_action(self.action_space, actions) # scale the output for the prediction - - if not vectorized_env: - actions = actions[0] - - return actions, None - - def get_parameter_list(self): - return (self.params + - self.target_params) - - def save(self, save_path, cloudpickle=False): - data = { - "learning_rate": self.learning_rate, - "buffer_size": self.buffer_size, - "learning_starts": self.learning_starts, - "train_freq": self.train_freq, - "batch_size": self.batch_size, - "tau": self.tau, - # Should we also store the replay buffer? - # this may lead to high memory usage - # with all transition inside - # "replay_buffer": self.replay_buffer - "policy_delay": self.policy_delay, - "target_noise_clip": self.target_noise_clip, - "target_policy_noise": self.target_policy_noise, - "gamma": self.gamma, - "verbose": self.verbose, - "observation_space": self.observation_space, - "action_space": self.action_space, - "policy": self.policy, - "n_envs": self.n_envs, - "n_cpu_tf_sess": self.n_cpu_tf_sess, - "seed": self.seed, - "action_noise": self.action_noise, - "random_exploration": self.random_exploration, - "_vectorize_action": self._vectorize_action, - "policy_kwargs": self.policy_kwargs - } - - params_to_save = self.get_parameters() - - self._save_to_file(save_path, data=data, params=params_to_save, cloudpickle=cloudpickle) diff --git a/stable_baselines/trpo_mpi/__init__.py b/stable_baselines/trpo_mpi/__init__.py deleted file mode 100644 index 601d7f88..00000000 --- a/stable_baselines/trpo_mpi/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from stable_baselines.trpo_mpi.trpo_mpi import TRPO diff --git a/stable_baselines/trpo_mpi/run_atari.py b/stable_baselines/trpo_mpi/run_atari.py deleted file mode 100644 index dab662b2..00000000 --- a/stable_baselines/trpo_mpi/run_atari.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python3 -import os - -from mpi4py import MPI - -from stable_baselines.common import set_global_seeds -from stable_baselines import bench, logger, TRPO -from stable_baselines.common.atari_wrappers import make_atari, wrap_deepmind -from stable_baselines.common.cmd_util import atari_arg_parser -from stable_baselines.common.policies import CnnPolicy - - -def train(env_id, num_timesteps, seed): - """ - Train TRPO model for the atari environment, for testing purposes - - :param env_id: (str) Environment ID - :param num_timesteps: (int) The total number of samples - :param seed: (int) The initial seed for training - """ - rank = MPI.COMM_WORLD.Get_rank() - - if rank == 0: - logger.configure() - else: - logger.configure(format_strs=[]) - - workerseed = seed + 10000 * MPI.COMM_WORLD.Get_rank() - set_global_seeds(workerseed) - env = make_atari(env_id) - - env = bench.Monitor(env, logger.get_dir() and os.path.join(logger.get_dir(), str(rank))) - env.seed(workerseed) - - env = wrap_deepmind(env) - env.seed(workerseed) - - model = TRPO(CnnPolicy, env, timesteps_per_batch=512, max_kl=0.001, cg_iters=10, cg_damping=1e-3, entcoeff=0.0, - gamma=0.98, lam=1, vf_iters=3, vf_stepsize=1e-4) - model.learn(total_timesteps=int(num_timesteps * 1.1)) - env.close() - # Free memory - del env - - -def main(): - """ - Runs the test - """ - args = atari_arg_parser().parse_args() - train(args.env, num_timesteps=args.num_timesteps, seed=args.seed) - - -if __name__ == "__main__": - main() diff --git a/stable_baselines/trpo_mpi/run_mujoco.py b/stable_baselines/trpo_mpi/run_mujoco.py deleted file mode 100644 index de303dba..00000000 --- a/stable_baselines/trpo_mpi/run_mujoco.py +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/env python3 -# noinspection PyUnresolvedReferences -from mpi4py import MPI - -from stable_baselines.common.cmd_util import make_mujoco_env, mujoco_arg_parser -from stable_baselines.common.policies import MlpPolicy -from stable_baselines import logger -from stable_baselines.trpo_mpi import TRPO -import stable_baselines.common.tf_util as tf_util - - -def train(env_id, num_timesteps, seed): - """ - Train TRPO model for the mujoco environment, for testing purposes - - :param env_id: (str) Environment ID - :param num_timesteps: (int) The total number of samples - :param seed: (int) The initial seed for training - """ - with tf_util.single_threaded_session(): - rank = MPI.COMM_WORLD.Get_rank() - if rank == 0: - logger.configure() - else: - logger.configure(format_strs=[]) - logger.set_level(logger.DISABLED) - workerseed = seed + 10000 * MPI.COMM_WORLD.Get_rank() - - env = make_mujoco_env(env_id, workerseed) - model = TRPO(MlpPolicy, env, timesteps_per_batch=1024, max_kl=0.01, cg_iters=10, cg_damping=0.1, entcoeff=0.0, - gamma=0.99, lam=0.98, vf_iters=5, vf_stepsize=1e-3) - model.learn(total_timesteps=num_timesteps) - env.close() - - -def main(): - """ - Runs the test - """ - args = mujoco_arg_parser().parse_args() - train(args.env, num_timesteps=args.num_timesteps, seed=args.seed) - - -if __name__ == '__main__': - main() diff --git a/stable_baselines/trpo_mpi/trpo_mpi.py b/stable_baselines/trpo_mpi/trpo_mpi.py deleted file mode 100644 index 7d95356d..00000000 --- a/stable_baselines/trpo_mpi/trpo_mpi.py +++ /dev/null @@ -1,538 +0,0 @@ -import time -from contextlib import contextmanager -from collections import deque - -import gym -from mpi4py import MPI -import tensorflow as tf -import numpy as np - -import stable_baselines.common.tf_util as tf_util -from stable_baselines.common.tf_util import total_episode_reward_logger -from stable_baselines.common import explained_variance, zipsame, dataset, fmt_row, colorize, ActorCriticRLModel, \ - SetVerbosity, TensorboardWriter -from stable_baselines import logger -from stable_baselines.common.mpi_adam import MpiAdam -from stable_baselines.common.cg import conjugate_gradient -from stable_baselines.common.policies import ActorCriticPolicy -from stable_baselines.common.misc_util import flatten_lists -from stable_baselines.common.runners import traj_segment_generator -from stable_baselines.trpo_mpi.utils import add_vtarg_and_adv - - -class TRPO(ActorCriticRLModel): - """ - Trust Region Policy Optimization (https://arxiv.org/abs/1502.05477) - - :param policy: (ActorCriticPolicy or str) The policy model to use (MlpPolicy, CnnPolicy, CnnLstmPolicy, ...) - :param env: (Gym environment or str) The environment to learn from (if registered in Gym, can be str) - :param gamma: (float) the discount value - :param timesteps_per_batch: (int) the number of timesteps to run per batch (horizon) - :param max_kl: (float) the Kullback-Leibler loss threshold - :param cg_iters: (int) the number of iterations for the conjugate gradient calculation - :param lam: (float) GAE factor - :param entcoeff: (float) the weight for the entropy loss - :param cg_damping: (float) the compute gradient dampening factor - :param vf_stepsize: (float) the value function stepsize - :param vf_iters: (int) the value function's number iterations for learning - :param verbose: (int) the verbosity level: 0 none, 1 training information, 2 tensorflow debug - :param tensorboard_log: (str) the log location for tensorboard (if None, no logging) - :param _init_setup_model: (bool) Whether or not to build the network at the creation of the instance - :param policy_kwargs: (dict) additional arguments to be passed to the policy on creation - :param full_tensorboard_log: (bool) enable additional logging when using tensorboard - WARNING: this logging can take a lot of space quickly - :param seed: (int) Seed for the pseudo-random generators (python, numpy, tensorflow). - If None (default), use random seed. Note that if you want completely deterministic - results, you must set `n_cpu_tf_sess` to 1. - :param n_cpu_tf_sess: (int) The number of threads for TensorFlow operations - If None, the number of cpu of the current machine will be used. - """ - def __init__(self, policy, env, gamma=0.99, timesteps_per_batch=1024, max_kl=0.01, cg_iters=10, lam=0.98, - entcoeff=0.0, cg_damping=1e-2, vf_stepsize=3e-4, vf_iters=3, verbose=0, tensorboard_log=None, - _init_setup_model=True, policy_kwargs=None, full_tensorboard_log=False, - seed=None, n_cpu_tf_sess=1): - super(TRPO, self).__init__(policy=policy, env=env, verbose=verbose, requires_vec_env=False, - _init_setup_model=_init_setup_model, policy_kwargs=policy_kwargs, - seed=seed, n_cpu_tf_sess=n_cpu_tf_sess) - - self.using_gail = False - self.timesteps_per_batch = timesteps_per_batch - self.cg_iters = cg_iters - self.cg_damping = cg_damping - self.gamma = gamma - self.lam = lam - self.max_kl = max_kl - self.vf_iters = vf_iters - self.vf_stepsize = vf_stepsize - self.entcoeff = entcoeff - self.tensorboard_log = tensorboard_log - self.full_tensorboard_log = full_tensorboard_log - - # GAIL Params - self.hidden_size_adversary = 100 - self.adversary_entcoeff = 1e-3 - self.expert_dataset = None - self.g_step = 1 - self.d_step = 1 - self.d_stepsize = 3e-4 - - self.graph = None - self.sess = None - self.policy_pi = None - self.loss_names = None - self.assign_old_eq_new = None - self.compute_losses = None - self.compute_lossandgrad = None - self.compute_fvp = None - self.compute_vflossandgrad = None - self.d_adam = None - self.vfadam = None - self.get_flat = None - self.set_from_flat = None - self.timed = None - self.allmean = None - self.nworkers = None - self.rank = None - self.reward_giver = None - self.step = None - self.proba_step = None - self.initial_state = None - self.params = None - self.summary = None - - if _init_setup_model: - self.setup_model() - - def _get_pretrain_placeholders(self): - policy = self.policy_pi - action_ph = policy.pdtype.sample_placeholder([None]) - if isinstance(self.action_space, gym.spaces.Discrete): - return policy.obs_ph, action_ph, policy.policy - return policy.obs_ph, action_ph, policy.deterministic_action - - def setup_model(self): - # prevent import loops - from stable_baselines.gail.adversary import TransitionClassifier - - with SetVerbosity(self.verbose): - - assert issubclass(self.policy, ActorCriticPolicy), "Error: the input policy for the TRPO model must be " \ - "an instance of common.policies.ActorCriticPolicy." - - self.nworkers = MPI.COMM_WORLD.Get_size() - self.rank = MPI.COMM_WORLD.Get_rank() - np.set_printoptions(precision=3) - - self.graph = tf.Graph() - with self.graph.as_default(): - self.set_random_seed(self.seed) - self.sess = tf_util.make_session(num_cpu=self.n_cpu_tf_sess, graph=self.graph) - - if self.using_gail: - self.reward_giver = TransitionClassifier(self.observation_space, self.action_space, - self.hidden_size_adversary, - entcoeff=self.adversary_entcoeff) - - # Construct network for new policy - self.policy_pi = self.policy(self.sess, self.observation_space, self.action_space, self.n_envs, 1, - None, reuse=False, **self.policy_kwargs) - - # Network for old policy - with tf.variable_scope("oldpi", reuse=False): - old_policy = self.policy(self.sess, self.observation_space, self.action_space, self.n_envs, 1, - None, reuse=False, **self.policy_kwargs) - - with tf.variable_scope("loss", reuse=False): - atarg = tf.placeholder(dtype=tf.float32, shape=[None]) # Target advantage function (if applicable) - ret = tf.placeholder(dtype=tf.float32, shape=[None]) # Empirical return - - observation = self.policy_pi.obs_ph - action = self.policy_pi.pdtype.sample_placeholder([None]) - - kloldnew = old_policy.proba_distribution.kl(self.policy_pi.proba_distribution) - ent = self.policy_pi.proba_distribution.entropy() - meankl = tf.reduce_mean(kloldnew) - meanent = tf.reduce_mean(ent) - entbonus = self.entcoeff * meanent - - vferr = tf.reduce_mean(tf.square(self.policy_pi.value_flat - ret)) - - # advantage * pnew / pold - ratio = tf.exp(self.policy_pi.proba_distribution.logp(action) - - old_policy.proba_distribution.logp(action)) - surrgain = tf.reduce_mean(ratio * atarg) - - optimgain = surrgain + entbonus - losses = [optimgain, meankl, entbonus, surrgain, meanent] - self.loss_names = ["optimgain", "meankl", "entloss", "surrgain", "entropy"] - - dist = meankl - - all_var_list = tf_util.get_trainable_vars("model") - var_list = [v for v in all_var_list if "/vf" not in v.name and "/q/" not in v.name] - vf_var_list = [v for v in all_var_list if "/pi" not in v.name and "/logstd" not in v.name] - - self.get_flat = tf_util.GetFlat(var_list, sess=self.sess) - self.set_from_flat = tf_util.SetFromFlat(var_list, sess=self.sess) - - klgrads = tf.gradients(dist, var_list) - flat_tangent = tf.placeholder(dtype=tf.float32, shape=[None], name="flat_tan") - shapes = [var.get_shape().as_list() for var in var_list] - start = 0 - tangents = [] - for shape in shapes: - var_size = tf_util.intprod(shape) - tangents.append(tf.reshape(flat_tangent[start: start + var_size], shape)) - start += var_size - gvp = tf.add_n([tf.reduce_sum(grad * tangent) - for (grad, tangent) in zipsame(klgrads, tangents)]) # pylint: disable=E1111 - # Fisher vector products - fvp = tf_util.flatgrad(gvp, var_list) - - tf.summary.scalar('entropy_loss', meanent) - tf.summary.scalar('policy_gradient_loss', optimgain) - tf.summary.scalar('value_function_loss', surrgain) - tf.summary.scalar('approximate_kullback-leibler', meankl) - tf.summary.scalar('loss', optimgain + meankl + entbonus + surrgain + meanent) - - self.assign_old_eq_new = \ - tf_util.function([], [], updates=[tf.assign(oldv, newv) for (oldv, newv) in - zipsame(tf_util.get_globals_vars("oldpi"), - tf_util.get_globals_vars("model"))]) - self.compute_losses = tf_util.function([observation, old_policy.obs_ph, action, atarg], losses) - self.compute_fvp = tf_util.function([flat_tangent, observation, old_policy.obs_ph, action, atarg], - fvp) - self.compute_vflossandgrad = tf_util.function([observation, old_policy.obs_ph, ret], - tf_util.flatgrad(vferr, vf_var_list)) - - @contextmanager - def timed(msg): - if self.rank == 0 and self.verbose >= 1: - print(colorize(msg, color='magenta')) - start_time = time.time() - yield - print(colorize("done in {:.3f} seconds".format((time.time() - start_time)), - color='magenta')) - else: - yield - - def allmean(arr): - assert isinstance(arr, np.ndarray) - out = np.empty_like(arr) - MPI.COMM_WORLD.Allreduce(arr, out, op=MPI.SUM) - out /= self.nworkers - return out - - tf_util.initialize(sess=self.sess) - - th_init = self.get_flat() - MPI.COMM_WORLD.Bcast(th_init, root=0) - self.set_from_flat(th_init) - - with tf.variable_scope("Adam_mpi", reuse=False): - self.vfadam = MpiAdam(vf_var_list, sess=self.sess) - if self.using_gail: - self.d_adam = MpiAdam(self.reward_giver.get_trainable_variables(), sess=self.sess) - self.d_adam.sync() - self.vfadam.sync() - - with tf.variable_scope("input_info", reuse=False): - tf.summary.scalar('discounted_rewards', tf.reduce_mean(ret)) - tf.summary.scalar('learning_rate', tf.reduce_mean(self.vf_stepsize)) - tf.summary.scalar('advantage', tf.reduce_mean(atarg)) - tf.summary.scalar('kl_clip_range', tf.reduce_mean(self.max_kl)) - - if self.full_tensorboard_log: - tf.summary.histogram('discounted_rewards', ret) - tf.summary.histogram('learning_rate', self.vf_stepsize) - tf.summary.histogram('advantage', atarg) - tf.summary.histogram('kl_clip_range', self.max_kl) - if tf_util.is_image(self.observation_space): - tf.summary.image('observation', observation) - else: - tf.summary.histogram('observation', observation) - - self.timed = timed - self.allmean = allmean - - self.step = self.policy_pi.step - self.proba_step = self.policy_pi.proba_step - self.initial_state = self.policy_pi.initial_state - - self.params = tf_util.get_trainable_vars("model") + tf_util.get_trainable_vars("oldpi") - if self.using_gail: - self.params.extend(self.reward_giver.get_trainable_variables()) - - self.summary = tf.summary.merge_all() - - self.compute_lossandgrad = \ - tf_util.function([observation, old_policy.obs_ph, action, atarg, ret], - [self.summary, tf_util.flatgrad(optimgain, var_list)] + losses) - - def _initialize_dataloader(self): - """Initialize dataloader.""" - batchsize = self.timesteps_per_batch // self.d_step - self.expert_dataset.init_dataloader(batchsize) - - def learn(self, total_timesteps, callback=None, log_interval=100, tb_log_name="TRPO", - reset_num_timesteps=True): - - new_tb_log = self._init_num_timesteps(reset_num_timesteps) - callback = self._init_callback(callback) - - with SetVerbosity(self.verbose), TensorboardWriter(self.graph, self.tensorboard_log, tb_log_name, new_tb_log) \ - as writer: - self._setup_learn() - - with self.sess.as_default(): - callback.on_training_start(locals(), globals()) - - seg_gen = traj_segment_generator(self.policy_pi, self.env, self.timesteps_per_batch, - reward_giver=self.reward_giver, - gail=self.using_gail, callback=callback) - - episodes_so_far = 0 - timesteps_so_far = 0 - iters_so_far = 0 - t_start = time.time() - len_buffer = deque(maxlen=40) # rolling buffer for episode lengths - reward_buffer = deque(maxlen=40) # rolling buffer for episode rewards - - true_reward_buffer = None - if self.using_gail: - true_reward_buffer = deque(maxlen=40) - - self._initialize_dataloader() - - # Stats not used for now - # TODO: replace with normal tb logging - #  g_loss_stats = Stats(loss_names) - # d_loss_stats = Stats(reward_giver.loss_name) - # ep_stats = Stats(["True_rewards", "Rewards", "Episode_length"]) - - while True: - if timesteps_so_far >= total_timesteps: - break - - logger.log("********** Iteration %i ************" % iters_so_far) - - def fisher_vector_product(vec): - return self.allmean(self.compute_fvp(vec, *fvpargs, sess=self.sess)) + self.cg_damping * vec - - # ------------------ Update G ------------------ - logger.log("Optimizing Policy...") - # g_step = 1 when not using GAIL - mean_losses = None - vpredbefore = None - tdlamret = None - observation = None - action = None - seg = None - for k in range(self.g_step): - with self.timed("sampling"): - seg = seg_gen.__next__() - - # Stop training early (triggered by the callback) - if not seg.get('continue_training', True): # pytype: disable=attribute-error - break - - add_vtarg_and_adv(seg, self.gamma, self.lam) - # ob, ac, atarg, ret, td1ret = map(np.concatenate, (obs, acs, atargs, rets, td1rets)) - observation, action = seg["observations"], seg["actions"] - atarg, tdlamret = seg["adv"], seg["tdlamret"] - - vpredbefore = seg["vpred"] # predicted value function before update - atarg = (atarg - atarg.mean()) / (atarg.std() + 1e-8) # standardized advantage function estimate - - # true_rew is the reward without discount - if writer is not None: - total_episode_reward_logger(self.episode_reward, - seg["true_rewards"].reshape( - (self.n_envs, -1)), - seg["dones"].reshape((self.n_envs, -1)), - writer, self.num_timesteps) - - args = seg["observations"], seg["observations"], seg["actions"], atarg - # Subsampling: see p40-42 of John Schulman thesis - # http://joschu.net/docs/thesis.pdf - fvpargs = [arr[::5] for arr in args] - - self.assign_old_eq_new(sess=self.sess) - - with self.timed("computegrad"): - steps = self.num_timesteps + (k + 1) * (seg["total_timestep"] / self.g_step) - run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE) - run_metadata = tf.RunMetadata() if self.full_tensorboard_log else None - # run loss backprop with summary, and save the metadata (memory, compute time, ...) - if writer is not None: - summary, grad, *lossbefore = self.compute_lossandgrad(*args, tdlamret, sess=self.sess, - options=run_options, - run_metadata=run_metadata) - if self.full_tensorboard_log: - writer.add_run_metadata(run_metadata, 'step%d' % steps) - writer.add_summary(summary, steps) - else: - _, grad, *lossbefore = self.compute_lossandgrad(*args, tdlamret, sess=self.sess, - options=run_options, - run_metadata=run_metadata) - - lossbefore = self.allmean(np.array(lossbefore)) - grad = self.allmean(grad) - if np.allclose(grad, 0): - logger.log("Got zero gradient. not updating") - else: - with self.timed("conjugate_gradient"): - stepdir = conjugate_gradient(fisher_vector_product, grad, cg_iters=self.cg_iters, - verbose=self.rank == 0 and self.verbose >= 1) - assert np.isfinite(stepdir).all() - shs = .5 * stepdir.dot(fisher_vector_product(stepdir)) - # abs(shs) to avoid taking square root of negative values - lagrange_multiplier = np.sqrt(abs(shs) / self.max_kl) - # logger.log("lagrange multiplier:", lm, "gnorm:", np.linalg.norm(g)) - fullstep = stepdir / lagrange_multiplier - expectedimprove = grad.dot(fullstep) - surrbefore = lossbefore[0] - stepsize = 1.0 - thbefore = self.get_flat() - for _ in range(10): - thnew = thbefore + fullstep * stepsize - self.set_from_flat(thnew) - mean_losses = surr, kl_loss, *_ = self.allmean( - np.array(self.compute_losses(*args, sess=self.sess))) - improve = surr - surrbefore - logger.log("Expected: %.3f Actual: %.3f" % (expectedimprove, improve)) - if not np.isfinite(mean_losses).all(): - logger.log("Got non-finite value of losses -- bad!") - elif kl_loss > self.max_kl * 1.5: - logger.log("violated KL constraint. shrinking step.") - elif improve < 0: - logger.log("surrogate didn't improve. shrinking step.") - else: - logger.log("Stepsize OK!") - break - stepsize *= .5 - else: - logger.log("couldn't compute a good step") - self.set_from_flat(thbefore) - if self.nworkers > 1 and iters_so_far % 20 == 0: - # list of tuples - paramsums = MPI.COMM_WORLD.allgather((thnew.sum(), self.vfadam.getflat().sum())) - assert all(np.allclose(ps, paramsums[0]) for ps in paramsums[1:]) - - for (loss_name, loss_val) in zip(self.loss_names, mean_losses): - logger.record_tabular(loss_name, loss_val) - - with self.timed("vf"): - for _ in range(self.vf_iters): - # NOTE: for recurrent policies, use shuffle=False? - for (mbob, mbret) in dataset.iterbatches((seg["observations"], seg["tdlamret"]), - include_final_partial_batch=False, - batch_size=128, - shuffle=True): - grad = self.allmean(self.compute_vflossandgrad(mbob, mbob, mbret, sess=self.sess)) - self.vfadam.update(grad, self.vf_stepsize) - - # Stop training early (triggered by the callback) - if not seg.get('continue_training', True): # pytype: disable=attribute-error - break - - logger.record_tabular("explained_variance_tdlam_before", - explained_variance(vpredbefore, tdlamret)) - - if self.using_gail: - # ------------------ Update D ------------------ - logger.log("Optimizing Discriminator...") - logger.log(fmt_row(13, self.reward_giver.loss_name)) - assert len(observation) == self.timesteps_per_batch - batch_size = self.timesteps_per_batch // self.d_step - - # NOTE: uses only the last g step for observation - d_losses = [] # list of tuples, each of which gives the loss for a minibatch - # NOTE: for recurrent policies, use shuffle=False? - for ob_batch, ac_batch in dataset.iterbatches((observation, action), - include_final_partial_batch=False, - batch_size=batch_size, - shuffle=True): - ob_expert, ac_expert = self.expert_dataset.get_next_batch() - # update running mean/std for reward_giver - if self.reward_giver.normalize: - self.reward_giver.obs_rms.update(np.concatenate((ob_batch, ob_expert), 0)) - - # Reshape actions if needed when using discrete actions - if isinstance(self.action_space, gym.spaces.Discrete): - if len(ac_batch.shape) == 2: - ac_batch = ac_batch[:, 0] - if len(ac_expert.shape) == 2: - ac_expert = ac_expert[:, 0] - *newlosses, grad = self.reward_giver.lossandgrad(ob_batch, ac_batch, ob_expert, ac_expert) - self.d_adam.update(self.allmean(grad), self.d_stepsize) - d_losses.append(newlosses) - logger.log(fmt_row(13, np.mean(d_losses, axis=0))) - - # lr: lengths and rewards - lr_local = (seg["ep_lens"], seg["ep_rets"], seg["ep_true_rets"]) # local values - list_lr_pairs = MPI.COMM_WORLD.allgather(lr_local) # list of tuples - lens, rews, true_rets = map(flatten_lists, zip(*list_lr_pairs)) - true_reward_buffer.extend(true_rets) - else: - # lr: lengths and rewards - lr_local = (seg["ep_lens"], seg["ep_rets"]) # local values - list_lr_pairs = MPI.COMM_WORLD.allgather(lr_local) # list of tuples - lens, rews = map(flatten_lists, zip(*list_lr_pairs)) - len_buffer.extend(lens) - reward_buffer.extend(rews) - - if len(len_buffer) > 0: - logger.record_tabular("EpLenMean", np.mean(len_buffer)) - logger.record_tabular("EpRewMean", np.mean(reward_buffer)) - if self.using_gail: - logger.record_tabular("EpTrueRewMean", np.mean(true_reward_buffer)) - logger.record_tabular("EpThisIter", len(lens)) - episodes_so_far += len(lens) - current_it_timesteps = MPI.COMM_WORLD.allreduce(seg["total_timestep"]) - timesteps_so_far += current_it_timesteps - self.num_timesteps += current_it_timesteps - iters_so_far += 1 - - logger.record_tabular("EpisodesSoFar", episodes_so_far) - logger.record_tabular("TimestepsSoFar", self.num_timesteps) - logger.record_tabular("TimeElapsed", time.time() - t_start) - - if self.verbose >= 1 and self.rank == 0: - logger.dump_tabular() - - callback.on_training_end() - return self - - def save(self, save_path, cloudpickle=False): - data = { - "gamma": self.gamma, - "timesteps_per_batch": self.timesteps_per_batch, - "max_kl": self.max_kl, - "cg_iters": self.cg_iters, - "lam": self.lam, - "entcoeff": self.entcoeff, - "cg_damping": self.cg_damping, - "vf_stepsize": self.vf_stepsize, - "vf_iters": self.vf_iters, - "hidden_size_adversary": self.hidden_size_adversary, - "adversary_entcoeff": self.adversary_entcoeff, - "expert_dataset": self.expert_dataset, - "g_step": self.g_step, - "d_step": self.d_step, - "d_stepsize": self.d_stepsize, - "using_gail": self.using_gail, - "verbose": self.verbose, - "policy": self.policy, - "observation_space": self.observation_space, - "action_space": self.action_space, - "n_envs": self.n_envs, - "n_cpu_tf_sess": self.n_cpu_tf_sess, - "seed": self.seed, - "_vectorize_action": self._vectorize_action, - "policy_kwargs": self.policy_kwargs - } - - params_to_save = self.get_parameters() - - self._save_to_file(save_path, data=data, params=params_to_save, cloudpickle=cloudpickle) diff --git a/stable_baselines/trpo_mpi/utils.py b/stable_baselines/trpo_mpi/utils.py deleted file mode 100644 index 8661edcb..00000000 --- a/stable_baselines/trpo_mpi/utils.py +++ /dev/null @@ -1,23 +0,0 @@ -import numpy as np - - -def add_vtarg_and_adv(seg, gamma, lam): - """ - Compute target value using TD(lambda) estimator, and advantage with GAE(lambda) - - :param seg: (dict) the current segment of the trajectory (see traj_segment_generator return for more information) - :param gamma: (float) Discount factor - :param lam: (float) GAE factor - """ - # last element is only used for last vtarg, but we already zeroed it if last new = 1 - episode_starts = np.append(seg["episode_starts"], False) - vpred = np.append(seg["vpred"], seg["nextvpred"]) - rew_len = len(seg["rewards"]) - seg["adv"] = np.empty(rew_len, 'float32') - rewards = seg["rewards"] - lastgaelam = 0 - for step in reversed(range(rew_len)): - nonterminal = 1 - float(episode_starts[step + 1]) - delta = rewards[step] + gamma * vpred[step + 1] * nonterminal - vpred[step] - seg["adv"][step] = lastgaelam = delta + gamma * lam * nonterminal * lastgaelam - seg["tdlamret"] = seg["adv"] + seg["vpred"] diff --git a/stable_baselines/version.txt b/stable_baselines/version.txt deleted file mode 100644 index af104faf..00000000 --- a/stable_baselines/version.txt +++ /dev/null @@ -1 +0,0 @@ -2.10.3a0 From 7fe969beda157f5f3c1b515a55638a1f895dfb24 Mon Sep 17 00:00:00 2001 From: Mustafa-249 Date: Wed, 23 Jul 2025 14:55:35 +0300 Subject: [PATCH 09/18] Delete docs directory --- docs/Makefile | 20 - docs/README.md | 25 - docs/_static/css/baselines_theme.css | 52 -- docs/_static/img/Tensorboard_example_1.png | Bin 187299 -> 0 bytes docs/_static/img/Tensorboard_example_2.png | Bin 148408 -> 0 bytes docs/_static/img/Tensorboard_example_3.png | Bin 167980 -> 0 bytes docs/_static/img/breakout.gif | Bin 199418 -> 0 bytes docs/_static/img/colab.svg | 7 - docs/_static/img/learning_curve.png | Bin 25521 -> 0 bytes docs/_static/img/logo.png | Bin 132717 -> 0 bytes docs/_static/img/mistake.png | Bin 148639 -> 0 bytes docs/_static/img/try_it.png | Bin 12156 -> 0 bytes docs/common/cmd_utils.rst | 7 - docs/common/distributions.rst | 24 - docs/common/env_checker.rst | 7 - docs/common/evaluation.rst | 7 - docs/common/monitor.rst | 7 - docs/common/schedules.rst | 11 - docs/common/tf_utils.rst | 7 - docs/conf.py | 223 ------ docs/guide/algos.rst | 78 -- docs/guide/callbacks.rst | 340 --------- docs/guide/checking_nan.rst | 253 ------- docs/guide/custom_env.rst | 82 --- docs/guide/custom_policy.rst | 246 ------- docs/guide/examples.rst | 680 ------------------ docs/guide/export.rst | 103 --- docs/guide/install.rst | 196 ----- docs/guide/pretrain.rst | 152 ---- docs/guide/quickstart.rst | 47 -- docs/guide/rl.rst | 17 - docs/guide/rl_tips.rst | 252 ------- docs/guide/rl_zoo.rst | 107 --- docs/guide/save_format.rst | 86 --- docs/guide/tensorboard.rst | 146 ---- docs/guide/vec_envs.rst | 85 --- docs/index.rst | 126 ---- docs/make.bat | 36 - docs/misc/changelog.rst | 789 --------------------- docs/misc/projects.rst | 216 ------ docs/misc/results_plotter.rst | 8 - docs/modules/a2c.rst | 127 ---- docs/modules/acer.rst | 118 --- docs/modules/acktr.rst | 134 ---- docs/modules/base.rst | 12 - docs/modules/ddpg.rst | 227 ------ docs/modules/dqn.rst | 226 ------ docs/modules/gail.rst | 136 ---- docs/modules/her.rst | 110 --- docs/modules/policies.rst | 73 -- docs/modules/ppo1.rst | 141 ---- docs/modules/ppo2.rst | 131 ---- docs/modules/sac.rst | 209 ------ docs/modules/td3.rst | 214 ------ docs/modules/trpo.rst | 127 ---- docs/requirements.txt | 2 - docs/spelling_wordlist.txt | 110 --- 57 files changed, 6539 deletions(-) delete mode 100644 docs/Makefile delete mode 100644 docs/README.md delete mode 100644 docs/_static/css/baselines_theme.css delete mode 100644 docs/_static/img/Tensorboard_example_1.png delete mode 100644 docs/_static/img/Tensorboard_example_2.png delete mode 100644 docs/_static/img/Tensorboard_example_3.png delete mode 100644 docs/_static/img/breakout.gif delete mode 100644 docs/_static/img/colab.svg delete mode 100644 docs/_static/img/learning_curve.png delete mode 100644 docs/_static/img/logo.png delete mode 100644 docs/_static/img/mistake.png delete mode 100644 docs/_static/img/try_it.png delete mode 100644 docs/common/cmd_utils.rst delete mode 100644 docs/common/distributions.rst delete mode 100644 docs/common/env_checker.rst delete mode 100644 docs/common/evaluation.rst delete mode 100644 docs/common/monitor.rst delete mode 100644 docs/common/schedules.rst delete mode 100644 docs/common/tf_utils.rst delete mode 100644 docs/conf.py delete mode 100644 docs/guide/algos.rst delete mode 100644 docs/guide/callbacks.rst delete mode 100644 docs/guide/checking_nan.rst delete mode 100644 docs/guide/custom_env.rst delete mode 100644 docs/guide/custom_policy.rst delete mode 100644 docs/guide/examples.rst delete mode 100644 docs/guide/export.rst delete mode 100644 docs/guide/install.rst delete mode 100644 docs/guide/pretrain.rst delete mode 100644 docs/guide/quickstart.rst delete mode 100644 docs/guide/rl.rst delete mode 100644 docs/guide/rl_tips.rst delete mode 100644 docs/guide/rl_zoo.rst delete mode 100644 docs/guide/save_format.rst delete mode 100644 docs/guide/tensorboard.rst delete mode 100644 docs/guide/vec_envs.rst delete mode 100644 docs/index.rst delete mode 100644 docs/make.bat delete mode 100644 docs/misc/changelog.rst delete mode 100644 docs/misc/projects.rst delete mode 100644 docs/misc/results_plotter.rst delete mode 100644 docs/modules/a2c.rst delete mode 100644 docs/modules/acer.rst delete mode 100644 docs/modules/acktr.rst delete mode 100644 docs/modules/base.rst delete mode 100644 docs/modules/ddpg.rst delete mode 100644 docs/modules/dqn.rst delete mode 100644 docs/modules/gail.rst delete mode 100644 docs/modules/her.rst delete mode 100644 docs/modules/policies.rst delete mode 100644 docs/modules/ppo1.rst delete mode 100644 docs/modules/ppo2.rst delete mode 100644 docs/modules/sac.rst delete mode 100644 docs/modules/td3.rst delete mode 100644 docs/modules/trpo.rst delete mode 100644 docs/requirements.txt delete mode 100644 docs/spelling_wordlist.txt diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index 47f98cd7..00000000 --- a/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -W # make warnings fatal -SPHINXBUILD = sphinx-build -SPHINXPROJ = StableBaselines -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index ffb37538..00000000 --- a/docs/README.md +++ /dev/null @@ -1,25 +0,0 @@ -## Stable Baselines Documentation - -This folder contains documentation for the RL baselines. - - -### Build the Documentation - -#### Install Sphinx and Theme - -``` -pip install sphinx sphinx-autobuild sphinx-rtd-theme -``` - -#### Building the Docs - -In the `docs/` folder: -``` -make html -``` - -if you want to building each time a file is changed: - -``` -sphinx-autobuild . _build/html -``` diff --git a/docs/_static/css/baselines_theme.css b/docs/_static/css/baselines_theme.css deleted file mode 100644 index 5701d00c..00000000 --- a/docs/_static/css/baselines_theme.css +++ /dev/null @@ -1,52 +0,0 @@ -/* Main colors from https://color.adobe.com/fr/Copy-of-NOUEBO-Original-color-theme-11116609 */ -:root{ - --main-bg-color: #324D5C; - --link-color: #14B278; -} - -/* Header fonts y */ -h1, h2, .rst-content .toctree-wrapper p.caption, h3, h4, h5, h6, legend, p.caption { - font-family: "Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; -} - - -/* Docs background */ -.wy-side-nav-search{ - background-color: var(--main-bg-color); -} - -/* Mobile version */ -.wy-nav-top{ - background-color: var(--main-bg-color); -} - -/* Change link colors (except for the menu) */ -a { - color: var(--link-color); -} - -a:hover { - color: #4F778F; -} - -.wy-menu a { - color: #b3b3b3; -} - -.wy-menu a:hover { - color: #b3b3b3; -} - -a.icon.icon-home { - color: #b3b3b3; -} - -.version{ - color: var(--link-color) !important; -} - - -/* Make code blocks have a background */ -.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight'] { - background: #f8f8f8;; -} diff --git a/docs/_static/img/Tensorboard_example_1.png b/docs/_static/img/Tensorboard_example_1.png deleted file mode 100644 index 0738bebc72ad610c662445cf1a9c15a0ebe728bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187299 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

-PK*Oc#dS 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 z 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 z

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 diff --git a/docs/_static/img/breakout.gif b/docs/_static/img/breakout.gif deleted file mode 100644 index da5beb4f66b60d16d4652f3b541c8bf74aa6adca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199418 zcmc%wWl$W?7r2WL1PGce?h>*P+>#K2LkL-%01E^QNpKdD5W$1HE$;4%!{YAlwz#`X z(1pGEe1CPT{&L^nc`-HBH8b5c)jj9bd7gf!ATRRzlQdQq)+ICW?*Ib;1OQ+F00#gh z0H6Q>{l8W)7=VBQ7#M(q0VEhefdTaYZUsXC2n2vZ05}9dLI4y5K>zP~Fbsge02mB_ z!vG`g9C6lfP@1mIDr0NPhcbfK>{!&07n8yB!EH!=>K&OMgb5M z07C(A6o5nlC=`JH-jX` zP*5-m3PC|(C@35SMWUc66cmku0%#~04TYegFfc3s5{5v*5NH?zfFro+y z5`jb_P)GzCi2zUtFbV-dAz&y39ECul5GWJ^jY0ru1Q?Bgpb;=M0**!?(Fhb8fkq<$ z00Rav5C8)MFmM2a1TZK7g9b1F7y|}lAYcp(jDdqONH7Kk#-PC%0D=KSFc1g^2Eo7~ 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
H;QqAdy`p0O{q4Ea{#UQ?cduU~ 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 UDrhtve_n$!(l=qG>sbc<7j>%#i2wiq diff --git a/docs/_static/img/logo.png b/docs/_static/img/logo.png deleted file mode 100644 index 33bdea60bef4d9980e22fe56c35f50498cde1452..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132717 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

xzqcj+H0)((RbRlK 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

Jy}93c{GGY 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 Discrete -- ``DiagGaussianProbabilityDistribution`` -> Box (continuous actions) -- ``MultiCategoricalProbabilityDistribution`` -> MultiDiscrete -- ``BernoulliProbabilityDistribution`` -> MultiBinary - -The policy networks output parameters for the distributions (named ``flat`` in the methods). -Actions are then sampled from those distributions. - -For instance, in the case of discrete actions. The policy network outputs probability -of taking each action. The ``CategoricalProbabilityDistribution`` allows to sample from it, -computes the entropy, the negative log probability (``neglogp``) and backpropagate the gradient. - -In the case of continuous actions, a Gaussian distribution is used. The policy network outputs -mean and (log) std of the distribution (assumed to be a ``DiagGaussianProbabilityDistribution``). - -.. automodule:: stable_baselines.common.distributions - :members: diff --git a/docs/common/env_checker.rst b/docs/common/env_checker.rst deleted file mode 100644 index 404f6d6a..00000000 --- a/docs/common/env_checker.rst +++ /dev/null @@ -1,7 +0,0 @@ -.. _env_checker: - -Gym Environment Checker -======================== - -.. automodule:: stable_baselines.common.env_checker - :members: diff --git a/docs/common/evaluation.rst b/docs/common/evaluation.rst deleted file mode 100644 index ded89665..00000000 --- a/docs/common/evaluation.rst +++ /dev/null @@ -1,7 +0,0 @@ -.. _eval: - -Evaluation Helper -================= - -.. automodule:: stable_baselines.common.evaluation - :members: diff --git a/docs/common/monitor.rst b/docs/common/monitor.rst deleted file mode 100644 index cb696fa7..00000000 --- a/docs/common/monitor.rst +++ /dev/null @@ -1,7 +0,0 @@ -.. _monitor: - -Monitor Wrapper -=============== - -.. automodule:: stable_baselines.bench.monitor - :members: diff --git a/docs/common/schedules.rst b/docs/common/schedules.rst deleted file mode 100644 index 968a0676..00000000 --- a/docs/common/schedules.rst +++ /dev/null @@ -1,11 +0,0 @@ -.. _schedules: - -Schedules -========= - -Schedules are used as hyperparameter for most of the algorithms, -in order to change value of a parameter over time (usually the learning rate). - - -.. automodule:: stable_baselines.common.schedules - :members: diff --git a/docs/common/tf_utils.rst b/docs/common/tf_utils.rst deleted file mode 100644 index 2f682676..00000000 --- a/docs/common/tf_utils.rst +++ /dev/null @@ -1,7 +0,0 @@ -.. _tf_utils: - -Tensorflow Utils -========================= - -.. automodule:: stable_baselines.common.tf_util - :members: diff --git a/docs/conf.py b/docs/conf.py deleted file mode 100644 index efe73f8c..00000000 --- a/docs/conf.py +++ /dev/null @@ -1,223 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Configuration file for the Sphinx documentation builder. -# -# This file does only contain a selection of the most common options. For a -# full list see the documentation: -# http://www.sphinx-doc.org/en/master/config - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import sys -from unittest.mock import MagicMock - -# We CANNOT enable 'sphinxcontrib.spelling' because ReadTheDocs.org does not support -# PyEnchant. -try: - import sphinxcontrib.spelling - enable_spell_check = True -except ImportError: - enable_spell_check = False - -# source code directory, relative to this file, for sphinx-autobuild -sys.path.insert(0, os.path.abspath('..')) - - -class Mock(MagicMock): - @classmethod - def __getattr__(cls, name): - return MagicMock() - -# Mock modules that requires C modules -# Note: because of that we cannot test examples using CI -MOCK_MODULES = ['joblib', 'scipy', 'scipy.signal', - 'mpi4py', 'mujoco-py', 'cv2', 'tensorflow', - 'tensorflow.contrib', 'tensorflow.contrib.layers', - 'tensorflow.python', 'tensorflow.python.client', 'tensorflow.python.ops', - 'tqdm', 'matplotlib', 'matplotlib.pyplot', - 'seaborn', 'tensorflow.core', 'tensorflow.core.util', 'tensorflow.python.util', - 'zmq'] -sys.modules.update((mod_name, Mock()) for mod_name in MOCK_MODULES) - -# Read version from file -version_file = os.path.join(os.path.dirname(__file__), '../stable_baselines', 'version.txt') -with open(version_file, 'r') as file_handler: - __version__ = file_handler.read().strip() - -# -- Project information ----------------------------------------------------- - -project = 'Stable Baselines' -copyright = '2018-2021, Stable Baselines' -author = 'Stable Baselines Contributors' - -# The short X.Y version -version = 'master (' + __version__ + ' )' -# The full version, including alpha/beta/rc tags -release = __version__ - - -# -- General configuration --------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.autosummary', - 'sphinx.ext.mathjax', - 'sphinx.ext.ifconfig', - 'sphinx.ext.viewcode', -] - -if enable_spell_check: - extensions.append('sphinxcontrib.spelling') - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# Add a string of reStructuredText that will be included at the beginning -# of every source file that is read. This is a possible place to add -# substitutions that should be available in every file. -rst_prolog = """ -.. warning:: - - This package is in maintenance mode, please use `Stable-Baselines3 - (SB3)`_ for an up-to-date version. You can find a `migration guide`_ in - SB3 documentation. - -.. _Stable-Baselines3 (SB3): https://github.com/DLR-RM/stable-baselines3 -.. _migration guide: https://stable-baselines3.readthedocs.io/en/master/guide/migration.html -""" - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = '.rst' - -# The master toctree document. -master_doc = 'index' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = "en" - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path . -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. - -# Fix for read the docs -on_rtd = os.environ.get('READTHEDOCS') == 'True' -if on_rtd: - html_theme = 'default' -else: - html_theme = 'sphinx_rtd_theme' - -html_logo = '_static/img/logo.png' - - -def setup(app): - app.add_css_file("css/baselines_theme.css") - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# The default sidebars (for documents that don't match any pattern) are -# defined by theme itself. Builtin themes are using these templates by -# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', -# 'searchbox.html']``. -# -# html_sidebars = {} - - -# -- Options for HTMLHelp output --------------------------------------------- - -# Output file base name for HTML help builder. -htmlhelp_basename = 'StableBaselinesdoc' - - -# -- Options for LaTeX output ------------------------------------------------ - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - (master_doc, 'StableBaselines.tex', 'Stable Baselines Documentation', - 'Stable Baselines Contributors', 'manual'), -] - - -# -- Options for manual page output ------------------------------------------ - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, 'stablebaselines', 'Stable Baselines Documentation', - [author], 1) -] - - -# -- Options for Texinfo output ---------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - (master_doc, 'StableBaselines', 'Stable Baselines Documentation', - author, 'StableBaselines', 'One line description of project.', - 'Miscellaneous'), -] - - -# -- Extension configuration ------------------------------------------------- diff --git a/docs/guide/algos.rst b/docs/guide/algos.rst deleted file mode 100644 index 50803c0e..00000000 --- a/docs/guide/algos.rst +++ /dev/null @@ -1,78 +0,0 @@ -RL Algorithms -============= - -This table displays the rl algorithms that are implemented in the stable baselines project, -along with some useful characteristics: support for recurrent policies, discrete/continuous actions, multiprocessing. - -.. Table too large -.. ===== ======================== ========= ======= ============ ================= =============== ================ -.. Name Refactored \ :sup:`(1)`\ Recurrent ``Box`` ``Discrete`` ``MultiDiscrete`` ``MultiBinary`` Multi Processing -.. ===== ======================== ========= ======= ============ ================= =============== ================ -.. A2C ✔️ -.. ===== ======================== ========= ======= ============ ================= =============== ================ - - -============ ======================== ========= =========== ============ ================ -Name Refactored [#f1]_ Recurrent ``Box`` ``Discrete`` Multi Processing -============ ======================== ========= =========== ============ ================ -A2C ✔️ ✔️ ✔️ ✔️ ✔️ -ACER ✔️ ✔️ ❌ [#f4]_ ✔️ ✔️ -ACKTR ✔️ ✔️ ✔️ ✔️ ✔️ -DDPG ✔️ ❌ ✔️ ❌ ✔️ [#f3]_ -DQN ✔️ ❌ ❌ ✔️ ❌ -HER ✔️ ❌ ✔️ ✔️ ❌ -GAIL [#f2]_ ✔️ ✔️ ✔️ ✔️ ✔️ [#f3]_ -PPO1 ✔️ ❌ ✔️ ✔️ ✔️ [#f3]_ -PPO2 ✔️ ✔️ ✔️ ✔️ ✔️ -SAC ✔️ ❌ ✔️ ❌ ❌ -TD3 ✔️ ❌ ✔️ ❌ ❌ -TRPO ✔️ ❌ ✔️ ✔ ✔️ [#f3]_ -============ ======================== ========= =========== ============ ================ - -.. [#f1] Whether or not the algorithm has be refactored to fit the ``BaseRLModel`` class. -.. [#f2] Only implemented for TRPO. -.. [#f3] Multi Processing with `MPI`_. -.. [#f4] TODO, in project scope. - -.. note:: - Non-array spaces such as ``Dict`` or ``Tuple`` are not currently supported by any algorithm, - except HER for dict when working with ``gym.GoalEnv`` - -Actions ``gym.spaces``: - -- ``Box``: A N-dimensional box that contains every point in the action - space. -- ``Discrete``: A list of possible actions, where each timestep only - one of the actions can be used. -- ``MultiDiscrete``: A list of possible actions, where each timestep only one action of each discrete set can be used. -- ``MultiBinary``: A list of possible actions, where each timestep any of the actions can be used in any combination. - -.. _MPI: https://mpi4py.readthedocs.io/en/stable/ - -.. note:: - - Some logging values (like ``ep_rewmean``, ``eplenmean``) are only available when using a Monitor wrapper - See `Issue #339 `_ for more info. - - -Reproducibility ---------------- - -Completely reproducible results are not guaranteed across Tensorflow releases or different platforms. -Furthermore, results need not be reproducible between CPU and GPU executions, even when using identical seeds. - -In order to make computations deterministic on CPU, on your specific problem on one specific platform, -you need to pass a ``seed`` argument at the creation of a model and set `n_cpu_tf_sess=1` (number of cpu for Tensorflow session). -If you pass an environment to the model using `set_env()`, then you also need to seed the environment first. - -.. note:: - - Because of the current limits of Tensorflow 1.x, we cannot ensure reproducible results on the GPU yet. This issue is solved in `Stable-Baselines3 "PyTorch edition" `_ - - -.. note:: - - TD3 sometimes fail to have reproducible results for obscure reasons, even when following the previous steps (cf `PR #492 `_). If you find the reason then please open an issue ;) - - -Credit: part of the *Reproducibility* section comes from `PyTorch Documentation `_ diff --git a/docs/guide/callbacks.rst b/docs/guide/callbacks.rst deleted file mode 100644 index 62cf7425..00000000 --- a/docs/guide/callbacks.rst +++ /dev/null @@ -1,340 +0,0 @@ -.. _callbacks: - -Callbacks -========= - -A callback is a set of functions that will be called at given stages of the training procedure. -You can use callbacks to access internal state of the RL model during training. -It allows one to do monitoring, auto saving, model manipulation, progress bars, ... - - -Custom Callback ---------------- - -To build a custom callback, you need to create a class that derives from ``BaseCallback``. -This will give you access to events (``_on_training_start``, ``_on_step``) and useful variables (like `self.model` for the RL model). - - -You can find two examples of custom callbacks in the documentation: one for saving the best model according to the training reward (see :ref:`Examples `), and one for logging additional values with Tensorboard (see :ref:`Tensorboard section `). - - -.. code-block:: python - - from stable_baselines.common.callbacks import BaseCallback - - - class CustomCallback(BaseCallback): - """ - A custom callback that derives from ``BaseCallback``. - - :param verbose: (int) Verbosity level 0: not output 1: info 2: debug - """ - def __init__(self, verbose=0): - super(CustomCallback, self).__init__(verbose) - # Those variables will be accessible in the callback - # (they are defined in the base class) - # The RL model - # self.model = None # type: BaseRLModel - # An alias for self.model.get_env(), the environment used for training - # self.training_env = None # type: Union[gym.Env, VecEnv, None] - # Number of time the callback was called - # self.n_calls = 0 # type: int - # self.num_timesteps = 0 # type: int - # local and global variables - # self.locals = None # type: Dict[str, Any] - # self.globals = None # type: Dict[str, Any] - # The logger object, used to report things in the terminal - # self.logger = None # type: logger.Logger - # # Sometimes, for event callback, it is useful - # # to have access to the parent object - # self.parent = None # type: Optional[BaseCallback] - - def _on_training_start(self) -> None: - """ - This method is called before the first rollout starts. - """ - pass - - def _on_rollout_start(self) -> None: - """ - A rollout is the collection of environment interaction - using the current policy. - This event is triggered before collecting new samples. - """ - pass - - def _on_step(self) -> bool: - """ - This method will be called by the model after each call to `env.step()`. - - For child callback (of an `EventCallback`), this will be called - when the event is triggered. - - :return: (bool) If the callback returns False, training is aborted early. - """ - return True - - def _on_rollout_end(self) -> None: - """ - This event is triggered before updating the policy. - """ - pass - - def _on_training_end(self) -> None: - """ - This event is triggered before exiting the `learn()` method. - """ - pass - - -.. note:: - `self.num_timesteps` corresponds to the total number of steps taken in the environment, i.e., it is the number of environments multiplied by the number of time `env.step()` was called - - You should know that ``PPO1`` and ``TRPO`` update `self.num_timesteps` after each rollout (and not each step) because they rely on MPI. - - For the other algorithms, `self.num_timesteps` is incremented by ``n_envs`` (number of environments) after each call to `env.step()` - - -.. note:: - - For off-policy algorithms like SAC, DDPG, TD3 or DQN, the notion of ``rollout`` corresponds to the steps taken in the environment between two updates. - - -.. _EventCallback: - -Event Callback --------------- - -Compared to Keras, Stable Baselines provides a second type of ``BaseCallback``, named ``EventCallback`` that is meant to trigger events. When an event is triggered, then a child callback is called. - -As an example, :ref:`EvalCallback` is an ``EventCallback`` that will trigger its child callback when there is a new best model. -A child callback is for instance :ref:`StopTrainingOnRewardThreshold ` that stops the training if the mean reward achieved by the RL model is above a threshold. - -.. note:: - - We recommend to take a look at the source code of :ref:`EvalCallback` and :ref:`StopTrainingOnRewardThreshold ` to have a better overview of what can be achieved with this kind of callbacks. - - -.. code-block:: python - - class EventCallback(BaseCallback): - """ - Base class for triggering callback on event. - - :param callback: (Optional[BaseCallback]) Callback that will be called - when an event is triggered. - :param verbose: (int) - """ - def __init__(self, callback: Optional[BaseCallback] = None, verbose: int = 0): - super(EventCallback, self).__init__(verbose=verbose) - self.callback = callback - # Give access to the parent - if callback is not None: - self.callback.parent = self - ... - - def _on_event(self) -> bool: - if self.callback is not None: - return self.callback() - return True - - - -Callback Collection -------------------- - -Stable Baselines provides you with a set of common callbacks for: - -- saving the model periodically (:ref:`CheckpointCallback`) -- evaluating the model periodically and saving the best one (:ref:`EvalCallback`) -- chaining callbacks (:ref:`CallbackList`) -- triggering callback on events (:ref:`EventCallback`, :ref:`EveryNTimesteps`) -- stopping the training early based on a reward threshold (:ref:`StopTrainingOnRewardThreshold `) - - -.. _CheckpointCallback: - -CheckpointCallback -^^^^^^^^^^^^^^^^^^ - -Callback for saving a model every ``save_freq`` steps, you must specify a log folder (``save_path``) -and optionally a prefix for the checkpoints (``rl_model`` by default). - - -.. code-block:: python - - from stable_baselines import SAC - from stable_baselines.common.callbacks import CheckpointCallback - # Save a checkpoint every 1000 steps - checkpoint_callback = CheckpointCallback(save_freq=1000, save_path='./logs/', - name_prefix='rl_model') - - model = SAC('MlpPolicy', 'Pendulum-v0') - model.learn(2000, callback=checkpoint_callback) - - -.. _EvalCallback: - -EvalCallback -^^^^^^^^^^^^ - -Evaluate periodically the performance of an agent, using a separate test environment. -It will save the best model if ``best_model_save_path`` folder is specified and save the evaluations results in a numpy archive (`evaluations.npz`) if ``log_path`` folder is specified. - - -.. note:: - - You can pass a child callback via the ``callback_on_new_best`` argument. It will be triggered each time there is a new best model. - - - -.. code-block:: python - - import gym - - from stable_baselines import SAC - from stable_baselines.common.callbacks import EvalCallback - - # Separate evaluation env - eval_env = gym.make('Pendulum-v0') - # Use deterministic actions for evaluation - eval_callback = EvalCallback(eval_env, best_model_save_path='./logs/', - log_path='./logs/', eval_freq=500, - deterministic=True, render=False) - - model = SAC('MlpPolicy', 'Pendulum-v0') - model.learn(5000, callback=eval_callback) - - -.. _Callbacklist: - -CallbackList -^^^^^^^^^^^^ - -Class for chaining callbacks, they will be called sequentially. -Alternatively, you can pass directly a list of callbacks to the `learn()` method, it will be converted automatically to a ``CallbackList``. - - -.. code-block:: python - - import gym - - from stable_baselines import SAC - from stable_baselines.common.callbacks import CallbackList, CheckpointCallback, EvalCallback - - checkpoint_callback = CheckpointCallback(save_freq=1000, save_path='./logs/') - # Separate evaluation env - eval_env = gym.make('Pendulum-v0') - eval_callback = EvalCallback(eval_env, best_model_save_path='./logs/best_model', - log_path='./logs/results', eval_freq=500) - # Create the callback list - callback = CallbackList([checkpoint_callback, eval_callback]) - - model = SAC('MlpPolicy', 'Pendulum-v0') - # Equivalent to: - # model.learn(5000, callback=[checkpoint_callback, eval_callback]) - model.learn(5000, callback=callback) - - -.. _StopTrainingCallback: - -StopTrainingOnRewardThreshold -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Stop the training once a threshold in episodic reward (mean episode reward over the evaluations) has been reached (i.e., when the model is good enough). -It must be used with the :ref:`EvalCallback` and use the event triggered by a new best model. - - -.. code-block:: python - - import gym - - from stable_baselines import SAC - from stable_baselines.common.callbacks import EvalCallback, StopTrainingOnRewardThreshold - - # Separate evaluation env - eval_env = gym.make('Pendulum-v0') - # Stop training when the model reaches the reward threshold - callback_on_best = StopTrainingOnRewardThreshold(reward_threshold=-200, verbose=1) - eval_callback = EvalCallback(eval_env, callback_on_new_best=callback_on_best, verbose=1) - - model = SAC('MlpPolicy', 'Pendulum-v0', verbose=1) - # Almost infinite number of timesteps, but the training will stop - # early as soon as the reward threshold is reached - model.learn(int(1e10), callback=eval_callback) - - -.. _EveryNTimesteps: - -EveryNTimesteps -^^^^^^^^^^^^^^^ - -An :ref:`EventCallback` that will trigger its child callback every ``n_steps`` timesteps. - - -.. note:: - - Because of the way ``PPO1`` and ``TRPO`` work (they rely on MPI), ``n_steps`` is a lower bound between two events. - - -.. code-block:: python - - import gym - - from stable_baselines import PPO2 - from stable_baselines.common.callbacks import CheckpointCallback, EveryNTimesteps - - # this is equivalent to defining CheckpointCallback(save_freq=500) - # checkpoint_callback will be triggered every 500 steps - checkpoint_on_event = CheckpointCallback(save_freq=1, save_path='./logs/') - event_callback = EveryNTimesteps(n_steps=500, callback=checkpoint_on_event) - - model = PPO2('MlpPolicy', 'Pendulum-v0', verbose=1) - - model.learn(int(2e4), callback=event_callback) - - -.. automodule:: stable_baselines.common.callbacks - :members: - - - Legacy: A functional approach - ----------------------------- - - .. warning:: - - This way of doing callbacks is deprecated in favor of the object oriented approach. - - - - A callback function takes the ``locals()`` variables and the ``globals()`` variables from the model, then returns a boolean value for whether or not the training should continue. - - Thanks to the access to the models variables, in particular ``_locals["self"]``, we are able to even change the parameters of the model without halting the training, or changing the model's code. - - - .. code-block:: python - - from typing import Dict, Any - - from stable_baselines import PPO2 - - - def simple_callback(_locals: Dict[str, Any], _globals: Dict[str, Any]) -> bool: - """ - Callback called at each step (for DQN and others) or after n steps (see ACER or PPO2). - This callback will save the model and stop the training after the first call. - - :param _locals: (Dict[str, Any]) - :param _globals: (Dict[str, Any]) - :return: (bool) If your callback returns False, training is aborted early. - """ - print("callback called") - # Save the model - _locals["self"].save("saved_model") - # If you want to continue training, the callback must return True. - # return True # returns True, training continues. - print("stop training") - return False # returns False, training stops. - - model = PPO2('MlpPolicy', 'CartPole-v1') - model.learn(2000, callback=simple_callback) diff --git a/docs/guide/checking_nan.rst b/docs/guide/checking_nan.rst deleted file mode 100644 index c51bdc0a..00000000 --- a/docs/guide/checking_nan.rst +++ /dev/null @@ -1,253 +0,0 @@ -Dealing with NaNs and infs -========================== - -During the training of a model on a given environment, it is possible that the RL model becomes completely -corrupted when a NaN or an inf is given or returned from the RL model. - -How and why? ------------- - -The issue arises then NaNs or infs do not crash, but simply get propagated through the training, -until all the floating point number converge to NaN or inf. This is in line with the -`IEEE Standard for Floating-Point Arithmetic (IEEE 754) `_ standard, as it says: - -.. note:: - Five possible exceptions can occur: - - Invalid operation (:math:`\sqrt{-1}`, :math:`\inf \times 1`, :math:`\text{NaN}\ \mathrm{mod}\ 1`, ...) return NaN - - Division by zero: - - if the operand is not zero (:math:`1/0`, :math:`-2/0`, ...) returns :math:`\pm\inf` - - if the operand is zero (:math:`0/0`) returns signaling NaN - - Overflow (exponent too high to represent) returns :math:`\pm\inf` - - Underflow (exponent too low to represent) returns :math:`0` - - Inexact (not representable exactly in base 2, eg: :math:`1/5`) returns the rounded value (ex: :code:`assert (1/5) * 3 == 0.6000000000000001`) - -And of these, only ``Division by zero`` will signal an exception, the rest will propagate invalid values quietly. - -In python, dividing by zero will indeed raise the exception: ``ZeroDivisionError: float division by zero``, -but ignores the rest. - -The default in numpy, will warn: ``RuntimeWarning: invalid value encountered`` -but will not halt the code. - -And the worst of all, Tensorflow will not signal anything - -.. code-block:: python - - import tensorflow as tf - import numpy as np - - print("tensorflow test:") - - a = tf.constant(1.0) - b = tf.constant(0.0) - c = a / b - - sess = tf.Session() - val = sess.run(c) # this will be quiet - print(val) - sess.close() - - print("\r\nnumpy test:") - - a = np.float64(1.0) - b = np.float64(0.0) - val = a / b # this will warn - print(val) - - print("\r\npure python test:") - - a = 1.0 - b = 0.0 - val = a / b # this will raise an exception and halt. - print(val) - -Unfortunately, most of the floating point operations are handled by Tensorflow and numpy, -meaning you might get little to no warning when a invalid value occurs. - -Numpy parameters ----------------- - -Numpy has a convenient way of dealing with invalid value: `numpy.seterr `_, -which defines for the python process, how it should handle floating point error. - -.. code-block:: python - - import numpy as np - - np.seterr(all='raise') # define before your code. - - print("numpy test:") - - a = np.float64(1.0) - b = np.float64(0.0) - val = a / b # this will now raise an exception instead of a warning. - print(val) - -but this will also avoid overflow issues on floating point numbers: - -.. code-block:: python - - import numpy as np - - np.seterr(all='raise') # define before your code. - - print("numpy overflow test:") - - a = np.float64(10) - b = np.float64(1000) - val = a ** b # this will now raise an exception - print(val) - -but will not avoid the propagation issues: - -.. code-block:: python - - import numpy as np - - np.seterr(all='raise') # define before your code. - - print("numpy propagation test:") - - a = np.float64('NaN') - b = np.float64(1.0) - val = a + b # this will neither warn nor raise anything - print(val) - -Tensorflow parameters ---------------------- - -Tensorflow can add checks for detecting and dealing with invalid value: `tf.add_check_numerics_ops `_ and `tf.check_numerics `_, -however they will add operations to the Tensorflow graph and raise the computation time. - -.. code-block:: python - - import tensorflow as tf - - print("tensorflow test:") - - a = tf.constant(1.0) - b = tf.constant(0.0) - c = a / b - - check_nan = tf.add_check_numerics_ops() # add after your graph definition. - - sess = tf.Session() - val, _ = sess.run([c, check_nan]) # this will now raise an exception - print(val) - sess.close() - -but this will also avoid overflow issues on floating point numbers: - -.. code-block:: python - - import tensorflow as tf - - print("tensorflow overflow test:") - - check_nan = [] # the list of check_numerics operations - - a = tf.constant(10) - b = tf.constant(1000) - c = a ** b - - check_nan.append(tf.check_numerics(c, "")) # check the 'c' operations - - sess = tf.Session() - val, _ = sess.run([c] + check_nan) # this will now raise an exception - print(val) - sess.close() - -and catch propagation issues: - -.. code-block:: python - - import tensorflow as tf - - print("tensorflow propagation test:") - - check_nan = [] # the list of check_numerics operations - - a = tf.constant('NaN') - b = tf.constant(1.0) - c = a + b - - check_nan.append(tf.check_numerics(c, "")) # check the 'c' operations - - sess = tf.Session() - val, _ = sess.run([c] + check_nan) # this will now raise an exception - print(val) - sess.close() - - -VecCheckNan Wrapper -------------------- - -In order to find when and from where the invalid value originated from, stable-baselines comes with a ``VecCheckNan`` wrapper. - -It will monitor the actions, observations, and rewards, indicating what action or observation caused it and from what. - -.. code-block:: python - - import gym - from gym import spaces - import numpy as np - - from stable_baselines import PPO2 - from stable_baselines.common.vec_env import DummyVecEnv, VecCheckNan - - class NanAndInfEnv(gym.Env): - """Custom Environment that raised NaNs and Infs""" - metadata = {'render.modes': ['human']} - - def __init__(self): - super(NanAndInfEnv, self).__init__() - self.action_space = spaces.Box(low=-np.inf, high=np.inf, shape=(1,), dtype=np.float64) - self.observation_space = spaces.Box(low=-np.inf, high=np.inf, shape=(1,), dtype=np.float64) - - def step(self, _action): - randf = np.random.rand() - if randf > 0.99: - obs = float('NaN') - elif randf > 0.98: - obs = float('inf') - else: - obs = randf - return [obs], 0.0, False, {} - - def reset(self): - return [0.0] - - def render(self, mode='human', close=False): - pass - - # Create environment - env = DummyVecEnv([lambda: NanAndInfEnv()]) - env = VecCheckNan(env, raise_exception=True) - - # Instantiate the agent - model = PPO2('MlpPolicy', env) - - # Train the agent - model.learn(total_timesteps=int(2e5)) # this will crash explaining that the invalid value originated from the environment. - -RL Model hyperparameters ------------------------- - -Depending on your hyperparameters, NaN can occurs much more often. -A great example of this: https://github.com/hill-a/stable-baselines/issues/340 - -Be aware, the hyperparameters given by default seem to work in most cases, -however your environment might not play nice with them. -If this is the case, try to read up on the effect each hyperparameters has on the model, -so that you can try and tune them to get a stable model. Alternatively, you can try automatic hyperparameter tuning (included in the rl zoo). - -Missing values from datasets ----------------------------- - -If your environment is generated from an external dataset, do not forget to make sure your dataset does not contain NaNs. -As some datasets will sometimes fill missing values with NaNs as a surrogate value. - -Here is some reading material about finding NaNs: https://pandas.pydata.org/pandas-docs/stable/user_guide/missing_data.html - -And filling the missing values with something else (imputation): https://towardsdatascience.com/how-to-handle-missing-data-8646b18db0d4 - diff --git a/docs/guide/custom_env.rst b/docs/guide/custom_env.rst deleted file mode 100644 index e3b91ab5..00000000 --- a/docs/guide/custom_env.rst +++ /dev/null @@ -1,82 +0,0 @@ -.. _custom_env: - -Using Custom Environments -========================== - -To use the rl baselines with custom environments, they just need to follow the *gym* interface. -That is to say, your environment must implement the following methods (and inherits from OpenAI Gym Class): - - -.. note:: - If you are using images as input, the input values must be in [0, 255] as the observation - is normalized (dividing by 255 to have values in [0, 1]) when using CNN policies. - - - -.. code-block:: python - - import gym - from gym import spaces - - class CustomEnv(gym.Env): - """Custom Environment that follows gym interface""" - metadata = {'render.modes': ['human']} - - def __init__(self, arg1, arg2, ...): - super(CustomEnv, self).__init__() - # Define action and observation space - # They must be gym.spaces objects - # Example when using discrete actions: - self.action_space = spaces.Discrete(N_DISCRETE_ACTIONS) - # Example for using image as input: - self.observation_space = spaces.Box(low=0, high=255, - shape=(HEIGHT, WIDTH, N_CHANNELS), dtype=np.uint8) - - def step(self, action): - ... - return observation, reward, done, info - def reset(self): - ... - return observation # reward, done, info can't be included - def render(self, mode='human'): - ... - def close (self): - ... - - -Then you can define and train a RL agent with: - -.. code-block:: python - - # Instantiate the env - env = CustomEnv(arg1, ...) - # Define and Train the agent - model = A2C('CnnPolicy', env).learn(total_timesteps=1000) - - -To check that your environment follows the gym interface, please use: - -.. code-block:: python - - from stable_baselines.common.env_checker import check_env - - env = CustomEnv(arg1, ...) - # It will check your custom environment and output additional warnings if needed - check_env(env) - - - -We have created a `colab notebook `_ for -a concrete example of creating a custom environment. - -You can also find a `complete guide online `_ -on creating a custom Gym environment. - - -Optionally, you can also register the environment with gym, -that will allow you to create the RL agent in one line (and use ``gym.make()`` to instantiate the env). - - -In the project, for testing purposes, we use a custom environment named ``IdentityEnv`` -defined `in this file `_. -An example of how to use it can be found `here `_. diff --git a/docs/guide/custom_policy.rst b/docs/guide/custom_policy.rst deleted file mode 100644 index 45b2a431..00000000 --- a/docs/guide/custom_policy.rst +++ /dev/null @@ -1,246 +0,0 @@ -.. _custom_policy: - -Custom Policy Network ---------------------- - -Stable baselines provides default policy networks (see :ref:`Policies ` ) for images (CNNPolicies) -and other type of input features (MlpPolicies). - -One way of customising the policy network architecture is to pass arguments when creating the model, -using ``policy_kwargs`` parameter: - -.. code-block:: python - - import gym - import tensorflow as tf - - from stable_baselines import PPO2 - - # Custom MLP policy of two layers of size 32 each with tanh activation function - policy_kwargs = dict(act_fun=tf.nn.tanh, net_arch=[32, 32]) - # Create the agent - model = PPO2("MlpPolicy", "CartPole-v1", policy_kwargs=policy_kwargs, verbose=1) - # Retrieve the environment - env = model.get_env() - # Train the agent - model.learn(total_timesteps=100000) - # Save the agent - model.save("ppo2-cartpole") - - del model - # the policy_kwargs are automatically loaded - model = PPO2.load("ppo2-cartpole") - - -You can also easily define a custom architecture for the policy (or value) network: - -.. note:: - - Defining a custom policy class is equivalent to passing ``policy_kwargs``. - However, it lets you name the policy and so makes usually the code clearer. - ``policy_kwargs`` should be rather used when doing hyperparameter search. - - - -.. code-block:: python - - import gym - - from stable_baselines.common.policies import FeedForwardPolicy, register_policy - from stable_baselines.common.vec_env import DummyVecEnv - from stable_baselines import A2C - - # Custom MLP policy of three layers of size 128 each - class CustomPolicy(FeedForwardPolicy): - def __init__(self, *args, **kwargs): - super(CustomPolicy, self).__init__(*args, **kwargs, - net_arch=[dict(pi=[128, 128, 128], - vf=[128, 128, 128])], - feature_extraction="mlp") - - # Create and wrap the environment - env = gym.make('LunarLander-v2') - env = DummyVecEnv([lambda: env]) - - model = A2C(CustomPolicy, env, verbose=1) - # Train the agent - model.learn(total_timesteps=100000) - # Save the agent - model.save("a2c-lunar") - - del model - # When loading a model with a custom policy - # you MUST pass explicitly the policy when loading the saved model - model = A2C.load("a2c-lunar", policy=CustomPolicy) - -.. warning:: - - When loading a model with a custom policy, you must pass the custom policy explicitly when loading the model. - (cf previous example) - - -You can also register your policy, to help with code simplicity: you can refer to your custom policy using a string. - -.. code-block:: python - - import gym - - from stable_baselines.common.policies import FeedForwardPolicy, register_policy - from stable_baselines.common.vec_env import DummyVecEnv - from stable_baselines import A2C - - # Custom MLP policy of three layers of size 128 each - class CustomPolicy(FeedForwardPolicy): - def __init__(self, *args, **kwargs): - super(CustomPolicy, self).__init__(*args, **kwargs, - net_arch=[dict(pi=[128, 128, 128], - vf=[128, 128, 128])], - feature_extraction="mlp") - - # Register the policy, it will check that the name is not already taken - register_policy('CustomPolicy', CustomPolicy) - - # Because the policy is now registered, you can pass - # a string to the agent constructor instead of passing a class - model = A2C(policy='CustomPolicy', env='LunarLander-v2', verbose=1).learn(total_timesteps=100000) - - -.. deprecated:: 2.3.0 - - Use ``net_arch`` instead of ``layers`` parameter to define the network architecture. It allows to have a greater control. - - -The ``net_arch`` parameter of ``FeedForwardPolicy`` allows to specify the amount and size of the hidden layers and how many -of them are shared between the policy network and the value network. It is assumed to be a list with the following -structure: - -1. An arbitrary length (zero allowed) number of integers each specifying the number of units in a shared layer. - If the number of ints is zero, there will be no shared layers. -2. An optional dict, to specify the following non-shared layers for the value network and the policy network. - It is formatted like ``dict(vf=[], pi=[])``. - If it is missing any of the keys (pi or vf), no non-shared layers (empty list) is assumed. - -In short: ``[, dict(vf=[], pi=[])]``. - -Examples -~~~~~~~~ - -Two shared layers of size 128: ``net_arch=[128, 128]`` - - -.. code-block:: none - - obs - | - <128> - | - <128> - / \ - action value - - -Value network deeper than policy network, first layer shared: ``net_arch=[128, dict(vf=[256, 256])]`` - -.. code-block:: none - - obs - | - <128> - / \ - action <256> - | - <256> - | - value - - -Initially shared then diverging: ``[128, dict(vf=[256], pi=[16])]`` - -.. code-block:: none - - obs - | - <128> - / \ - <16> <256> - | | - action value - -The ``LstmPolicy`` can be used to construct recurrent policies in a similar way: - -.. code-block:: python - - class CustomLSTMPolicy(LstmPolicy): - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, n_lstm=64, reuse=False, **_kwargs): - super().__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, n_lstm, reuse, - net_arch=[8, 'lstm', dict(vf=[5, 10], pi=[10])], - layer_norm=True, feature_extraction="mlp", **_kwargs) - -Here the ``net_arch`` parameter takes an additional (mandatory) 'lstm' entry within the shared network section. -The LSTM is shared between value network and policy network. - - - - -If your task requires even more granular control over the policy architecture, you can redefine the policy directly: - -.. code-block:: python - - import gym - import tensorflow as tf - - from stable_baselines.common.policies import ActorCriticPolicy, register_policy, nature_cnn - from stable_baselines.common.vec_env import DummyVecEnv - from stable_baselines import A2C - - # Custom MLP policy of three layers of size 128 each for the actor and 2 layers of 32 for the critic, - # with a nature_cnn feature extractor - class CustomPolicy(ActorCriticPolicy): - def __init__(self, sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse=False, **kwargs): - super(CustomPolicy, self).__init__(sess, ob_space, ac_space, n_env, n_steps, n_batch, reuse=reuse, scale=True) - - with tf.variable_scope("model", reuse=reuse): - activ = tf.nn.relu - - extracted_features = nature_cnn(self.processed_obs, **kwargs) - extracted_features = tf.layers.flatten(extracted_features) - - pi_h = extracted_features - for i, layer_size in enumerate([128, 128, 128]): - pi_h = activ(tf.layers.dense(pi_h, layer_size, name='pi_fc' + str(i))) - pi_latent = pi_h - - vf_h = extracted_features - for i, layer_size in enumerate([32, 32]): - vf_h = activ(tf.layers.dense(vf_h, layer_size, name='vf_fc' + str(i))) - value_fn = tf.layers.dense(vf_h, 1, name='vf') - vf_latent = vf_h - - self._proba_distribution, self._policy, self.q_value = \ - self.pdtype.proba_distribution_from_latent(pi_latent, vf_latent, init_scale=0.01) - - self._value_fn = value_fn - self._setup_init() - - def step(self, obs, state=None, mask=None, deterministic=False): - if deterministic: - action, value, neglogp = self.sess.run([self.deterministic_action, self.value_flat, self.neglogp], - {self.obs_ph: obs}) - else: - action, value, neglogp = self.sess.run([self.action, self.value_flat, self.neglogp], - {self.obs_ph: obs}) - return action, value, self.initial_state, neglogp - - def proba_step(self, obs, state=None, mask=None): - return self.sess.run(self.policy_proba, {self.obs_ph: obs}) - - def value(self, obs, state=None, mask=None): - return self.sess.run(self.value_flat, {self.obs_ph: obs}) - - - # Create and wrap the environment - env = DummyVecEnv([lambda: gym.make('Breakout-v0')]) - - model = A2C(CustomPolicy, env, verbose=1) - # Train the agent - model.learn(total_timesteps=100000) diff --git a/docs/guide/examples.rst b/docs/guide/examples.rst deleted file mode 100644 index 36672b22..00000000 --- a/docs/guide/examples.rst +++ /dev/null @@ -1,680 +0,0 @@ -.. _examples: - -Examples -======== - -Try it online with Colab Notebooks! ------------------------------------ - -All the following examples can be executed online using Google colab |colab| -notebooks: - -- `Full Tutorial `_ -- `All Notebooks `_ -- `Getting Started`_ -- `Training, Saving, Loading`_ -- `Multiprocessing`_ -- `Monitor Training and Plotting`_ -- `Atari Games`_ -- `Breakout`_ (trained agent included) -- `Hindsight Experience Replay`_ -- `RL Baselines zoo`_ - -.. _Getting Started: https://colab.research.google.com/github/Stable-Baselines-Team/rl-colab-notebooks/blob/master/stable_baselines_getting_started.ipynb -.. _Training, Saving, Loading: https://colab.research.google.com/github/Stable-Baselines-Team/rl-colab-notebooks/blob/master/saving_loading_dqn.ipynb -.. _Multiprocessing: https://colab.research.google.com/github/Stable-Baselines-Team/rl-colab-notebooks/blob/master/multiprocessing_rl.ipynb -.. _Monitor Training and Plotting: https://colab.research.google.com/github/Stable-Baselines-Team/rl-colab-notebooks/blob/master/monitor_training.ipynb -.. _Atari Games: https://colab.research.google.com/github/Stable-Baselines-Team/rl-colab-notebooks/blob/master/atari_games.ipynb -.. _Breakout: https://colab.research.google.com/github/Stable-Baselines-Team/rl-colab-notebooks/blob/master/breakout.ipynb -.. _Hindsight Experience Replay: https://colab.research.google.com/github/Stable-Baselines-Team/rl-colab-notebooks/blob/master/stable_baselines_her.ipynb -.. _RL Baselines zoo: https://colab.research.google.com/github/Stable-Baselines-Team/rl-colab-notebooks/blob/master/rl-baselines-zoo.ipynb - -.. |colab| image:: ../_static/img/colab.svg - -Basic Usage: Training, Saving, Loading --------------------------------------- - -In the following example, we will train, save and load a DQN model on the Lunar Lander environment. - -.. image:: ../_static/img/try_it.png - :scale: 30 % - :target: https://colab.research.google.com/github/Stable-Baselines-Team/rl-colab-notebooks/blob/master/saving_loading_dqn.ipynb - - -.. figure:: https://cdn-images-1.medium.com/max/960/1*f4VZPKOI0PYNWiwt0la0Rg.gif - - Lunar Lander Environment - - -.. note:: - LunarLander requires the python package ``box2d``. - You can install it using ``apt install swig`` and then ``pip install box2d box2d-kengz`` - -.. note:: - ``load`` function re-creates model from scratch on each call, which can be slow. - If you need to e.g. evaluate same model with multiple different sets of parameters, consider - using ``load_parameters`` instead. - -.. code-block:: python - - import gym - - from stable_baselines import DQN - from stable_baselines.common.evaluation import evaluate_policy - - - # Create environment - env = gym.make('LunarLander-v2') - - # Instantiate the agent - model = DQN('MlpPolicy', env, learning_rate=1e-3, prioritized_replay=True, verbose=1) - # Train the agent - model.learn(total_timesteps=int(2e5)) - # Save the agent - model.save("dqn_lunar") - del model # delete trained model to demonstrate loading - - # Load the trained agent - model = DQN.load("dqn_lunar") - - # Evaluate the agent - mean_reward, std_reward = evaluate_policy(model, model.get_env(), n_eval_episodes=10) - - # Enjoy trained agent - obs = env.reset() - for i in range(1000): - action, _states = model.predict(obs) - obs, rewards, dones, info = env.step(action) - env.render() - - -Multiprocessing: Unleashing the Power of Vectorized Environments ----------------------------------------------------------------- - -.. image:: ../_static/img/try_it.png - :scale: 30 % - :target: https://colab.research.google.com/github/Stable-Baselines-Team/rl-colab-notebooks/blob/master/multiprocessing_rl.ipynb - -.. figure:: https://cdn-images-1.medium.com/max/960/1*h4WTQNVIsvMXJTCpXm_TAw.gif - - CartPole Environment - - -.. code-block:: python - - import gym - import numpy as np - - from stable_baselines.common.policies import MlpPolicy - from stable_baselines.common.vec_env import SubprocVecEnv - from stable_baselines.common import set_global_seeds, make_vec_env - from stable_baselines import ACKTR - - def make_env(env_id, rank, seed=0): - """ - Utility function for multiprocessed env. - - :param env_id: (str) the environment ID - :param num_env: (int) the number of environments you wish to have in subprocesses - :param seed: (int) the inital seed for RNG - :param rank: (int) index of the subprocess - """ - def _init(): - env = gym.make(env_id) - env.seed(seed + rank) - return env - set_global_seeds(seed) - return _init - - if __name__ == '__main__': - env_id = "CartPole-v1" - num_cpu = 4 # Number of processes to use - # Create the vectorized environment - env = SubprocVecEnv([make_env(env_id, i) for i in range(num_cpu)]) - - # Stable Baselines provides you with make_vec_env() helper - # which does exactly the previous steps for you: - # env = make_vec_env(env_id, n_envs=num_cpu, seed=0) - - model = ACKTR(MlpPolicy, env, verbose=1) - model.learn(total_timesteps=25000) - - obs = env.reset() - for _ in range(1000): - action, _states = model.predict(obs) - obs, rewards, dones, info = env.step(action) - env.render() - - - -Using Callback: Monitoring Training ------------------------------------ - -.. note:: - - We recommend reading the `Callback section `_ - -You can define a custom callback function that will be called inside the agent. -This could be useful when you want to monitor training, for instance display live -learning curves in Tensorboard (or in Visdom) or save the best agent. -If your callback returns False, training is aborted early. - -.. image:: ../_static/img/try_it.png - :scale: 30 % - :target: https://colab.research.google.com/github/Stable-Baselines-Team/rl-colab-notebooks/blob/master/monitor_training.ipynb - -.. figure:: ../_static/img/learning_curve.png - - Learning curve of DDPG on LunarLanderContinuous environment - -.. code-block:: python - - import os - - import gym - import numpy as np - import matplotlib.pyplot as plt - - from stable_baselines import DDPG - from stable_baselines.ddpg.policies import LnMlpPolicy - from stable_baselines import results_plotter - from stable_baselines.bench import Monitor - from stable_baselines.results_plotter import load_results, ts2xy - from stable_baselines.common.noise import AdaptiveParamNoiseSpec - from stable_baselines.common.callbacks import BaseCallback - - - class SaveOnBestTrainingRewardCallback(BaseCallback): - """ - Callback for saving a model (the check is done every ``check_freq`` steps) - based on the training reward (in practice, we recommend using ``EvalCallback``). - - :param check_freq: (int) - :param log_dir: (str) Path to the folder where the model will be saved. - It must contains the file created by the ``Monitor`` wrapper. - :param verbose: (int) - """ - def __init__(self, check_freq: int, log_dir: str, verbose=1): - super(SaveOnBestTrainingRewardCallback, self).__init__(verbose) - self.check_freq = check_freq - self.log_dir = log_dir - self.save_path = os.path.join(log_dir, 'best_model') - self.best_mean_reward = -np.inf - - def _init_callback(self) -> None: - # Create folder if needed - if self.save_path is not None: - os.makedirs(self.save_path, exist_ok=True) - - def _on_step(self) -> bool: - if self.n_calls % self.check_freq == 0: - - # Retrieve training reward - x, y = ts2xy(load_results(self.log_dir), 'timesteps') - if len(x) > 0: - # Mean training reward over the last 100 episodes - mean_reward = np.mean(y[-100:]) - if self.verbose > 0: - print("Num timesteps: {}".format(self.num_timesteps)) - print("Best mean reward: {:.2f} - Last mean reward per episode: {:.2f}".format(self.best_mean_reward, mean_reward)) - - # New best model, you could save the agent here - if mean_reward > self.best_mean_reward: - self.best_mean_reward = mean_reward - # Example for saving best model - if self.verbose > 0: - print("Saving new best model to {}".format(self.save_path)) - self.model.save(self.save_path) - - return True - - # Create log dir - log_dir = "tmp/" - os.makedirs(log_dir, exist_ok=True) - - # Create and wrap the environment - env = gym.make('LunarLanderContinuous-v2') - env = Monitor(env, log_dir) - - # Add some param noise for exploration - param_noise = AdaptiveParamNoiseSpec(initial_stddev=0.1, desired_action_stddev=0.1) - # Because we use parameter noise, we should use a MlpPolicy with layer normalization - model = DDPG(LnMlpPolicy, env, param_noise=param_noise, verbose=0) - # Create the callback: check every 1000 steps - callback = SaveOnBestTrainingRewardCallback(check_freq=1000, log_dir=log_dir) - # Train the agent - time_steps = 1e5 - model.learn(total_timesteps=int(time_steps), callback=callback) - - results_plotter.plot_results([log_dir], time_steps, results_plotter.X_TIMESTEPS, "DDPG LunarLander") - plt.show() - - -Atari Games ------------ - -.. figure:: ../_static/img/breakout.gif - - Trained A2C agent on Breakout - -.. figure:: https://cdn-images-1.medium.com/max/960/1*UHYJE7lF8IDZS_U5SsAFUQ.gif - - Pong Environment - - -Training a RL agent on Atari games is straightforward thanks to ``make_atari_env`` helper function. -It will do `all the preprocessing `_ -and multiprocessing for you. - -.. image:: ../_static/img/try_it.png - :scale: 30 % - :target: https://colab.research.google.com/github/Stable-Baselines-Team/rl-colab-notebooks/blob/master/atari_games.ipynb - - -.. code-block:: python - - from stable_baselines.common.cmd_util import make_atari_env - from stable_baselines.common.vec_env import VecFrameStack - from stable_baselines import ACER - - # There already exists an environment generator - # that will make and wrap atari environments correctly. - # Here we are also multiprocessing training (num_env=4 => 4 processes) - env = make_atari_env('PongNoFrameskip-v4', num_env=4, seed=0) - # Frame-stacking with 4 frames - env = VecFrameStack(env, n_stack=4) - - model = ACER('CnnPolicy', env, verbose=1) - model.learn(total_timesteps=25000) - - obs = env.reset() - while True: - action, _states = model.predict(obs) - obs, rewards, dones, info = env.step(action) - env.render() - - -PyBullet: Normalizing input features ------------------------------------- - -Normalizing input features may be essential to successful training of an RL agent -(by default, images are scaled but not other types of input), -for instance when training on `PyBullet `_ environments. For that, a wrapper exists and -will compute a running average and standard deviation of input features (it can do the same for rewards). - - -.. note:: - - you need to install pybullet with ``pip install pybullet`` - - -.. code-block:: python - - import os - - import gym - import pybullet_envs - - from stable_baselines.common.vec_env import DummyVecEnv, VecNormalize - from stable_baselines import PPO2 - - env = DummyVecEnv([lambda: gym.make("HalfCheetahBulletEnv-v0")]) - # Automatically normalize the input features and reward - env = VecNormalize(env, norm_obs=True, norm_reward=True, - clip_obs=10.) - - model = PPO2('MlpPolicy', env) - model.learn(total_timesteps=2000) - - # Don't forget to save the VecNormalize statistics when saving the agent - log_dir = "/tmp/" - model.save(log_dir + "ppo_halfcheetah") - stats_path = os.path.join(log_dir, "vec_normalize.pkl") - env.save(stats_path) - - # To demonstrate loading - del model, env - - # Load the agent - model = PPO2.load(log_dir + "ppo_halfcheetah") - - # Load the saved statistics - env = DummyVecEnv([lambda: gym.make("HalfCheetahBulletEnv-v0")]) - env = VecNormalize.load(stats_path, env) - # do not update them at test time - env.training = False - # reward normalization is not needed at test time - env.norm_reward = False - - - -Custom Policy Network ---------------------- - -Stable baselines provides default policy networks for images (CNNPolicies) -and other type of inputs (MlpPolicies). -However, you can also easily define a custom architecture for the policy network `(see custom policy section) `_: - -.. code-block:: python - - import gym - - from stable_baselines.common.policies import FeedForwardPolicy - from stable_baselines.common.vec_env import DummyVecEnv - from stable_baselines import A2C - - # Custom MLP policy of three layers of size 128 each - class CustomPolicy(FeedForwardPolicy): - def __init__(self, *args, **kwargs): - super(CustomPolicy, self).__init__(*args, **kwargs, - net_arch=[dict(pi=[128, 128, 128], vf=[128, 128, 128])], - feature_extraction="mlp") - - model = A2C(CustomPolicy, 'LunarLander-v2', verbose=1) - # Train the agent - model.learn(total_timesteps=100000) - - -Accessing and modifying model parameters ----------------------------------------- - -You can access model's parameters via ``load_parameters`` and ``get_parameters`` functions, which -use dictionaries that map variable names to NumPy arrays. - -These functions are useful when you need to e.g. evaluate large set of models with same network structure, -visualize different layers of the network or modify parameters manually. - -You can access original Tensorflow Variables with function ``get_parameter_list``. - -Following example demonstrates reading parameters, modifying some of them and loading them to model -by implementing `evolution strategy `_ -for solving ``CartPole-v1`` environment. The initial guess for parameters is obtained by running -A2C policy gradient updates on the model. - -.. code-block:: python - - import gym - import numpy as np - - from stable_baselines import A2C - - def mutate(params): - """Mutate parameters by adding normal noise to them""" - return dict((name, param + np.random.normal(size=param.shape)) - for name, param in params.items()) - - def evaluate(env, model): - """Return mean fitness (sum of episodic rewards) for given model""" - episode_rewards = [] - for _ in range(10): - reward_sum = 0 - done = False - obs = env.reset() - while not done: - action, _states = model.predict(obs) - obs, reward, done, info = env.step(action) - reward_sum += reward - episode_rewards.append(reward_sum) - return np.mean(episode_rewards) - - # Create env - env = gym.make('CartPole-v1') - # Create policy with a small network - model = A2C('MlpPolicy', env, ent_coef=0.0, learning_rate=0.1, - policy_kwargs={'net_arch': [8, ]}) - - # Use traditional actor-critic policy gradient updates to - # find good initial parameters - model.learn(total_timesteps=5000) - - # Get the parameters as the starting point for ES - mean_params = model.get_parameters() - - # Include only variables with "/pi/" (policy) or "/shared" (shared layers) - # in their name: Only these ones affect the action. - mean_params = dict((key, value) for key, value in mean_params.items() - if ("/pi/" in key or "/shared" in key)) - - for iteration in range(10): - # Create population of candidates and evaluate them - population = [] - for population_i in range(100): - candidate = mutate(mean_params) - # Load new policy parameters to agent. - # Tell function that it should only update parameters - # we give it (policy parameters) - model.load_parameters(candidate, exact_match=False) - fitness = evaluate(env, model) - population.append((candidate, fitness)) - # Take top 10% and use average over their parameters as next mean parameter - top_candidates = sorted(population, key=lambda x: x[1], reverse=True)[:10] - mean_params = dict( - (name, np.stack([top_candidate[0][name] for top_candidate in top_candidates]).mean(0)) - for name in mean_params.keys() - ) - mean_fitness = sum(top_candidate[1] for top_candidate in top_candidates) / 10.0 - print("Iteration {:<3} Mean top fitness: {:.2f}".format(iteration, mean_fitness)) - - -Recurrent Policies ------------------- - -This example demonstrate how to train a recurrent policy and how to test it properly. - -.. warning:: - - One current limitation of recurrent policies is that you must test them - with the same number of environments they have been trained on. - - -.. code-block:: python - - from stable_baselines import PPO2 - - # For recurrent policies, with PPO2, the number of environments run in parallel - # should be a multiple of nminibatches. - model = PPO2('MlpLstmPolicy', 'CartPole-v1', nminibatches=1, verbose=1) - model.learn(50000) - - # Retrieve the env - env = model.get_env() - - obs = env.reset() - # Passing state=None to the predict function means - # it is the initial state - state = None - # When using VecEnv, done is a vector - done = [False for _ in range(env.num_envs)] - for _ in range(1000): - # We need to pass the previous state and a mask for recurrent policies - # to reset lstm state when a new episode begin - action, state = model.predict(obs, state=state, mask=done) - obs, reward , done, _ = env.step(action) - # Note: with VecEnv, env.reset() is automatically called - - # Show the env - env.render() - - -Hindsight Experience Replay (HER) ---------------------------------- - -For this example, we are using `Highway-Env `_ by `@eleurent `_. - - -.. image:: ../_static/img/try_it.png - :scale: 30 % - :target: https://colab.research.google.com/github/Stable-Baselines-Team/rl-colab-notebooks/blob/master/stable_baselines_her.ipynb - - -.. figure:: https://raw.githubusercontent.com/eleurent/highway-env/gh-media/docs/media/parking-env.gif - - The highway-parking-v0 environment. - -The parking env is a goal-conditioned continuous control task, in which the vehicle must park in a given space with the appropriate heading. - -.. note:: - - the hyperparameters in the following example were optimized for that environment. - - -.. code-block:: python - - import gym - import highway_env - import numpy as np - - from stable_baselines import HER, SAC, DDPG, TD3 - from stable_baselines.ddpg import NormalActionNoise - - env = gym.make("parking-v0") - - # Create 4 artificial transitions per real transition - n_sampled_goal = 4 - - # SAC hyperparams: - model = HER('MlpPolicy', env, SAC, n_sampled_goal=n_sampled_goal, - goal_selection_strategy='future', - verbose=1, buffer_size=int(1e6), - learning_rate=1e-3, - gamma=0.95, batch_size=256, - policy_kwargs=dict(layers=[256, 256, 256])) - - # DDPG Hyperparams: - # NOTE: it works even without action noise - # n_actions = env.action_space.shape[0] - # noise_std = 0.2 - # action_noise = NormalActionNoise(mean=np.zeros(n_actions), sigma=noise_std * np.ones(n_actions)) - # model = HER('MlpPolicy', env, DDPG, n_sampled_goal=n_sampled_goal, - # goal_selection_strategy='future', - # verbose=1, buffer_size=int(1e6), - # actor_lr=1e-3, critic_lr=1e-3, action_noise=action_noise, - # gamma=0.95, batch_size=256, - # policy_kwargs=dict(layers=[256, 256, 256])) - - - model.learn(int(2e5)) - model.save('her_sac_highway') - - # Load saved model - model = HER.load('her_sac_highway', env=env) - - obs = env.reset() - - # Evaluate the agent - episode_reward = 0 - for _ in range(100): - action, _ = model.predict(obs) - obs, reward, done, info = env.step(action) - env.render() - episode_reward += reward - if done or info.get('is_success', False): - print("Reward:", episode_reward, "Success?", info.get('is_success', False)) - episode_reward = 0.0 - obs = env.reset() - - - -Continual Learning ------------------- - -You can also move from learning on one environment to another for `continual learning `_ -(PPO2 on ``DemonAttack-v0``, then transferred on ``SpaceInvaders-v0``): - -.. code-block:: python - - from stable_baselines.common.cmd_util import make_atari_env - from stable_baselines import PPO2 - - # There already exists an environment generator - # that will make and wrap atari environments correctly - env = make_atari_env('DemonAttackNoFrameskip-v4', num_env=8, seed=0) - - model = PPO2('CnnPolicy', env, verbose=1) - model.learn(total_timesteps=10000) - - obs = env.reset() - for i in range(1000): - action, _states = model.predict(obs) - obs, rewards, dones, info = env.step(action) - env.render() - - # Close the processes - env.close() - - # The number of environments must be identical when changing environments - env = make_atari_env('SpaceInvadersNoFrameskip-v4', num_env=8, seed=0) - - # change env - model.set_env(env) - model.learn(total_timesteps=10000) - - obs = env.reset() - while True: - action, _states = model.predict(obs) - obs, rewards, dones, info = env.step(action) - env.render() - env.close() - - -Record a Video --------------- - -Record a mp4 video (here using a random agent). - -.. note:: - - It requires ffmpeg or avconv to be installed on the machine. - -.. code-block:: python - - import gym - from stable_baselines.common.vec_env import VecVideoRecorder, DummyVecEnv - - env_id = 'CartPole-v1' - video_folder = 'logs/videos/' - video_length = 100 - - env = DummyVecEnv([lambda: gym.make(env_id)]) - - obs = env.reset() - - # Record the video starting at the first step - env = VecVideoRecorder(env, video_folder, - record_video_trigger=lambda x: x == 0, video_length=video_length, - name_prefix="random-agent-{}".format(env_id)) - - env.reset() - for _ in range(video_length + 1): - action = [env.action_space.sample()] - obs, _, _, _ = env.step(action) - # Save the video - env.close() - - -Bonus: Make a GIF of a Trained Agent ------------------------------------- - -.. note:: - For Atari games, you need to use a screen recorder such as `Kazam `_. - And then convert the video using `ffmpeg `_ - -.. code-block:: python - - import imageio - import numpy as np - - from stable_baselines import A2C - - model = A2C("MlpPolicy", "LunarLander-v2").learn(100000) - - images = [] - obs = model.env.reset() - img = model.env.render(mode='rgb_array') - for i in range(350): - images.append(img) - action, _ = model.predict(obs) - obs, _, _ ,_ = model.env.step(action) - img = model.env.render(mode='rgb_array') - - imageio.mimsave('lander_a2c.gif', [np.array(img) for i, img in enumerate(images) if i%2 == 0], fps=29) diff --git a/docs/guide/export.rst b/docs/guide/export.rst deleted file mode 100644 index a4180153..00000000 --- a/docs/guide/export.rst +++ /dev/null @@ -1,103 +0,0 @@ -.. _export: - - -Exporting models -================ - -After training an agent, you may want to deploy/use it in an other language -or framework, like PyTorch or `tensorflowjs `_. -Stable Baselines does not include tools to export models to other frameworks, but -this document aims to cover parts that are required for exporting along with -more detailed stories from users of Stable Baselines. - - -Background ----------- - -In Stable Baselines, the controller is stored inside :ref:`policies ` which convert -observations into actions. Each learning algorithm (e.g. DQN, A2C, SAC) contains -one or more policies, some of which are only used for training. An easy way to find -the policy is to check the code for the ``predict`` function of the agent: -This function should only call one policy with simple arguments. - -Policies hold the necessary Tensorflow placeholders and tensors to do the -inference (i.e. predict actions), so it is enough to export these policies -to do inference in an another framework. - -.. note:: - Learning algorithms also may contain other Tensorflow placeholders, that are used for training only and are - not required for inference. - - -.. warning:: - When using CNN policies, the observation is normalized internally (dividing by 255 to have values in [0, 1]) - - -Export to PyTorch ------------------ - -A known working solution is to use :func:`get_parameters ` -function to obtain model parameters, construct the network manually in PyTorch and assign parameters correctly. - -.. warning:: - PyTorch and Tensorflow have internal differences with e.g. 2D convolutions (see discussion linked below). - - -See `discussion #372 `_ for details. - - -Export to C++ ------------------ - -Tensorflow, which is the backbone of Stable Baselines, is fundamentally a C/C++ library despite being most commonly accessed -through the Python frontend layer. This design choice means that the models created at Python level should generally be -fully compliant with the respective C++ version of Tensorflow. - -.. warning:: - It is advisable not to mix-and-match different versions of Tensorflow libraries, particularly in terms of the state. - Moving computational graphs is generally more forgiving. As a matter of fact, mentioned below `PPO_CPP `_ project uses - graphs generated with Python Tensorflow 1.x in C++ Tensorflow 2 version. - -Stable Baselines comes very handily when hoping to migrate a computational graph and/or a state (weights) as -the existing algorithms define most of the necessary computations for you so you don't need to recreate the core of the algorithms again. -This is exactly the idea that has been used in the `PPO_CPP `_ project, which executes the training at the C++ level for the sake of -computational efficiency. The graphs are exported from Stable Baselines' PPO2 implementation through ``tf.train.export_meta_graph`` -function. Alternatively, and perhaps more commonly, you could use the C++ layer only for inference. That could be useful -as a deployment step of server backends or optimization for more limited devices. - -.. warning:: - As a word of caution, C++-level APIs are more imperative than their Python counterparts or more plainly speaking: cruder. - This is particularly apparent in Tensorflow 2.0 where the declarativeness of Autograph exists only at Python level. The - C++ counterpart still operates on Session objects' use, which are known from earlier versions of Tensorflow. In our use case, - availability of graphs utilized by Session depends on the use of ``tf.function`` decorators. However, as of November 2019, Stable Baselines still - uses Tensorflow 1.x in the main version which is slightly easier to use in the context of the C++ portability. - - -Export to tensorflowjs / tfjs ------------------------------ - -Can be done via Tensorflow's `simple_save `_ function -and `tensorflowjs_converter `_. - -See `discussion #474 `_ for details. - - -Export to Java ---------------- - -Can be done via Tensorflow's `simple_save `_ function. - -See `this discussion `_ for details. - - -Manual export -------------- - -You can also manually export required parameters (weights) and construct the -network in your desired framework, as done with the PyTorch example above. - -You can access parameters of the model via agents' -:func:`get_parameters ` -function. If you use default policies, you can find the architecture of the networks in -source for :ref:`policies `. Otherwise, for DQN/SAC/DDPG or TD3 you need to check the `policies.py` file located -in their respective folders. diff --git a/docs/guide/install.rst b/docs/guide/install.rst deleted file mode 100644 index 07b11d60..00000000 --- a/docs/guide/install.rst +++ /dev/null @@ -1,196 +0,0 @@ -.. _install: - -Installation -============ - -Prerequisites -------------- - -Baselines requires python3 (>=3.5) with the development headers. You'll -also need system packages CMake, OpenMPI and zlib. Those can be -installed as follows - -.. note:: - - Stable-Baselines supports Tensorflow versions from 1.8.0 to 1.15.0, and does not work on - Tensorflow versions 2.0.0 and above. PyTorch support is done in `Stable-Baselines3 `_ - - -Ubuntu -~~~~~~ - -.. code-block:: bash - - sudo apt-get update && sudo apt-get install cmake libopenmpi-dev python3-dev zlib1g-dev - -Mac OS X -~~~~~~~~ - -Installation of system packages on Mac requires `Homebrew`_. With -Homebrew installed, run the following: - -.. code-block:: bash - - brew install cmake openmpi - -.. _Homebrew: https://brew.sh - - -Windows 10 -~~~~~~~~~~ - -We recommend using `Anaconda `_ for Windows users for easier installation of Python packages and required libraries. You need an environment with Python version 3.5 or above. - -For a quick start you can move straight to installing Stable-Baselines in the next step (without MPI). This supports most but not all algorithms. - -To support all algorithms, Install `MPI for Windows `_ (you need to download and install ``msmpisetup.exe``) and follow the instructions on how to install Stable-Baselines with MPI support in following section. - -.. note:: - - Trying to create Atari environments may result to vague errors related to missing DLL files and modules. This is an - issue with atari-py package. `See this discussion for more information `_. - - -.. _openmpi: - -Stable Release -~~~~~~~~~~~~~~ -To install with support for all algorithms, including those depending on OpenMPI, execute: - -.. code-block:: bash - - pip install stable-baselines[mpi] - -GAIL, DDPG, TRPO, and PPO1 parallelize training using OpenMPI. OpenMPI has had weird -interactions with Tensorflow in the past (see -`Issue #430 `_) and so if you do not -intend to use these algorithms we recommend installing without OpenMPI. To do this, execute: - -.. code-block:: bash - - pip install stable-baselines - -If you have already installed with MPI support, you can disable MPI by uninstalling ``mpi4py`` -with ``pip uninstall mpi4py``. - - -.. note:: - - Unless you are using the bleeding-edge version, you need to install the correct Tensorflow version manually. See `Issue #849 `_ - - -Bleeding-edge version ---------------------- - -To install the latest master version: - -.. code-block:: bash - - pip install git+https://github.com/hill-a/stable-baselines - - -Development version -------------------- - -To contribute to Stable-Baselines, with support for running tests and building the documentation. - -.. code-block:: bash - - git clone https://github.com/hill-a/stable-baselines && cd stable-baselines - pip install -e .[docs,tests,mpi] - - -Using Docker Images -------------------- - -If you are looking for docker images with stable-baselines already installed in it, -we recommend using images from `RL Baselines Zoo `_. - -Otherwise, the following images contained all the dependencies for stable-baselines but not the stable-baselines package itself. -They are made for development. - -Use Built Images -~~~~~~~~~~~~~~~~ - -GPU image (requires `nvidia-docker`_): - -.. code-block:: bash - - docker pull stablebaselines/stable-baselines - -CPU only: - -.. code-block:: bash - - docker pull stablebaselines/stable-baselines-cpu - -Build the Docker Images -~~~~~~~~~~~~~~~~~~~~~~~~ - -Build GPU image (with nvidia-docker): - -.. code-block:: bash - - make docker-gpu - -Build CPU image: - -.. code-block:: bash - - make docker-cpu - -Note: if you are using a proxy, you need to pass extra params during -build and do some `tweaks`_: - -.. code-block:: bash - - --network=host --build-arg HTTP_PROXY=http://your.proxy.fr:8080/ --build-arg http_proxy=http://your.proxy.fr:8080/ --build-arg HTTPS_PROXY=https://your.proxy.fr:8080/ --build-arg https_proxy=https://your.proxy.fr:8080/ - -Run the images (CPU/GPU) -~~~~~~~~~~~~~~~~~~~~~~~~ - -Run the nvidia-docker GPU image - -.. code-block:: bash - - docker run -it --runtime=nvidia --rm --network host --ipc=host --name test --mount src="$(pwd)",target=/root/code/stable-baselines,type=bind stablebaselines/stable-baselines bash -c 'cd /root/code/stable-baselines/ && pytest tests/' - -Or, with the shell file: - -.. code-block:: bash - - ./scripts/run_docker_gpu.sh pytest tests/ - -Run the docker CPU image - -.. code-block:: bash - - docker run -it --rm --network host --ipc=host --name test --mount src="$(pwd)",target=/root/code/stable-baselines,type=bind stablebaselines/stable-baselines-cpu bash -c 'cd /root/code/stable-baselines/ && pytest tests/' - -Or, with the shell file: - -.. code-block:: bash - - ./scripts/run_docker_cpu.sh pytest tests/ - -Explanation of the docker command: - -- ``docker run -it`` create an instance of an image (=container), and - run it interactively (so ctrl+c will work) -- ``--rm`` option means to remove the container once it exits/stops - (otherwise, you will have to use ``docker rm``) -- ``--network host`` don't use network isolation, this allow to use - tensorboard/visdom on host machine -- ``--ipc=host`` Use the host system’s IPC namespace. IPC (POSIX/SysV IPC) namespace provides - separation of named shared memory segments, semaphores and message - queues. -- ``--name test`` give explicitly the name ``test`` to the container, - otherwise it will be assigned a random name -- ``--mount src=...`` give access of the local directory (``pwd`` - command) to the container (it will be map to ``/root/code/stable-baselines``), so - all the logs created in the container in this folder will be kept -- ``bash -c '...'`` Run command inside the docker image, here run the tests - (``pytest tests/``) - -.. _nvidia-docker: https://github.com/NVIDIA/nvidia-docker -.. _tweaks: https://stackoverflow.com/questions/23111631/cannot-download-docker-images-behind-a-proxy diff --git a/docs/guide/pretrain.rst b/docs/guide/pretrain.rst deleted file mode 100644 index af03c37a..00000000 --- a/docs/guide/pretrain.rst +++ /dev/null @@ -1,152 +0,0 @@ -.. _pretrain: - -.. automodule:: stable_baselines.gail - :noindex: - - -Pre-Training (Behavior Cloning) -=============================== - -With the ``.pretrain()`` method, you can pre-train RL policies using trajectories from an expert, and therefore accelerate training. - -Behavior Cloning (BC) treats the problem of imitation learning, i.e., using expert demonstrations, as a supervised learning problem. -That is to say, given expert trajectories (observations-actions pairs), the policy network is trained to reproduce the expert behavior: -for a given observation, the action taken by the policy must be the one taken by the expert. - -Expert trajectories can be human demonstrations, trajectories from another controller (e.g. a PID controller) -or trajectories from a trained RL agent. - - -.. note:: - - Only ``Box`` and ``Discrete`` spaces are supported for now for pre-training a model. - - -.. note:: - - Images datasets are treated a bit differently as other datasets to avoid memory issues. - The images from the expert demonstrations must be located in a folder, not in the expert numpy archive. - - - -Generate Expert Trajectories ----------------------------- - -Here, we are going to train a RL model and then generate expert trajectories -using this agent. - -Note that in practice, generating expert trajectories usually does not require training an RL agent. - -The following example is only meant to demonstrate the ``pretrain()`` feature. - -However, we recommend users to take a look at the code of the ``generate_expert_traj()`` function (located in ``gail/dataset/`` folder) -to learn about the data structure of the expert dataset (see below for an overview) and how to record trajectories. - - -.. code-block:: python - - from stable_baselines import DQN - from stable_baselines.gail import generate_expert_traj - - model = DQN('MlpPolicy', 'CartPole-v1', verbose=1) - # Train a DQN agent for 1e5 timesteps and generate 10 trajectories - # data will be saved in a numpy archive named `expert_cartpole.npz` - generate_expert_traj(model, 'expert_cartpole', n_timesteps=int(1e5), n_episodes=10) - - - -Here is an additional example when the expert controller is a callable, -that is passed to the function instead of a RL model. -The idea is that this callable can be a PID controller, asking a human player, ... - - -.. code-block:: python - - import gym - - from stable_baselines.gail import generate_expert_traj - - env = gym.make("CartPole-v1") - # Here the expert is a random agent - # but it can be any python function, e.g. a PID controller - def dummy_expert(_obs): - """ - Random agent. It samples actions randomly - from the action space of the environment. - - :param _obs: (np.ndarray) Current observation - :return: (np.ndarray) action taken by the expert - """ - return env.action_space.sample() - # Data will be saved in a numpy archive named `expert_cartpole.npz` - # when using something different than an RL expert, - # you must pass the environment object explicitly - generate_expert_traj(dummy_expert, 'dummy_expert_cartpole', env, n_episodes=10) - - - -Pre-Train a Model using Behavior Cloning ----------------------------------------- - -Using the ``expert_cartpole.npz`` dataset generated with the previous script. - -.. code-block:: python - - from stable_baselines import PPO2 - from stable_baselines.gail import ExpertDataset - # Using only one expert trajectory - # you can specify `traj_limitation=-1` for using the whole dataset - dataset = ExpertDataset(expert_path='expert_cartpole.npz', - traj_limitation=1, batch_size=128) - - model = PPO2('MlpPolicy', 'CartPole-v1', verbose=1) - # Pretrain the PPO2 model - model.pretrain(dataset, n_epochs=1000) - - # As an option, you can train the RL agent - # model.learn(int(1e5)) - - # Test the pre-trained model - env = model.get_env() - obs = env.reset() - - reward_sum = 0.0 - for _ in range(1000): - action, _ = model.predict(obs) - obs, reward, done, _ = env.step(action) - reward_sum += reward - env.render() - if done: - print(reward_sum) - reward_sum = 0.0 - obs = env.reset() - - env.close() - - -Data Structure of the Expert Dataset ------------------------------------- - -The expert dataset is a ``.npz`` archive. The data is saved in python dictionary format with keys: ``actions``, ``episode_returns``, ``rewards``, ``obs``, ``episode_starts``. - -In case of images, ``obs`` contains the relative path to the images. - -obs, actions: shape (N * L, ) + S - -where N = # episodes, L = episode length -and S is the environment observation/action space. - -S = (1, ) for discrete space - - -.. autoclass:: ExpertDataset - :members: - :inherited-members: - - -.. autoclass:: DataLoader - :members: - :inherited-members: - - -.. autofunction:: generate_expert_traj diff --git a/docs/guide/quickstart.rst b/docs/guide/quickstart.rst deleted file mode 100644 index bcd74749..00000000 --- a/docs/guide/quickstart.rst +++ /dev/null @@ -1,47 +0,0 @@ -.. _quickstart: - -=============== -Getting Started -=============== - -Most of the library tries to follow a sklearn-like syntax for the Reinforcement Learning algorithms. - -Here is a quick example of how to train and run PPO2 on a cartpole environment: - -.. code-block:: python - - import gym - - from stable_baselines.common.policies import MlpPolicy - from stable_baselines.common.vec_env import DummyVecEnv - from stable_baselines import PPO2 - - env = gym.make('CartPole-v1') - # Optional: PPO2 requires a vectorized environment to run - # the env is now wrapped automatically when passing it to the constructor - # env = DummyVecEnv([lambda: env]) - - model = PPO2(MlpPolicy, env, verbose=1) - model.learn(total_timesteps=10000) - - obs = env.reset() - for i in range(1000): - action, _states = model.predict(obs) - obs, rewards, dones, info = env.step(action) - env.render() - - -Or just train a model with a one liner if -`the environment is registered in Gym `_ and if -`the policy is registered `_: - -.. code-block:: python - - from stable_baselines import PPO2 - - model = PPO2('MlpPolicy', 'CartPole-v1').learn(10000) - - -.. figure:: https://cdn-images-1.medium.com/max/960/1*R_VMmdgKAY0EDhEjHVelzw.gif - - Define and train a RL agent in one line of code! diff --git a/docs/guide/rl.rst b/docs/guide/rl.rst deleted file mode 100644 index ca9aeb1d..00000000 --- a/docs/guide/rl.rst +++ /dev/null @@ -1,17 +0,0 @@ -.. _rl: - -================================ -Reinforcement Learning Resources -================================ - - -Stable-Baselines assumes that you already understand the basic concepts of Reinforcement Learning (RL). - -However, if you want to learn about RL, there are several good resources to get started: - -- `OpenAI Spinning Up `_ -- `David Silver's course `_ -- `Lilian Weng's blog `_ -- `Berkeley's Deep RL Bootcamp `_ -- `Berkeley's Deep Reinforcement Learning course `_ -- `More resources `_ diff --git a/docs/guide/rl_tips.rst b/docs/guide/rl_tips.rst deleted file mode 100644 index 7d00af27..00000000 --- a/docs/guide/rl_tips.rst +++ /dev/null @@ -1,252 +0,0 @@ -.. _rl_tips: - -====================================== -Reinforcement Learning Tips and Tricks -====================================== - -The aim of this section is to help you doing reinforcement learning experiments. -It covers general advice about RL (where to start, which algorithm to choose, how to evaluate an algorithm, ...), -as well as tips and tricks when using a custom environment or implementing an RL algorithm. - - -General advice when using Reinforcement Learning -================================================ - -TL;DR ------ - -1. Read about RL and Stable Baselines -2. Do quantitative experiments and hyperparameter tuning if needed -3. Evaluate the performance using a separate test environment -4. For better performance, increase the training budget - - -Like any other subject, if you want to work with RL, you should first read about it (we have a dedicated `resource page `_ to get you started) -to understand what you are using. We also recommend you read Stable Baselines (SB) documentation and do the `tutorial `_. -It covers basic usage and guide you towards more advanced concepts of the library (e.g. callbacks and wrappers). - -Reinforcement Learning differs from other machine learning methods in several ways. The data used to train the agent is collected -through interactions with the environment by the agent itself (compared to supervised learning where you have a fixed dataset for instance). -This dependence can lead to vicious circle: if the agent collects poor quality data (e.g., trajectories with no rewards), then it will not improve and continue to amass -bad trajectories. - -This factor, among others, explains that results in RL may vary from one run to another (i.e., when only the seed of the pseudo-random generator changes). -For this reason, you should always do several runs to have quantitative results. - -Good results in RL are generally dependent on finding appropriate hyperparameters. Recent algorithms (PPO, SAC, TD3) normally require little hyperparameter tuning, -however, *don't expect the default ones to work* on any environment. - -Therefore, we *highly recommend you* to take a look at the `RL zoo `_ (or the original papers) for tuned hyperparameters. -A best practice when you apply RL to a new problem is to do automatic hyperparameter optimization. Again, this is included in the `RL zoo `_. - -When applying RL to a custom problem, you should always normalize the input to the agent (e.g. using VecNormalize for PPO2/A2C) -and look at common preprocessing done on other environments (e.g. for `Atari `_, frame-stack, ...). -Please refer to *Tips and Tricks when creating a custom environment* paragraph below for more advice related to custom environments. - - -Current Limitations of RL -------------------------- - -You have to be aware of the current `limitations `_ of reinforcement learning. - - -Model-free RL algorithms (i.e. all the algorithms implemented in SB) are usually *sample inefficient*. They require a lot of samples (sometimes millions of interactions) to learn something useful. -That's why most of the successes in RL were achieved on games or in simulation only. For instance, in this `work `_ by ETH Zurich, the ANYmal robot was trained in simulation only, and then tested in the real world. - -As a general advice, to obtain better performances, you should augment the budget of the agent (number of training timesteps). - - -In order to achieve the desired behavior, expert knowledge is often required to design an adequate reward function. -This *reward engineering* (or *RewArt* as coined by `Freek Stulp `_), necessitates several iterations. As a good example of reward shaping, -you can take a look at `Deep Mimic paper `_ which combines imitation learning and reinforcement learning to do acrobatic moves. - -One last limitation of RL is the instability of training. That is to say, you can observe during training a huge drop in performance. -This behavior is particularly present in ``DDPG``, that's why its extension ``TD3`` tries to tackle that issue. -Other method, like ``TRPO`` or ``PPO`` make use of a *trust region* to minimize that problem by avoiding too large update. - - -How to evaluate an RL algorithm? --------------------------------- - -Because most algorithms use exploration noise during training, you need a separate test environment to evaluate the performance -of your agent at a given time. It is recommended to periodically evaluate your agent for ``n`` test episodes (``n`` is usually between 5 and 20) -and average the reward per episode to have a good estimate. - -As some policy are stochastic by default (e.g. A2C or PPO), you should also try to set `deterministic=True` when calling the `.predict()` method, -this frequently leads to better performance. -Looking at the training curve (episode reward function of the timesteps) is a good proxy but underestimates the agent true performance. - - -.. note:: - - We provide an ``EvalCallback`` for doing such evaluation. You can read more about it in the :ref:`Callbacks ` section. - - - -We suggest you reading `Deep Reinforcement Learning that Matters `_ for a good discussion about RL evaluation. - -You can also take a look at this `blog post `_ -and this `issue `_ by Cédric Colas. - - -Which algorithm should I use? -============================= - -There is no silver bullet in RL, depending on your needs and problem, you may choose one or the other. -The first distinction comes from your action space, i.e., do you have discrete (e.g. LEFT, RIGHT, ...) -or continuous actions (ex: go to a certain speed)? - -Some algorithms are only tailored for one or the other domain: ``DQN`` only supports discrete actions, where ``SAC`` is restricted to continuous actions. - -The second difference that will help you choose is whether you can parallelize your training or not, and how you can do it (with or without MPI?). -If what matters is the wall clock training time, then you should lean towards ``A2C`` and its derivatives (PPO, ACER, ACKTR, ...). -Take a look at the `Vectorized Environments `_ to learn more about training with multiple workers. - -To sum it up: - -Discrete Actions ----------------- - -.. note:: - - This covers ``Discrete``, ``MultiDiscrete``, ``Binary`` and ``MultiBinary`` spaces - - -Discrete Actions - Single Process -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -DQN with extensions (double DQN, prioritized replay, ...) and ACER are the recommended algorithms. -DQN is usually slower to train (regarding wall clock time) but is the most sample efficient (because of its replay buffer). - -Discrete Actions - Multiprocessed -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -You should give a try to PPO2, A2C and its successors (ACKTR, ACER). - -If you can multiprocess the training using MPI, then you should checkout PPO1 and TRPO. - - -Continuous Actions ------------------- - -Continuous Actions - Single Process -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Current State Of The Art (SOTA) algorithms are ``SAC`` and ``TD3``. -Please use the hyperparameters in the `RL zoo `_ for best results. - - -Continuous Actions - Multiprocessed -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Take a look at PPO2, TRPO or A2C. Again, don't forget to take the hyperparameters from the `RL zoo `_ -for continuous actions problems (cf *Bullet* envs). - -.. note:: - - Normalization is critical for those algorithms - -If you can use MPI, then you can choose between PPO1, TRPO and DDPG. - - -Goal Environment ------------------ - -If your environment follows the ``GoalEnv`` interface (cf `HER <../modules/her.html>`_), then you should use -HER + (SAC/TD3/DDPG/DQN) depending on the action space. - - -.. note:: - - The number of workers is an important hyperparameters for experiments with HER. Currently, only HER+DDPG supports multiprocessing using MPI. - - - -Tips and Tricks when creating a custom environment -================================================== - -If you want to learn about how to create a custom environment, we recommend you read this `page `_. -We also provide a `colab notebook `_ for -a concrete example of creating a custom gym environment. - -Some basic advice: - -- always normalize your observation space when you can, i.e., when you know the boundaries -- normalize your action space and make it symmetric when continuous (cf potential issue below) A good practice is to rescale your actions to lie in [-1, 1]. This does not limit you as you can easily rescale the action inside the environment -- start with shaped reward (i.e. informative reward) and simplified version of your problem -- debug with random actions to check that your environment works and follows the gym interface: - - -We provide a helper to check that your environment runs without error: - -.. code-block:: python - - from stable_baselines.common.env_checker import check_env - - env = CustomEnv(arg1, ...) - # It will check your custom environment and output additional warnings if needed - check_env(env) - - -If you want to quickly try a random agent on your environment, you can also do: - -.. code-block:: python - - env = YourEnv() - obs = env.reset() - n_steps = 10 - for _ in range(n_steps): - # Random action - action = env.action_space.sample() - obs, reward, done, info = env.step(action) - - -**Why should I normalize the action space?** - - -Most reinforcement learning algorithms rely on a Gaussian distribution (initially centered at 0 with std 1) for continuous actions. -So, if you forget to normalize the action space when using a custom environment, -this can harm learning and be difficult to debug (cf attached image and `issue #473 `_). - -.. figure:: ../_static/img/mistake.png - - -Another consequence of using a Gaussian is that the action range is not bounded. -That's why clipping is usually used as a bandage to stay in a valid interval. -A better solution would be to use a squashing function (cf ``SAC``) or a Beta distribution (cf `issue #112 `_). - -.. note:: - - This statement is not true for ``DDPG`` or ``TD3`` because they don't rely on any probability distribution. - - - -Tips and Tricks when implementing an RL algorithm -================================================= - -When you try to reproduce a RL paper by implementing the algorithm, the `nuts and bolts of RL research `_ -by John Schulman are quite useful (`video `_). - -We *recommend following those steps to have a working RL algorithm*: - -1. Read the original paper several times -2. Read existing implementations (if available) -3. Try to have some "sign of life" on toy problems -4. Validate the implementation by making it run on harder and harder envs (you can compare results against the RL zoo) - You usually need to run hyperparameter optimization for that step. - -You need to be particularly careful on the shape of the different objects you are manipulating (a broadcast mistake will fail silently cf `issue #75 `_) -and when to stop the gradient propagation. - -A personal pick (by @araffin) for environments with gradual difficulty in RL with continuous actions: - -1. Pendulum (easy to solve) -2. HalfCheetahBullet (medium difficulty with local minima and shaped reward) -3. BipedalWalkerHardcore (if it works on that one, then you can have a cookie) - -in RL with discrete actions: - -1. CartPole-v1 (easy to be better than random agent, harder to achieve maximal performance) -2. LunarLander -3. Pong (one of the easiest Atari game) -4. other Atari games (e.g. Breakout) diff --git a/docs/guide/rl_zoo.rst b/docs/guide/rl_zoo.rst deleted file mode 100644 index 61c4d15b..00000000 --- a/docs/guide/rl_zoo.rst +++ /dev/null @@ -1,107 +0,0 @@ -.. _rl_zoo: - -================= -RL Baselines Zoo -================= - -`RL Baselines Zoo `_. is a collection of pre-trained Reinforcement Learning agents using -Stable-Baselines. -It also provides basic scripts for training, evaluating agents, tuning hyperparameters and recording videos. - -Goals of this repository: - -1. Provide a simple interface to train and enjoy RL agents -2. Benchmark the different Reinforcement Learning algorithms -3. Provide tuned hyperparameters for each environment and RL algorithm -4. Have fun with the trained agents! - -Installation ------------- - -1. Install dependencies -:: - - apt-get install swig cmake libopenmpi-dev zlib1g-dev ffmpeg - pip install stable-baselines box2d box2d-kengz pyyaml pybullet optuna pytablewriter - -2. Clone the repository: - -:: - - git clone https://github.com/araffin/rl-baselines-zoo - - -Train an Agent --------------- - -The hyperparameters for each environment are defined in -``hyperparameters/algo_name.yml``. - -If the environment exists in this file, then you can train an agent -using: - -:: - - python train.py --algo algo_name --env env_id - -For example (with tensorboard support): - -:: - - python train.py --algo ppo2 --env CartPole-v1 --tensorboard-log /tmp/stable-baselines/ - -Train for multiple environments (with one call) and with tensorboard -logging: - -:: - - python train.py --algo a2c --env MountainCar-v0 CartPole-v1 --tensorboard-log /tmp/stable-baselines/ - -Continue training (here, load pretrained agent for Breakout and continue -training for 5000 steps): - -:: - - python train.py --algo a2c --env BreakoutNoFrameskip-v4 -i trained_agents/a2c/BreakoutNoFrameskip-v4.pkl -n 5000 - - -Enjoy a Trained Agent ---------------------- - -If the trained agent exists, then you can see it in action using: - -:: - - python enjoy.py --algo algo_name --env env_id - -For example, enjoy A2C on Breakout during 5000 timesteps: - -:: - - python enjoy.py --algo a2c --env BreakoutNoFrameskip-v4 --folder trained_agents/ -n 5000 - - -Hyperparameter Optimization ---------------------------- - -We use `Optuna `_ for optimizing the hyperparameters. - - -Tune the hyperparameters for PPO2, using a random sampler and median pruner, 2 parallels jobs, -with a budget of 1000 trials and a maximum of 50000 steps: - -:: - - python train.py --algo ppo2 --env MountainCar-v0 -n 50000 -optimize --n-trials 1000 --n-jobs 2 \ - --sampler random --pruner median - - -Colab Notebook: Try it Online! ------------------------------- - -You can train agents online using Google `colab notebook `_. - - -.. note:: - - You can find more information about the rl baselines zoo in the repo `README `_. For instance, how to record a video of a trained agent. diff --git a/docs/guide/save_format.rst b/docs/guide/save_format.rst deleted file mode 100644 index 38561a3f..00000000 --- a/docs/guide/save_format.rst +++ /dev/null @@ -1,86 +0,0 @@ -.. _save_format: - - -On saving and loading -===================== - -Stable baselines stores both neural network parameters and algorithm-related parameters such as -exploration schedule, number of environments and observation/action space. This allows continual learning and easy -use of trained agents without training, but it is not without its issues. Following describes two formats -used to save agents in stable baselines, their pros and shortcomings. - -Terminology used in this page: - -- *parameters* refer to neural network parameters (also called "weights"). This is a dictionary - mapping Tensorflow variable name to a NumPy array. -- *data* refers to RL algorithm parameters, e.g. learning rate, exploration schedule, action/observation space. - These depend on the algorithm used. This is a dictionary mapping classes variable names their values. - - -Cloudpickle (stable-baselines<=2.7.0) -------------------------------------- - -Original stable baselines save format. Data and parameters are bundled up into a tuple ``(data, parameters)`` -and then serialized with ``cloudpickle`` library (essentially the same as ``pickle``). - -This save format is still available via an argument in model save function in stable-baselines versions above -v2.7.0 for backwards compatibility reasons, but its usage is discouraged. - -Pros: - -- Easy to implement and use. -- Works with almost any type of Python object, including functions. - - -Cons: - -- Pickle/Cloudpickle is not designed for long-term storage or sharing between Python version. -- If one object in file is not readable (e.g. wrong library version), then reading the rest of the - file is difficult. -- Python-specific format, hard to read stored files from other languages. - - -If part of a saved model becomes unreadable for any reason (e.g. different Tensorflow versions), then -it may be tricky to restore any of the model. For this reason another save format was designed. - - -Zip-archive (stable-baselines>2.7.0) -------------------------------------- - -A zip-archived JSON dump and NumPy zip archive of the arrays. The data dictionary (class parameters) -is stored as a JSON file, model parameters are serialized with ``numpy.savez`` function and these two files -are stored under a single .zip archive. - -Any objects that are not JSON serializable are serialized with cloudpickle and stored as base64-encoded -string in the JSON file, along with some information that was stored in the serialization. This allows -inspecting stored objects without deserializing the object itself. - -This format allows skipping elements in the file, i.e. we can skip deserializing objects that are -broken/non-serializable. This can be done via ``custom_objects`` argument to load functions. - -This is the default save format in stable baselines versions after v2.7.0. - -File structure: - -:: - - saved_model.zip/ - ├── data JSON file of class-parameters (dictionary) - ├── parameter_list JSON file of model parameters and their ordering (list) - ├── parameters Bytes from numpy.savez (a zip file of the numpy arrays). ... - ├── ... Being a zip-archive itself, this object can also be opened ... - ├── ... as a zip-archive and browsed. - - -Pros: - - -- More robust to unserializable objects (one bad object does not break everything). -- Saved file can be inspected/extracted with zip-archive explorers and by other - languages. - - -Cons: - -- More complex implementation. -- Still relies partly on cloudpickle for complex objects (e.g. custom functions). diff --git a/docs/guide/tensorboard.rst b/docs/guide/tensorboard.rst deleted file mode 100644 index b10c1b66..00000000 --- a/docs/guide/tensorboard.rst +++ /dev/null @@ -1,146 +0,0 @@ -.. _tensorboard: - -Tensorboard Integration -========================== - -Basic Usage ------------- - -To use Tensorboard with the rl baselines, you simply need to define a log location for the RL agent: - -.. code-block:: python - - import gym - - from stable_baselines import A2C - - model = A2C('MlpPolicy', 'CartPole-v1', verbose=1, tensorboard_log="./a2c_cartpole_tensorboard/") - model.learn(total_timesteps=10000) - - -Or after loading an existing model (by default the log path is not saved): - -.. code-block:: python - - import gym - - from stable_baselines.common.vec_env import DummyVecEnv - from stable_baselines import A2C - - env = gym.make('CartPole-v1') - env = DummyVecEnv([lambda: env]) # The algorithms require a vectorized environment to run - - model = A2C.load("./a2c_cartpole.pkl", env=env, tensorboard_log="./a2c_cartpole_tensorboard/") - model.learn(total_timesteps=10000) - - -You can also define custom logging name when training (by default it is the algorithm name) - -.. code-block:: python - - import gym - - from stable_baselines import A2C - - model = A2C('MlpPolicy', 'CartPole-v1', verbose=1, tensorboard_log="./a2c_cartpole_tensorboard/") - model.learn(total_timesteps=10000, tb_log_name="first_run") - # Pass reset_num_timesteps=False to continue the training curve in tensorboard - # By default, it will create a new curve - model.learn(total_timesteps=10000, tb_log_name="second_run", reset_num_timesteps=False) - model.learn(total_timesteps=10000, tb_log_name="thrid_run", reset_num_timesteps=False) - - -Once the learn function is called, you can monitor the RL agent during or after the training, with the following bash command: - -.. code-block:: bash - - tensorboard --logdir ./a2c_cartpole_tensorboard/ - -you can also add past logging folders: - -.. code-block:: bash - - tensorboard --logdir ./a2c_cartpole_tensorboard/;./ppo2_cartpole_tensorboard/ - -It will display information such as the model graph, the episode reward, the model losses, the observation and other parameter unique to some models. - -.. image:: ../_static/img/Tensorboard_example_1.png - :width: 400 - :alt: plotting - -.. image:: ../_static/img/Tensorboard_example_2.png - :width: 400 - :alt: histogram - -.. image:: ../_static/img/Tensorboard_example_3.png - :width: 400 - :alt: graph - - -Logging More Values -------------------- - -Using a callback, you can easily log more values with TensorBoard. -Here is a simple example on how to log both additional tensor or arbitrary scalar value: - -.. code-block:: python - - import tensorflow as tf - import numpy as np - - from stable_baselines import SAC - from stable_baselines.common.callbacks import BaseCallback - - model = SAC("MlpPolicy", "Pendulum-v0", tensorboard_log="/tmp/sac/", verbose=1) - - class TensorboardCallback(BaseCallback): - """ - Custom callback for plotting additional values in tensorboard. - """ - def __init__(self, verbose=0): - self.is_tb_set = False - super(TensorboardCallback, self).__init__(verbose) - - def _on_step(self) -> bool: - # Log additional tensor - if not self.is_tb_set: - with self.model.graph.as_default(): - tf.summary.scalar('value_target', tf.reduce_mean(self.model.value_target)) - self.model.summary = tf.summary.merge_all() - self.is_tb_set = True - # Log scalar value (here a random variable) - value = np.random.random() - summary = tf.Summary(value=[tf.Summary.Value(tag='random_value', simple_value=value)]) - self.locals['writer'].add_summary(summary, self.num_timesteps) - return True - - - model.learn(50000, callback=TensorboardCallback()) - -Legacy Integration -------------------- - -All the information displayed in the terminal (default logging) can be also logged in tensorboard. -For that, you need to define several environment variables: - -.. code-block:: bash - - # formats are comma-separated, but for tensorboard you only need the last one - # stdout -> terminal - export OPENAI_LOG_FORMAT='stdout,log,csv,tensorboard' - export OPENAI_LOGDIR=path/to/tensorboard/data - -and to configure the logger using: - -.. code-block:: python - - from stable_baselines.logger import configure - - configure() - - -Then start tensorboard with: - -.. code-block:: bash - - tensorboard --logdir=$OPENAI_LOGDIR diff --git a/docs/guide/vec_envs.rst b/docs/guide/vec_envs.rst deleted file mode 100644 index a5530cbb..00000000 --- a/docs/guide/vec_envs.rst +++ /dev/null @@ -1,85 +0,0 @@ -.. _vec_env: - -.. automodule:: stable_baselines.common.vec_env - -Vectorized Environments -======================= - -Vectorized Environments are a method for stacking multiple independent environments into a single environment. -Instead of training an RL agent on 1 environment per step, it allows us to train it on ``n`` environments per step. -Because of this, ``actions`` passed to the environment are now a vector (of dimension ``n``). -It is the same for ``observations``, ``rewards`` and end of episode signals (``dones``). -In the case of non-array observation spaces such as ``Dict`` or ``Tuple``, where different sub-spaces -may have different shapes, the sub-observations are vectors (of dimension ``n``). - -============= ======= ============ ======== ========= ================ -Name ``Box`` ``Discrete`` ``Dict`` ``Tuple`` Multi Processing -============= ======= ============ ======== ========= ================ -DummyVecEnv ✔️ ✔️ ✔️ ✔️ ❌️ -SubprocVecEnv ✔️ ✔️ ✔️ ✔️ ✔️ -============= ======= ============ ======== ========= ================ - -.. note:: - - Vectorized environments are required when using wrappers for frame-stacking or normalization. - -.. note:: - - When using vectorized environments, the environments are automatically reset at the end of each episode. - Thus, the observation returned for the i-th environment when ``done[i]`` is true will in fact be the first observation of the next episode, not the last observation of the episode that has just terminated. - You can access the "real" final observation of the terminated episode—that is, the one that accompanied the ``done`` event provided by the underlying environment—using the ``terminal_observation`` keys in the info dicts returned by the vecenv. - -.. warning:: - - When using ``SubprocVecEnv``, users must wrap the code in an ``if __name__ == "__main__":`` if using the ``forkserver`` or ``spawn`` start method (default on Windows). - On Linux, the default start method is ``fork`` which is not thread safe and can create deadlocks. - - For more information, see Python's `multiprocessing guidelines `_. - -VecEnv ------- - -.. autoclass:: VecEnv - :members: - -DummyVecEnv ------------ - -.. autoclass:: DummyVecEnv - :members: - -SubprocVecEnv -------------- - -.. autoclass:: SubprocVecEnv - :members: - -Wrappers --------- - -VecFrameStack -~~~~~~~~~~~~~ - -.. autoclass:: VecFrameStack - :members: - - -VecNormalize -~~~~~~~~~~~~ - -.. autoclass:: VecNormalize - :members: - - -VecVideoRecorder -~~~~~~~~~~~~~~~~ - -.. autoclass:: VecVideoRecorder - :members: - - -VecCheckNan -~~~~~~~~~~~~~~~~ - -.. autoclass:: VecCheckNan - :members: diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index a1a4cdc9..00000000 --- a/docs/index.rst +++ /dev/null @@ -1,126 +0,0 @@ -.. Stable Baselines documentation master file, created by - sphinx-quickstart on Sat Aug 25 10:33:54 2018. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to Stable Baselines docs! - RL Baselines Made Easy -=========================================================== - -`Stable Baselines `_ is a set of improved implementations -of Reinforcement Learning (RL) algorithms based on OpenAI `Baselines `_. - - -Github repository: https://github.com/hill-a/stable-baselines - -RL Baselines Zoo (collection of pre-trained agents): https://github.com/araffin/rl-baselines-zoo - -RL Baselines zoo also offers a simple interface to train, evaluate agents and do hyperparameter tuning. - -You can read a detailed presentation of Stable Baselines in the -Medium article: `link `_ - - -Main differences with OpenAI Baselines --------------------------------------- - -This toolset is a fork of OpenAI Baselines, with a major structural refactoring, and code cleanups: - -- Unified structure for all algorithms -- PEP8 compliant (unified code style) -- Documented functions and classes -- More tests & more code coverage -- Additional algorithms: SAC and TD3 (+ HER support for DQN, DDPG, SAC and TD3) - - -.. toctree:: - :maxdepth: 2 - :caption: User Guide - - guide/install - guide/quickstart - guide/rl_tips - guide/rl - guide/algos - guide/examples - guide/vec_envs - guide/custom_env - guide/custom_policy - guide/callbacks - guide/tensorboard - guide/rl_zoo - guide/pretrain - guide/checking_nan - guide/save_format - guide/export - - -.. toctree:: - :maxdepth: 1 - :caption: RL Algorithms - - modules/base - modules/policies - modules/a2c - modules/acer - modules/acktr - modules/ddpg - modules/dqn - modules/gail - modules/her - modules/ppo1 - modules/ppo2 - modules/sac - modules/td3 - modules/trpo - -.. toctree:: - :maxdepth: 1 - :caption: Common - - common/distributions - common/tf_utils - common/cmd_utils - common/schedules - common/evaluation - common/env_checker - common/monitor - -.. toctree:: - :maxdepth: 1 - :caption: Misc - - misc/changelog - misc/projects - misc/results_plotter - - -Citing Stable Baselines ------------------------ -To cite this project in publications: - -.. code-block:: bibtex - - @misc{stable-baselines, - author = {Hill, Ashley and Raffin, Antonin and Ernestus, Maximilian and Gleave, Adam and Kanervisto, Anssi and Traore, Rene and Dhariwal, Prafulla and Hesse, Christopher and Klimov, Oleg and Nichol, Alex and Plappert, Matthias and Radford, Alec and Schulman, John and Sidor, Szymon and Wu, Yuhuai}, - title = {Stable Baselines}, - year = {2018}, - publisher = {GitHub}, - journal = {GitHub repository}, - howpublished = {\url{https://github.com/hill-a/stable-baselines}}, - } - -Contributing ------------- - -To any interested in making the rl baselines better, there are still some improvements -that need to be done. -A full TODO list is available in the `roadmap `_. - -If you want to contribute, please read `CONTRIBUTING.md `_ first. - -Indices and tables -------------------- - -* :ref:`genindex` -* :ref:`search` -* :ref:`modindex` diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 22b5fff4..00000000 --- a/docs/make.bat +++ /dev/null @@ -1,36 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=. -set BUILDDIR=_build -set SPHINXPROJ=StableBaselines - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% - -:end -popd diff --git a/docs/misc/changelog.rst b/docs/misc/changelog.rst deleted file mode 100644 index ce47e4e9..00000000 --- a/docs/misc/changelog.rst +++ /dev/null @@ -1,789 +0,0 @@ -.. _changelog: - -Changelog -========== - -For download links, please look at `Github release page `_. - -Pre-Release 2.10.3a0 (WIP) ---------------------------- - - -Breaking Changes: -^^^^^^^^^^^^^^^^^ - -New Features: -^^^^^^^^^^^^^ - -Bug Fixes: -^^^^^^^^^^ -- Fixed bug in pretraining method that prevented from calling it twice. -- Fixed a bug where a crash would occur if a PPO2 model was trained in a vectorized environment, saved and subsequently loaded, then trained in a vectorized environment with a different length - -Deprecations: -^^^^^^^^^^^^^ - -Others: -^^^^^^^ - -Documentation: -^^^^^^^^^^^^^^ -- Adding the version warning banner on every documentation page (@qgallouedec) - -Release 2.10.2 (2021-04-05) ---------------------------- - -.. warning:: - - This package is in maintenance mode, please use `Stable-Baselines3 - (SB3)`_ for an up-to-date version. You can find a `migration guide`_ in - SB3 documentation. - - -.. _Stable-Baselines3 (SB3): https://github.com/DLR-RM/stable-baselines3 -.. _migration guide: https://stable-baselines3.readthedocs.io/en/master/guide/migration.html - - -Breaking Changes: -^^^^^^^^^^^^^^^^^ - -New Features: -^^^^^^^^^^^^^ -- EvalCallback now works also for recurrent policies (@mily20001) - -Bug Fixes: -^^^^^^^^^^ -- Fixed calculation of the log probability of Diagonal Gaussian distribution - when using ``action_probability()`` method (@SVJayanthi, @sunshineclt) -- Fixed docker image build (@anj1) - -Deprecations: -^^^^^^^^^^^^^ - -Others: -^^^^^^^ -- Faster tests, switched to GitHub CI - -Documentation: -^^^^^^^^^^^^^^ -- Added stable-baselines-tf2 link on Projects page. (@sophiagu) -- Fixed a typo in ``stable_baselines.common.env_checker.check_env`` (@OGordon100) - -Release 2.10.1 (2020-08-05) ---------------------------- - -**Bug fixes release** - -Breaking Changes: -^^^^^^^^^^^^^^^^^ -- ``render()`` method of ``VecEnvs`` now only accept one argument: ``mode`` - -New Features: -^^^^^^^^^^^^^ -- Added momentum parameter to A2C for the embedded RMSPropOptimizer (@kantneel) -- ActionNoise is now an abstract base class and implements ``__call__``, ``NormalActionNoise`` and ``OrnsteinUhlenbeckActionNoise`` have return types (@PartiallyTyped) -- HER now passes info dictionary to compute_reward, allowing for the computation of rewards that are independent of the goal (@tirafesi) - -Bug Fixes: -^^^^^^^^^^ -- Fixed DDPG sampling empty replay buffer when combined with HER (@tirafesi) -- Fixed a bug in ``HindsightExperienceReplayWrapper``, where the openai-gym signature for ``compute_reward`` was not matched correctly (@johannes-dornheim) -- Fixed SAC/TD3 checking time to update on learn steps instead of total steps (@PartiallyTyped) -- Added ``**kwarg`` pass through for ``reset`` method in ``atari_wrappers.FrameStack`` (@PartiallyTyped) -- Fix consistency in ``setup_model()`` for SAC, ``target_entropy`` now uses ``self.action_space`` instead of ``self.env.action_space`` (@PartiallyTyped) -- Fix reward threshold in ``test_identity.py`` -- Partially fix tensorboard indexing for PPO2 (@enderdead) -- Fixed potential bug in ``DummyVecEnv`` where ``copy()`` was used instead of ``deepcopy()`` -- Fixed a bug in ``GAIL`` where the dataloader was not available after saving, causing an error when using ``CheckpointCallback`` -- Fixed a bug in ``SAC`` where any convolutional layers were not included in the target network parameters. -- Fixed ``render()`` method for ``VecEnvs`` -- Fixed ``seed()``` method for ``SubprocVecEnv`` -- Fixed a bug ``callback.locals`` did not have the correct values (@PartiallyTyped) -- Fixed a bug in the ``close()`` method of ``SubprocVecEnv``, causing wrappers further down in the wrapper stack to not be closed. (@NeoExtended) -- Fixed a bug in the ``generate_expert_traj()`` method in ``record_expert.py`` when using a non-image vectorized environment (@jbarsce) -- Fixed a bug in CloudPickleWrapper's (used by VecEnvs) ``__setstate___`` where loading was incorrectly using ``pickle.loads`` (@shwang). -- Fixed a bug in ``SAC`` and ``TD3`` where the log timesteps was not correct(@YangRui2015) -- Fixed a bug where the environment was reset twice when using ``evaluate_policy`` - - -Deprecations: -^^^^^^^^^^^^^ - -Others: -^^^^^^^ -- Added ``version.txt`` to manage version number in an easier way -- Added ``.readthedocs.yml`` to install requirements with read the docs -- Added a test for seeding ``SubprocVecEnv``` and rendering - -Documentation: -^^^^^^^^^^^^^^ -- Fix typos (@caburu) -- Fix typos in PPO2 (@kvenkman) -- Removed ``stable_baselines\deepq\experiments\custom_cartpole.py`` (@aakash94) -- Added Google's motion imitation project -- Added documentation page for monitor -- Fixed typos and update ``VecNormalize`` example to show normalization at test-time -- Fixed ``train_mountaincar`` description -- Added imitation baselines project -- Updated install instructions -- Added Slime Volleyball project (@hardmaru) -- Added a table of the variables accessible from the ``on_step`` function of the callbacks for each algorithm (@PartiallyTyped) -- Fix typo in README.md (@ColinLeongUDRI) -- Fix typo in gail.rst (@roccivic) - -Release 2.10.0 (2020-03-11) ---------------------------- - -**Callback collection, cleanup and bug fixes** - -Breaking Changes: -^^^^^^^^^^^^^^^^^ -- ``evaluate_policy`` now returns the standard deviation of the reward per episode - as second return value (instead of ``n_steps``) -- ``evaluate_policy`` now returns as second return value a list of the episode lengths - when ``return_episode_rewards`` is set to ``True`` (instead of ``n_steps``) -- Callback are now called after each ``env.step()`` for consistency (it was called every ``n_steps`` before - in algorithm like ``A2C`` or ``PPO2``) -- Removed unused code in ``common/a2c/utils.py`` (``calc_entropy_softmax``, ``make_path``) -- **Refactoring, including removed files and moving functions.** - - - Algorithms no longer import from each other, and ``common`` does not import from algorithms. - - ``a2c/utils.py`` removed and split into other files: - - - common/tf_util.py: ``sample``, ``calc_entropy``, ``mse``, ``avg_norm``, ``total_episode_reward_logger``, - ``q_explained_variance``, ``gradient_add``, ``avg_norm``, ``check_shape``, - ``seq_to_batch``, ``batch_to_seq``. - - common/tf_layers.py: ``conv``, ``linear``, ``lstm``, ``_ln``, ``lnlstm``, ``conv_to_fc``, ``ortho_init``. - - a2c/a2c.py: ``discount_with_dones``. - - acer/acer_simple.py: ``get_by_index``, ``EpisodeStats``. - - common/schedules.py: ``constant``, ``linear_schedule``, ``middle_drop``, ``double_linear_con``, ``double_middle_drop``, - ``SCHEDULES``, ``Scheduler``. - - - ``trpo_mpi/utils.py`` functions moved (``traj_segment_generator`` moved to ``common/runners.py``, ``flatten_lists`` to ``common/misc_util.py``). - - ``ppo2/ppo2.py`` functions moved (``safe_mean`` to ``common/math_util.py``, ``constfn`` and ``get_schedule_fn`` to ``common/schedules.py``). - - ``sac/policies.py`` function ``mlp`` moved to ``common/tf_layers.py``. - - ``sac/sac.py`` function ``get_vars`` removed (replaced with ``tf.util.get_trainable_vars``). - - ``deepq/replay_buffer.py`` renamed to ``common/buffers.py``. - - -New Features: -^^^^^^^^^^^^^ -- Parallelized updating and sampling from the replay buffer in DQN. (@flodorner) -- Docker build script, `scripts/build_docker.sh`, can push images automatically. -- Added callback collection -- Added ``unwrap_vec_normalize`` and ``sync_envs_normalization`` in the ``vec_env`` module - to synchronize two VecNormalize environment -- Added a seeding method for vectorized environments. (@NeoExtended) -- Added extend method to store batches of experience in ReplayBuffer. (@PartiallyTyped) - - -Bug Fixes: -^^^^^^^^^^ - -- Fixed Docker images via ``scripts/build_docker.sh`` and ``Dockerfile``: GPU image now contains ``tensorflow-gpu``, - and both images have ``stable_baselines`` installed in developer mode at correct directory for mounting. -- Fixed Docker GPU run script, ``scripts/run_docker_gpu.sh``, to work with new NVidia Container Toolkit. -- Repeated calls to ``RLModel.learn()`` now preserve internal counters for some episode - logging statistics that used to be zeroed at the start of every call. -- Fix `DummyVecEnv.render` for ``num_envs > 1``. This used to print a warning and then not render at all. (@shwang) -- Fixed a bug in PPO2, ACER, A2C, and ACKTR where repeated calls to ``learn(total_timesteps)`` reset - the environment on every call, potentially biasing samples toward early episode timesteps. - (@shwang) -- Fixed by adding lazy property ``ActorCriticRLModel.runner``. Subclasses now use lazily-generated - ``self.runner`` instead of reinitializing a new Runner every time ``learn()`` is called. -- Fixed a bug in ``check_env`` where it would fail on high dimensional action spaces -- Fixed ``Monitor.close()`` that was not calling the parent method -- Fixed a bug in ``BaseRLModel`` when seeding vectorized environments. (@NeoExtended) -- Fixed ``num_timesteps`` computation to be consistent between algorithms (updated after ``env.step()``) - Only ``TRPO`` and ``PPO1`` update it differently (after synchronization) because they rely on MPI -- Fixed bug in ``TRPO`` with NaN standardized advantages (@richardwu) -- Fixed partial minibatch computation in ExpertDataset (@richardwu) -- Fixed normalization (with ``VecNormalize``) for off-policy algorithms -- Fixed ``sync_envs_normalization`` to sync the reward normalization too -- Bump minimum Gym version (>=0.11) - -Deprecations: -^^^^^^^^^^^^^ - -Others: -^^^^^^^ -- Removed redundant return value from ``a2c.utils::total_episode_reward_logger``. (@shwang) -- Cleanup and refactoring in ``common/identity_env.py`` (@shwang) -- Added a Makefile to simplify common development tasks (build the doc, type check, run the tests) - - -Documentation: -^^^^^^^^^^^^^^ -- Add dedicated page for callbacks -- Fixed example for creating a GIF (@KuKuXia) -- Change Colab links in the README to point to the notebooks repo -- Fix typo in Reinforcement Learning Tips and Tricks page. (@mmcenta) - - -Release 2.9.0 (2019-12-20) --------------------------- - -*Reproducible results, automatic ``VecEnv`` wrapping, env checker and more usability improvements* - -Breaking Changes: -^^^^^^^^^^^^^^^^^ -- The ``seed`` argument has been moved from `learn()` method to model constructor - in order to have reproducible results -- ``allow_early_resets`` of the ``Monitor`` wrapper now default to ``True`` -- ``make_atari_env`` now returns a ``DummyVecEnv`` by default (instead of a ``SubprocVecEnv``) - this usually improves performance. -- Fix inconsistency of sample type, so that mode/sample function returns tensor of tf.int64 in CategoricalProbabilityDistribution/MultiCategoricalProbabilityDistribution (@seheevic) - -New Features: -^^^^^^^^^^^^^ -- Add ``n_cpu_tf_sess`` to model constructor to choose the number of threads used by Tensorflow -- Environments are automatically wrapped in a ``DummyVecEnv`` if needed when passing them to the model constructor -- Added ``stable_baselines.common.make_vec_env`` helper to simplify VecEnv creation -- Added ``stable_baselines.common.evaluation.evaluate_policy`` helper to simplify model evaluation -- ``VecNormalize`` changes: - - - Now supports being pickled and unpickled (@AdamGleave). - - New methods ``.normalize_obs(obs)`` and `normalize_reward(rews)` apply normalization - to arbitrary observation or rewards without updating statistics (@shwang) - - ``.get_original_reward()`` returns the unnormalized rewards from the most recent timestep - - ``.reset()`` now collects observation statistics (used to only apply normalization) - -- Add parameter ``exploration_initial_eps`` to DQN. (@jdossgollin) -- Add type checking and PEP 561 compliance. - Note: most functions are still not annotated, this will be a gradual process. -- DDPG, TD3 and SAC accept non-symmetric action spaces. (@Antymon) -- Add ``check_env`` util to check if a custom environment follows the gym interface (@araffin and @justinkterry) - -Bug Fixes: -^^^^^^^^^^ -- Fix seeding, so it is now possible to have deterministic results on cpu -- Fix a bug in DDPG where ``predict`` method with `deterministic=False` would fail -- Fix a bug in TRPO: mean_losses was not initialized causing the logger to crash when there was no gradients (@MarvineGothic) -- Fix a bug in ``cmd_util`` from API change in recent Gym versions -- Fix a bug in DDPG, TD3 and SAC where warmup and random exploration actions would end up scaled in the replay buffer (@Antymon) - -Deprecations: -^^^^^^^^^^^^^ -- ``nprocs`` (ACKTR) and ``num_procs`` (ACER) are deprecated in favor of ``n_cpu_tf_sess`` which is now common - to all algorithms -- ``VecNormalize``: ``load_running_average`` and ``save_running_average`` are deprecated in favour of using pickle. - -Others: -^^^^^^^ -- Add upper bound for Tensorflow version (<2.0.0). -- Refactored test to remove duplicated code -- Add pull request template -- Replaced redundant code in load_results (@jbulow) -- Minor PEP8 fixes in dqn.py (@justinkterry) -- Add a message to the assert in ``PPO2`` -- Update replay buffer doctring -- Fix ``VecEnv`` docstrings - -Documentation: -^^^^^^^^^^^^^^ -- Add plotting to the Monitor example (@rusu24edward) -- Add Snake Game AI project (@pedrohbtp) -- Add note on the support Tensorflow versions. -- Remove unnecessary steps required for Windows installation. -- Remove ``DummyVecEnv`` creation when not needed -- Added ``make_vec_env`` to the examples to simplify VecEnv creation -- Add QuaRL project (@srivatsankrishnan) -- Add Pwnagotchi project (@evilsocket) -- Fix multiprocessing example (@rusu24edward) -- Fix ``result_plotter`` example -- Add JNRR19 tutorial (by @edbeeching, @hill-a and @araffin) -- Updated notebooks link -- Fix typo in algos.rst, "containes" to "contains" (@SyllogismRXS) -- Fix outdated source documentation for load_results -- Add PPO_CPP project (@Antymon) -- Add section on C++ portability of Tensorflow models (@Antymon) -- Update custom env documentation to reflect new gym API for the ``close()`` method (@justinkterry) -- Update custom env documentation to clarify what step and reset return (@justinkterry) -- Add RL tips and tricks for doing RL experiments -- Corrected lots of typos -- Add spell check to documentation if available - - -Release 2.8.0 (2019-09-29) --------------------------- - -**MPI dependency optional, new save format, ACKTR with continuous actions** - -Breaking Changes: -^^^^^^^^^^^^^^^^^ -- OpenMPI-dependent algorithms (PPO1, TRPO, GAIL, DDPG) are disabled in the - default installation of stable_baselines. ``mpi4py`` is now installed as an - extra. When ``mpi4py`` is not available, stable-baselines skips imports of - OpenMPI-dependent algorithms. - See :ref:`installation notes ` and - `Issue #430 `_. -- SubprocVecEnv now defaults to a thread-safe start method, ``forkserver`` when - available and otherwise ``spawn``. This may require application code be - wrapped in ``if __name__ == '__main__'``. You can restore previous behavior - by explicitly setting ``start_method = 'fork'``. See - `PR #428 `_. -- Updated dependencies: tensorflow v1.8.0 is now required -- Removed ``checkpoint_path`` and ``checkpoint_freq`` argument from ``DQN`` that were not used -- Removed ``bench/benchmark.py`` that was not used -- Removed several functions from ``common/tf_util.py`` that were not used -- Removed ``ppo1/run_humanoid.py`` - -New Features: -^^^^^^^^^^^^^ -- **important change** Switch to using zip-archived JSON and Numpy ``savez`` for - storing models for better support across library/Python versions. (@Miffyli) -- ACKTR now supports continuous actions -- Add ``double_q`` argument to ``DQN`` constructor - -Bug Fixes: -^^^^^^^^^^ -- Skip automatic imports of OpenMPI-dependent algorithms to avoid an issue - where OpenMPI would cause stable-baselines to hang on Ubuntu installs. - See :ref:`installation notes ` and - `Issue #430 `_. -- Fix a bug when calling ``logger.configure()`` with MPI enabled (@keshaviyengar) -- set ``allow_pickle=True`` for numpy>=1.17.0 when loading expert dataset -- Fix a bug when using VecCheckNan with numpy ndarray as state. `Issue #489 `_. (@ruifeng96150) - -Deprecations: -^^^^^^^^^^^^^ -- Models saved with cloudpickle format (stable-baselines<=2.7.0) are now - deprecated in favor of zip-archive format for better support across - Python/Tensorflow versions. (@Miffyli) - -Others: -^^^^^^^ -- Implementations of noise classes (``AdaptiveParamNoiseSpec``, ``NormalActionNoise``, - ``OrnsteinUhlenbeckActionNoise``) were moved from `stable_baselines.ddpg.noise` - to ``stable_baselines.common.noise``. The API remains backward-compatible; - for example ``from stable_baselines.ddpg.noise import NormalActionNoise`` is still - okay. (@shwang) -- Docker images were updated -- Cleaned up files in ``common/`` folder and in `acktr/` folder that were only used by old ACKTR version - (e.g. `filter.py`) -- Renamed `acktr_disc.py` to `acktr.py` - -Documentation: -^^^^^^^^^^^^^^ -- Add WaveRL project (@jaberkow) -- Add Fenics-DRL project (@DonsetPG) -- Fix and rename custom policy names (@eavelardev) -- Add documentation on exporting models. -- Update maintainers list (Welcome to @Miffyli) - - -Release 2.7.0 (2019-07-31) --------------------------- - -**Twin Delayed DDPG (TD3) and GAE bug fix (TRPO, PPO1, GAIL)** - -Breaking Changes: -^^^^^^^^^^^^^^^^^ - -New Features: -^^^^^^^^^^^^^ -- added Twin Delayed DDPG (TD3) algorithm, with HER support -- added support for continuous action spaces to ``action_probability``, computing the PDF of a Gaussian - policy in addition to the existing support for categorical stochastic policies. -- added flag to ``action_probability`` to return log-probabilities. -- added support for python lists and numpy arrays in ``logger.writekvs``. (@dwiel) -- the info dict returned by VecEnvs now include a ``terminal_observation`` key providing access to the last observation in a trajectory. (@qxcv) - -Bug Fixes: -^^^^^^^^^^ -- fixed a bug in ``traj_segment_generator`` where the ``episode_starts`` was wrongly recorded, - resulting in wrong calculation of Generalized Advantage Estimation (GAE), this affects TRPO, PPO1 and GAIL (thanks to @miguelrass for spotting the bug) -- added missing property ``n_batch`` in ``BasePolicy``. - -Deprecations: -^^^^^^^^^^^^^ - -Others: -^^^^^^^ -- renamed some keys in ``traj_segment_generator`` to be more meaningful -- retrieve unnormalized reward when using Monitor wrapper with TRPO, PPO1 and GAIL - to display them in the logs (mean episode reward) -- clean up DDPG code (renamed variables) - -Documentation: -^^^^^^^^^^^^^^ - -- doc fix for the hyperparameter tuning command in the rl zoo -- added an example on how to log additional variable with tensorboard and a callback - - - -Release 2.6.0 (2019-06-12) --------------------------- - -**Hindsight Experience Replay (HER) - Reloaded | get/load parameters** - -Breaking Changes: -^^^^^^^^^^^^^^^^^ - -- **breaking change** removed ``stable_baselines.ddpg.memory`` in favor of ``stable_baselines.deepq.replay_buffer`` (see fix below) - -**Breaking Change:** DDPG replay buffer was unified with DQN/SAC replay buffer. As a result, -when loading a DDPG model trained with stable_baselines<2.6.0, it throws an import error. -You can fix that using: - -.. code-block:: python - - import sys - import pkg_resources - - import stable_baselines - - # Fix for breaking change for DDPG buffer in v2.6.0 - if pkg_resources.get_distribution("stable_baselines").version >= "2.6.0": - sys.modules['stable_baselines.ddpg.memory'] = stable_baselines.deepq.replay_buffer - stable_baselines.deepq.replay_buffer.Memory = stable_baselines.deepq.replay_buffer.ReplayBuffer - - -We recommend you to save again the model afterward, so the fix won't be needed the next time the trained agent is loaded. - - -New Features: -^^^^^^^^^^^^^ - -- **revamped HER implementation**: clean re-implementation from scratch, now supports DQN, SAC and DDPG -- add ``action_noise`` param for SAC, it helps exploration for problem with deceptive reward -- The parameter ``filter_size`` of the function ``conv`` in A2C utils now supports passing a list/tuple of two integers (height and width), in order to have non-squared kernel matrix. (@yutingsz) -- add ``random_exploration`` parameter for DDPG and SAC, it may be useful when using HER + DDPG/SAC. This hack was present in the original OpenAI Baselines DDPG + HER implementation. -- added ``load_parameters`` and ``get_parameters`` to base RL class. With these methods, users are able to load and get parameters to/from existing model, without touching tensorflow. (@Miffyli) -- added specific hyperparameter for PPO2 to clip the value function (``cliprange_vf``) -- added ``VecCheckNan`` wrapper - -Bug Fixes: -^^^^^^^^^^ - -- bugfix for ``VecEnvWrapper.__getattr__`` which enables access to class attributes inherited from parent classes. -- fixed path splitting in ``TensorboardWriter._get_latest_run_id()`` on Windows machines (@PatrickWalter214) -- fixed a bug where initial learning rate is logged instead of its placeholder in ``A2C.setup_model`` (@sc420) -- fixed a bug where number of timesteps is incorrectly updated and logged in ``A2C.learn`` and ``A2C._train_step`` (@sc420) -- fixed ``num_timesteps`` (total_timesteps) variable in PPO2 that was wrongly computed. -- fixed a bug in DDPG/DQN/SAC, when there were the number of samples in the replay buffer was lesser than the batch size - (thanks to @dwiel for spotting the bug) -- **removed** ``a2c.utils.find_trainable_params`` please use ``common.tf_util.get_trainable_vars`` instead. - ``find_trainable_params`` was returning all trainable variables, discarding the scope argument. - This bug was causing the model to save duplicated parameters (for DDPG and SAC) - but did not affect the performance. - -Deprecations: -^^^^^^^^^^^^^ - -- **deprecated** ``memory_limit`` and ``memory_policy`` in DDPG, please use ``buffer_size`` instead. (will be removed in v3.x.x) - -Others: -^^^^^^^ - -- **important change** switched to using dictionaries rather than lists when storing parameters, with tensorflow Variable names being the keys. (@Miffyli) -- removed unused dependencies (tdqm, dill, progressbar2, seaborn, glob2, click) -- removed ``get_available_gpus`` function which hadn't been used anywhere (@Pastafarianist) - -Documentation: -^^^^^^^^^^^^^^ - -- added guide for managing ``NaN`` and ``inf`` -- updated ven_env doc -- misc doc updates - -Release 2.5.1 (2019-05-04) --------------------------- - -**Bug fixes + improvements in the VecEnv** - -**Warning: breaking changes when using custom policies** - -- doc update (fix example of result plotter + improve doc) -- fixed logger issues when stdout lacks ``read`` function -- fixed a bug in ``common.dataset.Dataset`` where shuffling was not disabled properly (it affects only PPO1 with recurrent policies) -- fixed output layer name for DDPG q function, used in pop-art normalization and l2 regularization of the critic -- added support for multi env recording to ``generate_expert_traj`` (@XMaster96) -- added support for LSTM model recording to ``generate_expert_traj`` (@XMaster96) -- ``GAIL``: remove mandatory matplotlib dependency and refactor as subclass of ``TRPO`` (@kantneel and @AdamGleave) -- added ``get_attr()``, ``env_method()`` and ``set_attr()`` methods for all VecEnv. - Those methods now all accept ``indices`` keyword to select a subset of envs. - ``set_attr`` now returns ``None`` rather than a list of ``None``. (@kantneel) -- ``GAIL``: ``gail.dataset.ExpertDataset`` supports loading from memory rather than file, and - ``gail.dataset.record_expert`` supports returning in-memory rather than saving to file. -- added support in ``VecEnvWrapper`` for accessing attributes of arbitrarily deeply nested - instances of ``VecEnvWrapper`` and ``VecEnv``. This is allowed as long as the attribute belongs - to exactly one of the nested instances i.e. it must be unambiguous. (@kantneel) -- fixed bug where result plotter would crash on very short runs (@Pastafarianist) -- added option to not trim output of result plotter by number of timesteps (@Pastafarianist) -- clarified the public interface of ``BasePolicy`` and ``ActorCriticPolicy``. **Breaking change** when using custom policies: ``masks_ph`` is now called ``dones_ph``, - and most placeholders were made private: e.g. ``self.value_fn`` is now ``self._value_fn`` -- support for custom stateful policies. -- fixed episode length recording in ``trpo_mpi.utils.traj_segment_generator`` (@GerardMaggiolino) - - -Release 2.5.0 (2019-03-28) --------------------------- - -**Working GAIL, pretrain RL models and hotfix for A2C with continuous actions** - -- fixed various bugs in GAIL -- added scripts to generate dataset for gail -- added tests for GAIL + data for Pendulum-v0 -- removed unused ``utils`` file in DQN folder -- fixed a bug in A2C where actions were cast to ``int32`` even in the continuous case -- added addional logging to A2C when Monitor wrapper is used -- changed logging for PPO2: do not display NaN when reward info is not present -- change default value of A2C lr schedule -- removed behavior cloning script -- added ``pretrain`` method to base class, in order to use behavior cloning on all models -- fixed ``close()`` method for DummyVecEnv. -- added support for Dict spaces in DummyVecEnv and SubprocVecEnv. (@AdamGleave) -- added support for arbitrary multiprocessing start methods and added a warning about SubprocVecEnv that are not thread-safe by default. (@AdamGleave) -- added support for Discrete actions for GAIL -- fixed deprecation warning for tf: replaces ``tf.to_float()`` by ``tf.cast()`` -- fixed bug in saving and loading ddpg model when using normalization of obs or returns (@tperol) -- changed DDPG default buffer size from 100 to 50000. -- fixed a bug in ``ddpg.py`` in ``combined_stats`` for eval. Computed mean on ``eval_episode_rewards`` and ``eval_qs`` (@keshaviyengar) -- fixed a bug in ``setup.py`` that would error on non-GPU systems without TensorFlow installed - - -Release 2.4.1 (2019-02-11) --------------------------- - -**Bug fixes and improvements** - -- fixed computation of training metrics in TRPO and PPO1 -- added ``reset_num_timesteps`` keyword when calling train() to continue tensorboard learning curves -- reduced the size taken by tensorboard logs (added a ``full_tensorboard_log`` to enable full logging, which was the previous behavior) -- fixed image detection for tensorboard logging -- fixed ACKTR for recurrent policies -- fixed gym breaking changes -- fixed custom policy examples in the doc for DQN and DDPG -- remove gym spaces patch for equality functions -- fixed tensorflow dependency: cpu version was installed overwritting tensorflow-gpu when present. -- fixed a bug in ``traj_segment_generator`` (used in ppo1 and trpo) where ``new`` was not updated. (spotted by @junhyeokahn) - - -Release 2.4.0 (2019-01-17) --------------------------- - -**Soft Actor-Critic (SAC) and policy kwargs** - -- added Soft Actor-Critic (SAC) model -- fixed a bug in DQN where prioritized_replay_beta_iters param was not used -- fixed DDPG that did not save target network parameters -- fixed bug related to shape of true_reward (@abhiskk) -- fixed example code in documentation of tf_util:Function (@JohannesAck) -- added learning rate schedule for SAC -- fixed action probability for continuous actions with actor-critic models -- added optional parameter to action_probability for likelihood calculation of given action being taken. -- added more flexible custom LSTM policies -- added auto entropy coefficient optimization for SAC -- clip continuous actions at test time too for all algorithms (except SAC/DDPG where it is not needed) -- added a mean to pass kwargs to policy when creating a model (+ save those kwargs) -- fixed DQN examples in DQN folder -- added possibility to pass activation function for DDPG, DQN and SAC - - -Release 2.3.0 (2018-12-05) --------------------------- - -- added support for storing model in file like object. (thanks to @ernestum) -- fixed wrong image detection when using tensorboard logging with DQN -- fixed bug in ppo2 when passing non callable lr after loading -- fixed tensorboard logging in ppo2 when nminibatches=1 -- added early stoppping via callback return value (@ernestum) -- added more flexible custom mlp policies (@ernestum) - - -Release 2.2.1 (2018-11-18) --------------------------- - -- added VecVideoRecorder to record mp4 videos from environment. - - -Release 2.2.0 (2018-11-07) --------------------------- - -- Hotfix for ppo2, the wrong placeholder was used for the value function - - -Release 2.1.2 (2018-11-06) --------------------------- - -- added ``async_eigen_decomp`` parameter for ACKTR and set it to ``False`` by default (remove deprecation warnings) -- added methods for calling env methods/setting attributes inside a VecEnv (thanks to @bjmuld) -- updated gym minimum version - - -Release 2.1.1 (2018-10-20) --------------------------- - -- fixed MpiAdam synchronization issue in PPO1 (thanks to @brendenpetersen) issue #50 -- fixed dependency issues (new mujoco-py requires a mujoco license + gym broke MultiDiscrete space shape) - - -Release 2.1.0 (2018-10-2) -------------------------- - -.. warning:: - - This version contains breaking changes for DQN policies, please read the full details - -**Bug fixes + doc update** - - -- added patch fix for equal function using `gym.spaces.MultiDiscrete` and `gym.spaces.MultiBinary` -- fixes for DQN action_probability -- re-added double DQN + refactored DQN policies **breaking changes** -- replaced ``async`` with ``async_eigen_decomp`` in ACKTR/KFAC for python 3.7 compatibility -- removed action clipping for prediction of continuous actions (see issue #36) -- fixed NaN issue due to clipping the continuous action in the wrong place (issue #36) -- documentation was updated (policy + DDPG example hyperparameters) - -Release 2.0.0 (2018-09-18) --------------------------- - -.. warning:: - - This version contains breaking changes, please read the full details - -**Tensorboard, refactoring and bug fixes** - - -- Renamed DeepQ to DQN **breaking changes** -- Renamed DeepQPolicy to DQNPolicy **breaking changes** -- fixed DDPG behavior **breaking changes** -- changed default policies for DDPG, so that DDPG now works correctly **breaking changes** -- added more documentation (some modules from common). -- added doc about using custom env -- added Tensorboard support for A2C, ACER, ACKTR, DDPG, DeepQ, PPO1, PPO2 and TRPO -- added episode reward to Tensorboard -- added documentation for Tensorboard usage -- added Identity for Box action space -- fixed render function ignoring parameters when using wrapped environments -- fixed PPO1 and TRPO done values for recurrent policies -- fixed image normalization not occurring when using images -- updated VecEnv objects for the new Gym version -- added test for DDPG -- refactored DQN policies -- added registry for policies, can be passed as string to the agent -- added documentation for custom policies + policy registration -- fixed numpy warning when using DDPG Memory -- fixed DummyVecEnv not copying the observation array when stepping and resetting -- added pre-built docker images + installation instructions -- added ``deterministic`` argument in the predict function -- added assert in PPO2 for recurrent policies -- fixed predict function to handle both vectorized and unwrapped environment -- added input check to the predict function -- refactored ActorCritic models to reduce code duplication -- refactored Off Policy models (to begin HER and replay_buffer refactoring) -- added tests for auto vectorization detection -- fixed render function, to handle positional arguments - - -Release 1.0.7 (2018-08-29) --------------------------- - -**Bug fixes and documentation** - -- added html documentation using sphinx + integration with read the docs -- cleaned up README + typos -- fixed normalization for DQN with images -- fixed DQN identity test - - -Release 1.0.1 (2018-08-20) --------------------------- - -**Refactored Stable Baselines** - -- refactored A2C, ACER, ACTKR, DDPG, DeepQ, GAIL, TRPO, PPO1 and PPO2 under a single constant class -- added callback to refactored algorithm training -- added saving and loading to refactored algorithms -- refactored ACER, DDPG, GAIL, PPO1 and TRPO to fit with A2C, PPO2 and ACKTR policies -- added new policies for most algorithms (Mlp, MlpLstm, MlpLnLstm, Cnn, CnnLstm and CnnLnLstm) -- added dynamic environment switching (so continual RL learning is now feasible) -- added prediction from observation and action probability from observation for all the algorithms -- fixed graphs issues, so models wont collide in names -- fixed behavior_clone weight loading for GAIL -- fixed Tensorflow using all the GPU VRAM -- fixed models so that they are all compatible with vectorized environments -- fixed ``set_global_seed`` to update ``gym.spaces``'s random seed -- fixed PPO1 and TRPO performance issues when learning identity function -- added new tests for loading, saving, continuous actions and learning the identity function -- fixed DQN wrapping for atari -- added saving and loading for Vecnormalize wrapper -- added automatic detection of action space (for the policy network) -- fixed ACER buffer with constant values assuming n_stack=4 -- fixed some RL algorithms not clipping the action to be in the action_space, when using ``gym.spaces.Box`` -- refactored algorithms can take either a ``gym.Environment`` or a ``str`` ([if the environment name is registered](https://github.com/openai/gym/wiki/Environments)) -- Hoftix in ACER (compared to v1.0.0) - -Future Work : - -- Finish refactoring HER -- Refactor ACKTR and ACER for continuous implementation - - - -Release 0.1.6 (2018-07-27) --------------------------- - -**Deobfuscation of the code base + pep8 and fixes** - -- Fixed ``tf.session().__enter__()`` being used, rather than - ``sess = tf.session()`` and passing the session to the objects -- Fixed uneven scoping of TensorFlow Sessions throughout the code -- Fixed rolling vecwrapper to handle observations that are not only - grayscale images -- Fixed deepq saving the environment when trying to save itself -- Fixed - ``ValueError: Cannot take the length of Shape with unknown rank.`` in - ``acktr``, when running ``run_atari.py`` script. -- Fixed calling baselines sequentially no longer creates graph - conflicts -- Fixed mean on empty array warning with deepq -- Fixed kfac eigen decomposition not cast to float64, when the - parameter use_float64 is set to True -- Fixed Dataset data loader, not correctly resetting id position if - shuffling is disabled -- Fixed ``EOFError`` when reading from connection in the ``worker`` in - ``subproc_vec_env.py`` -- Fixed ``behavior_clone`` weight loading and saving for GAIL -- Avoid taking root square of negative number in ``trpo_mpi.py`` -- Removed some duplicated code (a2cpolicy, trpo_mpi) -- Removed unused, undocumented and crashing function ``reset_task`` in - ``subproc_vec_env.py`` -- Reformated code to PEP8 style -- Documented all the codebase -- Added atari tests -- Added logger tests - -Missing: tests for acktr continuous (+ HER, rely on mujoco...) - -Maintainers ------------ - -Stable-Baselines is currently maintained by `Ashley Hill`_ (aka @hill-a), `Antonin Raffin`_ (aka `@araffin`_), -`Maximilian Ernestus`_ (aka @ernestum), `Adam Gleave`_ (`@AdamGleave`_) and `Anssi Kanervisto`_ (aka `@Miffyli`_). - -.. _Ashley Hill: https://github.com/hill-a -.. _Antonin Raffin: https://araffin.github.io/ -.. _Maximilian Ernestus: https://github.com/ernestum -.. _Adam Gleave: https://gleave.me/ -.. _@araffin: https://github.com/araffin -.. _@AdamGleave: https://github.com/adamgleave -.. _Anssi Kanervisto: https://github.com/Miffyli -.. _@Miffyli: https://github.com/Miffyli - - -Contributors (since v2.0.0): ----------------------------- -In random order... - -Thanks to @bjmuld @iambenzo @iandanforth @r7vme @brendenpetersen @huvar @abhiskk @JohannesAck @mily20001 -@EliasHasle @mrakgr @Bleyddyn @antoine-galataud @junhyeokahn @AdamGleave @keshaviyengar @tperol -@XMaster96 @kantneel @Pastafarianist @GerardMaggiolino @PatrickWalter214 @yutingsz @sc420 @Aaahh @billtubbs -@Miffyli @dwiel @miguelrass @qxcv @jaberkow @eavelardev @ruifeng96150 @pedrohbtp @srivatsankrishnan @evilsocket -@MarvineGothic @jdossgollin @SyllogismRXS @rusu24edward @jbulow @Antymon @seheevic @justinkterry @edbeeching -@flodorner @KuKuXia @NeoExtended @PartiallyTyped @mmcenta @richardwu @tirafesi @caburu @johannes-dornheim @kvenkman @aakash94 -@enderdead @hardmaru @jbarsce @ColinLeongUDRI @shwang @YangRui2015 @sophiagu @OGordon100 @SVJayanthi @sunshineclt -@roccivic @anj1 \ No newline at end of file diff --git a/docs/misc/projects.rst b/docs/misc/projects.rst deleted file mode 100644 index 1798a537..00000000 --- a/docs/misc/projects.rst +++ /dev/null @@ -1,216 +0,0 @@ -.. _projects: - -Projects -========= - -This is a list of projects using stable-baselines. -Please tell us, if you want your project to appear on this page ;) - - -Stable Baselines for TensorFlow 2 ---------------------------------- -A fork of the original stable-baselines repo that works with TF2.x. - -| Author: Sophia Gu (@sophiagu) -| Github repo: https://github.com/sophiagu/stable-baselines-tf2 - - -Slime Volleyball Gym Environment --------------------------------- -A simple environment for benchmarking single and multi-agent reinforcement learning algorithms on a clone of the Slime Volleyball game. Only dependencies are gym and numpy. Both state and pixel observation environments are available. The motivation of this environment is to easily enable trained agents to play against each other, and also facilitate the training of agents directly in a multi-agent setting, thus adding an extra dimension for evaluating an agent's performance. - -Uses stable-baselines to train RL agents for both state and pixel observation versions of the task. A tutorial is also provided on modifying stable-baselines for self-play using PPO. - -| Author: David Ha (@hardmaru) -| Github repo: https://github.com/hardmaru/slimevolleygym - - -Learning to drive in a day --------------------------- -Implementation of reinforcement learning approach to make a donkey car learn to drive. -Uses DDPG on VAE features (reproducing paper from wayve.ai) - -| Author: Roma Sokolkov (@r7vme) -| Github repo: https://github.com/r7vme/learning-to-drive-in-a-day - - -Donkey Gym ----------- -OpenAI gym environment for donkeycar simulator. - -| Author: Tawn Kramer (@tawnkramer) -| Github repo: https://github.com/tawnkramer/donkey_gym - - -Self-driving FZERO Artificial Intelligence ------------------------------------------- -Series of videos on how to make a self-driving FZERO artificial intelligence using reinforcement learning algorithms PPO2 and A2C. - -| Author: Lucas Thompson -| `Video Link `_ - - -S-RL Toolbox ------------- -S-RL Toolbox: Reinforcement Learning (RL) and State Representation Learning (SRL) for Robotics. -Stable-Baselines was originally developped for this project. - -| Authors: Antonin Raffin, Ashley Hill, René Traoré, Timothée Lesort, Natalia Díaz-Rodríguez, David Filliat -| Github repo: https://github.com/araffin/robotics-rl-srl - - -Roboschool simulations training on Amazon SageMaker ---------------------------------------------------- -"In this notebook example, we will make HalfCheetah learn to walk using the stable-baselines [...]" - -| Author: Amazon AWS -| `Repo Link `_ - - -MarathonEnvs + OpenAi.Baselines -------------------------------- -Experimental - using OpenAI baselines with MarathonEnvs (ML-Agents) - -| Author: Joe Booth (@Sohojoe) -| Github repo: https://github.com/Sohojoe/MarathonEnvsBaselines - - -Learning to drive smoothly in minutes -------------------------------------- -Implementation of reinforcement learning approach to make a car learn to drive smoothly in minutes. -Uses SAC on VAE features. - -| Author: Antonin Raffin (@araffin) -| Blog post: https://towardsdatascience.com/learning-to-drive-smoothly-in-minutes-450a7cdb35f4 -| Github repo: https://github.com/araffin/learning-to-drive-in-5-minutes - - -Making Roboy move with elegance -------------------------------- -Project around Roboy, a tendon-driven robot, that enabled it to move its shoulder in simulation to reach a pre-defined point in 3D space. The agent used Proximal Policy Optimization (PPO) or Soft Actor-Critic (SAC) and was tested on the real hardware. - -| Authors: Alexander Pakakis, Baris Yazici, Tomas Ruiz -| Email: FirstName.LastName@tum.de -| GitHub repo: https://github.com/Roboy/DeepAndReinforced -| DockerHub image: deepandreinforced/rl:latest -| Presentation: https://tinyurl.com/DeepRoboyControl -| Video: https://tinyurl.com/DeepRoboyControlVideo -| Blog post: https://tinyurl.com/mediumDRC -| Website: https://roboy.org/ - - -Train a ROS-integrated mobile robot (differential drive) to avoid dynamic objects ---------------------------------------------------------------------------------- -The RL-agent serves as local planner and is trained in a simulator, fusion of the Flatland Simulator and the crowd simulator Pedsim. This was tested on a real mobile robot. -The Proximal Policy Optimization (PPO) algorithm is applied. - -| Author: Ronja Güldenring -| Email: 6guelden@informatik.uni-hamburg.de -| Video: https://www.youtube.com/watch?v=laGrLaMaeT4 -| GitHub: https://github.com/RGring/drl_local_planner_ros_stable_baselines - - -Adversarial Policies: Attacking Deep Reinforcement Learning ------------------------------------------------------------ -Uses Stable Baselines to train *adversarial policies* that attack pre-trained victim policies in a zero-sum multi-agent environments. -May be useful as an example of how to integrate Stable Baselines with `Ray `_ to perform distributed experiments and `Sacred `_ for experiment configuration and monitoring. - -| Authors: Adam Gleave, Michael Dennis, Neel Kant, Cody Wild -| Email: adam@gleave.me -| GitHub: https://github.com/HumanCompatibleAI/adversarial-policies -| Paper: https://arxiv.org/abs/1905.10615 -| Website: https://adversarialpolicies.github.io - - -WaveRL: Training RL agents to perform active damping ----------------------------------------------------- -Reinforcement learning is used to train agents to control pistons attached to a bridge to cancel out vibrations. The bridge is modeled as a one dimensional oscillating system and dynamics are simulated using a finite difference solver. Agents were trained using Proximal Policy Optimization. See presentation for environment detalis. - -| Author: Jack Berkowitz -| Email: jackberkowitz88@gmail.com -| GitHub: https://github.com/jaberkow/WaveRL -| Presentation: http://bit.ly/WaveRLslides - - -Fenics-DRL: Fluid mechanics and Deep Reinforcement Learning ------------------------------------------------------------ -Deep Reinforcement Learning is used to control the position or the shape of obstacles in different fluids in order to optimize drag or lift. `Fenics `_ is used for the Fluid Mechanics part, and Stable Baselines is used for the DRL. - -| Authors: Paul Garnier, Jonathan Viquerat, Aurélien Larcher, Elie Hachem -| Email: paul.garnier@mines-paristech.fr -| GitHub: https://github.com/DonsetPG/openFluid -| Paper: https://arxiv.org/abs/1908.04127 -| Website: https://donsetpg.github.io/blog/2019/08/06/DRL-FM-review/ - - -Air Learning: An AI Research Platform Algorithm Hardware Benchmarking of Autonomous Aerial Robots -------------------------------------------------------------------------------------------------- -Aerial robotics is a cross-layer, interdisciplinary field. Air Learning is an effort to bridge seemingly disparate fields. - -Designing an autonomous robot to perform a task involves interactions between various boundaries spanning from modeling the environment down to the choice of onboard computer platform available in the robot. Our goal through building Air Learning is to provide researchers with a cross-domain infrastructure that allows them to holistically study and evaluate reinforcement learning algorithms for autonomous aerial machines. We use stable-baselines to train UAV agent with Deep Q-Networks and Proximal Policy Optimization algorithms. - -| Authors: Srivatsan Krishnan, Behzad Boroujerdian, William Fu, Aleksandra Faust, Vijay Janapa Reddi -| Email: srivatsan@seas.harvard.edu -| Github: https://github.com/harvard-edge/airlearning -| Paper: https://arxiv.org/pdf/1906.00421.pdf -| Video: https://www.youtube.com/watch?v=oakzGnh7Llw (Simulation), https://www.youtube.com/watch?v=cvO5YOzI0mg (on a CrazyFlie Nano-Drone) - - -Snake Game AI --------------------------- -AI to play the classic snake game. -The game was trained using PPO2 available from stable-baselines and -then exported to tensorflowjs to run directly on the browser - -| Author: Pedro Torres (@pedrohbtp) -| Repository: https://github.com/pedrohbtp/snake-rl -| Website: https://www.pedro-torres.com/snake-rl/ - - -Pwnagotchi --------------------------- -Pwnagotchi is an A2C-based “AI” powered by bettercap and running on a Raspberry Pi Zero W that learns from its surrounding WiFi environment in order to maximize the crackable WPA key material it captures (either through passive sniffing or by performing deauthentication and association attacks). This material is collected on disk as PCAP files containing any form of handshake supported by hashcat, including full and half WPA handshakes as well as PMKIDs. - -| Author: Simone Margaritelli (@evilsocket) -| Repository: https://github.com/evilsocket/pwnagotchi -| Website: https://pwnagotchi.ai/ - - -Quantized Reinforcement Learning (QuaRL) ----------------------------------------- -QuaRL is a open-source framework to study the effects of quantization broad spectrum of reinforcement learning algorithms. The RL algorithms we used in -this study are from stable-baselines. - -| Authors: Srivatsan Krishnan, Sharad Chitlangia, Maximilian Lam, Zishen Wan, Aleksandra Faust, Vijay Janapa Reddi -| Email: srivatsan@seas.harvard.edu -| Github: https://github.com/harvard-edge/quarl -| Paper: https://arxiv.org/pdf/1910.01055.pdf - - -PPO_CPP: C++ version of a Deep Reinforcement Learning algorithm PPO -------------------------------------------------------------------- -Executes PPO at C++ level yielding notable execution performance speedups. -Uses Stable Baselines to create a computational graph which is then used for training with custom environments by machine-code-compiled binary. - -| Author: Szymon Brych -| Email: szymon.brych@gmail.com -| GitHub: https://github.com/Antymon/ppo_cpp - - -Learning Agile Robotic Locomotion Skills by Imitating Animals -------------------------------------------------------------- -Learning locomotion gaits by imitating animals. It uses PPO1 and AWR. - -| Authors: Xue Bin Peng, Erwin Coumans, Tingnan Zhang, Tsang-Wei Lee, Jie Tan, Sergey Levine -| Website: https://xbpeng.github.io/projects/Robotic_Imitation/index.html -| Github: https://github.com/google-research/motion_imitation -| Paper: https://arxiv.org/abs/2004.00784 - - -Imitation Learning Baseline Implementations -------------------------------------------- -This project aims to provide clean implementations of imitation learning algorithms. -Currently we have implementations of AIRL and GAIL, and intend to add more in the future. - -| Authors: Adam Gleave, Steven Wang, Nevan Wichers, Sam Toyer -| Github: https://github.com/HumanCompatibleAI/imitation diff --git a/docs/misc/results_plotter.rst b/docs/misc/results_plotter.rst deleted file mode 100644 index 283958f2..00000000 --- a/docs/misc/results_plotter.rst +++ /dev/null @@ -1,8 +0,0 @@ -.. _results_plotter: - - -Plotting Results -================ - -.. automodule:: stable_baselines.results_plotter - :members: diff --git a/docs/modules/a2c.rst b/docs/modules/a2c.rst deleted file mode 100644 index 45f34555..00000000 --- a/docs/modules/a2c.rst +++ /dev/null @@ -1,127 +0,0 @@ -.. _a2c: - -.. automodule:: stable_baselines.a2c - - -A2C -==== - -A synchronous, deterministic variant of `Asynchronous Advantage Actor Critic (A3C) `_. -It uses multiple workers to avoid the use of a replay buffer. - - -Notes ------ - -- Original paper: https://arxiv.org/abs/1602.01783 -- OpenAI blog post: https://openai.com/blog/baselines-acktr-a2c/ -- ``python -m stable_baselines.a2c.run_atari`` runs the algorithm for 40M - frames = 10M timesteps on an Atari game. See help (``-h``) for more - options. -- ``python -m stable_baselines.a2c.run_mujoco`` runs the algorithm for 1M - frames on a Mujoco environment. - -Can I use? ----------- - -- Recurrent policies: ✔️ -- Multi processing: ✔️ -- Gym spaces: - - -============= ====== =========== -Space Action Observation -============= ====== =========== -Discrete ✔️ ✔️ -Box ✔️ ✔️ -MultiDiscrete ✔️ ✔️ -MultiBinary ✔️ ✔️ -============= ====== =========== - - -Example -------- - -Train a A2C agent on `CartPole-v1` using 4 processes. - -.. code-block:: python - - import gym - - from stable_baselines.common.policies import MlpPolicy - from stable_baselines.common import make_vec_env - from stable_baselines import A2C - - # Parallel environments - env = make_vec_env('CartPole-v1', n_envs=4) - - model = A2C(MlpPolicy, env, verbose=1) - model.learn(total_timesteps=25000) - model.save("a2c_cartpole") - - del model # remove to demonstrate saving and loading - - model = A2C.load("a2c_cartpole") - - obs = env.reset() - while True: - action, _states = model.predict(obs) - obs, rewards, dones, info = env.step(action) - env.render() - -Parameters ----------- - -.. autoclass:: A2C - :members: - :inherited-members: - - -Callbacks - Accessible Variables --------------------------------- - -Depending on initialization parameters and timestep, different variables are accessible. -Variables accessible "From timestep X" are variables that can be accessed when -``self.timestep==X`` in the ``on_step`` function. - - +--------------------------------+-----------------------------------------------------+ - |Variable | Availability| - +================================+=====================================================+ - |- self |From timestep 1 | - |- total_timesteps | | - |- callback | | - |- log_interval | | - |- tb_log_name | | - |- reset_num_timesteps | | - |- new_tb_log | | - |- writer | | - |- t_start | | - |- mb_obs | | - |- mb_rewards | | - |- mb_actions | | - |- mb_values | | - |- mb_dones | | - |- mb_states | | - |- ep_infos | | - |- actions | | - |- values | | - |- states | | - |- clipped_actions | | - |- obs | | - |- rewards | | - |- dones | | - |- infos | | - +--------------------------------+-----------------------------------------------------+ - |- info |From timestep 2 | - |- maybe_ep_info | | - +--------------------------------+-----------------------------------------------------+ - |- update |From timestep ``n_step+1`` | - |- rollout | | - |- masks | | - |- true_reward | | - +--------------------------------+-----------------------------------------------------+ - |- value_loss |From timestep ``2 * n_step+1`` | - |- policy_entropy | | - |- n_seconds | | - |- fps | | - +--------------------------------+-----------------------------------------------------+ diff --git a/docs/modules/acer.rst b/docs/modules/acer.rst deleted file mode 100644 index ea9dd1b4..00000000 --- a/docs/modules/acer.rst +++ /dev/null @@ -1,118 +0,0 @@ -.. _acer: - -.. automodule:: stable_baselines.acer - - -ACER -==== - - `Sample Efficient Actor-Critic with Experience Replay (ACER) `_ combines - several ideas of previous algorithms: it uses multiple workers (as A2C), implements a replay buffer (as in DQN), - uses Retrace for Q-value estimation, importance sampling and a trust region. - - -Notes ------ - -- Original paper: https://arxiv.org/abs/1611.01224 -- ``python -m stable_baselines.acer.run_atari`` runs the algorithm for 40M frames = 10M timesteps on an Atari game. See help (``-h``) for more options. - -Can I use? ----------- - -- Recurrent policies: ✔️ -- Multi processing: ✔️ -- Gym spaces: - - -============= ====== =========== -Space Action Observation -============= ====== =========== -Discrete ✔️ ✔️ -Box ❌ ✔️ -MultiDiscrete ❌ ✔️ -MultiBinary ❌ ✔️ -============= ====== =========== - - -Example -------- - -.. code-block:: python - - import gym - - from stable_baselines.common.policies import MlpPolicy, MlpLstmPolicy, MlpLnLstmPolicy - from stable_baselines.common import make_vec_env - from stable_baselines import ACER - - # multiprocess environment - env = make_vec_env('CartPole-v1', n_envs=4) - - model = ACER(MlpPolicy, env, verbose=1) - model.learn(total_timesteps=25000) - model.save("acer_cartpole") - - del model # remove to demonstrate saving and loading - - model = ACER.load("acer_cartpole") - - obs = env.reset() - while True: - action, _states = model.predict(obs) - obs, rewards, dones, info = env.step(action) - env.render() - - -Parameters ----------- - -.. autoclass:: ACER - :members: - :inherited-members: - - -Callbacks - Accessible Variables --------------------------------- - -Depending on initialization parameters and timestep, different variables are accessible. -Variables accessible from "timestep X" are variables that can be accessed when -``self.timestep==X`` from the ``on_step`` function. - - +--------------------------------+-----------------------------------------------------+ - |Variable | Availability| - +================================+=====================================================+ - |- self | From timestep 1 | - |- total_timesteps | | - |- callback | | - |- log_interval | | - |- tb_log_name | | - |- reset_num_timesteps | | - |- new_tb_log | | - |- writer | | - |- episode_stats | | - |- buffer | | - |- t_start | | - |- enc_obs | | - |- mb_obs | | - |- mb_actions | | - |- mb_mus | | - |- mb_dones | | - |- mb_rewards | | - |- actions | | - |- states | | - |- mus | | - |- clipped_actions | | - |- obs | | - |- rewards | | - |- dones | | - +--------------------------------+-----------------------------------------------------+ - |- steps | From timestep ``n_step+1`` | - |- masks | | - +--------------------------------+-----------------------------------------------------+ - |- names_ops | From timestep ``2 * n_step+1`` | - |- values_ops | | - +--------------------------------+-----------------------------------------------------+ - |- samples_number | After replay_start steps, when replay_ratio > 0 and| - | | buffer is not None | - +--------------------------------+-----------------------------------------------------+ diff --git a/docs/modules/acktr.rst b/docs/modules/acktr.rst deleted file mode 100644 index 7337dc48..00000000 --- a/docs/modules/acktr.rst +++ /dev/null @@ -1,134 +0,0 @@ -.. _acktr: - -.. automodule:: stable_baselines.acktr - - -ACKTR -===== - -`Actor Critic using Kronecker-Factored Trust Region (ACKTR) `_ uses -Kronecker-factored approximate curvature (K-FAC) for trust region optimization. - - -Notes ------ - -- Original paper: https://arxiv.org/abs/1708.05144 -- Baselines blog post: https://blog.openai.com/baselines-acktr-a2c/ -- ``python -m stable_baselines.acktr.run_atari`` runs the algorithm for 40M frames = 10M timesteps on an Atari game. - See help (``-h``) for more options. - -Can I use? ----------- - -- Recurrent policies: ✔️ -- Multi processing: ✔️ -- Gym spaces: - - -============= ====== =========== -Space Action Observation -============= ====== =========== -Discrete ✔️ ✔️ -Box ✔️ ✔️ -MultiDiscrete ❌ ✔️ -MultiBinary ❌ ✔️ -============= ====== =========== - - -Example -------- - -.. code-block:: python - - import gym - - from stable_baselines.common.policies import MlpPolicy, MlpLstmPolicy, MlpLnLstmPolicy - from stable_baselines.common import make_vec_env - from stable_baselines import ACKTR - - # multiprocess environment - env = make_vec_env('CartPole-v1', n_envs=4) - - model = ACKTR(MlpPolicy, env, verbose=1) - model.learn(total_timesteps=25000) - model.save("acktr_cartpole") - - del model # remove to demonstrate saving and loading - - model = ACKTR.load("acktr_cartpole") - - obs = env.reset() - while True: - action, _states = model.predict(obs) - obs, rewards, dones, info = env.step(action) - env.render() - - -Parameters ----------- - -.. autoclass:: ACKTR - :members: - :inherited-members: - - - - -Callbacks - Accessible Variables --------------------------------- - -Depending on initialization parameters and timestep, different variables are accessible. -Variables accessible from "timestep X" are variables that can be accessed when -``self.timestep==X`` from the ``on_step`` function. - - +--------------------------------+-----------------------------------------------------+ - |Variable | Availability| - +================================+=====================================================+ - |- self |From timestep 1 | - |- total_timesteps | | - |- callback | | - |- log_interval | | - |- tb_log_name | | - |- reset_num_timesteps | | - |- new_tb_log | | - |- writer | | - |- tf_vars | | - |- is_uninitialized | | - |- new_uninitialized_vars | | - |- t_start | | - |- coord | | - |- enqueue_threads | | - |- old_uninitialized_vars | | - |- mb_obs | | - |- mb_rewards | | - |- mb_actions | | - |- mb_values | | - |- mb_dones | | - |- mb_states | | - |- ep_infos | | - |- _ | | - |- actions | | - |- values | | - |- states | | - |- clipped_actions | | - |- obs | | - |- rewards | | - |- dones | | - |- infos | | - +--------------------------------+-----------------------------------------------------+ - |- info |From timestep 2 | - |- maybe_ep_info | | - +--------------------------------+-----------------------------------------------------+ - |- update |From timestep ``n_steps+1`` | - |- rollout | | - |- returns | | - |- masks | | - |- true_reward | | - +--------------------------------+-----------------------------------------------------+ - |- policy_loss |From timestep ``2*n_steps+1`` | - |- value_loss | | - |- policy_entropy | | - |- n_seconds | | - |- fps | | - +--------------------------------+-----------------------------------------------------+ diff --git a/docs/modules/base.rst b/docs/modules/base.rst deleted file mode 100644 index 84dfa1b2..00000000 --- a/docs/modules/base.rst +++ /dev/null @@ -1,12 +0,0 @@ -.. _base_algo: - -.. automodule:: stable_baselines.common.base_class - - -Base RL Class -============= - -Common interface for all the RL algorithms - -.. autoclass:: BaseRLModel - :members: diff --git a/docs/modules/ddpg.rst b/docs/modules/ddpg.rst deleted file mode 100644 index f6883a20..00000000 --- a/docs/modules/ddpg.rst +++ /dev/null @@ -1,227 +0,0 @@ -.. _ddpg: - -.. automodule:: stable_baselines.ddpg - - -DDPG -==== -`Deep Deterministic Policy Gradient (DDPG) `_ - -.. note:: - - DDPG requires :ref:`OpenMPI `. If OpenMPI isn't enabled, then DDPG isn't - imported into the ``stable_baselines`` module. - -.. warning:: - - The DDPG model does not support ``stable_baselines.common.policies`` because it uses q-value instead - of value estimation, as a result it must use its own policy models (see :ref:`ddpg_policies`). - - -.. rubric:: Available Policies - -.. autosummary:: - :nosignatures: - - MlpPolicy - LnMlpPolicy - CnnPolicy - LnCnnPolicy - -Notes ------ - -- Original paper: https://arxiv.org/abs/1509.02971 -- Baselines post: https://blog.openai.com/better-exploration-with-parameter-noise/ -- ``python -m stable_baselines.ddpg.main`` runs the algorithm for 1M frames = 10M timesteps - on a Mujoco environment. See help (``-h``) for more options. - -Can I use? ----------- - -- Recurrent policies: ❌ -- Multi processing: ✔️ (using MPI) -- Gym spaces: - - -============= ====== =========== -Space Action Observation -============= ====== =========== -Discrete ❌ ✔️ -Box ✔️ ✔️ -MultiDiscrete ❌ ✔️ -MultiBinary ❌ ✔️ -============= ====== =========== - - -Example -------- - -.. code-block:: python - - import gym - import numpy as np - - from stable_baselines.ddpg.policies import MlpPolicy - from stable_baselines.common.noise import NormalActionNoise, OrnsteinUhlenbeckActionNoise, AdaptiveParamNoiseSpec - from stable_baselines import DDPG - - env = gym.make('MountainCarContinuous-v0') - - # the noise objects for DDPG - n_actions = env.action_space.shape[-1] - param_noise = None - action_noise = OrnsteinUhlenbeckActionNoise(mean=np.zeros(n_actions), sigma=float(0.5) * np.ones(n_actions)) - - model = DDPG(MlpPolicy, env, verbose=1, param_noise=param_noise, action_noise=action_noise) - model.learn(total_timesteps=400000) - model.save("ddpg_mountain") - - del model # remove to demonstrate saving and loading - - model = DDPG.load("ddpg_mountain") - - obs = env.reset() - while True: - action, _states = model.predict(obs) - obs, rewards, dones, info = env.step(action) - env.render() - -Parameters ----------- - -.. autoclass:: DDPG - :members: - :inherited-members: - -.. _ddpg_policies: - -DDPG Policies -------------- - -.. autoclass:: MlpPolicy - :members: - :inherited-members: - - -.. autoclass:: LnMlpPolicy - :members: - :inherited-members: - - -.. autoclass:: CnnPolicy - :members: - :inherited-members: - - -.. autoclass:: LnCnnPolicy - :members: - :inherited-members: - - -Action and Parameters Noise ---------------------------- - -.. autoclass:: AdaptiveParamNoiseSpec - :members: - :inherited-members: - -.. autoclass:: NormalActionNoise - :members: - :inherited-members: - -.. autoclass:: OrnsteinUhlenbeckActionNoise - :members: - :inherited-members: - - -Custom Policy Network ---------------------- - -Similarly to the example given in the `examples <../guide/custom_policy.html>`_ page. -You can easily define a custom architecture for the policy network: - -.. code-block:: python - - import gym - - from stable_baselines.ddpg.policies import FeedForwardPolicy - from stable_baselines import DDPG - - # Custom MLP policy of two layers of size 16 each - class CustomDDPGPolicy(FeedForwardPolicy): - def __init__(self, *args, **kwargs): - super(CustomDDPGPolicy, self).__init__(*args, **kwargs, - layers=[16, 16], - layer_norm=False, - feature_extraction="mlp") - - - model = DDPG(CustomDDPGPolicy, 'Pendulum-v0', verbose=1) - # Train the agent - model.learn(total_timesteps=100000) - - -Callbacks - Accessible Variables --------------------------------- - - -Depending on initialization parameters and timestep, different variables are accessible. -Variables accessible from "timestep X" are variables that can be accessed when ``self.timestep==X`` from the ``on_step`` function. - - +--------------------------------+-----------------------------------------------------+ - |Variable | Availability| - +================================+=====================================================+ - |- self |From timestep 1 | - |- total_timesteps | | - |- callback | | - |- log_interval | | - |- tb_log_name | | - |- reset_num_timesteps | | - |- replay_wrapper | | - |- new_tb_log | | - |- writer | | - |- rank | | - |- eval_episode_rewards_history | | - |- episode_rewards_history | | - |- episode_successes | | - |- obs | | - |- eval_obs | | - |- episode_reward | | - |- episode_step | | - |- episodes | | - |- step | | - |- total_steps | | - |- start_time | | - |- epoch_episode_rewards | | - |- epoch_episode_steps | | - |- epoch_actor_losses | | - |- epoch_critic_losses | | - |- epoch_adaptive_distances | | - |- eval_episode_rewards | | - |- eval_qs | | - |- epoch_actions | | - |- epoch_qs | | - |- epoch_episodes | | - |- epoch | | - |- action | | - |- q_value | | - |- unscaled_action | | - |- new_obs | | - |- reward | | - |- done | | - |- info | | - +--------------------------------+-----------------------------------------------------+ - |- obs\_ |From timestep 2 | - |- new_obs\_ | | - |- reward\_ | | - +--------------------------------+-----------------------------------------------------+ - |- t_train |After nb_rollout_steps+1 | - +--------------------------------+-----------------------------------------------------+ - |- distance |After | - | |nb_rollout_steps*ceil(nb_rollout_steps/batch_size)```| - |- critic_loss | | - |- actor_loss | | - +--------------------------------+-----------------------------------------------------+ - |- maybe_is_success |After episode termination | - +--------------------------------+-----------------------------------------------------+ diff --git a/docs/modules/dqn.rst b/docs/modules/dqn.rst deleted file mode 100644 index 0eea78d5..00000000 --- a/docs/modules/dqn.rst +++ /dev/null @@ -1,226 +0,0 @@ -.. _dqn: - -.. automodule:: stable_baselines.deepq - - -DQN -=== - -`Deep Q Network (DQN) `_ -and its extensions (Double-DQN, Dueling-DQN, Prioritized Experience Replay). - -.. warning:: - - The DQN model does not support ``stable_baselines.common.policies``, - as a result it must use its own policy models (see :ref:`deepq_policies`). - -.. rubric:: Available Policies - -.. autosummary:: - :nosignatures: - - MlpPolicy - LnMlpPolicy - CnnPolicy - LnCnnPolicy - -Notes ------ - -- DQN paper: https://arxiv.org/abs/1312.5602 -- Dueling DQN: https://arxiv.org/abs/1511.06581 -- Double-Q Learning: https://arxiv.org/abs/1509.06461 -- Prioritized Experience Replay: https://arxiv.org/abs/1511.05952 - -.. note:: - - By default, the DQN class has double q learning and dueling extensions enabled. - See `Issue #406 `_ for disabling dueling. - To disable double-q learning, you can change the default value in the constructor. - - -Can I use? ----------- - -- Recurrent policies: ❌ -- Multi processing: ❌ -- Gym spaces: - - -============= ====== =========== -Space Action Observation -============= ====== =========== -Discrete ✔️ ✔️ -Box ❌ ✔️ -MultiDiscrete ❌ ✔️ -MultiBinary ❌ ✔️ -============= ====== =========== - - -Example -------- - -.. code-block:: python - - import gym - - from stable_baselines.common.vec_env import DummyVecEnv - from stable_baselines.deepq.policies import MlpPolicy - from stable_baselines import DQN - - env = gym.make('CartPole-v1') - - model = DQN(MlpPolicy, env, verbose=1) - model.learn(total_timesteps=25000) - model.save("deepq_cartpole") - - del model # remove to demonstrate saving and loading - - model = DQN.load("deepq_cartpole") - - obs = env.reset() - while True: - action, _states = model.predict(obs) - obs, rewards, dones, info = env.step(action) - env.render() - - -With Atari: - -.. code-block:: python - - from stable_baselines.common.atari_wrappers import make_atari - from stable_baselines.deepq.policies import MlpPolicy, CnnPolicy - from stable_baselines import DQN - - env = make_atari('BreakoutNoFrameskip-v4') - - model = DQN(CnnPolicy, env, verbose=1) - model.learn(total_timesteps=25000) - model.save("deepq_breakout") - - del model # remove to demonstrate saving and loading - - model = DQN.load("deepq_breakout") - - obs = env.reset() - while True: - action, _states = model.predict(obs) - obs, rewards, dones, info = env.step(action) - env.render() - -Parameters ----------- - -.. autoclass:: DQN - :members: - :inherited-members: - -.. _deepq_policies: - -DQN Policies ------------- - -.. autoclass:: MlpPolicy - :members: - :inherited-members: - - -.. autoclass:: LnMlpPolicy - :members: - :inherited-members: - - -.. autoclass:: CnnPolicy - :members: - :inherited-members: - - -.. autoclass:: LnCnnPolicy - :members: - :inherited-members: - - -Custom Policy Network ---------------------- - -Similarly to the example given in the `examples <../guide/custom_policy.html>`_ page. -You can easily define a custom architecture for the policy network: - -.. code-block:: python - - import gym - - from stable_baselines.deepq.policies import FeedForwardPolicy - from stable_baselines.common.vec_env import DummyVecEnv - from stable_baselines import DQN - - # Custom MLP policy of two layers of size 32 each - class CustomDQNPolicy(FeedForwardPolicy): - def __init__(self, *args, **kwargs): - super(CustomDQNPolicy, self).__init__(*args, **kwargs, - layers=[32, 32], - layer_norm=False, - feature_extraction="mlp") - - # Create and wrap the environment - env = gym.make('LunarLander-v2') - env = DummyVecEnv([lambda: env]) - - model = DQN(CustomDQNPolicy, env, verbose=1) - # Train the agent - model.learn(total_timesteps=100000) - - -Callbacks - Accessible Variables --------------------------------- - -Depending on initialization parameters and timestep, different variables are accessible. -Variables accessible from "timestep X" are variables that can be accessed when -``self.timestep==X`` from the ``on_step`` function. - - +--------------------------------+-----------------------------------------------------+ - |Variable | Availability| - +================================+=====================================================+ - |- self |From timestep 1 | - |- total_timesteps | | - |- callback | | - |- log_interval | | - |- tb_log_name | | - |- reset_num_timesteps | | - |- replay_wrapper | | - |- new_tb_log | | - |- writer | | - |- episode_rewards | | - |- episode_successes | | - |- reset | | - |- obs | | - |- _ | | - |- kwargs | | - |- update_eps | | - |- update_param_noise_threshold | | - |- action | | - |- env_action | | - |- new_obs | | - |- rew | | - |- done | | - |- info | | - +--------------------------------+-----------------------------------------------------+ - |- obs\_ |From timestep 2 | - |- new_obs\_ | | - |- reward\_ | | - |- can_sample | | - |- mean_100ep_reward | | - |- num_episodes | | - +--------------------------------+-----------------------------------------------------+ - |- maybe_is_success |After the first episode | - +--------------------------------+-----------------------------------------------------+ - |- obses_t |After at least ``max(batch_size, learning_starts)`` | - |- actions |and every `train_freq` steps | - |- rewards | | - |- obses_tp1 | | - |- dones | | - |- weights | | - |- batch_idxes | | - |- td_errors | | - +--------------------------------+-----------------------------------------------------+ \ No newline at end of file diff --git a/docs/modules/gail.rst b/docs/modules/gail.rst deleted file mode 100644 index f3c3d31f..00000000 --- a/docs/modules/gail.rst +++ /dev/null @@ -1,136 +0,0 @@ -.. _gail: - -.. automodule:: stable_baselines.gail - - -GAIL -==== - -The `Generative Adversarial Imitation Learning (GAIL) `_ uses expert trajectories -to recover a cost function and then learn a policy. - -Learning a cost function from expert demonstrations is called Inverse Reinforcement Learning (IRL). -The connection between GAIL and Generative Adversarial Networks (GANs) is that it uses a discriminator that tries -to separate expert trajectory from trajectories of the learned policy, which has the role of the generator here. - -.. note:: - - GAIL requires :ref:`OpenMPI `. If OpenMPI isn't enabled, then GAIL isn't - imported into the ``stable_baselines`` module. - - -Notes ------ - -- Original paper: https://arxiv.org/abs/1606.03476 - -.. warning:: - - Images are not yet handled properly by the current implementation - - - -If you want to train an imitation learning agent ------------------------------------------------- - - -Step 1: Generate expert data -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -You can either train a RL algorithm in a classic setting, use another controller (e.g. a PID controller) -or human demonstrations. - -We recommend you to take a look at :ref:`pre-training ` section -or directly look at ``stable_baselines/gail/dataset/`` folder to learn more about the expected format for the dataset. - -Here is an example of training a Soft Actor-Critic model to generate expert trajectories for GAIL: - - -.. code-block:: python - - from stable_baselines import SAC - from stable_baselines.gail import generate_expert_traj - - # Generate expert trajectories (train expert) - model = SAC('MlpPolicy', 'Pendulum-v0', verbose=1) - # Train for 60000 timesteps and record 10 trajectories - # all the data will be saved in 'expert_pendulum.npz' file - generate_expert_traj(model, 'expert_pendulum', n_timesteps=60000, n_episodes=10) - - - -Step 2: Run GAIL -~~~~~~~~~~~~~~~~ - - -**In case you want to run Behavior Cloning (BC)** - -Use the ``.pretrain()`` method (cf guide). - - -**Others** - -Thanks to the open source: - -- @openai/imitation -- @carpedm20/deep-rl-tensorflow - - -Can I use? ----------- - -- Recurrent policies: ❌ -- Multi processing: ✔️ (using MPI) -- Gym spaces: - - -============= ====== =========== -Space Action Observation -============= ====== =========== -Discrete ✔️ ✔️ -Box ✔️ ✔️ -MultiDiscrete ❌ ✔️ -MultiBinary ❌ ✔️ -============= ====== =========== - - -Example -------- - -.. code-block:: python - - import gym - - from stable_baselines import GAIL, SAC - from stable_baselines.gail import ExpertDataset, generate_expert_traj - - # Generate expert trajectories (train expert) - model = SAC('MlpPolicy', 'Pendulum-v0', verbose=1) - generate_expert_traj(model, 'expert_pendulum', n_timesteps=100, n_episodes=10) - - # Load the expert dataset - dataset = ExpertDataset(expert_path='expert_pendulum.npz', traj_limitation=10, verbose=1) - - model = GAIL('MlpPolicy', 'Pendulum-v0', dataset, verbose=1) - # Note: in practice, you need to train for 1M steps to have a working policy - model.learn(total_timesteps=1000) - model.save("gail_pendulum") - - del model # remove to demonstrate saving and loading - - model = GAIL.load("gail_pendulum") - - env = gym.make('Pendulum-v0') - obs = env.reset() - while True: - action, _states = model.predict(obs) - obs, rewards, dones, info = env.step(action) - env.render() - - -Parameters ----------- - -.. autoclass:: GAIL - :members: - :inherited-members: diff --git a/docs/modules/her.rst b/docs/modules/her.rst deleted file mode 100644 index e64cd7ed..00000000 --- a/docs/modules/her.rst +++ /dev/null @@ -1,110 +0,0 @@ -.. _her: - -.. automodule:: stable_baselines.her - - -HER -==== - -`Hindsight Experience Replay (HER) `_ - -HER is a method wrapper that works with Off policy methods (DQN, SAC, TD3 and DDPG for example). - -.. note:: - - HER was re-implemented from scratch in Stable-Baselines compared to the original OpenAI baselines. - If you want to reproduce results from the paper, please use the rl baselines zoo - in order to have the correct hyperparameters and at least 8 MPI workers with DDPG. - -.. warning:: - - HER requires the environment to inherits from `gym.GoalEnv `_ - - -.. warning:: - - you must pass an environment or wrap it with ``HERGoalEnvWrapper`` in order to use the predict method - - -Notes ------ - -- Original paper: https://arxiv.org/abs/1707.01495 -- OpenAI paper: `Plappert et al. (2018)`_ -- OpenAI blog post: https://openai.com/blog/ingredients-for-robotics-research/ - - -.. _Plappert et al. (2018): https://arxiv.org/abs/1802.09464 - -Can I use? ----------- - -Please refer to the wrapped model (DQN, SAC, TD3 or DDPG) for that section. - -Example -------- - -.. code-block:: python - - from stable_baselines import HER, DQN, SAC, DDPG, TD3 - from stable_baselines.her import GoalSelectionStrategy, HERGoalEnvWrapper - from stable_baselines.common.bit_flipping_env import BitFlippingEnv - - model_class = DQN # works also with SAC, DDPG and TD3 - - env = BitFlippingEnv(N_BITS, continuous=model_class in [DDPG, SAC, TD3], max_steps=N_BITS) - - # Available strategies (cf paper): future, final, episode, random - goal_selection_strategy = 'future' # equivalent to GoalSelectionStrategy.FUTURE - - # Wrap the model - model = HER('MlpPolicy', env, model_class, n_sampled_goal=4, goal_selection_strategy=goal_selection_strategy, - verbose=1) - # Train the model - model.learn(1000) - - model.save("./her_bit_env") - - # WARNING: you must pass an env - # or wrap your environment with HERGoalEnvWrapper to use the predict method - model = HER.load('./her_bit_env', env=env) - - obs = env.reset() - for _ in range(100): - action, _ = model.predict(obs) - obs, reward, done, _ = env.step(action) - - if done: - obs = env.reset() - - -Parameters ----------- - -.. autoclass:: HER - :members: - -Goal Selection Strategies -------------------------- - -.. autoclass:: GoalSelectionStrategy - :members: - :inherited-members: - :undoc-members: - - -Goal Env Wrapper ----------------- - -.. autoclass:: HERGoalEnvWrapper - :members: - :inherited-members: - :undoc-members: - - -Replay Wrapper --------------- - -.. autoclass:: HindsightExperienceReplayWrapper - :members: - :inherited-members: diff --git a/docs/modules/policies.rst b/docs/modules/policies.rst deleted file mode 100644 index b630f573..00000000 --- a/docs/modules/policies.rst +++ /dev/null @@ -1,73 +0,0 @@ -.. _policies: - -.. automodule:: stable_baselines.common.policies - -Policy Networks -=============== - -Stable-baselines provides a set of default policies, that can be used with most action spaces. -To customize the default policies, you can specify the ``policy_kwargs`` parameter to the model class you use. -Those kwargs are then passed to the policy on instantiation (see :ref:`custom_policy` for an example). -If you need more control on the policy architecture, you can also create a custom policy (see :ref:`custom_policy`). - -.. note:: - - CnnPolicies are for images only. MlpPolicies are made for other type of features (e.g. robot joints) - -.. warning:: - For all algorithms (except DDPG, TD3 and SAC), continuous actions are clipped during training and testing - (to avoid out of bound error). - - -.. rubric:: Available Policies - -.. autosummary:: - :nosignatures: - - MlpPolicy - MlpLstmPolicy - MlpLnLstmPolicy - CnnPolicy - CnnLstmPolicy - CnnLnLstmPolicy - - -Base Classes ------------- - -.. autoclass:: BasePolicy - :members: - -.. autoclass:: ActorCriticPolicy - :members: - -.. autoclass:: FeedForwardPolicy - :members: - -.. autoclass:: LstmPolicy - :members: - -MLP Policies ------------- - -.. autoclass:: MlpPolicy - :members: - -.. autoclass:: MlpLstmPolicy - :members: - -.. autoclass:: MlpLnLstmPolicy - :members: - - -CNN Policies ------------- - -.. autoclass:: CnnPolicy - :members: - -.. autoclass:: CnnLstmPolicy - :members: - -.. autoclass:: CnnLnLstmPolicy - :members: diff --git a/docs/modules/ppo1.rst b/docs/modules/ppo1.rst deleted file mode 100644 index 98caf867..00000000 --- a/docs/modules/ppo1.rst +++ /dev/null @@ -1,141 +0,0 @@ -.. _ppo1: - -.. automodule:: stable_baselines.ppo1 - - -PPO1 -==== - -The `Proximal Policy Optimization `_ algorithm combines ideas from A2C (having multiple workers) -and TRPO (it uses a trust region to improve the actor). - -The main idea is that after an update, the new policy should be not too far from the ``old`` policy. -For that, ppo uses clipping to avoid too large update. - -.. note:: - - PPO1 requires :ref:`OpenMPI `. If OpenMPI isn't enabled, then PPO1 isn't - imported into the ``stable_baselines`` module. - -.. note:: - - PPO1 uses MPI for multiprocessing unlike PPO2, which uses vectorized environments. - PPO2 is the implementation OpenAI made for GPU. - -Notes ------ - -- Original paper: https://arxiv.org/abs/1707.06347 -- Clear explanation of PPO on Arxiv Insights channel: https://www.youtube.com/watch?v=5P7I-xPq8u8 -- OpenAI blog post: https://blog.openai.com/openai-baselines-ppo/ -- ``mpirun -np 8 python -m stable_baselines.ppo1.run_atari`` runs the algorithm for 40M frames = 10M timesteps on an Atari game. See help (``-h``) for more options. -- ``python -m stable_baselines.ppo1.run_mujoco`` runs the algorithm for 1M frames on a Mujoco environment. -- Train mujoco 3d humanoid (with optimal-ish hyperparameters): ``mpirun -np 16 python -m stable_baselines.ppo1.run_humanoid --model-path=/path/to/model`` -- Render the 3d humanoid: ``python -m stable_baselines.ppo1.run_humanoid --play --model-path=/path/to/model`` - -Can I use? ----------- - -- Recurrent policies: ❌ -- Multi processing: ✔️ (using MPI) -- Gym spaces: - - -============= ====== =========== -Space Action Observation -============= ====== =========== -Discrete ✔️ ✔️ -Box ✔️ ✔️ -MultiDiscrete ✔️ ✔️ -MultiBinary ✔️ ✔️ -============= ====== =========== - - -Example -------- - -.. code-block:: python - - import gym - - from stable_baselines.common.policies import MlpPolicy - from stable_baselines import PPO1 - - env = gym.make('CartPole-v1') - - model = PPO1(MlpPolicy, env, verbose=1) - model.learn(total_timesteps=25000) - model.save("ppo1_cartpole") - - del model # remove to demonstrate saving and loading - - model = PPO1.load("ppo1_cartpole") - - obs = env.reset() - while True: - action, _states = model.predict(obs) - obs, rewards, dones, info = env.step(action) - env.render() - - -Parameters ----------- - -.. autoclass:: PPO1 - :members: - :inherited-members: - - -Callbacks - Accessible Variables --------------------------------- - -Depending on initialization parameters and timestep, different variables are accessible. -Variables accessible "From timestep X" are variables that can be accessed when -``self.timestep==X`` in the ``on_step`` function. - - +--------------------------------+-----------------------------------------------------+ - |Variable | Availability| - +================================+=====================================================+ - |- self |From timestep 0 | - |- total_timesteps | | - |- callback | | - |- log_interval | | - |- tb_log_name | | - |- reset_num_timesteps | | - |- new_tb_log | | - |- writer | | - |- policy | | - |- env | | - |- horizon | | - |- reward_giver | | - |- gail | | - |- step | | - |- cur_ep_ret | | - |- current_it_len | | - |- current_ep_len | | - |- cur_ep_true_ret | | - |- ep_true_rets | | - |- ep_rets | | - |- ep_lens | | - |- observations | | - |- true_rewards | | - |- rewards | | - |- vpreds | | - |- episode_starts | | - |- dones | | - |- actions | | - |- states | | - |- episode_start | | - |- done | | - |- vpred | | - |- _ | | - |- i | | - |- clipped_action | | - |- reward | | - |- true_reward | | - |- info | | - |- action | | - |- observation | | - +--------------------------------+-----------------------------------------------------+ - |- maybe_ep_info |After the first episode termination | - +--------------------------------+-----------------------------------------------------+ diff --git a/docs/modules/ppo2.rst b/docs/modules/ppo2.rst deleted file mode 100644 index 05c6f454..00000000 --- a/docs/modules/ppo2.rst +++ /dev/null @@ -1,131 +0,0 @@ -.. _ppo2: - -.. automodule:: stable_baselines.ppo2 - -PPO2 -==== - -The `Proximal Policy Optimization `_ algorithm combines ideas from A2C (having multiple workers) -and TRPO (it uses a trust region to improve the actor). - -The main idea is that after an update, the new policy should be not too far from the old policy. -For that, PPO uses clipping to avoid too large update. - -.. note:: - - PPO2 is the implementation of OpenAI made for GPU. For multiprocessing, it uses vectorized environments - compared to PPO1 which uses MPI. - -.. note:: - - PPO2 contains several modifications from the original algorithm not documented - by OpenAI: value function is also clipped and advantages are normalized. - - -Notes ------ - -- Original paper: https://arxiv.org/abs/1707.06347 -- Clear explanation of PPO on Arxiv Insights channel: https://www.youtube.com/watch?v=5P7I-xPq8u8 -- OpenAI blog post: https://blog.openai.com/openai-baselines-ppo/ -- ``python -m stable_baselines.ppo2.run_atari`` runs the algorithm for 40M - frames = 10M timesteps on an Atari game. See help (``-h``) for more - options. -- ``python -m stable_baselines.ppo2.run_mujoco`` runs the algorithm for 1M - frames on a Mujoco environment. - -Can I use? ----------- - -- Recurrent policies: ✔️ -- Multi processing: ✔️ -- Gym spaces: - - -============= ====== =========== -Space Action Observation -============= ====== =========== -Discrete ✔️ ✔️ -Box ✔️ ✔️ -MultiDiscrete ✔️ ✔️ -MultiBinary ✔️ ✔️ -============= ====== =========== - -Example -------- - -Train a PPO agent on `CartPole-v1` using 4 processes. - -.. code-block:: python - - import gym - - from stable_baselines.common.policies import MlpPolicy - from stable_baselines.common import make_vec_env - from stable_baselines import PPO2 - - # multiprocess environment - env = make_vec_env('CartPole-v1', n_envs=4) - - model = PPO2(MlpPolicy, env, verbose=1) - model.learn(total_timesteps=25000) - model.save("ppo2_cartpole") - - del model # remove to demonstrate saving and loading - - model = PPO2.load("ppo2_cartpole") - - # Enjoy trained agent - obs = env.reset() - while True: - action, _states = model.predict(obs) - obs, rewards, dones, info = env.step(action) - env.render() - -Parameters ----------- - -.. autoclass:: PPO2 - :members: - :inherited-members: - -Callbacks - Accessible Variables --------------------------------- - -Depending on initialization parameters and timestep, different variables are accessible. -Variables accessible "From timestep X" are variables that can be accessed when -``self.timestep==X`` in the ``on_step`` function. - - +--------------------------------+-----------------------------------------------------+ - |Variable | Availability| - +================================+=====================================================+ - |- self |From timestep 1 | - |- total_timesteps | | - |- callback | | - |- log_interval | | - |- tb_log_name | | - |- reset_num_timesteps | | - |- cliprange_vf | | - |- new_tb_log | | - |- writer | | - |- t_first_start | | - |- n_updates | | - |- mb_obs | | - |- mb_rewards | | - |- mb_actions | | - |- mb_values | | - |- mb_dones | | - |- mb_neglogpacs | | - |- mb_states | | - |- ep_infos | | - |- actions | | - |- values | | - |- neglogpacs | | - |- clipped_actions | | - |- rewards | | - |- infos | | - +--------------------------------+-----------------------------------------------------+ - |- info |From timestep 1 | - |- maybe_ep_info | | - +--------------------------------+-----------------------------------------------------+ - diff --git a/docs/modules/sac.rst b/docs/modules/sac.rst deleted file mode 100644 index 47c8a2c2..00000000 --- a/docs/modules/sac.rst +++ /dev/null @@ -1,209 +0,0 @@ -.. _sac: - -.. automodule:: stable_baselines.sac - - -SAC -=== - -`Soft Actor Critic (SAC) `_ Off-Policy Maximum Entropy Deep Reinforcement Learning with a Stochastic Actor. - -SAC is the successor of `Soft Q-Learning SQL `_ and incorporates the double Q-learning trick from TD3. -A key feature of SAC, and a major difference with common RL algorithms, is that it is trained to maximize a trade-off between expected return and entropy, a measure of randomness in the policy. - - -.. warning:: - - The SAC model does not support ``stable_baselines.common.policies`` because it uses double q-values - and value estimation, as a result it must use its own policy models (see :ref:`sac_policies`). - - -.. rubric:: Available Policies - -.. autosummary:: - :nosignatures: - - MlpPolicy - LnMlpPolicy - CnnPolicy - LnCnnPolicy - -Notes ------ - -- Original paper: https://arxiv.org/abs/1801.01290 -- OpenAI Spinning Guide for SAC: https://spinningup.openai.com/en/latest/algorithms/sac.html -- Original Implementation: https://github.com/haarnoja/sac -- Blog post on using SAC with real robots: https://bair.berkeley.edu/blog/2018/12/14/sac/ - -.. note:: - In our implementation, we use an entropy coefficient (as in OpenAI Spinning or Facebook Horizon), - which is the equivalent to the inverse of reward scale in the original SAC paper. - The main reason is that it avoids having too high errors when updating the Q functions. - - -.. note:: - - The default policies for SAC differ a bit from others MlpPolicy: it uses ReLU instead of tanh activation, - to match the original paper - - -Can I use? ----------- - -- Recurrent policies: ❌ -- Multi processing: ❌ -- Gym spaces: - - -============= ====== =========== -Space Action Observation -============= ====== =========== -Discrete ❌ ✔️ -Box ✔️ ✔️ -MultiDiscrete ❌ ✔️ -MultiBinary ❌ ✔️ -============= ====== =========== - - -Example -------- - -.. code-block:: python - - import gym - import numpy as np - - from stable_baselines.sac.policies import MlpPolicy - from stable_baselines import SAC - - env = gym.make('Pendulum-v0') - - model = SAC(MlpPolicy, env, verbose=1) - model.learn(total_timesteps=50000, log_interval=10) - model.save("sac_pendulum") - - del model # remove to demonstrate saving and loading - - model = SAC.load("sac_pendulum") - - obs = env.reset() - while True: - action, _states = model.predict(obs) - obs, rewards, dones, info = env.step(action) - env.render() - -Parameters ----------- - -.. autoclass:: SAC - :members: - :inherited-members: - -.. _sac_policies: - -SAC Policies -------------- - -.. autoclass:: MlpPolicy - :members: - :inherited-members: - - -.. autoclass:: LnMlpPolicy - :members: - :inherited-members: - - -.. autoclass:: CnnPolicy - :members: - :inherited-members: - - -.. autoclass:: LnCnnPolicy - :members: - :inherited-members: - - -Custom Policy Network ---------------------- - -Similarly to the example given in the `examples <../guide/custom_policy.html>`_ page. -You can easily define a custom architecture for the policy network: - -.. code-block:: python - - import gym - - from stable_baselines.sac.policies import FeedForwardPolicy - from stable_baselines.common.vec_env import DummyVecEnv - from stable_baselines import SAC - - # Custom MLP policy of three layers of size 128 each - class CustomSACPolicy(FeedForwardPolicy): - def __init__(self, *args, **kwargs): - super(CustomSACPolicy, self).__init__(*args, **kwargs, - layers=[128, 128, 128], - layer_norm=False, - feature_extraction="mlp") - - # Create and wrap the environment - env = gym.make('Pendulum-v0') - env = DummyVecEnv([lambda: env]) - - model = SAC(CustomSACPolicy, env, verbose=1) - # Train the agent - model.learn(total_timesteps=100000) - - - -Callbacks - Accessible Variables --------------------------------- - -Depending on initialization parameters and timestep, different variables are accessible. -Variables accessible "From timestep X" are variables that can be accessed when -``self.timestep==X`` in the ``on_step`` function. - - +--------------------------------+-----------------------------------------------------+ - |Variable | Availability| - +================================+=====================================================+ - |- self |From timestep 1 | - |- total_timesteps | | - |- callback | | - |- log_interval | | - |- tb_log_name | | - |- reset_num_timesteps | | - |- replay_wrapper | | - |- new_tb_log | | - |- writer | | - |- current_lr | | - |- start_time | | - |- episode_rewards | | - |- episode_successes | | - |- obs | | - |- n_updates | | - |- infos_values | | - |- step | | - |- unscaled_action | | - |- action | | - |- new_obs | | - |- reward | | - |- done | | - |- info | | - +--------------------------------+-----------------------------------------------------+ - |- obs\_ |From timestep 2 | - |- new_obs\_ | | - |- reward\_ | | - |- maybe_ep_info | | - |- mean_reward | | - |- num_episodes | | - +--------------------------------+-----------------------------------------------------+ - |- mb_infos_vals |After timestep train_freq steps | - |- grad_step | | - +--------------------------------+-----------------------------------------------------+ - |- frac |After timestep train_freq steps | - | |After at least batch_size and learning_starts steps | - +--------------------------------+-----------------------------------------------------+ - |- maybe_is_success |After the first episode | - +--------------------------------+-----------------------------------------------------+ - diff --git a/docs/modules/td3.rst b/docs/modules/td3.rst deleted file mode 100644 index 0b9d4703..00000000 --- a/docs/modules/td3.rst +++ /dev/null @@ -1,214 +0,0 @@ -.. _td3: - -.. automodule:: stable_baselines.td3 - - -TD3 -=== - -`Twin Delayed DDPG (TD3) `_ Addressing Function Approximation Error in Actor-Critic Methods. - -TD3 is a direct successor of DDPG and improves it using three major tricks: clipped double Q-Learning, delayed policy update and target policy smoothing. -We recommend reading `OpenAI Spinning guide on TD3 `_ to learn more about those. - - -.. warning:: - - The TD3 model does not support ``stable_baselines.common.policies`` because it uses double q-values - estimation, as a result it must use its own policy models (see :ref:`td3_policies`). - - -.. rubric:: Available Policies - -.. autosummary:: - :nosignatures: - - MlpPolicy - LnMlpPolicy - CnnPolicy - LnCnnPolicy - -Notes ------ - -- Original paper: https://arxiv.org/pdf/1802.09477.pdf -- OpenAI Spinning Guide for TD3: https://spinningup.openai.com/en/latest/algorithms/td3.html -- Original Implementation: https://github.com/sfujim/TD3 - -.. note:: - - The default policies for TD3 differ a bit from others MlpPolicy: it uses ReLU instead of tanh activation, - to match the original paper - - -Can I use? ----------- - -- Recurrent policies: ❌ -- Multi processing: ❌ -- Gym spaces: - - -============= ====== =========== -Space Action Observation -============= ====== =========== -Discrete ❌ ✔️ -Box ✔️ ✔️ -MultiDiscrete ❌ ✔️ -MultiBinary ❌ ✔️ -============= ====== =========== - - -Example -------- - -.. code-block:: python - - import gym - import numpy as np - - from stable_baselines import TD3 - from stable_baselines.td3.policies import MlpPolicy - from stable_baselines.common.vec_env import DummyVecEnv - from stable_baselines.ddpg.noise import NormalActionNoise, OrnsteinUhlenbeckActionNoise - - env = gym.make('Pendulum-v0') - - # The noise objects for TD3 - n_actions = env.action_space.shape[-1] - action_noise = NormalActionNoise(mean=np.zeros(n_actions), sigma=0.1 * np.ones(n_actions)) - - model = TD3(MlpPolicy, env, action_noise=action_noise, verbose=1) - model.learn(total_timesteps=50000, log_interval=10) - model.save("td3_pendulum") - - del model # remove to demonstrate saving and loading - - model = TD3.load("td3_pendulum") - - obs = env.reset() - while True: - action, _states = model.predict(obs) - obs, rewards, dones, info = env.step(action) - env.render() - -Parameters ----------- - -.. autoclass:: TD3 - :members: - :inherited-members: - -.. _td3_policies: - -TD3 Policies -------------- - -.. autoclass:: MlpPolicy - :members: - :inherited-members: - - -.. autoclass:: LnMlpPolicy - :members: - :inherited-members: - - -.. autoclass:: CnnPolicy - :members: - :inherited-members: - - -.. autoclass:: LnCnnPolicy - :members: - :inherited-members: - - -Custom Policy Network ---------------------- - -Similarly to the example given in the `examples <../guide/custom_policy.html>`_ page. -You can easily define a custom architecture for the policy network: - -.. code-block:: python - - import gym - import numpy as np - - from stable_baselines import TD3 - from stable_baselines.td3.policies import FeedForwardPolicy - from stable_baselines.common.vec_env import DummyVecEnv - from stable_baselines.ddpg.noise import NormalActionNoise, OrnsteinUhlenbeckActionNoise - - # Custom MLP policy with two layers - class CustomTD3Policy(FeedForwardPolicy): - def __init__(self, *args, **kwargs): - super(CustomTD3Policy, self).__init__(*args, **kwargs, - layers=[400, 300], - layer_norm=False, - feature_extraction="mlp") - - # Create and wrap the environment - env = gym.make('Pendulum-v0') - env = DummyVecEnv([lambda: env]) - - # The noise objects for TD3 - n_actions = env.action_space.shape[-1] - action_noise = NormalActionNoise(mean=np.zeros(n_actions), sigma=0.1 * np.ones(n_actions)) - - - model = TD3(CustomTD3Policy, env, action_noise=action_noise, verbose=1) - # Train the agent - model.learn(total_timesteps=80000) - - -Callbacks - Accessible Variables --------------------------------- - -Depending on initialization parameters and timestep, different variables are accessible. -Variables accessible "From timestep X" are variables that can be accessed when -``self.timestep==X`` in the ``on_step`` function. - -+--------------------------------+-----------------------------------------------------+ -|Variable | Availability| -+================================+=====================================================+ -|- self |From timestep 1 | -|- total_timesteps | | -|- callback | | -|- log_interval | | -|- tb_log_name | | -|- reset_num_timesteps | | -|- replay_wrapper | | -|- new_tb_log | | -|- writer | | -|- current_lr | | -|- start_time | | -|- episode_rewards | | -|- episode_successes | | -|- obs | | -|- n_updates | | -|- infos_values | | -|- step | | -|- unscaled_action | | -|- action | | -|- new_obs | | -|- reward | | -|- done | | -|- info | | -+--------------------------------+-----------------------------------------------------+ -|- obs\_ |From timestep 2 | -|- new_obs\_ | | -|- reward\_ | | -|- maybe_ep_info | | -|- mean_reward | | -|- num_episodes | | -+--------------------------------+-----------------------------------------------------+ -|- mb_infos_vals |After timestep train_freq steps | -|- grad_step | | -+--------------------------------+-----------------------------------------------------+ -|- frac |After timestep train_freq steps | -| |After at least batch_size and learning_starts steps | -+--------------------------------+-----------------------------------------------------+ -|- maybe_is_success |After the first episode | -+--------------------------------+-----------------------------------------------------+ - diff --git a/docs/modules/trpo.rst b/docs/modules/trpo.rst deleted file mode 100644 index 9a101b15..00000000 --- a/docs/modules/trpo.rst +++ /dev/null @@ -1,127 +0,0 @@ -.. _trpo: - -.. automodule:: stable_baselines.trpo_mpi - - -TRPO -==== - -`Trust Region Policy Optimization (TRPO) `_ -is an iterative approach for optimizing policies with guaranteed monotonic improvement. - -.. note:: - - TRPO requires :ref:`OpenMPI `. If OpenMPI isn't enabled, then TRPO isn't - imported into the ``stable_baselines`` module. - -Notes ------ - -- Original paper: https://arxiv.org/abs/1502.05477 -- OpenAI blog post: https://blog.openai.com/openai-baselines-ppo/ -- ``mpirun -np 16 python -m stable_baselines.trpo_mpi.run_atari`` runs the algorithm - for 40M frames = 10M timesteps on an Atari game. See help (``-h``) for more options. -- ``python -m stable_baselines.trpo_mpi.run_mujoco`` runs the algorithm for 1M timesteps on a Mujoco environment. - -Can I use? ----------- - -- Recurrent policies: ❌ -- Multi processing: ✔️ (using MPI) -- Gym spaces: - - -============= ====== =========== -Space Action Observation -============= ====== =========== -Discrete ✔️ ✔️ -Box ✔️ ✔️ -MultiDiscrete ✔️ ✔️ -MultiBinary ✔️ ✔️ -============= ====== =========== - - -Example -------- - -.. code-block:: python - - import gym - - from stable_baselines.common.policies import MlpPolicy - from stable_baselines import TRPO - - env = gym.make('CartPole-v1') - - model = TRPO(MlpPolicy, env, verbose=1) - model.learn(total_timesteps=25000) - model.save("trpo_cartpole") - - del model # remove to demonstrate saving and loading - - model = TRPO.load("trpo_cartpole") - - obs = env.reset() - while True: - action, _states = model.predict(obs) - obs, rewards, dones, info = env.step(action) - env.render() - - -Parameters ----------- - -.. autoclass:: TRPO - :members: - :inherited-members: - -Callbacks - Accessible Variables --------------------------------- - -Depending on initialization parameters and timestep, different variables are accessible. -Variables accessible "From timestep X" are variables that can be accessed when -``self.timestep==X`` in the ``on_step`` function. - -+--------------------------------+-----------------------------------------------------+ -|Variable | Availability| -+================================+=====================================================+ -|- total_timesteps |From timestep 0 | -|- callback | | -|- log_interval | | -|- tb_log_name | | -|- reset_num_timesteps | | -|- new_tb_log | | -|- writer | | -|- self | | -|- policy | | -|- env | | -|- horizon | | -|- reward_giver | | -|- gail | | -|- step | | -|- cur_ep_ret | | -|- current_it_len | | -|- current_ep_len | | -|- cur_ep_true_ret | | -|- ep_true_rets | | -|- ep_rets | | -|- ep_lens | | -|- observations | | -|- true_rewards | | -|- rewards | | -|- vpreds | | -|- episode_starts | | -|- dones | | -|- actions | | -|- states | | -|- episode_start | | -|- done | | -|- vpred | | -|- clipped_action | | -|- reward | | -|- true_reward | | -|- info | | -|- action | | -|- observation | | -|- maybe_ep_info | | -+--------------------------------+-----------------------------------------------------+ diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index 99a688c6..00000000 --- a/docs/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -gym -pandas diff --git a/docs/spelling_wordlist.txt b/docs/spelling_wordlist.txt deleted file mode 100644 index b5a3c560..00000000 --- a/docs/spelling_wordlist.txt +++ /dev/null @@ -1,110 +0,0 @@ -py -env -atari -argparse -Argparse -TensorFlow -feedforward -envs -VecEnv -pretrain -petrained -tf -np -mujoco -cpu -ndarray -ndarrays -timestep -timesteps -stepsize -dataset -adam -fn -normalisation -Kullback -Leibler -boolean -deserialized -pretrained -minibatch -subprocesses -ArgumentParser -Tensorflow -Gaussian -approximator -minibatches -hyperparameters -hyperparameter -vectorized -rl -colab -dataloader -npz -datasets -vf -logits -num -Utils -backpropagate -prepend -NaN -preprocessing -Cloudpickle -async -multiprocess -tensorflow -mlp -cnn -neglogp -tanh -coef -repo -Huber -params -ppo -arxiv -Arxiv -func -DQN -Uhlenbeck -Ornstein -multithread -cancelled -Tensorboard -parallelize -customising -serializable -Multiprocessed -cartpole -toolset -lstm -rescale -ffmpeg -avconv -unnormalized -Github -pre -preprocess -backend -attr -preprocess -Antonin -Raffin -araffin -Homebrew -Numpy -Theano -rollout -kfac -Piecewise -csv -nvidia -visdom -tensorboard -preprocessed -namespace -sklearn -GoalEnv -BaseCallback -Keras From cb6b92a35b54874e6f4e82ab5ca598bb71b6db18 Mon Sep 17 00:00:00 2001 From: Mustafa-249 Date: Wed, 23 Jul 2025 14:56:00 +0300 Subject: [PATCH 10/18] Delete .coveragerc --- .coveragerc | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 .coveragerc diff --git a/.coveragerc b/.coveragerc deleted file mode 100644 index 8302b192..00000000 --- a/.coveragerc +++ /dev/null @@ -1,17 +0,0 @@ -[run] -branch = False -omit = - # Mujoco requires a licence - stable_baselines/*/run_mujoco.py - stable_baselines/ppo1/run_humanoid.py - stable_baselines/ppo1/run_robotics.py - # HER requires mpi and Mujoco - stable_baselines/her/experiment/* - tests/* - setup.py - -[report] -exclude_lines = - pragma: no cover - raise NotImplementedError() - if KFAC_DEBUG: From e9a1920752a97a24b8a59b84376a02138043736b Mon Sep 17 00:00:00 2001 From: Mustafa-249 Date: Wed, 23 Jul 2025 14:56:24 +0300 Subject: [PATCH 11/18] Delete .gitignore --- .gitignore | 42 ------------------------------------------ 1 file changed, 42 deletions(-) delete mode 100644 .gitignore diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 53acce05..00000000 --- a/.gitignore +++ /dev/null @@ -1,42 +0,0 @@ -*.swp -*.pyc -*.pkl -*.py~ -*.bak -.pytest_cache -.pytype -.DS_Store -.idea -.coverage -.coverage.* -__pycache__/ -_build/ -*.npz -*.zip - -# Setuptools distribution and build folders. -/dist/ -/build -keys/ - -# Virtualenv -/env -/venv - -*.sublime-project -*.sublime-workspace - -logs/ - -.ipynb_checkpoints -ghostdriver.log - -htmlcov - -junk -src - -*.egg-info -.cache - -MUJOCO_LOG.TXT From efc65d2f8585e07242a1f05b58ea8e75995b0f2a Mon Sep 17 00:00:00 2001 From: Mustafa-249 Date: Wed, 23 Jul 2025 14:56:39 +0300 Subject: [PATCH 12/18] Delete LICENSE --- LICENSE | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 LICENSE diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 209b99f0..00000000 --- a/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License - -Copyright (c) 2017 OpenAI (http://openai.com) -Copyright (c) 2018-2019 Stable-Baselines Team - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. From 1f0e8a63ef150bc178baef97ae490e0d2eb1d265 Mon Sep 17 00:00:00 2001 From: Mustafa-249 Date: Wed, 23 Jul 2025 14:56:51 +0300 Subject: [PATCH 13/18] Delete Dockerfile --- Dockerfile | 47 ----------------------------------------------- 1 file changed, 47 deletions(-) delete mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index db9d0a09..00000000 --- a/Dockerfile +++ /dev/null @@ -1,47 +0,0 @@ -ARG PARENT_IMAGE -FROM $PARENT_IMAGE -ARG USE_GPU - -RUN apt-get -y update \ - && apt-get -y install \ - curl \ - cmake \ - default-jre \ - git \ - jq \ - python-dev \ - python-pip \ - python3-dev \ - libfontconfig1 \ - libglib2.0-0 \ - libsm6 \ - libxext6 \ - libxrender1 \ - libopenmpi-dev \ - zlib1g-dev \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* - -ENV CODE_DIR /root/code -ENV VENV /root/venv - -COPY ./stable_baselines/version.txt ${CODE_DIR}/stable-baselines/stable_baselines/version.txt -COPY ./setup.py ${CODE_DIR}/stable-baselines/setup.py - -RUN \ - pip install pip --upgrade && \ - pip install virtualenv && \ - virtualenv $VENV --python=python3 && \ - . $VENV/bin/activate && \ - pip install --upgrade pip && \ - cd ${CODE_DIR}/stable-baselines && \ - pip install -e .[mpi,tests,docs] && \ - rm -rf $HOME/.cache/pip - -ENV PATH=$VENV/bin:$PATH - -# Codacy code coverage report: used for partial code coverage reporting -RUN cd $CODE_DIR && \ - curl -Ls -o codacy-coverage-reporter.jar "$(curl -Ls https://api.github.com/repos/codacy/codacy-coverage-reporter/releases/latest | jq -r '.assets | map({name, browser_download_url} | select(.name | (startswith("codacy-coverage-reporter") and contains("assembly") and endswith(".jar")))) | .[0].browser_download_url')" - -CMD /bin/bash From 4293f348066d0d8a68a43686d2669c36ef9f391d Mon Sep 17 00:00:00 2001 From: Mustafa-249 Date: Wed, 23 Jul 2025 14:57:05 +0300 Subject: [PATCH 14/18] Delete CONTRIBUTING.md --- CONTRIBUTING.md | 122 ------------------------------------------------ 1 file changed, 122 deletions(-) delete mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index d11f2780..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,122 +0,0 @@ -## Contributing to Stable-Baselines - -If you are interested in contributing to Stable-Baselines, your contributions will fall -into two categories: -1. You want to propose a new Feature and implement it - - Create an issue about your intended feature, and we shall discuss the design and - implementation. Once we agree that the plan looks good, go ahead and implement it. -2. You want to implement a feature or bug-fix for an outstanding issue - - Look at the outstanding issues here: https://github.com/hill-a/stable-baselines/issues - - Look at the roadmap here: https://github.com/hill-a/stable-baselines/projects/1 - - Pick an issue or feature and comment on the task that you want to work on this feature. - - If you need more context on a particular issue, please ask and we shall provide. - -Once you finish implementing a feature or bug-fix, please send a Pull Request to -https://github.com/hill-a/stable-baselines/ - - -If you are not familiar with creating a Pull Request, here are some guides: -- http://stackoverflow.com/questions/14680711/how-to-do-a-github-pull-request -- https://help.github.com/articles/creating-a-pull-request/ - - -## Developing Stable-Baselines - -To develop Stable-Baselines on your machine, here are some tips: - -1. Clone a copy of Stable-Baselines from source: - -```bash -git clone https://github.com/hill-a/stable-baselines/ -cd stable-baselines -``` - -2. Install Stable-Baselines in develop mode, with support for building the docs and running tests: - -```bash -pip install -e .[docs,tests] -``` - -## Codestyle - -We follow the [PEP8 codestyle](https://www.python.org/dev/peps/pep-0008/). Please order the imports as follows: - -1. built-in -2. packages -3. current module - -with one space between each, that gives for instance: -```python -import os -import warnings - -import numpy as np - -from stable_baselines import PPO2 -``` - -In general, we recommend using pycharm to format everything in an efficient way. - -Please document each function/method and [type](https://google.github.io/pytype/user_guide.html) them using the following template: - -```python - -def my_function(arg1: type1, arg2: type2) -> returntype: - """ - Short description of the function. - - :param arg1: (type1) describe what is arg1 - :param arg2: (type2) describe what is arg2 - :return: (returntype) describe what is returned - """ - ... - return my_variable -``` - -## Pull Request (PR) - -Before proposing a PR, please open an issue, where the feature will be discussed. This prevent from duplicated PR to be proposed and also ease the code review process. - -Each PR need to be reviewed and accepted by at least one of the maintainers (@hill-a, @araffin, @erniejunior, @AdamGleave or @Miffyli). -A PR must pass the Continuous Integration tests (travis + codacy) to be merged with the master branch. - -Note: in rare cases, we can create exception for codacy failure. - -## Test - -All new features must add tests in the `tests/` folder ensuring that everything works fine. -We use [pytest](https://pytest.org/). -Also, when a bug fix is proposed, tests should be added to avoid regression. - -To run tests with `pytest`: - -``` -make pytest -``` - -Type checking with `pytype`: - -``` -make type -``` - -Build the documentation: - -``` -make doc -``` - -Check documentation spelling (you need to install `sphinxcontrib.spelling` package for that): - -``` -make spelling -``` - - -## Changelog and Documentation - -Please do not forget to update the changelog (`docs/misc/changelog.rst`) and add documentation if needed. -A README is present in the `docs/` folder for instructions on how to build the documentation. - - -Credits: this contributing guide is based on the [PyTorch](https://github.com/pytorch/pytorch/) one. From 4dbe6b6d5ed15ff78a7266925ef98ac28ba984d2 Mon Sep 17 00:00:00 2001 From: Mustafa-249 Date: Wed, 23 Jul 2025 14:57:17 +0300 Subject: [PATCH 15/18] Delete .travis.yml --- .travis.yml | 52 ---------------------------------------------------- 1 file changed, 52 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 049cc0ff..00000000 --- a/.travis.yml +++ /dev/null @@ -1,52 +0,0 @@ -language: python -python: - - "3.5" - -env: - global: - - DOCKER_IMAGE=stablebaselines/stable-baselines-cpu:v2.10.0 - -notifications: - email: false - -services: - - docker - -install: - - docker pull ${DOCKER_IMAGE} - -script: - - ./scripts/run_tests_travis.sh "${TEST_GLOB}" - -jobs: - include: - # Big test suite. Run in parallel to decrease wall-clock time, and to avoid OOM error from leaks - - stage: Test - name: "Unit Tests a-h" - env: TEST_GLOB="[a-h]*" - - - name: "Unit Tests i-l" - env: TEST_GLOB="[i-l]*" - - - name: "Unit Tests m-sa" - env: TEST_GLOB="{[m-r]*,sa*}" - - - name: "Unit Tests sb-z" - env: TEST_GLOB="{s[b-z]*,[t-z]*}" - - - name: "Unit Tests determinism" - env: TEST_GLOB="0deterministic.py" - - - name: "Sphinx Documentation" - script: - - 'docker run -it --rm --mount src=$(pwd),target=/root/code/stable-baselines,type=bind ${DOCKER_IMAGE} bash -c "cd /root/code/stable-baselines/ && pushd docs/ && make clean && make html"' - - - name: "Type Checking" - script: - - 'docker run --rm --mount src=$(pwd),target=/root/code/stable-baselines,type=bind ${DOCKER_IMAGE} bash -c "cd /root/code/stable-baselines/ && pytype --version && pytype"' - - - stage: Codacy Trigger - if: type != pull_request - script: - # When all test coverage reports have been uploaded, instruct Codacy to start analysis. - - 'docker run -it --rm --network host --ipc=host --mount src=$(pwd),target=/root/code/stable-baselines,type=bind --env CODACY_PROJECT_TOKEN=${CODACY_PROJECT_TOKEN} ${DOCKER_IMAGE} bash -c "cd /root/code/stable-baselines/ && java -jar /root/code/codacy-coverage-reporter.jar final"' From 9d404d26bf83d1821989bef5bf12aae99e2009a1 Mon Sep 17 00:00:00 2001 From: Mustafa-249 Date: Wed, 23 Jul 2025 14:57:31 +0300 Subject: [PATCH 16/18] Delete .readthedocs.yml --- .readthedocs.yml | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 .readthedocs.yml diff --git a/.readthedocs.yml b/.readthedocs.yml deleted file mode 100644 index 6b05eedd..00000000 --- a/.readthedocs.yml +++ /dev/null @@ -1,18 +0,0 @@ -# Read the Docs configuration file -# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details - -# Required -version: 2 - -# Build documentation in the docs/ directory with Sphinx -sphinx: - configuration: docs/conf.py - -# Optionally build your docs in additional formats such as PDF and ePub -formats: all - -# Optionally set the version of Python and requirements required to build your docs -python: - version: 3.7 - install: - - requirements: docs/requirements.txt From 6b7a33e93c4de62c9e343850cf7746e2627c6aff Mon Sep 17 00:00:00 2001 From: Mustafa-249 Date: Wed, 23 Jul 2025 14:57:46 +0300 Subject: [PATCH 17/18] Delete .dockerignore --- .dockerignore | 1 - 1 file changed, 1 deletion(-) delete mode 120000 .dockerignore diff --git a/.dockerignore b/.dockerignore deleted file mode 120000 index 3e4e48b0..00000000 --- a/.dockerignore +++ /dev/null @@ -1 +0,0 @@ -.gitignore \ No newline at end of file From 59a37f6917e8da13d3c625a22afa91a343583cf7 Mon Sep 17 00:00:00 2001 From: Mustafa-249 Date: Wed, 23 Jul 2025 12:06:23 +0000 Subject: [PATCH 18/18] hi there --- txt.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 txt.txt diff --git a/txt.txt b/txt.txt new file mode 100644 index 00000000..e69de29b

9 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 Gulz6F(6BxL diff --git a/docs/_static/img/colab.svg b/docs/_static/img/colab.svg deleted file mode 100644 index c2d30e97..00000000 --- a/docs/_static/img/colab.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/docs/_static/img/learning_curve.png b/docs/_static/img/learning_curve.png deleted file mode 100644 index 5dd8edf5a8b672f3b68d1781cc7dc57caee9632b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25521 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

#H7Qr*!k2lTdm&odl-|-HVgSPIuGtEy0efXO+ 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 z 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