From d21627221ae8f794ae0b59fb0f9d54b8451f5c2b Mon Sep 17 00:00:00 2001 From: shunichi Date: Thu, 25 Jan 2024 19:53:48 +0900 Subject: [PATCH] Add amp --- bin/test_reproductions | 12 +- docs/source/nnablarl_api/algorithms.rst | 10 + nnabla_rl/algorithms/README.md | 1 + nnabla_rl/algorithms/__init__.py | 2 + nnabla_rl/algorithms/amp.py | 1349 +++++++++++++++++ .../epsilon_greedy_explorer.py | 17 +- nnabla_rl/environments/__init__.py | 13 +- nnabla_rl/environments/amp_env.py | 84 + nnabla_rl/environments/dummy.py | 117 +- nnabla_rl/environments/wrappers/__init__.py | 2 +- nnabla_rl/environments/wrappers/common.py | 69 +- .../environments/wrappers/goal_conditioned.py | 5 +- nnabla_rl/functions.py | 69 +- nnabla_rl/model_trainers/policy/__init__.py | 3 +- .../policy/amp_policy_trainer.py | 177 +++ nnabla_rl/model_trainers/reward/__init__.py | 4 +- .../reward/amp_reward_function_trainer.py | 280 ++++ nnabla_rl/models/__init__.py | 5 +- nnabla_rl/models/pybullet/policy.py | 162 ++ nnabla_rl/models/pybullet/reward_functions.py | 63 + nnabla_rl/models/pybullet/v_functions.py | 109 ++ .../preprocessors/running_mean_normalizer.py | 76 +- nnabla_rl/utils/data.py | 71 +- .../algorithms/pybullet/amp/.gitignore | 4 + .../algorithms/pybullet/amp/README.md | 172 +++ .../pybullet/amp/amp_reproduction.py | 289 ++++ .../pybullet/amp/deepmimic_utils/__init__.py | 13 + .../amp/deepmimic_utils/deepmimic_buffer.py | 70 + .../amp/deepmimic_utils/deepmimic_env.py | 454 ++++++ .../deepmimic_utils/deepmimic_env_utils.py | 251 +++ .../deepmimic_utils/deepmimic_evaluator.py | 42 + .../amp/deepmimic_utils/deepmimic_explorer.py | 80 + .../deepmimic_utils/deepmimic_normalizer.py | 117 ++ .../evaluation_result_average_scalar.tsv | 201 +++ .../humanoid3d_backflip_results/result.png | Bin 0 -> 28404 bytes .../seed-1/best_score_scalar.tsv | 2 + .../seed-1/evaluation_result_histogram.tsv | 201 +++ .../seed-1/evaluation_result_scalar.tsv | 201 +++ .../seed-1/result.png | Bin 0 -> 32058 bytes .../seed-10/best_score_scalar.tsv | 2 + .../seed-10/evaluation_result_histogram.tsv | 201 +++ .../seed-10/evaluation_result_scalar.tsv | 201 +++ .../seed-10/result.png | Bin 0 -> 34582 bytes .../seed-100/best_score_scalar.tsv | 2 + .../seed-100/evaluation_result_histogram.tsv | 201 +++ .../seed-100/evaluation_result_scalar.tsv | 201 +++ .../seed-100/result.png | Bin 0 -> 32379 bytes .../evaluation_result_average_scalar.tsv | 201 +++ .../humanoid3d_cartwheel_results/result.png | Bin 0 -> 27516 bytes .../seed-1/best_score_scalar.tsv | 2 + .../seed-1/evaluation_result_histogram.tsv | 201 +++ .../seed-1/evaluation_result_scalar.tsv | 201 +++ .../seed-1/result.png | Bin 0 -> 26913 bytes .../seed-10/best_score_scalar.tsv | 2 + .../seed-10/evaluation_result_histogram.tsv | 201 +++ .../seed-10/evaluation_result_scalar.tsv | 201 +++ .../seed-10/result.png | Bin 0 -> 20854 bytes .../seed-100/best_score_scalar.tsv | 2 + .../seed-100/evaluation_result_histogram.tsv | 201 +++ .../seed-100/evaluation_result_scalar.tsv | 201 +++ .../seed-100/result.png | Bin 0 -> 30779 bytes .../evaluation_result_average_scalar.tsv | 401 +++++ .../result.png | Bin 0 -> 31398 bytes .../seed-1/best_score_scalar.tsv | 2 + .../seed-1/evaluation_result_histogram.tsv | 401 +++++ .../seed-1/evaluation_result_scalar.tsv | 401 +++++ .../seed-1/result.png | Bin 0 -> 36439 bytes .../seed-10/best_score_scalar.tsv | 2 + .../seed-10/evaluation_result_histogram.tsv | 401 +++++ .../seed-10/evaluation_result_scalar.tsv | 401 +++++ .../seed-10/result.png | Bin 0 -> 38030 bytes .../seed-100/best_score_scalar.tsv | 2 + .../seed-100/evaluation_result_histogram.tsv | 401 +++++ .../seed-100/evaluation_result_scalar.tsv | 401 +++++ .../seed-100/result.png | Bin 0 -> 36552 bytes tests/algorithms/test_amp.py | 398 +++++ .../test_epsilon_greedy.py | 31 +- tests/environments/test_amp_env.py | 146 ++ tests/environments/wrappers/test_common.py | 50 +- .../test_running_mean_normalizer.py | 53 +- tests/test_functions.py | 59 +- tests/utils/test_data.py | 48 +- 82 files changed, 10577 insertions(+), 39 deletions(-) create mode 100644 nnabla_rl/algorithms/amp.py create mode 100644 nnabla_rl/environments/amp_env.py create mode 100644 nnabla_rl/model_trainers/policy/amp_policy_trainer.py create mode 100644 nnabla_rl/model_trainers/reward/amp_reward_function_trainer.py create mode 100644 nnabla_rl/models/pybullet/policy.py create mode 100644 nnabla_rl/models/pybullet/reward_functions.py create mode 100644 nnabla_rl/models/pybullet/v_functions.py create mode 100644 reproductions/algorithms/pybullet/amp/.gitignore create mode 100644 reproductions/algorithms/pybullet/amp/README.md create mode 100644 reproductions/algorithms/pybullet/amp/amp_reproduction.py create mode 100644 reproductions/algorithms/pybullet/amp/deepmimic_utils/__init__.py create mode 100644 reproductions/algorithms/pybullet/amp/deepmimic_utils/deepmimic_buffer.py create mode 100644 reproductions/algorithms/pybullet/amp/deepmimic_utils/deepmimic_env.py create mode 100644 reproductions/algorithms/pybullet/amp/deepmimic_utils/deepmimic_env_utils.py create mode 100644 reproductions/algorithms/pybullet/amp/deepmimic_utils/deepmimic_evaluator.py create mode 100644 reproductions/algorithms/pybullet/amp/deepmimic_utils/deepmimic_explorer.py create mode 100644 reproductions/algorithms/pybullet/amp/deepmimic_utils/deepmimic_normalizer.py create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/evaluation_result_average_scalar.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/result.png create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/seed-1/best_score_scalar.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/seed-1/evaluation_result_histogram.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/seed-1/evaluation_result_scalar.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/seed-1/result.png create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/seed-10/best_score_scalar.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/seed-10/evaluation_result_histogram.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/seed-10/evaluation_result_scalar.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/seed-10/result.png create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/seed-100/best_score_scalar.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/seed-100/evaluation_result_histogram.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/seed-100/evaluation_result_scalar.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/seed-100/result.png create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/evaluation_result_average_scalar.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/result.png create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-1/best_score_scalar.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-1/evaluation_result_histogram.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-1/evaluation_result_scalar.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-1/result.png create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-10/best_score_scalar.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-10/evaluation_result_histogram.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-10/evaluation_result_scalar.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-10/result.png create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-100/best_score_scalar.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-100/evaluation_result_histogram.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-100/evaluation_result_scalar.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-100/result.png create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/evaluation_result_average_scalar.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/result.png create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/seed-1/best_score_scalar.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/seed-1/evaluation_result_histogram.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/seed-1/evaluation_result_scalar.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/seed-1/result.png create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/seed-10/best_score_scalar.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/seed-10/evaluation_result_histogram.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/seed-10/evaluation_result_scalar.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/seed-10/result.png create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/seed-100/best_score_scalar.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/seed-100/evaluation_result_histogram.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/seed-100/evaluation_result_scalar.tsv create mode 100644 reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/seed-100/result.png create mode 100644 tests/algorithms/test_amp.py create mode 100644 tests/environments/test_amp_env.py diff --git a/bin/test_reproductions b/bin/test_reproductions index 26bf43c0..857988b5 100755 --- a/bin/test_reproductions +++ b/bin/test_reproductions @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2021,2022,2023 Sony Group Corporation. +# Copyright 2021,2022,2023,2024 Sony Group Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -82,6 +82,16 @@ do echo "Test run of showcase for ${ALGORITHM}" python ${SCRIPT} --gpu ${GPU_ID} --snapshot-dir ${SNAPSHOT_DIR} --showcase \ --showcase_runs ${SHOWCASE_RUNS} + elif [ ${BASE_ENV} = "pybullet" ] && [ ${ALGORITHM} = "amp" ]; then + TMP_ENV="FakeAMPNNablaRL-v1" + echo "Test run of training for ${ALGORITHM}" + python ${SCRIPT} --gpu ${GPU_ID} --save-dir "${RESULT_BASE_DIR}/${ALGORITHM}" --seed ${SEED} \ + --total_iterations ${TOTAL_ITERATIONS} --save_timing ${TOTAL_ITERATIONS} --actor_num 1 \ + --args_file_path ${TMP_ENV} + SNAPSHOT_DIR="${RESULT_BASE_DIR}/${ALGORITHM}/${TMP_ENV}_results/seed-${SEED}/iteration-${TOTAL_ITERATIONS}" + echo "Test run of showcase for ${ALGORITHM}" + python ${SCRIPT} --gpu ${GPU_ID} --snapshot-dir ${SNAPSHOT_DIR} --showcase \ + --showcase_runs ${SHOWCASE_RUNS} --args_file_path ${TMP_ENV} elif [ ${ALGORITHM} = "decision_transformer" ]; then echo "Test run of training for ${ALGORITHM}" TOTAL_EPOCHS=1 diff --git a/docs/source/nnablarl_api/algorithms.rst b/docs/source/nnablarl_api/algorithms.rst index db0f1b8c..58363c73 100644 --- a/docs/source/nnablarl_api/algorithms.rst +++ b/docs/source/nnablarl_api/algorithms.rst @@ -29,6 +29,16 @@ A2C :members: :show-inheritance: +AMP +==== +.. autoclass:: nnabla_rl.algorithms.amp.AMPConfig + :members: + :show-inheritance: + +.. autoclass:: nnabla_rl.algorithms.amp.AMP + :members: + :show-inheritance: + ATRPO ====== .. autoclass:: nnabla_rl.algorithms.atrpo.ATRPOConfig diff --git a/nnabla_rl/algorithms/README.md b/nnabla_rl/algorithms/README.md index e73416e7..2b5af0ae 100644 --- a/nnabla_rl/algorithms/README.md +++ b/nnabla_rl/algorithms/README.md @@ -13,6 +13,7 @@ nnabla-rl offers various (deep) reinforcement learning and optimal control algor |Algorithm|Online training|Offline(Batch) training|Continuous action|Discrete action|Hybrid action|RNN layer support| |:---|:---:|:---:|:---:|:---:|:---:|:---:| |[A2C](https://arxiv.org/abs/1602.01783)|:heavy_check_mark:|:x:|(We will support continuous action in the future)|:heavy_check_mark:|:x:|:x:| +|[AMP](https://arxiv.org/abs/2104.02180)|:heavy_check_mark:|:x:|:heavy_check_mark:|:x:|:x:|:x:| |[ATRPO](https://arxiv.org/pdf/2106.07329)|:heavy_check_mark:|:x:|:heavy_check_mark:|(We will support discrete action in the future)|:x:|:x:| |[BCQ](https://arxiv.org/abs/1812.02900)|:x:|:heavy_check_mark:|:heavy_check_mark:|:x:|:x:|:x:| |[BEAR](https://arxiv.org/abs/1906.00949)|:x:|:heavy_check_mark:|:heavy_check_mark:|:x:|:x:|:x:| diff --git a/nnabla_rl/algorithms/__init__.py b/nnabla_rl/algorithms/__init__.py index 2440c4c8..2cf9c5d7 100644 --- a/nnabla_rl/algorithms/__init__.py +++ b/nnabla_rl/algorithms/__init__.py @@ -15,6 +15,7 @@ from nnabla_rl.algorithm import Algorithm, AlgorithmConfig from nnabla_rl.algorithms.a2c import A2C, A2CConfig +from nnabla_rl.algorithms.amp import AMP, AMPConfig from nnabla_rl.algorithms.atrpo import ATRPO, ATRPOConfig from nnabla_rl.algorithms.bcq import BCQ, BCQConfig from nnabla_rl.algorithms.bear import BEAR, BEARConfig @@ -83,6 +84,7 @@ def get_class_of(name): register_algorithm(A2C, A2CConfig) register_algorithm(ATRPO, ATRPOConfig) +register_algorithm(AMP, AMPConfig) register_algorithm(BCQ, BCQConfig) register_algorithm(BEAR, BEARConfig) register_algorithm(CategoricalDDQN, CategoricalDDQNConfig) diff --git a/nnabla_rl/algorithms/amp.py b/nnabla_rl/algorithms/amp.py new file mode 100644 index 00000000..1ac616b0 --- /dev/null +++ b/nnabla_rl/algorithms/amp.py @@ -0,0 +1,1349 @@ +# Copyright 2024 Sony Group Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import copy +import multiprocessing as mp +import os +import threading as th +from collections import namedtuple +from dataclasses import dataclass +from typing import Any, Dict, List, Optional, Tuple, Union, cast + +import gym +import numpy as np + +import nnabla as nn +import nnabla.functions as NF +import nnabla.solvers as NS +import nnabla_rl.environment_explorers as EE +import nnabla_rl.model_trainers as MT +from nnabla_rl.algorithm import Algorithm, AlgorithmConfig, eval_api +from nnabla_rl.algorithms.common_utils import (_get_shape, _StatePreprocessedRewardFunction, + _StatePreprocessedStochasticPolicy, _StatePreprocessedVFunction, + _StochasticPolicyActionSelector) +from nnabla_rl.builders import ExplorerBuilder, ModelBuilder, PreprocessorBuilder, ReplayBufferBuilder, SolverBuilder +from nnabla_rl.environment_explorer import EnvironmentExplorer +from nnabla_rl.environments.amp_env import AMPEnv, AMPGoalEnv, TaskResult +from nnabla_rl.environments.environment_info import EnvironmentInfo +from nnabla_rl.functions import compute_std, unnormalize +from nnabla_rl.model_trainers.model_trainer import ModelTrainer, TrainingBatch +from nnabla_rl.models import (AMPDiscriminator, AMPGatedPolicy, AMPGatedVFunction, AMPPolicy, AMPVFunction, Model, + RewardFunction, StochasticPolicy, VFunction) +from nnabla_rl.preprocessors import Preprocessor +from nnabla_rl.random import drng +from nnabla_rl.replay_buffer import ReplayBuffer +from nnabla_rl.replay_buffers.buffer_iterator import BufferIterator +from nnabla_rl.typing import Experience +from nnabla_rl.utils import context +from nnabla_rl.utils.data import (add_batch_dimension, compute_std_ndarray, marshal_experiences, normalize_ndarray, + set_data_to_variable, unnormalize_ndarray) +from nnabla_rl.utils.misc import create_variable +from nnabla_rl.utils.multiprocess import (copy_mp_arrays_to_params, copy_params_to_mp_arrays, mp_array_from_np_array, + mp_to_np_array, new_mp_arrays_from_params, np_to_mp_array) +from nnabla_rl.utils.reproductions import set_global_seed + + +@dataclass +class AMPConfig(AlgorithmConfig): + """List of configurations for Adversarial Motion Priors (AMP) algorithm. + + Args: + gamma (float): discount factor of rewards. Defaults to 0.95. + lmb (float): scalar of lambda return's computation in GAE. Defaults to 0.95. + policy_learning_rate (float): learning rate which is set to policy solver. \ + You can customize/override the learning rate for each solver by implementing the \ + (:py:class:`SolverBuilder `) by yourself. \ + Defaults to 0.000002. + policy_momentum (float): learning momentum which is set to policy solver. \ + You can customize/override the learning rate for each solver by implementing the \ + (:py:class:`SolverBuilder `) by yourself. \ + Defaults to 0.9. + policy_weight_decay (float): coefficient for weight decay of policy function parameters. \ + In AMP, weight decay is only applied to non bias parameters. Defaults to 0.0005. + action_bound_loss_coefficient (float): coefficient of action bound loss. Defaults to 10.0 + epsilon (float): probability ratio clipping range of ppo style policy update. Defaults to 0.2 + v_function_learning_rate (float): learning rate which is set to policy solver. \ + You can customize/override the learning rate for each solver by implementing the \ + (:py:class:`SolverBuilder `) by yourself. \ + Defaults to 0.0005. + v_function_momentum (float): learning momentum which is set to value function solver. \ + You can customize/override the learning rate for each solver by implementing the \ + (:py:class:`SolverBuilder `) by yourself. \ + Defaults to 0.9. + normalized_advantage_clip (Tuple[float, float]): clipping value for estimated advantages.\ + This clipping is applied after a normalization. Defaults to (-4.0, 4.0) + value_at_task_fail (float): value for a task fail state. We overwrite the value of the state by this value \ + when computing the value targets. Defaults to 0.0. + value_at_task_success (float): value for a task success state. We overwrite the value of the state by this \ + value when computing the value targets. Defaults to 1.0. + target_value_clip (Tuple[float, float]): clipping value for estimated value targets. Defaults to (0.0, 1.0). + epochs (int): number of epochs to perform in each training iteration for policy and value function. \ + Defaults to 1. + actor_num (int): number of parallel actors. Defaults to 16. + batch_size(int): training batch size for policy and value function. Defaults to 256. + actor_timesteps (int): number of timesteps to interact with the environment by the actors. Defaults to 4096. + max_explore_steps (int): number of maximum environment exploring steps. Defaults to 200000000. + final_explore_rate (float): final rate of the environment explorer. Defaults to 0.2. + timelimit_as_terminal (bool): Treat as done if the environment reaches the \ + `timelimit `_.\ + Defaults to False. + preprocess_state (bool): enable preprocessing the states in the collected experiences\ + before feeding as training batch. Defaults to False. + state_mean_initializer (Optional[Tuple[Union[float, Tuple[float, ...]], ...]]): \ + mean initialize value for the state preprocessor. Defaults to None. + state_var_initialize value (Optional[Tuple[Union[float, Tuple[float, ...]], ...]]): \ + variance initializer for the state preprocessor. Defaults to None. + num_processor_samples (int): number of timesteps for updating the state preprocessor. Defaults to 1000000. + normalize_action (bool): enable preprocessing the actions. Defaults to False. + action_mean (Optional[Tuple[float, ...]]) mean for the action normalization. Defaults to None. + action_var (Optional[Tuple[float, ...]]): variance for the action normalization. Defaults to None. + discriminator_learning_rate (float): learning rate which is set to discriminator solver. \ + You can customize/override the learning rate for each solver by implementing the \ + (:py:class:`SolverBuilder `) by yourself. \ + Defaults to 0.00001. + discriminator_momentum (float): learning momentum which is set to discriminator solver. \ + You can customize/override the learning rate for each solver by implementing the \ + (:py:class:`SolverBuilder `) by yourself. \ + Defaults to 0.9. + discriminator_weight_decay (float): coefficient for weight decay of value function parameters. \ + In AMP, weight decay is only applied to non bias parameters. Defaults to 0.0005. + discriminator_extra_regularization_coefficient (float): coefficient value of extra regularization \ + of discriminator function parameters that are defined in \ + `discriminator_extra_regularization_variable_names`. Defaults to 0.05. + discriminator_extra_regularization_variable_names (Tuple[str]): \ + variable names for applying extra regularization. Defaults to ("logits/affine/W",). + discriminator_gradient_penelty_coefficient (float): coefficient value of gradient penalty.\ + See equation (8) in AMP paper. Defaults to 10.0. + discriminator_gradient_penalty_indexes (Optional[Tuple[int, ...]]): state index number for \ + applying gradient penalty. Defaults to (1,). + discriminator_batch_size (int): training batch size for discriminator function Defaults to 256. + discriminator_epochs (int): number of epochs to perform in each training iteration \ + for discriminator function. Defaults to 2. + discriminator_reward_scale (float): reward scale.\ + This value will multiply the output reward from the discriminator. Defaults to 2.0. + discriminator_replay_buffer_size (int): replay buffer size for discriminator training. Defaults to 100000. + use_reward_from_env (bool): enable to use task reward (i.e., reward from the environment). Defaults to False. + lerp_reward_coefficient (float): coefficient value for lerping the reward from the environment and \ + the reward from the discriminator. Defaults to 0.5 + act_deterministic_in_eval (bool): enable act deterministically at evalution. Defaults to True. + seed (int): base seed of random number generator used by the actors. Defaults to 1. + """ + + # type declarations to type check with mypy + # NOTE: declared variables are instance variable and NOT class variable, unless it is marked with ClassVar + # See https://mypy.readthedocs.io/en/stable/class_basics.html for details + gamma: float = 0.95 + lmb: float = 0.95 + + policy_learning_rate: float = 0.000002 + policy_momentum: float = 0.9 + policy_weight_decay: float = 0.0005 + action_bound_loss_coefficient: float = 10.0 + epsilon: float = 0.2 + + v_function_learning_rate: float = 0.0005 + v_function_momentum: float = 0.9 + normalized_advantage_clip: Tuple[float, float] = (-4.0, 4.0) + value_at_task_fail: float = 0.0 + value_at_task_success: float = 1.0 + target_value_clip: Tuple[float, float] = (0.0, 1.0) + + epochs: int = 1 + actor_num: int = 16 + batch_size: int = 256 + actor_timesteps: int = 4096 + + max_explore_steps: int = 200000000 + final_explore_rate: float = 0.2 + timelimit_as_terminal: bool = False + + preprocess_state: bool = False + state_mean_initializer: Optional[Tuple[Union[float, Tuple[float, ...]], ...]] = None + state_var_initializer: Optional[Tuple[Union[float, Tuple[float, ...]], ...]] = None + num_processor_samples: int = 1000000 + normalize_action: bool = False + action_mean: Optional[Tuple[float, ...]] = None + action_var: Optional[Tuple[float, ...]] = None + + discriminator_learning_rate: float = 0.00001 + discriminator_momentum: float = 0.9 + discriminator_weight_decay: float = 0.0005 + discriminator_extra_regularization_coefficient: float = 0.05 + discriminator_extra_regularization_variable_names: Tuple[str] = ("logits/affine/W",) + discriminator_gradient_penelty_coefficient: float = 10.0 + discriminator_gradient_penalty_indexes: Optional[Tuple[int, ...]] = (1,) + discriminator_batch_size: int = 256 + discriminator_epochs: int = 2 + discriminator_reward_scale: float = 2.0 + discriminator_agent_replay_buffer_size: int = 100000 + + use_reward_from_env: bool = False + lerp_reward_coefficient: float = 0.5 + + act_deterministic_in_eval: bool = True + seed: int = 1 + + def __post_init__(self): + """__post_init__ + + Check the values are in valid range. + """ + self._assert_between(self.gamma, 0.0, 1.0, "gamma") + self._assert_between(self.lmb, 0.0, 1.0, "lmb") + + self._assert_positive(self.policy_learning_rate, "policy_learning_rate") + self._assert_positive(self.policy_momentum, "policy_momentum") + self._assert_positive(self.policy_weight_decay, "policy_weight_decay") + self._assert_positive(self.action_bound_loss_coefficient, "action_bound_loss_coefficient") + self._assert_positive(self.epsilon, "epsilon") + + self._assert_positive(self.v_function_learning_rate, "v_function_learning_rate") + self._assert_positive(self.v_function_momentum, "v_function_momentum") + if self.normalized_advantage_clip[0] > self.normalized_advantage_clip[1]: + raise ValueError("min normalized_advantage_clip is larger than normalized_advantage_clip") + + if self.target_value_clip[0] > self.target_value_clip[1]: + raise ValueError("min target_value_clip is larger than max target_value_clip") + + self._assert_positive(self.epochs, "epochs") + self._assert_positive(self.actor_num, "actor num") + self._assert_positive(self.batch_size, "batch_size") + self._assert_positive(self.actor_timesteps, "actor_timesteps") + + self._assert_positive(self.max_explore_steps, "max_explore_steps") + self._assert_between(self.final_explore_rate, 0.0, 1.0, "final_explore_rate") + self._assert_positive(self.num_processor_samples, "num_processor_samples") + + self._assert_positive(self.discriminator_learning_rate, "discriminator_learning_rate") + self._assert_positive(self.discriminator_momentum, "discriminator_momentum") + self._assert_positive(self.discriminator_weight_decay, "discriminator_weight_decay") + self._assert_positive(self.discriminator_extra_regularization_coefficient, + "discriminator_extra_regularization_coefficient") + self._assert_positive(self.discriminator_gradient_penelty_coefficient, + "discriminator_gradient_penelty_coefficient") + self._assert_positive(self.discriminator_batch_size, "discriminator_batch_size") + self._assert_positive(self.discriminator_epochs, "discriminator_epochs") + self._assert_positive(self.discriminator_reward_scale, "discriminator_reward_scale") + self._assert_positive(self.discriminator_agent_replay_buffer_size, "discriminator_agent_replay_buffer_size") + self._assert_between(self.lerp_reward_coefficient, 0.0, 1.0, "lerp_reward_coefficient") + + +class DefaultPolicyBuilder(ModelBuilder[StochasticPolicy]): + def build_model(self, # type: ignore[override] + scope_name: str, + env_info: EnvironmentInfo, + algorithm_config: AMPConfig, + **kwargs) -> StochasticPolicy: + if env_info.is_goal_conditioned_env(): + return AMPGatedPolicy(scope_name, env_info.action_dim, 0.01) + else: + return AMPPolicy(scope_name, env_info.action_dim, 0.01) + + +class DefaultVFunctionBuilder(ModelBuilder[VFunction]): + def build_model(self, # type: ignore[override] + scope_name: str, + env_info: EnvironmentInfo, + algorithm_config: AMPConfig, + **kwargs) -> VFunction: + if env_info.is_goal_conditioned_env(): + return AMPGatedVFunction(scope_name) + else: + return AMPVFunction(scope_name) + + +class DefaultRewardFunctionBuilder(ModelBuilder[RewardFunction]): + def build_model(self, # type: ignore[override] + scope_name: str, + env_info: EnvironmentInfo, + algorithm_config: AMPConfig, + **kwargs) -> RewardFunction: + return AMPDiscriminator(scope_name, 1.0) + + +class DefaultVFunctionSolverBuilder(SolverBuilder): + def build_solver(self, # type: ignore[override] + env_info: EnvironmentInfo, + algorithm_config: AMPConfig, + **kwargs) -> nn.solver.Solver: + return NS.Momentum(lr=algorithm_config.v_function_learning_rate, + momentum=algorithm_config.v_function_momentum) + + +class DefaultPolicySolverBuilder(SolverBuilder): + def build_solver(self, # type: ignore[override] + env_info: EnvironmentInfo, + algorithm_config: AMPConfig, + **kwargs) -> nn.solver.Solver: + return NS.Momentum(lr=algorithm_config.policy_learning_rate, + momentum=algorithm_config.policy_momentum) + + +class DefaultRewardFunctionSolverBuilder(SolverBuilder): + def build_solver(self, # type: ignore[override] + env_info: EnvironmentInfo, + algorithm_config: AMPConfig, + **kwargs) -> nn.solver.Solver: + return NS.Momentum(lr=algorithm_config.discriminator_learning_rate, + momentum=algorithm_config.discriminator_momentum) + + +class DefaultExplorerBuilder(ExplorerBuilder): + def build_explorer(self, # type: ignore[override] + env_info: EnvironmentInfo, + algorithm_config: AMPConfig, + algorithm: "AMP", + **kwargs) -> EnvironmentExplorer: + explorer_config = \ + EE.LinearDecayEpsilonGreedyExplorerConfig(initial_step_num=0, + timelimit_as_terminal=algorithm_config.timelimit_as_terminal, + initial_epsilon=1.0, + final_epsilon=algorithm_config.final_explore_rate, + max_explore_steps=algorithm_config.max_explore_steps, + append_explorer_info=True) + explorer = EE.LinearDecayEpsilonGreedyExplorer(greedy_action_selector=kwargs["greedy_action_selector"], + random_action_selector=kwargs["random_action_selector"], + env_info=env_info, + config=explorer_config) + return explorer + + +class DefaultReplayBufferBuilder(ReplayBufferBuilder): + def build_replay_buffer(self, # type: ignore[override] + env_info: EnvironmentInfo, + algorithm_config: AMPConfig, + **kwargs) -> ReplayBuffer: + return ReplayBuffer( + capacity=int(np.ceil(algorithm_config.discriminator_agent_replay_buffer_size / algorithm_config.actor_num))) + + +class AMP(Algorithm): + """Adversarial Motion Prior (AMP) implementation. + + This class implements the Adversarial Motion Prior (AMP) algorithm + proposed by Xue Bin Peng, et al. in the paper: + "AMP: Adversarial Motion Priors for Stylized Physics-Based Character Control" + For detail see: https://arxiv.org/abs/2104.02180 + + This algorithm only supports online training. + + Args: + env_or_env_info\ + (gym.Env or :py:class:`EnvironmentInfo `): \ + the environment to train or environment info. + config (:py:class:`AMPConfig `): configuration of AMP algorithm. + v_function_builder (:py:class:`ModelBuilder[VFunction] `): \ + builder of v function models. + v_solver_builder (:py:class:`SolverBuilder `): builder for v function solvers + policy_builder (:py:class:`ModelBuilder[StochasicPolicy] `): \ + builder of policy models. + policy_solver_builder (:py:class:`SolverBuilder `): builder for policy solvers + reward_function_builder (:py:class:`ModelBuilder[RewardFunction] `): \ + builder of reward function models. + reward_solver_builder (:py:class:`SolverBuilder `): \ + builder for reward function solvers. + state_preprocessor_builder (None or :py:class:`PreprocessorBuilder `): \ + state preprocessor builder to preprocess the states. + env_explorer_builder (:py:class:`ExplorerBuilder `): \ + builder of environment explorer. + discriminator_replay_buffer_builder \ + (:py:class:`ReplayBufferBuilder `): builder of replay_buffer of \ + discriminator. + """ + # type declarations to type check with mypy + # NOTE: declared variables are instance variable and NOT class variable, unless it is marked with ClassVar + # See https://mypy.readthedocs.io/en/stable/class_basics.html for details + _config: AMPConfig + + _v_function: VFunction + _v_function_solver: nn.solver.Solver + _policy: StochasticPolicy + _policy_solver: nn.solver.Solver + _discriminator: RewardFunction + _discriminator_solver: nn.solver.Solver + _state_preprocessor: Optional[Preprocessor] + _discriminator_state_preprocessor: Optional[Preprocessor] + + _policy_trainer: ModelTrainer + _v_function_trainer: ModelTrainer + _discriminator_trainer: ModelTrainer + + _policy_solver_builder: SolverBuilder + _v_solver_builder: SolverBuilder + + _actors: List["_AMPActor"] + _actor_processes: List[Union[mp.Process, th.Thread]] + + _v_function_trainer_state: Dict[str, Any] + _policy_trainer_state: Dict[str, Any] + _discriminator_trainer_state: Dict[str, Any] + + _evaluation_actor: _StochasticPolicyActionSelector + + def __init__(self, + env_or_env_info: Union[gym.Env, EnvironmentInfo], + config: AMPConfig = AMPConfig(), + v_function_builder: ModelBuilder[VFunction] = DefaultVFunctionBuilder(), + v_solver_builder: SolverBuilder = DefaultVFunctionSolverBuilder(), + policy_builder: ModelBuilder[StochasticPolicy] = DefaultPolicyBuilder(), + policy_solver_builder: SolverBuilder = DefaultPolicySolverBuilder(), + reward_function_builder: ModelBuilder[RewardFunction] = DefaultRewardFunctionBuilder(), + reward_solver_builder: SolverBuilder = DefaultRewardFunctionSolverBuilder(), + state_preprocessor_builder: Optional[PreprocessorBuilder] = None, + env_explorer_builder: ExplorerBuilder = DefaultExplorerBuilder(), + discriminator_replay_buffer_builder: ReplayBufferBuilder = DefaultReplayBufferBuilder()): + super(AMP, self).__init__(env_or_env_info, config=config) + + # Initialize on cpu and change the context later + with nn.context_scope(context.get_nnabla_context(-1)): + policy = policy_builder("pi", self._env_info, self._config) + v_function = v_function_builder("v", self._env_info, self._config) + discriminator = reward_function_builder("discriminator", self._env_info, self._config) + + if self._config.preprocess_state: + if state_preprocessor_builder is None: + raise ValueError("State preprocessing is enabled but no preprocessor builder is given") + + self._pi_v_state_preprocessor = state_preprocessor_builder("pi_v_preprocessor", + self._env_info, + self._config) + v_function = _StatePreprocessedVFunction(v_function=v_function, + preprocessor=self._pi_v_state_preprocessor) + policy = _StatePreprocessedStochasticPolicy(policy=policy, preprocessor=self._pi_v_state_preprocessor) + + self._discriminator_state_preprocessor = state_preprocessor_builder("r_preprocessor", + self._env_info, + self._config) + discriminator = _StatePreprocessedRewardFunction(reward_function=discriminator, + preprocessor=self._discriminator_state_preprocessor) + + self._v_function = v_function + self._policy = policy + self._discriminator = discriminator + + self._v_function_solver = v_solver_builder(self._env_info, self._config) + self._v_solver_builder = v_solver_builder # keep for later use + self._policy_solver = policy_solver_builder(self._env_info, self._config) + self._policy_solver_builder = policy_solver_builder # keep for later use + self._discriminator_solver = reward_solver_builder(self._env_info, self._config) + self._discriminator_solver_builder = reward_solver_builder # keep for later use + self._env_explorer_builder = env_explorer_builder # keep for later use + + self._evaluation_actor = _StochasticPolicyActionSelector(self._env_info, + self._policy.shallowcopy(), + deterministic=self._config.act_deterministic_in_eval) + self._discriminator_agent_replay_buffers = \ + [discriminator_replay_buffer_builder(env_info=self._env_info, algorithm_config=self._config) + for _ in range(self._config.actor_num)] + self._discriminator_expert_replay_buffers = \ + [discriminator_replay_buffer_builder(env_info=self._env_info, algorithm_config=self._config) + for _ in range(self._config.actor_num)] + + if self._config.normalize_action: + action_mean = add_batch_dimension(np.array(self._config.action_mean, dtype=np.float32)) + self._action_mean = nn.Variable.from_numpy_array(action_mean) + action_var = add_batch_dimension(np.array(self._config.action_var, dtype=np.float32)) + self._action_std = compute_std(nn.Variable.from_numpy_array(action_var), + epsilon=0.0, mode_for_floating_point_error="max") + else: + self._action_mean = None + self._action_std = None + + @eval_api + def compute_eval_action(self, state, *, begin_of_episode=False, extra_info={}): + with nn.context_scope(context.get_nnabla_context(self._config.gpu_id)): + action, _ = self._evaluation_action_selector(state, begin_of_episode=begin_of_episode) + + if self._config.normalize_action: + std = compute_std_ndarray(np.array(self._config.action_var, dtype=np.float32), epsilon=0.0, + mode_for_floating_point_error="max") + action = unnormalize_ndarray(action, np.array(self._config.action_mean, dtype=np.float32), std) + + return action + + def _before_training_start(self, env_or_buffer): + if not self._is_env(env_or_buffer): + raise ValueError("AMP only supports online training") + + env = env_or_buffer + + if not (isinstance(env.unwrapped, AMPEnv) or isinstance(env.unwrapped, AMPGoalEnv)): + raise ValueError("AMP only support AMPEnv and AMPGoalEnv") + + # FIXME: This setup is a workaround for creating underlying model parameters + # If the parameter is not created, the multiprocessable array (created in launch_actor_processes) + # will be empty and the agent does not learn anything + context.set_nnabla_context(-1) + self._setup_policy_training(env) + self._setup_v_function_training(env) + self._setup_reward_function_training(env) + + self._actors, self._actor_processes = self._launch_actor_processes(env) + + context.set_nnabla_context(self._config.gpu_id) + + # Setup again here to use gpu (if it is set) + old_policy_solver = self._policy_solver + self._policy_solver = self._policy_solver_builder(self._env_info, self._config) + self._policy_trainer = self._setup_policy_training(env) + self._policy_solver.set_states(old_policy_solver.get_states()) + + old_v_function_solver = self._v_function_solver + self._v_function_solver = self._v_solver_builder(self._env_info, self._config) + self._v_function_trainer = self._setup_v_function_training(env) + self._v_function_solver.set_states(old_v_function_solver.get_states()) + + old_discriminator_solver = self._discriminator_solver + self._discriminator_solver = self._discriminator_solver_builder(self._env_info, self._config) + self._discriminator_trainer = self._setup_reward_function_training(env) + self._discriminator_solver.set_states(old_discriminator_solver.get_states()) + + def _setup_policy_training(self, env_or_buffer): + policy_trainer_config = MT.policy_trainers.AMPPolicyTrainerConfig( + epsilon=self._config.epsilon, + normalize_action=self._config.normalize_action, + action_bound_loss_coefficient=self._config.action_bound_loss_coefficient, + action_mean=self._config.action_mean, + action_var=self._config.action_var, + regularization_coefficient=self._config.policy_weight_decay) + policy_trainer = MT.policy_trainers.AMPPolicyTrainer( + models=self._policy, + solvers={self._policy.scope_name: self._policy_solver}, + env_info=self._env_info, + config=policy_trainer_config) + return policy_trainer + + def _setup_v_function_training(self, env_or_buffer): + # training input/loss variables + v_function_trainer_config = MT.v_value_trainers.MonteCarloVTrainerConfig(reduction_method="mean", + v_loss_scalar=0.5) + v_function_trainer = MT.v_value_trainers.MonteCarloVTrainer( + train_functions=self._v_function, + solvers={self._v_function.scope_name: self._v_function_solver}, + env_info=self._env_info, + config=v_function_trainer_config) + return v_function_trainer + + def _setup_reward_function_training(self, env_or_buffer): + reward_function_trainer_config = MT.reward_trainiers.AMPRewardFunctionTrainerConfig( + batch_size=self._config.discriminator_batch_size, + regularization_coefficient=self._config.discriminator_weight_decay, + extra_regularization_coefficient=self._config.discriminator_extra_regularization_coefficient, + extra_regularization_variable_names=self._config.discriminator_extra_regularization_variable_names, + gradient_penelty_coefficient=self._config.discriminator_gradient_penelty_coefficient, + gradient_penalty_indexes=self._config.discriminator_gradient_penalty_indexes) + model = self._discriminator._reward_function if isinstance( + self._discriminator, _StatePreprocessedRewardFunction) else self._discriminator + preprocessor = self._discriminator_state_preprocessor if self._config.preprocess_state else None + reward_function_trainer = MT.reward_trainiers.AMPRewardFunctionTrainer( + models=model, + solvers={self._discriminator.scope_name: self._discriminator_solver}, + env_info=self._env_info, + state_preprocessor=preprocessor, + config=reward_function_trainer_config) + return reward_function_trainer + + def _after_training_finish(self, env_or_buffer): + for actor in self._actors: + actor.dispose() + for process in self._actor_processes: + self._kill_actor_processes(process) + + def _launch_actor_processes(self, env): + actors = self._build_amp_actors(env=env, + policy=self._policy, + v_function=self._v_function, + state_preprocessor=(self._pi_v_state_preprocessor if + self._config.preprocess_state else None), + reward_function=self._discriminator, + reward_state_preprocessor=(self._discriminator_state_preprocessor if + self._config.preprocess_state else None), + env_explorer=self._env_explorer_builder( + self._env_info, + self._config, + self, + greedy_action_selector=self._compute_greedy_action, + random_action_selector=self._compute_explore_action)) + processes = [] + for actor in actors: + if self._config.actor_num == 1: + # Run on same process when we have only 1 actor + p = th.Thread(target=actor, daemon=False) + else: + p = mp.Process(target=actor, daemon=True) + p.start() + processes.append(p) + return actors, processes + + def _build_amp_actors(self, env, policy, v_function, state_preprocessor, reward_function, + reward_state_preprocessor, env_explorer): + actors = [] + for i in range(self._config.actor_num): + actor = _AMPActor(actor_num=i, + env=env, + env_info=self._env_info, + policy=policy, + v_function=v_function, + state_preprocessor=state_preprocessor, + reward_function=reward_function, + reward_state_preprocessor=reward_state_preprocessor, + config=self._config, + env_explorer=env_explorer) + actors.append(actor) + return actors + + def _run_online_training_iteration(self, env): + update_interval = self._config.actor_timesteps * self._config.actor_num + if self.iteration_num % update_interval != 0: + return + + experiences_per_agent = self._collect_experiences(self._actors) + assert len(experiences_per_agent) == self._config.actor_num + + self._add_experience_to_reward_buffers(experiences_per_agent) + + # s and s_expert shape is tuple_size * (batch_size, dim) + s, s_expert = _concatenate_state(experiences_per_agent) + + if update_interval < self.iteration_num: + # NOTE: The first update (when update_interval == self.iteration_num) will be skipped + policy_buffers, v_function_buffers = self._create_policy_and_v_function_buffers(experiences_per_agent) + self._amp_training(self._discriminator_agent_replay_buffers, self._discriminator_expert_replay_buffers, + policy_buffers, v_function_buffers) + + if self._config.preprocess_state and self.iteration_num < self._config.num_processor_samples: + self._pi_v_state_preprocessor.update(s) + self._discriminator_state_preprocessor.update(s) + self._discriminator_state_preprocessor.update(s_expert) + + def _collect_experiences(self, actors: List["_AMPActor"]): + def split_result(tuple_val): + return [_tuple_val for _tuple_val in zip(*tuple_val)] + + for actor in self._actors: + if self._config.actor_num != 1: + actor.update_policy_params(self._policy.get_parameters()) + actor.update_reward_function_params(self._discriminator.get_parameters()) + actor.update_v_function_params(self._v_function.get_parameters()) + if self._config.preprocess_state: + casted_pi_v_state_preprocessor = cast(Model, self._pi_v_state_preprocessor) + actor.update_state_preprocessor_params(casted_pi_v_state_preprocessor.get_parameters()) + casted_discriminator_state_preprocessor = cast(Model, self._discriminator_state_preprocessor) + actor.update_reward_state_preprocessor_params( + casted_discriminator_state_preprocessor.get_parameters()) + else: + # Its running on same process. No need to synchronize parameters with multiprocessing arrays. + pass + actor.run_data_collection() + + experiences_per_agent = [] + for actor in actors: + result = actor.wait_data_collection() + # Copy result to main processor + result = copy.deepcopy(result) + + splitted_result = [] + for r in result: + if isinstance(r, tuple): + splitted_result.append(split_result(r)) + else: + splitted_result.append(r) + + assert len(splitted_result[-1]) == self._config.actor_timesteps + + experience = [ + (s, a, r, non_terminal, n_s, log_prob, non_greedy, e_s, e_a, e_s_next, v_target, advantage) + for (s, a, r, non_terminal, n_s, log_prob, non_greedy, e_s, e_a, e_s_next, v_target, advantage) + in zip(*splitted_result)] + assert len(experience) == self._config.actor_timesteps + experiences_per_agent.append(experience) + + assert len(experiences_per_agent) == self._config.actor_num + return experiences_per_agent + + def _add_experience_to_reward_buffers(self, experience_per_agent): + assert len(self._discriminator_agent_replay_buffers) == len(experience_per_agent) + assert len(self._discriminator_expert_replay_buffers) == len(experience_per_agent) + for agent_buffer, expert_buffer, experience in zip(self._discriminator_agent_replay_buffers, + self._discriminator_expert_replay_buffers, + experience_per_agent): + agent_buffer.append_all(experience) + expert_buffer.append_all(experience) + + def _create_policy_and_v_function_buffers(self, experiences_per_agent): + policy_buffers = [] + v_function_buffers = [] + + for experience in experiences_per_agent: + policy_buffer = ReplayBuffer() + v_function_buffer = ReplayBuffer() + + for s, a, r, non_terminal, n_s, log_prob, non_greedy, _, _, _, v, ad in experience: + v_function_buffer.append((s, a, r, non_terminal, n_s, log_prob, v, ad, non_greedy)) + if non_greedy: # NOTE: Only use sampled action for policy learning + policy_buffer.append((s, a, r, non_terminal, n_s, log_prob, v, ad, non_greedy)) + + policy_buffers.append(policy_buffer) + v_function_buffers.append(v_function_buffer) + + return policy_buffers, v_function_buffers + + def _kill_actor_processes(self, process): + if isinstance(process, mp.Process): + process.terminate() + else: + # This is a thread. do nothing + pass + process.join() + + def _run_offline_training_iteration(self, buffer): + raise NotImplementedError + + def _amp_training(self, discriminator_agent_replay_buffers, discriminator_expert_replay_buffers, + policy_replay_buffers, v_function_replay_buffers): + self._reward_function_training(discriminator_agent_replay_buffers, discriminator_expert_replay_buffers) + + total_updates = (self._config.actor_num * self._config.actor_timesteps) // self._config.batch_size + self._v_function_training(total_updates, v_function_replay_buffers) + self._policy_training(total_updates, policy_replay_buffers) + + def _reward_function_training(self, agent_buffers: List[ReplayBuffer], expert_buffers: List[ReplayBuffer]): + num_updates = (self._config.actor_num * self._config.actor_timesteps) // self._config.discriminator_batch_size + for _ in range(self._config.discriminator_epochs): + for _ in range(num_updates): + agent_experiences = _sample_experiences_from_buffers( + agent_buffers, self._config.discriminator_batch_size) + (s_agent, a_agent, _, _, s_next_agent, *_) = marshal_experiences(agent_experiences) + + expert_experiences = _sample_experiences_from_buffers( + expert_buffers, self._config.discriminator_batch_size) + (_, _, _, _, _, _, _, s_expert, a_expert, s_next_expert, _, _) = marshal_experiences( + expert_experiences) + + extra = {} + extra["s_current_agent"] = s_agent + extra["a_current_agent"] = a_agent + extra["s_next_agent"] = s_next_agent + extra["s_current_expert"] = s_expert + extra["a_current_expert"] = a_expert + extra["s_next_expert"] = s_next_expert + + batch = TrainingBatch(batch_size=self._config.discriminator_batch_size, extra=extra) + self._discriminator_trainer_state = self._discriminator_trainer.train(batch) + + def _v_function_training(self, total_updates, v_function_replay_buffers): + v_function_buffer_iterator = _EquallySampleBufferIterator( + total_updates, v_function_replay_buffers, self._config.batch_size) + for _ in range(self._config.epochs): + for experiences in v_function_buffer_iterator: + (s, a, _, _, _, _, v_target, _, _) = marshal_experiences(experiences) + extra = {} + extra["v_target"] = v_target + batch = TrainingBatch(batch_size=len(experiences), s_current=s, a_current=a, extra=extra) + self._v_function_trainer_state = self._v_function_trainer.train(batch) + + def _policy_training(self, total_updates, policy_replay_buffers): + policy_buffer_iterator = _EquallySampleBufferIterator( + total_updates, policy_replay_buffers, self._config.batch_size) + for _ in range(self._config.epochs): + for experiences in policy_buffer_iterator: + (s, a, _, _, _, log_prob, _, advantage, _) = marshal_experiences(experiences) + extra = {} + extra["log_prob"] = log_prob + extra["advantage"] = advantage + batch = TrainingBatch(batch_size=len(experiences), s_current=s, a_current=a, extra=extra) + self._policy_trainer_state = self._policy_trainer.train(batch) + + def _evaluation_action_selector(self, s, *, begin_of_episode=False): + return self._evaluation_actor(s, begin_of_episode=begin_of_episode) + + def _models(self): + models = {} + models[self._policy.scope_name] = self._policy + models[self._v_function.scope_name] = self._v_function + models[self._discriminator.scope_name] = self._discriminator + if self._config.preprocess_state and isinstance(self._discriminator_state_preprocessor, Model): + models[self._discriminator_state_preprocessor.scope_name] = self._discriminator_state_preprocessor + if self._config.preprocess_state and isinstance(self._pi_v_state_preprocessor, Model): + models[self._pi_v_state_preprocessor.scope_name] = self._pi_v_state_preprocessor + return models + + def _solvers(self): + solvers = {} + solvers[self._v_function.scope_name] = self._v_function_solver + solvers[self._policy.scope_name] = self._policy_solver + solvers[self._discriminator.scope_name] = self._discriminator_solver + return solvers + + @classmethod + def is_supported_env(cls, env_or_env_info): + env_info = EnvironmentInfo.from_env(env_or_env_info) if isinstance( + env_or_env_info, gym.Env) else env_or_env_info + return not env_info.is_discrete_action_env() and not env_info.is_tuple_action_env() + + @eval_api + def _compute_greedy_action(self, s, *, begin_of_episode=False): + s = add_batch_dimension(s) + if not hasattr(self, "_greedy_state_var"): + self._greedy_state_var = create_variable(1, self._env_info.state_shape) + distribution = self._policy.pi(self._greedy_state_var) + self._greedy_action = distribution.choose_probable() + self._greedy_action_log_prob = distribution.log_prob(self._greedy_action) + if self._config.normalize_action: + # NOTE: an action from policy is normalized. + self._greedy_action = unnormalize(self._greedy_action, self._action_mean, self._action_std) + + set_data_to_variable(self._greedy_state_var, s) + nn.forward_all([self._greedy_action, self._greedy_action_log_prob]) + action = np.squeeze(self._greedy_action.d, axis=0) + log_prob = np.squeeze(self._greedy_action_log_prob.d, axis=0) + info = {} + info["log_prob"] = log_prob + return action, info + + @eval_api + def _compute_explore_action(self, s, *, begin_of_episode=False): + s = add_batch_dimension(s) + if not hasattr(self, "_explore_state_var"): + self._explore_state_var = create_variable(1, self._env_info.state_shape) + distribution = self._policy.pi(self._explore_state_var) + self._explore_action, self._explore_action_log_prob = distribution.sample_and_compute_log_prob() + if self._config.normalize_action: + # NOTE: an action from policy is normalized. + self._explore_action = unnormalize(self._explore_action, self._action_mean, self._action_std) + + set_data_to_variable(self._explore_state_var, s) + nn.forward_all([self._explore_action, self._explore_action_log_prob]) + action = np.squeeze(self._explore_action.d, axis=0) + log_prob = np.squeeze(self._explore_action_log_prob.d, axis=0) + info = {} + info["log_prob"] = log_prob + return action, info + + @property + def latest_iteration_state(self): + latest_iteration_state = super(AMP, self).latest_iteration_state + + if hasattr(self, "_discriminator_trainer_state"): + discriminator_trainer_state = {} + for k, v in self._discriminator_trainer_state.items(): + discriminator_trainer_state[k] = float(v) + latest_iteration_state["scalar"].update(discriminator_trainer_state) + + if hasattr(self, "_v_function_trainer_state"): + latest_iteration_state["scalar"].update({"v_loss": float(self._v_function_trainer_state["v_loss"])}) + + if hasattr(self, "_policy_trainer_state"): + policy_trainer_state = {} + for k, v in self._policy_trainer_state.items(): + policy_trainer_state[k] = float(v) + latest_iteration_state["scalar"].update(policy_trainer_state) + + return latest_iteration_state + + @property + def trainers(self): + return {"discriminator": self._discriminator_trainer, + "v_function": self._v_function_trainer, + "policy": self._policy_trainer} + + +def _sample_experiences_from_buffers(buffers: List[ReplayBuffer], batch_size: int) -> List[Experience]: + experiences: List[Experience] = [] + for buffer in buffers: + experience, _ = buffer.sample(num_samples=int(np.ceil(batch_size / len(buffers)))) + experience = cast(List[Experience], experience) + experiences.extend(experience) + + assert len(experiences) >= batch_size + return experiences[:batch_size] + + +def _concatenate_state(experiences_per_agent) -> Tuple[np.ndarray, np.ndarray]: + all_experience = [] + for e in experiences_per_agent: + all_experience.extend(e) + s, _, _, _, _, _, _, e_s, _, _, _, _ = marshal_experiences(all_experience) + return s, e_s + + +class _AMPActor: + + def __init__(self, + actor_num: int, + env: gym.Env, + env_info: EnvironmentInfo, + policy: StochasticPolicy, + v_function: VFunction, + state_preprocessor: Optional[Preprocessor], + reward_function: RewardFunction, + reward_state_preprocessor: Optional[Preprocessor], + env_explorer: EnvironmentExplorer, + config: AMPConfig): + # These variables will be copied when process is created + self._actor_num = actor_num + self._env = env + self._env_info = env_info + self._policy = policy + self._v_function = v_function + self._reward_function = reward_function + self._reward_state_preprocessor = reward_state_preprocessor + self._state_preprocessor = state_preprocessor + self._timesteps = config.actor_timesteps + self._gamma = config.gamma + self._lambda = config.lmb + self._config = config + self._env_explorer = env_explorer + + # IPC communication variables + self._disposed = mp.Value("i", False) + self._task_start_event = mp.Event() + self._task_finish_event = mp.Event() + + self._policy_mp_arrays = new_mp_arrays_from_params(policy.get_parameters()) + self._v_function_mp_arrays = new_mp_arrays_from_params(v_function.get_parameters()) + self._reward_function_mp_arrays = new_mp_arrays_from_params(reward_function.get_parameters()) + if self._config.preprocess_state: + assert state_preprocessor is not None + casted_state_preprocessor = cast(Model, state_preprocessor) + self._state_preprocessor_mp_arrays = new_mp_arrays_from_params(casted_state_preprocessor.get_parameters()) + + assert reward_state_preprocessor is not None + casted_reward_state_preprocessor = cast(Model, reward_state_preprocessor) + self._reward_state_preprocessor_mp_arrays = new_mp_arrays_from_params( + casted_reward_state_preprocessor.get_parameters() + ) + + MultiProcessingArrays = namedtuple("MultiProcessingArrays", + ["state", + "action", + "reward", + "non_terminal", + "next_state", + "log_prob", + "non_greedy_action", + "expert_state", + "expert_action", + "expert_next_state", + "v_target", + "advantage"]) + + state_mp_array = self._prepare_state_mp_array(env_info.observation_space, env_info) + action_mp_array = self._prepare_action_mp_array(env_info.action_space, env_info) + + scalar_mp_array_shape = (self._timesteps, 1) + reward_mp_array = (mp_array_from_np_array(np.empty(shape=scalar_mp_array_shape, dtype=np.float32)), + scalar_mp_array_shape, + np.float32) + non_terminal_mp_array = (mp_array_from_np_array(np.empty(shape=scalar_mp_array_shape, dtype=np.float32)), + scalar_mp_array_shape, + np.float32) + next_state_mp_array = self._prepare_state_mp_array(env_info.observation_space, env_info) + log_prob_mp_array = (mp_array_from_np_array(np.empty(shape=scalar_mp_array_shape, dtype=np.float32)), + scalar_mp_array_shape, + np.float32) + non_greedy_action_mp_array = (mp_array_from_np_array(np.empty(shape=scalar_mp_array_shape, dtype=np.float32)), + scalar_mp_array_shape, + np.float32) + v_target_mp_array = (mp_array_from_np_array(np.empty(shape=scalar_mp_array_shape, dtype=np.float32)), + scalar_mp_array_shape, + np.float32) + advantage_mp_array = (mp_array_from_np_array(np.empty(shape=scalar_mp_array_shape, dtype=np.float32)), + scalar_mp_array_shape, + np.float32) + + expert_state_mp_array = self._prepare_state_mp_array(env_info.observation_space, env_info) + expert_action_mp_array = self._prepare_action_mp_array(env_info.action_space, env_info) + expert_next_state_mp_array = self._prepare_state_mp_array(env_info.observation_space, env_info) + + self._mp_arrays = MultiProcessingArrays(state_mp_array, + action_mp_array, + reward_mp_array, + non_terminal_mp_array, + next_state_mp_array, + log_prob_mp_array, + non_greedy_action_mp_array, + expert_state_mp_array, + expert_action_mp_array, + expert_next_state_mp_array, + v_target_mp_array, + advantage_mp_array) + + self._reward_min = np.inf + self._reward_max = -np.inf + + def __call__(self): + self._run_actor_loop() + + def dispose(self): + self._disposed.value = True + self._task_start_event.set() + + def run_data_collection(self): + self._task_finish_event.clear() + self._task_start_event.set() + + def wait_data_collection(self): + def _mp_to_np_array(mp_array): + if isinstance(mp_array[0], tuple): + # tupled state + return tuple(mp_to_np_array(*array) for array in mp_array) + else: + return mp_to_np_array(*mp_array) + + self._task_finish_event.wait() + return tuple(_mp_to_np_array(mp_array) for mp_array in self._mp_arrays) + + def update_policy_params(self, params): + self._update_params(src=params, dest=self._policy_mp_arrays) + + def update_v_function_params(self, params): + self._update_params(src=params, dest=self._v_function_mp_arrays) + + def update_reward_function_params(self, params): + self._update_params(src=params, dest=self._reward_function_mp_arrays) + + def update_state_preprocessor_params(self, params): + self._update_params(src=params, dest=self._state_preprocessor_mp_arrays) + + def update_reward_state_preprocessor_params(self, params): + self._update_params(src=params, dest=self._reward_state_preprocessor_mp_arrays) + + def _update_params(self, src, dest): + copy_params_to_mp_arrays(src, dest) + + def _run_actor_loop(self): + context.set_nnabla_context(self._config.gpu_id) + if self._config.seed >= 0: + seed = self._actor_num + self._config.seed + else: + seed = os.getpid() + + self._env.seed(seed) + set_global_seed(seed) + while True: + self._task_start_event.wait() + if self._disposed.get_obj(): + break + if self._config.actor_num != 1: + # Running on different process + # Sync parameters through multiproccess arrays + self._synchronize_policy_params(self._policy.get_parameters()) + self._synchronize_v_function_params(self._v_function.get_parameters()) + self._synchronize_reward_function_params(self._reward_function.get_parameters()) + + if self._config.preprocess_state: + self._synchronize_preprocessor_params(self._state_preprocessor.get_parameters()) + self._synchronize_reward_preprocessor_params(self._reward_state_preprocessor.get_parameters()) + + experiences = self._run_data_collection() + self._fill_result(experiences) + + self._task_start_event.clear() + self._task_finish_event.set() + + def _fill_result(self, experiences): + indexes = np.arange(len(experiences)) + drng.shuffle(indexes) + experiences = [experiences[i] for i in indexes[: self._config.actor_timesteps]] + (s, a, r, non_terminal, s_next, log_prob, non_greedy_action, e_s, e_a, + e_s_next, v_target, advantage) = marshal_experiences(experiences) + + _copy_np_array_to_mp_array(s, self._mp_arrays.state) + _copy_np_array_to_mp_array(a, self._mp_arrays.action) + _copy_np_array_to_mp_array(r, self._mp_arrays.reward) + _copy_np_array_to_mp_array(non_terminal, self._mp_arrays.non_terminal) + _copy_np_array_to_mp_array(s_next, self._mp_arrays.next_state) + _copy_np_array_to_mp_array(log_prob, self._mp_arrays.log_prob) + _copy_np_array_to_mp_array(non_greedy_action, self._mp_arrays.non_greedy_action) + _copy_np_array_to_mp_array(e_s, self._mp_arrays.expert_state) + _copy_np_array_to_mp_array(e_a, self._mp_arrays.expert_action) + _copy_np_array_to_mp_array(e_s_next, self._mp_arrays.expert_next_state) + _copy_np_array_to_mp_array(v_target, self._mp_arrays.v_target) + _copy_np_array_to_mp_array(advantage, self._mp_arrays.advantage) + + def _run_data_collection(self): + experiences = self._env_explorer.step(self._env, n=self._timesteps) + rewards = self._compute_rewards(experiences) + self._reward_min = min(np.min(rewards), self._reward_min) + self._reward_max = max(np.max(rewards), self._reward_max) + v_targets, advantages = _compute_v_target_and_advantage_with_clipping_and_overwriting( + v_function=self._v_function, + experiences=experiences, + rewards=rewards, + gamma=self._config.gamma, + lmb=self._config.lmb, + value_clip=(self._reward_min / (1.0 - self._config.gamma), self._reward_max / (1.0 - self._config.gamma)), + value_at_task_fail=self._config.value_at_task_fail, + value_at_task_success=self._config.value_at_task_success) + assert self._config.target_value_clip[0] < self._config.target_value_clip[1] + v_targets = np.clip(v_targets, a_min=self._config.target_value_clip[0], a_max=self._config.target_value_clip[1]) + + advantage_std = compute_std_ndarray(np.var(advantages), epsilon=1e-5, mode_for_floating_point_error="add") + advantages = normalize_ndarray(advantages, mean=np.mean( + advantages), std=advantage_std, value_clip=self._config.normalized_advantage_clip) + + assert len(experiences) == len(v_targets) + assert len(experiences) == len(advantages) + organized_experiences = [] + for (s, a, r, non_terminal, s_next, info), v_target, advantage in zip(experiences, v_targets, advantages): + expert_s, expert_a, _, _, expert_n_s, _ = info["expert_experience"] + + assert "greedy_action" in info + organized_experiences.append((s, + a, + r, + non_terminal, + s_next, + info["log_prob"], + 0.0 if info["greedy_action"] else 1.0, + expert_s, + expert_a, + expert_n_s, + v_target, + advantage)) + + return organized_experiences + + def _compute_rewards(self, experiences: List[Experience]) -> List[float]: + if not hasattr(self, "_reward_var"): + self._s_var_label = create_variable(1, self._env_info.state_shape) + self._s_next_var_label = create_variable(1, self._env_info.state_shape) + self._a_var_label = create_variable(1, self._env_info.action_shape) + logits = self._reward_function.r(self._s_var_label, self._a_var_label, self._s_next_var_label) + # equation (7) in the paper + self._reward_var = 1.0 - 0.25 * ((logits - 1.0) ** 2) + self._reward_var = NF.maximum_scalar(self._reward_var, val=0.0) * self._config.discriminator_reward_scale + + rewards: List[float] = [] + for experience in experiences: + s, a, env_r, _, n_s, *_ = experience + set_data_to_variable(self._s_var_label, s) + set_data_to_variable(self._a_var_label, a) + set_data_to_variable(self._s_next_var_label, n_s) + self._reward_var.forward() + + if self._config.use_reward_from_env: + reward = (1.0 - self._config.lerp_reward_coefficient) * \ + float(self._reward_var.d) + self._config.lerp_reward_coefficient * float(env_r) + else: + reward = float(self._reward_var.d) + rewards.append(reward) + + return rewards + + def _synchronize_v_function_params(self, params): + self._synchronize_params(src=self._v_function_mp_arrays, dest=params) + + def _synchronize_policy_params(self, params): + self._synchronize_params(src=self._policy_mp_arrays, dest=params) + + def _synchronize_reward_function_params(self, params): + self._synchronize_params(src=self._reward_function_mp_arrays, dest=params) + + def _synchronize_preprocessor_params(self, params): + self._synchronize_params(src=self._state_preprocessor_mp_arrays, dest=params) + + def _synchronize_reward_preprocessor_params(self, params): + self._synchronize_params(src=self._reward_state_preprocessor_mp_arrays, dest=params) + + def _synchronize_params(self, src, dest): + copy_mp_arrays_to_params(src, dest) + + def _prepare_state_mp_array(self, obs_space, env_info): + if env_info.is_tuple_state_env(): + state_mp_arrays = [] + state_mp_array_shapes = [] + state_mp_array_dtypes = [] + for space in obs_space: + state_mp_array_shape = (self._timesteps, *space.shape) + state_mp_array = mp_array_from_np_array( + np.empty(shape=state_mp_array_shape, dtype=space.dtype)) + state_mp_array_shapes.append(state_mp_array_shape) + state_mp_array_dtypes.append(space.dtype) + state_mp_arrays.append(state_mp_array) + return tuple(x for x in zip(state_mp_arrays, state_mp_array_shapes, state_mp_array_dtypes)) + else: + state_mp_array_shape = (self._timesteps, *obs_space.shape) + state_mp_array = mp_array_from_np_array( + np.empty(shape=state_mp_array_shape, dtype=obs_space.dtype)) + return (state_mp_array, state_mp_array_shape, obs_space.dtype) + + def _prepare_action_mp_array(self, action_space, env_info): + action_mp_array_shape = (self._timesteps, action_space.shape[0]) + action_mp_array = mp_array_from_np_array( + np.empty(shape=action_mp_array_shape, dtype=action_space.dtype)) + return (action_mp_array, action_mp_array_shape, action_space.dtype) + + +def _copy_np_array_to_mp_array( + np_array: Union[np.ndarray, Tuple[np.ndarray]], + mp_array_shape_type: Union[Tuple[np.ndarray, Tuple[int, ...], np.dtype], + Tuple[Tuple[np.ndarray, Tuple[int, ...], np.dtype]]], +): + """Copy numpy array to multiprocessing array. + + Args: + np_array(Union[np.ndarray, Tuple[np.ndarray]]): copy source of numpy array. + mp_array_shape_type + (Union[Tuple[np.ndarray, Tuple[int, ...], np.dtype], Tuple[Tuple[np.ndarray, Tuple[int, ...], np.dtype]]]): + copy target of multiprocessing array, shape and type. + """ + if isinstance(np_array, tuple) and isinstance(mp_array_shape_type[0], tuple): + assert len(np_array) == len(mp_array_shape_type) + for np_ary, mp_ary_shape_type in zip(np_array, mp_array_shape_type): + np_to_mp_array(np_ary, mp_ary_shape_type[0], mp_ary_shape_type[2]) + elif isinstance(np_array, np.ndarray) and isinstance(mp_array_shape_type[0], np.ndarray): + np_to_mp_array(np_array, mp_array_shape_type[0], mp_array_shape_type[2]) + else: + raise ValueError("Invalid pair of np_array and mp_array!") + + +def _compute_v_target_and_advantage_with_clipping_and_overwriting(v_function: VFunction, + experiences: List[Experience], + rewards: List[float], + gamma: float, + lmb: float, + value_at_task_fail: float, + value_at_task_success: float, + value_clip: Optional[Tuple[float, float]] = None + ) -> Tuple[np.ndarray, np.ndarray]: + assert isinstance(v_function, VFunction), "Invalid v_function" + if value_clip is not None: + assert value_clip[0] < value_clip[1] + assert value_at_task_success > value_at_task_fail + assert len(rewards) == len(experiences) + + T = len(experiences) + v_targets: np.ndarray = np.empty(shape=(T, 1), dtype=np.float32) + advantages: np.ndarray = np.empty(shape=(T, 1), dtype=np.float32) + advantage: np.float32 = np.float32(0.0) + + v_current = None + v_next = None + s_var = create_variable(1, _get_shape(experiences[0][0])) + v = v_function.v(s_var) # build graph + v_forwards = [] + + for t in reversed(range(T)): + # Not use reward from the environment + s_current, _, _, non_terminal, s_next, info, *_ = experiences[t] + r = rewards[t] + + if not non_terminal: + v_next = None + advantage = np.float32(0.0) + + # predict current v + set_data_to_variable(s_var, s_current) + v.forward() + v_current = np.squeeze(v.d) + v_forwards.append(v_current) + + if value_clip is not None: + v_current = np.clip(v_current, a_min=value_clip[0], a_max=value_clip[1]) + + if v_next is None: + set_data_to_variable(s_var, s_next) + v.forward() + v_next = np.squeeze(v.d) + + if value_clip is not None: + v_next = np.clip(v_next, a_min=value_clip[0], a_max=value_clip[1]) + + if info["task_result"] == TaskResult.SUCCESS: + assert not non_terminal + v_next = value_at_task_success + elif info["task_result"] == TaskResult.FAIL: + assert not non_terminal + v_next = value_at_task_fail + elif info["task_result"] == TaskResult.UNKNOWN: + pass + else: + raise ValueError + + delta = r + gamma * v_next - v_current + advantage = np.float32(delta + gamma * lmb * advantage) + # A = Q - V, V = E[Q] -> v_target = A + V + v_target = advantage + v_current + + v_targets[t] = v_target + advantages[t] = advantage + + v_next = v_current + + return np.array(v_targets, dtype=np.float32), np.array(advantages, dtype=np.float32) + + +class _EndlessBufferIterator(BufferIterator): + """This buffer iterates endlessly.""" + + def __init__(self, buffer, batch_size, shuffle=True): + super().__init__(buffer, batch_size, shuffle, repeat=True) + + def next(self): + indices = self._indices[self._index:self._index + self._batch_size] + if (len(indices) < self._batch_size): + rest = self._batch_size - len(indices) + self.reset() + indices = np.append(indices, self._indices[self._index:self._index + rest]) + self._index += rest + else: + self._index += self._batch_size + return self._sample(indices) + + __next__ = next + + +class _EquallySampleBufferIterator(): + def __init__(self, total_num_iterations: int, replay_buffers: List[ReplayBuffer], batch_size: int): + buffer_batch_size = int(np.ceil(batch_size / len(replay_buffers))) + self._internal_iterators = [_EndlessBufferIterator(buffer=buffer, + shuffle=False, + batch_size=buffer_batch_size) + for buffer in replay_buffers] + self._total_num_iterations = total_num_iterations + self._replay_buffers = replay_buffers + self._batch_size = batch_size + self.reset() + + def __iter__(self): + return self + + def next(self): + self._num_iterations += 1 + + if self._num_iterations > self._total_num_iterations: + raise StopIteration + + return self._sample() + + __next__ = next + + def reset(self): + self._num_iterations = 0 + for iterator in self._internal_iterators: + iterator.reset() + + def _sample(self): + experiences = [] + for iterator in self._internal_iterators: + experience, *_ = iterator.next() + experiences.extend(experience) + + if len(experiences) > self._batch_size: + drng.shuffle(experiences) + experiences = experiences[:self._batch_size] + + return experiences diff --git a/nnabla_rl/environment_explorers/epsilon_greedy_explorer.py b/nnabla_rl/environment_explorers/epsilon_greedy_explorer.py index ae67500c..43b16a29 100644 --- a/nnabla_rl/environment_explorers/epsilon_greedy_explorer.py +++ b/nnabla_rl/environment_explorers/epsilon_greedy_explorer.py @@ -1,5 +1,5 @@ # Copyright 2020,2021 Sony Corporation. -# Copyright 2021,2022,2023 Sony Group Corporation. +# Copyright 2021,2022,2023,2024 Sony Group Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -80,11 +80,14 @@ class LinearDecayEpsilonGreedyExplorerConfig(EnvironmentExplorerConfig): This value must be smaller than initial_epsilon. Defaults to 0.05. max_explore_steps (int): Number of steps to decay epsilon from initial_epsilon to final_epsilon. Defaults to 1000000. + append_explorer_info (bool): Flag for appending explorer info to the action info. \ + The explore info includes whether the action is greedy or not, and explore rate. Defaults to False. """ initial_epsilon: float = 1.0 final_epsilon: float = 0.05 max_explore_steps: float = 1000000 + append_explorer_info: bool = False def __post_init__(self): self._assert_between(self.initial_epsilon, 0.0, 1.0, 'initial_epsilon') @@ -125,11 +128,13 @@ def __init__(self, def action(self, step: int, state: np.ndarray, *, begin_of_episode: bool = False) -> Tuple[np.ndarray, Dict]: epsilon = self._compute_epsilon(step) - (action, info), _ = epsilon_greedy_action_selection(state, - self._greedy_action_selector, - self._random_action_selector, - epsilon, - begin_of_episode=begin_of_episode) + (action, info), is_greedy_action = epsilon_greedy_action_selection(state, + self._greedy_action_selector, + self._random_action_selector, + epsilon, + begin_of_episode=begin_of_episode) + if self._config.append_explorer_info: + info.update({"greedy_action": is_greedy_action, "explore_rate": epsilon}) return action, info def _compute_epsilon(self, step): diff --git a/nnabla_rl/environments/__init__.py b/nnabla_rl/environments/__init__.py index 6224ed50..3ac5092f 100644 --- a/nnabla_rl/environments/__init__.py +++ b/nnabla_rl/environments/__init__.py @@ -22,7 +22,7 @@ DummyTupleContinuous, DummyTupleDiscrete, DummyTupleMixed, DummyTupleStateContinuous, DummyTupleStateDiscrete, DummyTupleActionContinuous, DummyTupleActionDiscrete, - DummyHybridEnv, + DummyHybridEnv, DummyAMPEnv, DummyAMPGoalEnv, DummyGymnasiumAtariEnv, DummyGymnasiumMujocoEnv) register( @@ -96,6 +96,17 @@ max_episode_steps=10 ) +register( + id='FakeAMPNNablaRL-v1', + entry_point='nnabla_rl.environments.dummy:DummyAMPEnv', + max_episode_steps=10 +) + +register( + id='FakeAMPGoalConditionedNNablaRL-v1', + entry_point='nnabla_rl.environments.dummy:DummyAMPGoalEnv', + max_episode_steps=10 +) gymnasium_register( id='FakeGymnasiumMujocoNNablaRL-v1', diff --git a/nnabla_rl/environments/amp_env.py b/nnabla_rl/environments/amp_env.py new file mode 100644 index 00000000..1cffc74e --- /dev/null +++ b/nnabla_rl/environments/amp_env.py @@ -0,0 +1,84 @@ +# Copyright 2024 Sony Group Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from abc import abstractmethod +from enum import Enum +from typing import Tuple + +import gym + +from nnabla_rl.external.goal_env import GoalEnv +from nnabla_rl.typing import Experience, Info, NextState, NonTerminal, Reward + + +class TaskResult(Enum): + UNKNOWN = 0 + SUCCESS = 1 + FAIL = 2 + + +class AMPEnv(gym.Env): + def step(self, action): + next_state, reward, done, info = self._step(action) + info["task_result"] = self.task_result(next_state, reward, done, info) + info["valid_episode"] = self.is_valid_episode(next_state, reward, done, info) + info["expert_experience"] = self.expert_experience(next_state, reward, done, info) + return next_state, reward, done, info + + @abstractmethod + def task_result(self, state, reward, done, info) -> TaskResult: + raise NotImplementedError + + @abstractmethod + def is_valid_episode(self, state, reward, done, info) -> bool: + raise NotImplementedError + + @abstractmethod + def expert_experience(self, state, reward, done, info) -> Experience: + raise NotImplementedError + + def update_sample_counts(self): + pass + + @abstractmethod + def _step(self, action) -> Tuple[NextState, Reward, NonTerminal, Info]: + raise NotImplementedError("Implement this function for stepping the env and do not override step()") + + +class AMPGoalEnv(GoalEnv): + def step(self, action): + next_state, reward, done, info = self._step(action) + info["task_result"] = self.task_result(next_state, reward, done, info) + info["valid_episode"] = self.is_valid_episode(next_state, reward, done, info) + info["expert_experience"] = self.expert_experience(next_state, reward, done, info) + return next_state, reward, done, info + + @abstractmethod + def task_result(self, state, reward, done, info) -> TaskResult: + raise NotImplementedError + + @abstractmethod + def is_valid_episode(self, state, reward, done, info) -> bool: + raise NotImplementedError + + @abstractmethod + def expert_experience(self, state, reward, done, info) -> Experience: + raise NotImplementedError + + def update_sample_counts(self): + pass + + @abstractmethod + def _step(self, action) -> Tuple[NextState, Reward, NonTerminal, Info]: + raise NotImplementedError("Implement this function for stepping the env and do not override step()") diff --git a/nnabla_rl/environments/dummy.py b/nnabla_rl/environments/dummy.py index de2d1831..bde7c0fb 100644 --- a/nnabla_rl/environments/dummy.py +++ b/nnabla_rl/environments/dummy.py @@ -13,9 +13,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import TYPE_CHECKING, cast +from typing import TYPE_CHECKING, List, cast import gym +import gym.spaces import gymnasium import numpy as np from gym.envs.registration import EnvSpec @@ -25,6 +26,7 @@ from gym.utils.seeding import RandomNumberGenerator import nnabla_rl +from nnabla_rl.environments.amp_env import AMPEnv, AMPGoalEnv, TaskResult from nnabla_rl.external.goal_env import GoalEnv @@ -317,6 +319,119 @@ def __init__(self, max_episode_steps=None): self.observation_space = gym.spaces.Box(low=0.0, high=1.0, shape=(5, )) +class DummyAMPEnv(AMPEnv): + def __init__(self, max_episode_steps=10): + self.spec = EnvSpec('dummy-amp-v0', max_episode_steps=max_episode_steps) + self.action_space = gym.spaces.Box(low=0.0, high=1.0, shape=(4, )) + self.observation_space = gym.spaces.Tuple( + [gym.spaces.Box(low=0.0, high=1.0, shape=(2, )), + gym.spaces.Box(low=0.0, high=1.0, shape=(5, )), + gym.spaces.Box(low=0.0, high=1.0, shape=(1, ))]) + self.reward_range = (0.0, 1.0) + self.observation_mean = tuple([np.zeros(2, dtype=np.float32), np.zeros( + 5, dtype=np.float32), np.zeros(1, dtype=np.float32)]) + self.observation_var = tuple([np.ones(2, dtype=np.float32), np.ones( + 5, dtype=np.float32), np.ones(1, dtype=np.float32)]) + self.action_mean = np.zeros((4,), dtype=np.float32) + self.action_var = np.ones((4,), dtype=np.float32) + self.reward_at_task_fail = 0.0 + self.reward_at_task_success = 10.0 + self._episode_steps = 0 + + def reset(self): + self._episode_steps = 0 + state = list(self.observation_space.sample()) + return tuple(state) + + def task_result(self, state, reward, done, info) -> TaskResult: + return TaskResult(TaskResult.UNKNOWN.value) + + def is_valid_episode(self, state, reward, done, info) -> bool: + return True + + def expert_experience(self, state, reward, done, info): + state = list(self.observation_space.sample()) + action = self.action_space.sample() + next_state = list(self.observation_space.sample()) + return tuple(state), action, 0.0, False, tuple(next_state), {} + + def _step(self, a): + self._episode_steps += 1 + next_state = list(self.observation_space.sample()) + reward = np.random.randn() + done = self._episode_steps >= self.spec.max_episode_steps + info = {'rnn_states': {'dummy_scope': {'dummy_state1': 1, 'dummy_state2': 2}}} + return tuple(next_state), reward, done, info + + +class DummyAMPGoalEnv(AMPGoalEnv): + def __init__(self, max_episode_steps=10): + self.spec = EnvSpec('dummy-amp-goal-v0', max_episode_steps=max_episode_steps) + self.action_space = gym.spaces.Box(low=0.0, high=1.0, shape=(4, )) + observation_space = gym.spaces.Tuple( + [gym.spaces.Box(low=0.0, high=1.0, shape=(2, )), + gym.spaces.Box(low=0.0, high=1.0, shape=(5, )), + gym.spaces.Box(low=0.0, high=1.0, shape=(1, ))]) + goal_state_space = gym.spaces.Tuple([gym.spaces.Box(low=-np.inf, + high=np.inf, + shape=(3,), + dtype=np.float32), + gym.spaces.Box(low=0.0, + high=1.0, + shape=(1,), + dtype=np.float32)]) + self.observation_space = gym.spaces.Dict({"observation": observation_space, + "desired_goal": goal_state_space, + "achieved_goal": goal_state_space}) + + self.reward_range = (0.0, 1.0) + self.observation_mean = tuple([np.zeros(2, dtype=np.float32), np.zeros( + 5, dtype=np.float32), np.zeros(1, dtype=np.float32)]) + self.observation_var = tuple([np.ones(2, dtype=np.float32), np.ones( + 5, dtype=np.float32), np.ones(1, dtype=np.float32)]) + self.action_mean = np.zeros((4,), dtype=np.float32) + self.action_var = np.ones((4,), dtype=np.float32) + self.reward_at_task_fail = 0.0 + self.reward_at_task_success = 10.0 + self._episode_steps = 0 + + def reset(self): + super().reset() + self._episode_steps = 0 + return self.observation_space.sample() + + def task_result(self, state, reward, done, info) -> TaskResult: + return TaskResult(TaskResult.UNKNOWN.value) + + def is_valid_episode(self, state, reward, done, info) -> bool: + return True + + def expert_experience(self, state, reward, done, info): + action = self.action_space.sample() + return (self._generate_dummy_goal_env_flatten_state(), action, 0.0, + False, self._generate_dummy_goal_env_flatten_state(), {}) + + def _generate_dummy_goal_env_flatten_state(self): + state: List[np.ndarray] = [] + sample = self.observation_space.sample() + for key in ["observation", "desired_goal", "achieved_goal"]: + s = sample[key] + if isinstance(s, tuple): + state.extend(s) + else: + state.append(s) + state = list(map(lambda v: v * 0.0, state)) + return tuple(state) + + def _step(self, a): + self._episode_steps += 1 + next_state = self.observation_space.sample() + reward = np.random.randn() + done = self._episode_steps >= self.spec.max_episode_steps + info = {'rnn_states': {'dummy_scope': {'dummy_state1': 1, 'dummy_state2': 2}}} + return next_state, reward, done, info + + # =========== gymnasium ========== class AbstractDummyGymnasiumEnv(gymnasium.Env): def __init__(self, max_episode_steps): diff --git a/nnabla_rl/environments/wrappers/__init__.py b/nnabla_rl/environments/wrappers/__init__.py index 927dab3b..83ee504f 100644 --- a/nnabla_rl/environments/wrappers/__init__.py +++ b/nnabla_rl/environments/wrappers/__init__.py @@ -14,7 +14,7 @@ # limitations under the License. from nnabla_rl.environments.wrappers.common import (Float32RewardEnv, HWCToCHWEnv, NumpyFloat32Env, # noqa - ScreenRenderEnv, TimestepAsStateEnv) + ScreenRenderEnv, TimestepAsStateEnv, FlattenNestedTupleStateWrapper) from nnabla_rl.environments.wrappers.mujoco import EndlessEnv # noqa from nnabla_rl.environments.wrappers.atari import make_atari, wrap_deepmind # noqa diff --git a/nnabla_rl/environments/wrappers/common.py b/nnabla_rl/environments/wrappers/common.py index 234e9fdd..0bc8e25a 100644 --- a/nnabla_rl/environments/wrappers/common.py +++ b/nnabla_rl/environments/wrappers/common.py @@ -1,5 +1,5 @@ # Copyright 2020,2021 Sony Corporation. -# Copyright 2021,2022,2023 Sony Group Corporation. +# Copyright 2021,2022,2023,2024 Sony Group Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -232,3 +232,70 @@ def __init__(self, env): def observation(self, obs): return np.transpose(obs, [2, 0, 1]) + + +class FlattenNestedTupleStateWrapper(gym.ObservationWrapper): + """Flatten a nested tuple state observation wrapper. + + This wapper flattens a state. + For example, if the original env_info.observation_shape is + + + ``` + Tuple(Tuple(Box(-inf, inf, (2,), float32), Box(-inf, inf, (6,), float32)), + Tuple(Box(-inf, inf, (1,), float32), Box(-inf, inf, (3,), float32))) + ```, + + then the wrapped observation_shape is + + ``` + Tuple(Box(-inf, inf, (2,), float32), + Box(-inf, inf, (6,), float32), + Box(-inf, inf, (1,), float32), + Box(-inf, inf, (3,), float32)) + ```. + """ + + def __init__(self, env): + super().__init__(env) + original_observation_space = env.observation_space + assert isinstance(original_observation_space, gym.spaces.Tuple) + self.observation_space = self._flatten_observation_space(original_observation_space) + + def _flatten_observation_space(self, observation_space): + flattened_obs = [] + for space in observation_space: + if isinstance(space, gym.spaces.Tuple): + space = self._flatten_tuple_space(space) + flattened_obs.extend(space) + else: + flattened_obs.append(space) + return gym.spaces.Tuple(flattened_obs) + + def _flatten_tuple_space(self, tuple_space): + flattened = [] + for item in tuple_space: + if isinstance(item, gym.spaces.Tuple): + flattened.extend(self._flatten_tuple_space(item)) + else: + flattened.append(item) + return flattened + + def observation(self, observation): + flattened_obs = [] + for obs in observation: + if isinstance(obs, tuple): + obs = self._flatten_nested_array(obs) + flattened_obs.extend(obs) + else: + flattened_obs.append(obs) + return tuple(flattened_obs) + + def _flatten_nested_array(self, arr): + flattened = [] + for item in arr: + if isinstance(item, tuple): + flattened.extend(self._flatten_nested_array(item)) + else: + flattened.append(item) + return flattened diff --git a/nnabla_rl/environments/wrappers/goal_conditioned.py b/nnabla_rl/environments/wrappers/goal_conditioned.py index 53d3dfd2..e1633c72 100644 --- a/nnabla_rl/environments/wrappers/goal_conditioned.py +++ b/nnabla_rl/environments/wrappers/goal_conditioned.py @@ -1,4 +1,4 @@ -# Copyright 2021,2022,2023 Sony Group Corporation. +# Copyright 2021,2022,2023,2024 Sony Group Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import copy from typing import Optional, SupportsFloat, Tuple, cast import gym @@ -171,7 +172,7 @@ def _build_observation_space(self, env: GoalEnv): def observation(self, observation): self._check_observation(observation) - return tuple(observation[key].copy() for key in self._observation_keys) + return tuple(copy.deepcopy(observation[key]) for key in self._observation_keys) def _check_observation(self, observation): for key in observation.keys(): diff --git a/nnabla_rl/functions.py b/nnabla_rl/functions.py index 43676196..f1ffee2c 100644 --- a/nnabla_rl/functions.py +++ b/nnabla_rl/functions.py @@ -1,5 +1,5 @@ # Copyright 2020,2021 Sony Corporation. -# Copyright 2021,2022,2023 Sony Group Corporation. +# Copyright 2021,2022,2023,2024 Sony Group Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -620,3 +620,70 @@ def swapaxes(x: nn.Variable, axis1: int, axis2: int) -> nn.Variable: axes[axis1] = axis2 axes[axis2] = axis1 return NF.transpose(x, axes=axes) + + +def normalize(x: nn.Variable, + mean: nn.Variable, + std: nn.Variable, + value_clip: Optional[Tuple[float, float]] = None) -> nn.Variable: + """Normalize the given variable. + + Args: + x (nn.Varible): variable to be normalized. + mean (nn.Variable): mean. + std (nn.Variable): standard deviation. + value_clip (Optional[Tuple[float, float]]): clipping value. defaults to None. + + Returns: + nn.Variable: normalized value. + """ + normalized = (x - mean) / std + if value_clip is not None: + normalized = NF.clip_by_value(normalized, min=value_clip[0], max=value_clip[1]) + return normalized + + +def unnormalize(x: nn.Variable, + mean: nn.Variable, + std: nn.Variable, + value_clip: Optional[Tuple[float, float]] = None) -> nn.Variable: + """Unnormalize the given variable. + + Args: + x (nn.Varible): variable to be normalized. + mean (nn.Variable): mean. + std (nn.Variable): standard deviation. + value_clip (Optional[Tuple[float, float]]): clipping value. defaults to None. + + Returns: + nn.Variable: unnormalized value. + """ + unnormalized = x * std + mean + if value_clip is not None: + unnormalized = NF.clip_by_value(unnormalized, min=value_clip[0], max=value_clip[1]) + return unnormalized + + +def compute_std(var: nn.Variable, epsilon: float, mode_for_floating_point_error: str) -> nn.Variable: + """Compute standard deviation. + + Args: + variance (nn.Variable) + epsilon (float): value to improve numerical stability for computing the standard deviation. + mode_for_floating_point_error (str): mode for avoiding a floating point error + when computing the standard deviation. Must be one of: + + - `add`: It returns the square root of the sum of var and epsilon. + - `max`: It returns epsilon if the square root of var is smaller than epsilon, \ + otherwise it returns the square root of var. + + Returns: + nn.Variable: standard deviation + """ + if mode_for_floating_point_error == "add": + std = (var + epsilon) ** 0.5 + elif mode_for_floating_point_error == "max": + std = NF.maximum_scalar(var**0.5, epsilon) + else: + raise ValueError + return std diff --git a/nnabla_rl/model_trainers/policy/__init__.py b/nnabla_rl/model_trainers/policy/__init__.py index e3967cbe..9f0f0454 100644 --- a/nnabla_rl/model_trainers/policy/__init__.py +++ b/nnabla_rl/model_trainers/policy/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2021,2022,2023 Sony Group Corporation. +# Copyright 2021,2022,2023,2024 Sony Group Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -13,6 +13,7 @@ # limitations under the License. from nnabla_rl.model_trainers.policy.a2c_policy_trainer import A2CPolicyTrainer, A2CPolicyTrainerConfig # noqa +from nnabla_rl.model_trainers.policy.amp_policy_trainer import AMPPolicyTrainer, AMPPolicyTrainerConfig # noqa from nnabla_rl.model_trainers.policy.bear_policy_trainer import BEARPolicyTrainer, BEARPolicyTrainerConfig # noqa from nnabla_rl.model_trainers.policy.demme_policy_trainer import DEMMEPolicyTrainer, DEMMEPolicyTrainerConfig # noqa from nnabla_rl.model_trainers.policy.dpg_policy_trainer import DPGPolicyTrainer, DPGPolicyTrainerConfig # noqa diff --git a/nnabla_rl/model_trainers/policy/amp_policy_trainer.py b/nnabla_rl/model_trainers/policy/amp_policy_trainer.py new file mode 100644 index 00000000..22c4609f --- /dev/null +++ b/nnabla_rl/model_trainers/policy/amp_policy_trainer.py @@ -0,0 +1,177 @@ +# Copyright 2024 Sony Group Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from dataclasses import dataclass +from typing import Dict, Optional, Sequence, Tuple, Union, cast + +import gym +import numpy as np + +import nnabla as nn +import nnabla.functions as NF +from nnabla_rl.distributions.distribution import Distribution +from nnabla_rl.environments.environment_info import EnvironmentInfo +from nnabla_rl.functions import compute_std, normalize +from nnabla_rl.model_trainers.model_trainer import (LossIntegration, ModelTrainer, TrainerConfig, TrainingBatch, + TrainingVariables) +from nnabla_rl.models import Model, StochasticPolicy +from nnabla_rl.utils.data import add_batch_dimension, set_data_to_variable +from nnabla_rl.utils.misc import create_variable + + +@dataclass +class AMPPolicyTrainerConfig(TrainerConfig): + action_bound_loss_coefficient: float = 10.0 + normalize_action: bool = True + action_mean: Optional[Tuple[float, ...]] = None + action_var: Optional[Tuple[float, ...]] = None + epsilon: float = 0.2 + regularization_coefficient: float = 0.0005 + + +class AMPPolicyTrainer(ModelTrainer): + """Adversarial Motion Prior Policy Trainer.""" + + # type declarations to type check with mypy + # NOTE: declared variables are instance variable and NOT class variable, unless it is marked with ClassVar + # See https://mypy.readthedocs.io/en/stable/class_basics.html for details + _config: AMPPolicyTrainerConfig + _pi_loss: nn.Variable + + def __init__(self, + models: Union[StochasticPolicy, Sequence[StochasticPolicy]], + solvers: Dict[str, nn.solver.Solver], + env_info: EnvironmentInfo, + config: AMPPolicyTrainerConfig = AMPPolicyTrainerConfig()): + + self._action_mean = None + self._action_std = None + if config.normalize_action: + action_mean = add_batch_dimension(np.array(config.action_mean, dtype=np.float32)) + self._action_mean = nn.Variable.from_numpy_array(action_mean) + action_var = add_batch_dimension(np.array(config.action_var, dtype=np.float32)) + self._action_std = compute_std(nn.Variable.from_numpy_array(action_var), + epsilon=0.0, mode_for_floating_point_error="max") + + super(AMPPolicyTrainer, self).__init__(models, solvers, env_info, config) + + def _update_model(self, + models: Sequence[Model], + solvers: Dict[str, nn.solver.Solver], + batch: TrainingBatch, + training_variables: TrainingVariables, + **kwargs) -> Dict[str, np.ndarray]: + for t, b in zip(training_variables, batch): + set_data_to_variable(t.s_current, b.s_current) + set_data_to_variable(t.a_current, b.a_current) + set_data_to_variable(t.extra["log_prob"], b.extra["log_prob"]) + set_data_to_variable(t.extra["advantage"], b.extra["advantage"]) + + # update model + for solver in solvers.values(): + solver.zero_grad() + self._pi_loss.forward() + self._pi_loss.backward() + for solver in solvers.values(): + solver.update() + + trainer_state = {} + trainer_state["pi_loss"] = self._pi_loss.d.copy() + return trainer_state + + def _build_training_graph(self, models: Sequence[Model], training_variables: TrainingVariables): + models = cast(Sequence[StochasticPolicy], models) + + self._pi_loss = 0.0 + + ignore_intermediate_loss = self._config.loss_integration is LossIntegration.LAST_TIMESTEP_ONLY + for step_index, variables in enumerate(training_variables): + is_burn_in_steps = step_index < self._config.burn_in_steps + is_intermediate_steps = step_index < self._config.burn_in_steps + self._config.unroll_steps - 1 + ignore_loss = is_burn_in_steps or (is_intermediate_steps and ignore_intermediate_loss) + self._build_one_step_graph(models, variables, ignore_loss=ignore_loss) + + def _build_one_step_graph(self, models: Sequence[Model], training_variables: TrainingVariables, ignore_loss: bool): + action_min_bound, action_max_bound = self._compute_action_bound() + + models = cast(Sequence[StochasticPolicy], models) + for policy in models: + distribution = policy.pi(training_variables.s_current) + + clip_loss = self._clip_loss(training_variables, distribution) + + action_bound_loss = self._bound_loss(distribution.mean(), action_min_bound, action_max_bound) + + regularization_loss = self._regularization_loss(policy) + + self._pi_loss += 0.0 if ignore_loss else clip_loss + action_bound_loss + regularization_loss + + def _compute_action_bound(self) -> Tuple[nn.Variable, nn.Variable]: + assert isinstance(self._env_info.action_space, gym.spaces.Box) + action_min = nn.Variable.from_numpy_array(add_batch_dimension(self._env_info.action_space.low)) + action_max = nn.Variable.from_numpy_array(add_batch_dimension(self._env_info.action_space.high)) + + if self._config.normalize_action: + normalized_action_min = normalize(action_min, mean=self._action_mean, std=self._action_std) + normalized_action_max = normalize(action_max, mean=self._action_mean, std=self._action_std) + return normalized_action_min, normalized_action_max + else: + return action_min, action_max + + def _clip_loss(self, training_variables: TrainingVariables, distribution: Distribution) -> nn.Variable: + a_current = training_variables.a_current + if self._config.normalize_action: + a_current = normalize(a_current, mean=self._action_mean, std=self._action_std) + + log_prob_new = distribution.log_prob(a_current) + log_prob_old = training_variables.extra["log_prob"] + probability_ratio = NF.exp(log_prob_new - log_prob_old) + clipped_ratio = NF.clip_by_value(probability_ratio, 1 - self._config.epsilon, 1 + self._config.epsilon) + advantage = training_variables.extra["advantage"] + lower_bounds = NF.minimum2(probability_ratio * advantage, clipped_ratio * advantage) + clip_loss = - NF.mean(lower_bounds) + return clip_loss + + def _bound_loss(self, mean: nn.Variable, bound_min: nn.Variable, bound_max: nn.Variable, axis: int = -1 + ) -> nn.Variable: + violation_min = NF.minimum_scalar(mean - bound_min, 0.0) + violation_max = NF.maximum_scalar(mean - bound_max, 0.0) + violation = NF.sum((violation_min**2), axis=axis) + NF.sum((violation_max**2), axis=axis) + loss = 0.5 * NF.mean(violation) + return self._config.action_bound_loss_coefficient * loss + + def _regularization_loss(self, policy: StochasticPolicy) -> nn.Variable: + regularization_loss = 0.0 + model_params = policy.get_parameters() + for n, p in model_params.items(): + # without bias + if not ("/b" in n): + regularization_loss += self._config.regularization_coefficient * 0.5 * NF.sum(p**2) + return regularization_loss + + def _setup_training_variables(self, batch_size) -> TrainingVariables: + # Training input variables + s_current_var = create_variable(batch_size, self._env_info.state_shape) + a_current_var = create_variable(batch_size, self._env_info.action_shape) + log_prob_var = create_variable(batch_size, 1) + advantage_var = create_variable(batch_size, 1) + + extra = {} + extra["log_prob"] = log_prob_var + extra["advantage"] = advantage_var + return TrainingVariables(batch_size, s_current_var, a_current_var, extra=extra) + + @ property + def loss_variables(self) -> Dict[str, nn.Variable]: + return {"pi_loss": self._pi_loss} diff --git a/nnabla_rl/model_trainers/reward/__init__.py b/nnabla_rl/model_trainers/reward/__init__.py index 9856e43d..5000c078 100644 --- a/nnabla_rl/model_trainers/reward/__init__.py +++ b/nnabla_rl/model_trainers/reward/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2021 Sony Group Corporation. +# Copyright 2021,2022,2023,2024 Sony Group Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -14,3 +14,5 @@ from nnabla_rl.model_trainers.reward.gail_reward_function_trainer import ( # noqa GAILRewardFunctionTrainer, GAILRewardFunctionTrainerConfig) +from nnabla_rl.model_trainers.reward.amp_reward_function_trainer import ( # noqa + AMPRewardFunctionTrainer, AMPRewardFunctionTrainerConfig) diff --git a/nnabla_rl/model_trainers/reward/amp_reward_function_trainer.py b/nnabla_rl/model_trainers/reward/amp_reward_function_trainer.py new file mode 100644 index 00000000..47f3461e --- /dev/null +++ b/nnabla_rl/model_trainers/reward/amp_reward_function_trainer.py @@ -0,0 +1,280 @@ +# Copyright 2024 Sony Group Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from dataclasses import dataclass +from typing import Dict, Iterable, List, Optional, Sequence, Tuple, Union, cast + +import numpy as np + +import nnabla as nn +import nnabla.functions as NF +from nnabla_rl.environments.environment_info import EnvironmentInfo +from nnabla_rl.model_trainers.model_trainer import (LossIntegration, ModelTrainer, TrainerConfig, TrainingBatch, + TrainingVariables) +from nnabla_rl.models import Model, RewardFunction +from nnabla_rl.preprocessors.preprocessor import Preprocessor +from nnabla_rl.utils.data import convert_to_list_if_not_list, set_data_to_variable +from nnabla_rl.utils.misc import create_variable + + +@dataclass +class AMPRewardFunctionTrainerConfig(TrainerConfig): + batch_size: int = 256 + extra_regularization_variable_names: Tuple[str] = ("logits/affine/W",) + extra_regularization_coefficient: float = 0.05 + regularization_coefficient: float = 0.0005 + gradient_penelty_coefficient: float = 10.0 + gradient_penalty_indexes: Optional[Tuple[int, ...]] = (1,) + + +class AMPRewardFunctionTrainer(ModelTrainer): + # type declarations to type check with mypy + # NOTE: declared variables are instance variable and NOT class variable, unless it is marked with ClassVar + # See https://mypy.readthedocs.io/en/stable/class_basics.html for details + _config: AMPRewardFunctionTrainerConfig + _reward_loss: nn.Variable + _total_reward_loss: nn.Variable + _binary_regression_loss: nn.Variable + _extra_regularization_loss: nn.Variable + _grad_penalty_loss: nn.Variable + _regularization_loss: nn.Variable + + def __init__(self, + models: Union[RewardFunction, Sequence[RewardFunction]], + solvers: Dict[str, nn.solver.Solver], + env_info: EnvironmentInfo, + state_preprocessor: Optional[Preprocessor] = None, + config: AMPRewardFunctionTrainerConfig = AMPRewardFunctionTrainerConfig()): + self._state_preprocessor = state_preprocessor + super(AMPRewardFunctionTrainer, self).__init__(models, solvers, env_info, config) + + def _update_model(self, + models: Iterable[Model], + solvers: Dict[str, nn.solver.Solver], + batch: TrainingBatch, + training_variables: TrainingVariables, + **kwargs) -> Dict[str, np.ndarray]: + for t, b in zip(training_variables, batch): + for key in batch.extra.keys(): + set_data_to_variable(t.extra[key], b.extra[key]) + + for solver in solvers.values(): + solver.zero_grad() + + self._total_reward_loss.forward() + self._total_reward_loss.backward() + + for solver in solvers.values(): + solver.update() + + trainer_state: Dict[str, np.ndarray] = {} + trainer_state["reward_loss"] = self._total_reward_loss.d.copy() + trainer_state["binary_regression_loss"] = self._binary_regression_loss.d.copy() + trainer_state["extra_regularization_loss"] = self._extra_regularization_loss.d.copy() + trainer_state["grad_penalty_loss"] = self._grad_penalty_loss.d.copy() + trainer_state["regularization_loss"] = self._regularization_loss.d.copy() + + return trainer_state + + def _build_training_graph( + self, + models: Union[Model, Sequence[Model]], + training_variables: TrainingVariables, + ): + models = convert_to_list_if_not_list(models) + models = cast(Sequence[RewardFunction], models) + + self._binary_regression_loss = 0.0 + self._extra_regularization_loss = 0.0 + self._grad_penalty_loss = 0.0 + self._regularization_loss = 0.0 + + ignore_intermediate_loss = self._config.loss_integration is LossIntegration.LAST_TIMESTEP_ONLY + for step_index, variables in enumerate(training_variables): + is_burn_in_steps = step_index < self._config.burn_in_steps + is_intermediate_steps = step_index < self._config.burn_in_steps + self._config.unroll_steps - 1 + ignore_loss = is_burn_in_steps or (is_intermediate_steps and ignore_intermediate_loss) + self._build_one_step_graph(models, variables, ignore_loss=ignore_loss) + + self._total_reward_loss = (self._binary_regression_loss + + self._grad_penalty_loss + + self._regularization_loss + + self._extra_regularization_loss) + + # To check all loss is built + assert isinstance(self._binary_regression_loss, nn.Variable) + assert isinstance(self._grad_penalty_loss, nn.Variable) + assert isinstance(self._regularization_loss, nn.Variable) + assert isinstance(self._extra_regularization_loss, nn.Variable) + assert isinstance(self._total_reward_loss, nn.Variable) + + self._binary_regression_loss.persistent = True + self._grad_penalty_loss.persistent = True + self._regularization_loss.persistent = True + self._extra_regularization_loss.persistent = True + self._total_reward_loss.persistent = True + + def _build_one_step_graph( + self, + models: Sequence[Model], + training_variables: TrainingVariables, + ignore_loss: bool, + ): + if ignore_loss: + return + + models = cast(Sequence[RewardFunction], models) + for model in models: + binary_regression_loss, grad_penalty_loss = self._build_adversarial_loss(model, training_variables) + self._binary_regression_loss += binary_regression_loss + self._grad_penalty_loss += grad_penalty_loss + + self._regularization_loss += self._build_regularization_penalty(model) + + self._extra_regularization_loss += self._build_extra_regularization_penalty(model) + + def _setup_training_variables(self, batch_size): + s_current_agent_var = create_variable(batch_size, self._env_info.state_shape) + s_next_agent_var = create_variable(batch_size, self._env_info.state_shape) + + s_current_expert_var = create_variable(batch_size, self._env_info.state_shape) + s_next_expert_var = create_variable(batch_size, self._env_info.state_shape) + + a_current_agent_var = create_variable(batch_size, self._env_info.action_shape) + a_current_expert_var = create_variable(batch_size, self._env_info.action_shape) + + variables = {"s_current_expert": s_current_expert_var, + "a_current_expert": a_current_expert_var, + "s_next_expert": s_next_expert_var, + "s_current_agent": s_current_agent_var, + "a_current_agent": a_current_agent_var, + "s_next_agent": s_next_agent_var} + + training_variables = TrainingVariables(batch_size, extra=variables) + + return training_variables + + def _build_adversarial_loss(self, model: RewardFunction, training_variables: TrainingVariables): + s_expert, s_n_expert, s_agent, s_n_agent = self._preprocess_state(training_variables) + + _apply_need_grad_true(s_expert) + _apply_need_grad_true(s_n_expert) + + logits_real, logits_fake = self._compute_logits( + model, s_expert, training_variables.extra["a_current_expert"], s_n_expert, + s_agent, training_variables.extra["a_current_agent"], s_n_agent, + ) + real_loss = 0.5 * NF.mean((logits_real - 1.0) ** 2) + fake_loss = 0.5 * NF.mean((logits_fake + 1.0) ** 2) + binary_regression_loss = 0.5 * (real_loss + fake_loss) + + # grad penalty for expert state + current_state_grads = self._compute_gradient_wrt_state(logits_real, s_expert) + current_state_grad_penalty = self._compute_gradient_penalty(current_state_grads) + + next_state_grads = self._compute_gradient_wrt_state(logits_real, s_n_expert) + next_state_grad_penalty = self._compute_gradient_penalty(next_state_grads) + + grad_penalty_loss = self._config.gradient_penelty_coefficient * \ + (current_state_grad_penalty + next_state_grad_penalty) + + return binary_regression_loss, grad_penalty_loss + + def _preprocess_state(self, training_variables: TrainingVariables): + s_expert = training_variables.extra["s_current_expert"] + s_n_expert = training_variables.extra["s_next_expert"] + if self._state_preprocessor is not None: + s_expert = self._state_preprocessor.process(s_expert) + s_n_expert = self._state_preprocessor.process(s_n_expert) + + s_agent = training_variables.extra["s_current_agent"] + s_n_agent = training_variables.extra["s_next_agent"] + if self._state_preprocessor is not None: + s_agent = self._state_preprocessor.process(s_agent) + s_n_agent = self._state_preprocessor.process(s_n_agent) + + return s_expert, s_n_expert, s_agent, s_n_agent + + def _compute_logits(self, model, s_expert, a_expert, s_n_expert, s_agent, a_agent, s_n_agent): + logits_real = model.r(s_expert, a_expert, s_n_expert) + assert logits_real.shape[1] == 1 + + logits_fake = model.r(s_agent, a_agent, s_n_agent) + assert logits_fake.shape[1] == 1 + + return logits_real, logits_fake + + def _build_regularization_penalty(self, model: RewardFunction): + regularization_loss = 0.0 + model_params = model.get_parameters() + for n, p in model_params.items(): + # without bias + if not ("/b" in n): + regularization_loss += self._config.regularization_coefficient * 0.5 * NF.sum(p**2) + return regularization_loss + + def _build_extra_regularization_penalty(self, model: RewardFunction): + extra_regularization_loss = 0.0 + model_params = model.get_parameters() + for variable_name in self._config.extra_regularization_variable_names: + extra_regularization_loss += self._config.extra_regularization_coefficient * \ + 0.5 * NF.sum(model_params[variable_name] ** 2) + return extra_regularization_loss + + def _compute_gradient_wrt_state( + self, loss: nn.Variable, state_variable: Union[nn.Variable, Tuple[nn.Variable, ...]] + ) -> List[nn.Variable]: + if isinstance(state_variable, nn.Variable) or isinstance(state_variable, tuple): + grads: List[nn.Variable] = nn.grad(loss, state_variable) + else: + raise ValueError + + for g in grads: + g.persistent = True + + return grads + + def _compute_gradient_penalty(self, grads: List[nn.Variable]) -> nn.Variable: + valid_grads: List[nn.Variable] = [] + indexes = ( + range(len(grads)) + if self._config.gradient_penalty_indexes is None + else self._config.gradient_penalty_indexes + ) + for i in indexes: + g = grads[i] + # if gradient is empty, skip to take sum. + if len(g.shape) == 0: + continue + valid_grads.append(g) + + if len(valid_grads) == 0: + return 0.0 + elif len(valid_grads) == 1: + return 0.5 * NF.mean(NF.sum(valid_grads[0] ** 2, axis=-1)) + else: + concat_g: nn.Variable = NF.concatenate(*valid_grads, axis=-1) + return 0.5 * NF.mean(NF.sum(concat_g**2, axis=-1)) + + @property + def loss_variables(self) -> Dict[str, nn.Variable]: + return {"reward_loss": self._total_reward_loss} + + +def _apply_need_grad_true(variable: Union[nn.Variable, Tuple[nn.Variable, ...]]): + if isinstance(variable, tuple): + for v in variable: + v.need_grad = True + else: + variable.need_grad = True diff --git a/nnabla_rl/models/__init__.py b/nnabla_rl/models/__init__.py index d78b9d1d..2d455cb7 100644 --- a/nnabla_rl/models/__init__.py +++ b/nnabla_rl/models/__init__.py @@ -1,5 +1,5 @@ # Copyright 2020,2021 Sony Corporation. -# Copyright 2021,2022,2023 Sony Group Corporation. +# Copyright 2021,2022,2023,2024 Sony Group Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -67,6 +67,9 @@ from nnabla_rl.models.atari.policies import ICML2015TRPOPolicy as ICML2015TRPOAtariPolicy # noqa from nnabla_rl.models.pybullet.q_functions import ICRA2018QtOptQFunction # noqa +from nnabla_rl.models.pybullet.reward_functions import AMPDiscriminator # noqa +from nnabla_rl.models.pybullet.policy import AMPGatedPolicy, AMPPolicy # noqa +from nnabla_rl.models.pybullet.v_functions import AMPGatedVFunction, AMPVFunction # noqa from nnabla_rl.models.classic_control.policies import REINFORCEContinousPolicy, REINFORCEDiscretePolicy # noqa from nnabla_rl.models.classic_control.dynamics import MPPIDeterministicDynamics # noqa diff --git a/nnabla_rl/models/pybullet/policy.py b/nnabla_rl/models/pybullet/policy.py new file mode 100644 index 00000000..4ecef435 --- /dev/null +++ b/nnabla_rl/models/pybullet/policy.py @@ -0,0 +1,162 @@ +# Copyright 2024 Sony Group Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Tuple + +import numpy as np + +import nnabla as nn +import nnabla.functions as NF +import nnabla.initializer as NI +import nnabla.parametric_functions as NPF +import nnabla_rl.distributions as D +import nnabla_rl.initializers as RI +from nnabla_rl.distributions.distribution import Distribution +from nnabla_rl.models.policy import StochasticPolicy + + +class AMPPolicy(StochasticPolicy): + """Actor model proposed by Xue Bin Peng, et al. + + in AMP paper for their bullet environment. + This network outputs the policy distribution + See: https://arxiv.org/abs/2104.02180 + """ + + # type declarations to type check with mypy + # NOTE: declared variables are instance variable and NOT class variable, unless it is marked with ClassVar + # See https://mypy.readthedocs.io/en/stable/class_basics.html for details + _action_dim: int + _output_layer_initializer_scale: float + + def __init__(self, scope_name: str, action_dim: int, output_layer_initializer_scale: float): + super(AMPPolicy, self).__init__(scope_name) + self._action_dim = action_dim + assert output_layer_initializer_scale > 0.0, f"{output_layer_initializer_scale} should be larger than 0.0" + self._output_layer_initializer_scale = output_layer_initializer_scale + + def pi(self, s: Tuple[nn.Variable, nn.Variable, nn.Variable]) -> Distribution: + assert len(s) == 3 + s_for_pi_v, _, _ = s + batch_size = s_for_pi_v.shape[0] + with nn.parameter_scope(self.scope_name): + h = NPF.affine(s_for_pi_v, + n_outmaps=1024, + name="linear1", + w_init=RI.GlorotUniform(inmaps=s_for_pi_v.shape[1], outmaps=1024)) + h = NF.relu(x=h) + h = NPF.affine(h, + n_outmaps=512, + name="linear2", + w_init=RI.GlorotUniform(inmaps=h.shape[1], outmaps=512)) + h = NF.relu(x=h) + mean = NPF.affine(h, + n_outmaps=self._action_dim, + name="linear3_mean", + w_init=NI.UniformInitializer((-1.0 * self._output_layer_initializer_scale, + self._output_layer_initializer_scale)), + b_init=NI.ConstantInitializer(0.0)) + ln_sigma = nn.Variable.from_numpy_array( + np.ones((batch_size, self._action_dim), dtype=np.float32) * np.log(0.05)) + ln_var = ln_sigma * 2.0 + assert mean.shape == ln_var.shape + assert mean.shape == (s_for_pi_v.shape[0], self._action_dim) + return D.Gaussian(mean=mean, ln_var=ln_var) + + +class AMPGatedPolicy(StochasticPolicy): + """Actor model proposed by Xue Bin Peng, et al. + + in AMP paper for their bullet environment. + This network outputs the policy distribution + See: https://arxiv.org/abs/2104.02180 + """ + + # type declarations to type check with mypy + # NOTE: declared variables are instance variable and NOT class variable, unless it is marked with ClassVar + # See https://mypy.readthedocs.io/en/stable/class_basics.html for details + _action_dim: int + _output_layer_initializer_scale: float + + def __init__(self, scope_name: str, action_dim: int, output_layer_initializer_scale: float): + super(AMPGatedPolicy, self).__init__(scope_name) + self._action_dim = action_dim + assert output_layer_initializer_scale > 0.0, f"{output_layer_initializer_scale} should be larger than 0.0" + self._output_layer_initializer_scale = output_layer_initializer_scale + + def pi(self, s: Tuple[nn.Variable, nn.Variable, nn.Variable, nn.Variable, nn.Variable, nn.Variable, nn.Variable]) \ + -> Distribution: + assert len(s) == 7 + s_for_pi_v, _, _, goal, *_ = s + batch_size = s_for_pi_v.shape[0] + with nn.parameter_scope(self.scope_name): + # gated block + g_z = NPF.affine(goal, + n_outmaps=128, + name="gate_initial_linear", + w_init=RI.GlorotUniform(inmaps=goal.shape[1], outmaps=128)) + g_z = NF.relu(g_z) + + h = NF.concatenate(s_for_pi_v, goal, axis=-1) + + # block1 + h = NPF.affine(h, n_outmaps=1024, name="linear_1", w_init=RI.GlorotUniform(inmaps=h.shape[1], outmaps=1024)) + + gate_h = NPF.affine(g_z, n_outmaps=64, name="gate_linear1", + w_init=RI.GlorotUniform(inmaps=g_z.shape[1], outmaps=64)) + gate_h = NF.relu(gate_h) + gate_h_bias = NPF.affine(gate_h, + n_outmaps=1024, + name="gate_bias_linear1", + w_init=RI.GlorotUniform(inmaps=gate_h.shape[1], outmaps=1024)) + gate_h_scale = NPF.affine(gate_h, + n_outmaps=1024, + name="gate_scale_linear1", + w_init=RI.GlorotUniform(inmaps=gate_h.shape[1], outmaps=1024)) + + h = h * 2.0 * NF.sigmoid(gate_h_scale) + gate_h_bias + h = NF.relu(h) + + # block2 + h = NPF.affine(h, n_outmaps=512, name="linear_2", w_init=RI.GlorotUniform(inmaps=h.shape[1], outmaps=512)) + + gate_h = NPF.affine(g_z, n_outmaps=64, name="gate_linear2", + w_init=RI.GlorotUniform(inmaps=h.shape[1], outmaps=64)) + gate_h = NF.relu(gate_h) + gate_h_bias = NPF.affine(gate_h, + n_outmaps=512, + name="gate_bias_linear2", + w_init=RI.GlorotUniform(inmaps=gate_h.shape[1], outmaps=512)) + gate_h_scale = NPF.affine(gate_h, + n_outmaps=512, + name="gate_scale_linear2", + w_init=RI.GlorotUniform(inmaps=gate_h.shape[1], outmaps=512)) + + h = h * 2.0 * NF.sigmoid(gate_h_scale) + gate_h_bias + h = NF.relu(h) + + # output block + mean = NPF.affine(h, + n_outmaps=self._action_dim, + name="linear3_mean", + w_init=NI.UniformInitializer((-1.0 * self._output_layer_initializer_scale, + self._output_layer_initializer_scale)), + b_init=NI.ConstantInitializer(0.0)) + ln_sigma = nn.Variable.from_numpy_array( + np.ones((batch_size, self._action_dim), dtype=np.float32) * np.log(0.05)) + ln_var = ln_sigma * 2.0 + assert mean.shape == ln_var.shape + assert mean.shape == (batch_size, self._action_dim) + + return D.Gaussian(mean=mean, ln_var=ln_var) diff --git a/nnabla_rl/models/pybullet/reward_functions.py b/nnabla_rl/models/pybullet/reward_functions.py new file mode 100644 index 00000000..5d168500 --- /dev/null +++ b/nnabla_rl/models/pybullet/reward_functions.py @@ -0,0 +1,63 @@ +# Copyright 2024 Sony Group Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Tuple + +import nnabla as nn +import nnabla.functions as NF +import nnabla.initializer as NI +import nnabla.parametric_functions as NPF +import nnabla_rl.initializers as RI +from nnabla_rl.models.reward_function import RewardFunction + + +class AMPDiscriminator(RewardFunction): + """Discriminator model used as reward function proposed by Xue Bin Peng, et + al. + + See: https://arxiv.org/abs/2104.02180 + """ + + def __init__(self, scope_name: str, output_layer_initializer_scale: float): + super(AMPDiscriminator, self).__init__(scope_name) + assert output_layer_initializer_scale > 0.0, f"{output_layer_initializer_scale} should be larger than 0.0" + self._output_layer_initializer_scale = output_layer_initializer_scale + + def r(self, s_current: Tuple[nn.Variable, ...], a_current: nn.Variable, s_next: Tuple[nn.Variable, ...] + ) -> nn.Variable: + assert len(s_current) == 7 or len(s_current) == 3 + for _s in s_current[1:]: + assert s_current[0].shape[0] == _s.shape[0] + + s_for_reward = s_current[1] + + # NOTE: s_for_reward has s and s_next. + # See author's enviroment implmentation and our env wrapper implementation. + with nn.parameter_scope(self.scope_name): + h = NPF.affine(s_for_reward, + n_outmaps=1024, + name="linear1", + w_init=RI.GlorotUniform(inmaps=s_for_reward.shape[1], outmaps=1024)) + h = NF.relu(x=h) + h = NPF.affine(h, + n_outmaps=512, + name="linear2", + w_init=RI.GlorotUniform(inmaps=h.shape[1], outmaps=512)) + h = NF.relu(x=h) + h = NPF.affine(h, + n_outmaps=1, + name="logits", + w_init=NI.UniformInitializer((-1.0 * self._output_layer_initializer_scale, + self._output_layer_initializer_scale))) + return h diff --git a/nnabla_rl/models/pybullet/v_functions.py b/nnabla_rl/models/pybullet/v_functions.py new file mode 100644 index 00000000..dd438212 --- /dev/null +++ b/nnabla_rl/models/pybullet/v_functions.py @@ -0,0 +1,109 @@ +# Copyright 2024 Sony Group Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Tuple + +import nnabla as nn +import nnabla.functions as NF +import nnabla.parametric_functions as NPF +import nnabla_rl.initializers as RI +from nnabla_rl.models.v_function import VFunction + + +class AMPVFunction(VFunction): + """Value function proposed by Xue Bin Peng, et al. + + See: https://arxiv.org/abs/2104.02180 + """ + + def __init__(self, scope_name: str): + super(AMPVFunction, self).__init__(scope_name) + + def v(self, s: nn.Variable) -> nn.Variable: + assert len(s) == 3 + s_for_pi_v, _, _ = s + with nn.parameter_scope(self.scope_name): + h = NPF.affine(s_for_pi_v, + n_outmaps=1024, + name="linear1", + w_init=RI.GlorotUniform(inmaps=s_for_pi_v.shape[1], outmaps=1024)) + h = NF.relu(x=h) + h = NPF.affine(h, n_outmaps=512, name="linear2", w_init=RI.GlorotUniform(inmaps=h.shape[1], outmaps=512)) + h = NF.relu(x=h) + h = NPF.affine(h, n_outmaps=1, name="linear3", w_init=RI.GlorotUniform(inmaps=h.shape[1], outmaps=1)) + return h + + +class AMPGatedVFunction(VFunction): + """Value function proposed by Xue Bin Peng, et al. + + See: https://arxiv.org/abs/2104.02180 + """ + + def __init__(self, scope_name: str): + super(AMPGatedVFunction, self).__init__(scope_name) + + def v(self, s: Tuple[nn.Variable, nn.Variable, nn.Variable, nn.Variable, nn.Variable, nn.Variable, nn.Variable]) \ + -> nn.Variable: + assert len(s) == 7 + s_for_pi_v, _, _, goal, *_ = s + with nn.parameter_scope(self.scope_name): + # gated block + g_z = NPF.affine(goal, + n_outmaps=128, + name="gate_initial_linear", + w_init=RI.GlorotUniform(inmaps=goal.shape[1], outmaps=128)) + g_z = NF.relu(g_z) + + h = NF.concatenate(s_for_pi_v, goal, axis=-1) + + # block1 + h = NPF.affine(h, n_outmaps=1024, name="linear_1", w_init=RI.GlorotUniform(inmaps=h.shape[1], outmaps=1024)) + + gate_h = NPF.affine(g_z, n_outmaps=64, name="gate_linear1", + w_init=RI.GlorotUniform(inmaps=g_z.shape[1], outmaps=64)) + gate_h = NF.relu(gate_h) + gate_h_bias = NPF.affine(gate_h, + n_outmaps=1024, + name="gate_bias_linear1", + w_init=RI.GlorotUniform(inmaps=gate_h.shape[1], outmaps=1024)) + gate_h_scale = NPF.affine(gate_h, + n_outmaps=1024, + name="gate_scale_linear1", + w_init=RI.GlorotUniform(inmaps=gate_h.shape[1], outmaps=1024)) + + h = h * 2.0 * NF.sigmoid(gate_h_scale) + gate_h_bias + h = NF.relu(h) + + # block2 + h = NPF.affine(h, n_outmaps=512, name="linear_2", w_init=RI.GlorotUniform(inmaps=h.shape[1], outmaps=512)) + + gate_h = NPF.affine(g_z, n_outmaps=64, name="gate_linear2", + w_init=RI.GlorotUniform(inmaps=g_z.shape[1], outmaps=64)) + gate_h = NF.relu(gate_h) + gate_h_bias = NPF.affine(gate_h, + n_outmaps=512, + name="gate_bias_linear2", + w_init=RI.GlorotUniform(inmaps=gate_h.shape[1], outmaps=512)) + gate_h_scale = NPF.affine(gate_h, + n_outmaps=512, + name="gate_scale_linear2", + w_init=RI.GlorotUniform(inmaps=gate_h.shape[1], outmaps=512)) + + h = h * 2.0 * NF.sigmoid(gate_h_scale) + gate_h_bias + h = NF.relu(h) + + # output block + h = NPF.affine(h, n_outmaps=1, name="linear3", w_init=RI.GlorotUniform(inmaps=h.shape[1], outmaps=1)) + return h diff --git a/nnabla_rl/preprocessors/running_mean_normalizer.py b/nnabla_rl/preprocessors/running_mean_normalizer.py index a7c7c81a..e1026494 100644 --- a/nnabla_rl/preprocessors/running_mean_normalizer.py +++ b/nnabla_rl/preprocessors/running_mean_normalizer.py @@ -1,5 +1,5 @@ # Copyright 2020,2021 Sony Corporation. -# Copyright 2021 Sony Group Corporation. +# Copyright 2021,2022,2023,2024 Sony Group Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -13,33 +13,85 @@ # See the License for the specific language governing permissions and # limitations under the License. +from typing import Optional, Tuple, Union + import numpy as np import nnabla as nn -import nnabla.functions as NF import nnabla.initializer as NI +from nnabla_rl.functions import compute_std, normalize from nnabla_rl.models.model import Model from nnabla_rl.preprocessors.preprocessor import Preprocessor +from nnabla_rl.typing import Shape class RunningMeanNormalizer(Preprocessor, Model): - def __init__(self, scope_name, shape, epsilon=1e-8, value_clip=None): + # type declarations to type check with mypy + # NOTE: declared variables are instance variable and NOT class variable, unless it is marked with ClassVar + # See https://mypy.readthedocs.io/en/stable/class_basics.html for details + _shape: Shape + """Running mean normalizer. This normalizer computes a running mean and \ + variance from the data and use them to process the given varible. + + Args: + scope_name (str): scope name of running mean normalizer's parameters + shape (Shape): shape of the variable which is normalized. + epsilon (float): value to improve numerical stability for computing the standard deviation. Defaults to 1e-8. + value_clip (Optional[Tuple[float, float]]): value clip. This clipping is applied after the normalization. + mode_for_floating_point_error (str): mode for avoiding a floating point error \ + when computing the standard deviation from the variance to normalize the data. \ + Must be one of: + + - `add`: Use the square root of the sum of var and epsilon as the standard deviation. + - `max`: Use the epsilon if the square root of var is smaller than epsilon, \ + otherwise it returns the square root of var as the standard deviation. + + Defaults to add. + mean_initializer (Union[NI.BaseInitializer, np.ndarray]): initializer for normalizer's mean. \ + The computation of a running mean is started from this value. Defaults to NI.ConstantInitializer(0.0). + var_initializer (Union[NI.BaseInitializer, np.ndarray]): initializer for normalizer's variance. \ + The computation of a running variance is started from this value. Defaults to NI.ConstantInitializer(1.0). + """ + + def __init__(self, + scope_name: str, + shape: Shape, + epsilon: float = 1e-8, + value_clip: Optional[Tuple[float, float]] = None, + mode_for_floating_point_error: str = "add", + mean_initializer: Union[NI.BaseInitializer, np.ndarray] = NI.ConstantInitializer(0.0), + var_initializer: Union[NI.BaseInitializer, np.ndarray] = NI.ConstantInitializer(1.0)): super(RunningMeanNormalizer, self).__init__(scope_name) if value_clip is not None and value_clip[0] > value_clip[1]: raise ValueError( - f'Unexpected clipping value range: {value_clip[0]} > {value_clip[1]}') + f"Unexpected clipping value range: {value_clip[0]} > {value_clip[1]}") self._value_clip = value_clip + + if isinstance(shape, int): + self._shape = (shape,) + elif isinstance(shape, tuple): + self._shape = shape + else: + raise ValueError + self._epsilon = epsilon - self._shape = shape + self._mode_for_floating_point_error = mode_for_floating_point_error + + if isinstance(mean_initializer, np.ndarray): + assert mean_initializer.shape == shape + mean_initializer = mean_initializer[np.newaxis, :] + self._mean_initializer = mean_initializer + + if isinstance(var_initializer, np.ndarray): + assert var_initializer.shape == shape + var_initializer = var_initializer[np.newaxis, :] + self._var_initializer = var_initializer def process(self, x): assert 0 < self._count.d - std = (self._var + self._epsilon) ** 0.5 - normalized = (x - self._mean) / std - if self._value_clip is not None: - normalized = NF.clip_by_value( - normalized, min=self._value_clip[0], max=self._value_clip[1]) + std = compute_std(self._var, self._epsilon, self._mode_for_floating_point_error) + normalized = normalize(x, self._mean, std, self._value_clip) normalized.need_grad = False return normalized @@ -66,13 +118,13 @@ def update(self, data): def _mean(self): with nn.parameter_scope(self.scope_name): return nn.parameter.get_parameter_or_create(name='mean', shape=(1, *self._shape), - initializer=NI.ConstantInitializer(0.0)) + initializer=self._mean_initializer) @property def _var(self): with nn.parameter_scope(self.scope_name): return nn.parameter.get_parameter_or_create(name='var', shape=(1, *self._shape), - initializer=NI.ConstantInitializer(1.0)) + initializer=self._var_initializer) @property def _count(self): diff --git a/nnabla_rl/utils/data.py b/nnabla_rl/utils/data.py index 6a451af4..4c8487ff 100644 --- a/nnabla_rl/utils/data.py +++ b/nnabla_rl/utils/data.py @@ -1,5 +1,5 @@ # Copyright 2020,2021 Sony Corporation. -# Copyright 2021,2022,2023 Sony Group Corporation. +# Copyright 2021,2022,2023,2024 Sony Group Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import Any, Dict, Generic, Iterable, List, Sequence, Tuple, TypeVar, Union, cast +from typing import Any, Dict, Generic, Iterable, List, Optional, Sequence, Tuple, TypeVar, Union, cast import numpy as np @@ -211,3 +211,70 @@ def append_with_removed_item_check(self, data): removed = self._buffer[index] self._buffer[index] = data return removed + + +def normalize_ndarray(ndarray: np.ndarray, + mean: np.ndarray, + std: np.ndarray, + value_clip: Optional[Tuple[float, float]] = None) -> np.ndarray: + """Normalize the given ndarray. + + Args: + ndarray (np.ndarray): variable to be normalized. + mean (np.ndarray): mean. + std (np.ndarray): standard deviation. + value_clip (Optional[Tuple[float, float]]): clipping value. defaults to None. + + Returns: + np.ndarray: normalized value. + """ + normalized: np.ndarray = (ndarray - mean) / std + if value_clip is not None: + normalized = np.clip(normalized, a_min=value_clip[0], a_max=value_clip[1]) + return normalized + + +def unnormalize_ndarray(ndarray: np.ndarray, + mean: np.ndarray, + std: np.ndarray, + value_clip: Optional[Tuple[float, float]] = None) -> np.ndarray: + """Unnormalize the given ndarray. + + Args: + ndarray (np.ndarray): variable to be unnormalized. + mean (np.ndarray): mean. + std (np.ndarray): standard deviation. + value_clip (Optional[Tuple[float, float]]): clipping value. defaults to None. + + Returns: + np.ndarray: unnormalized value. + """ + unnormalized: np.ndarray = ndarray * std + mean + if value_clip is not None: + unnormalized = np.clip(unnormalized, a_min=value_clip[0], a_max=value_clip[1]) + return unnormalized + + +def compute_std_ndarray(var: np.ndarray, epsilon: float, mode_for_floating_point_error: str) -> np.ndarray: + """Compute standard deviation. + + Args: + var (nn.Variable): variance + epsilon (float): value to improve numerical stability for computing the standard deviation. + mode_for_floating_point_error (str): mode for avoiding a floating point error + when computing the standard deviation. Must be one of: + + - `add`: It returns the square root of the sum of var and epsilon. + - `max`: It returns epsilon if the square root of var is smaller than epsilon, \ + otherwise it returns the square root of var. + + Returns: + nn.Variable: standard deviation + """ + if mode_for_floating_point_error == "add": + std = (var + epsilon) ** 0.5 + elif mode_for_floating_point_error == "max": + std = np.maximum(var**0.5, epsilon) + else: + raise ValueError + return std diff --git a/reproductions/algorithms/pybullet/amp/.gitignore b/reproductions/algorithms/pybullet/amp/.gitignore new file mode 100644 index 00000000..6917b2ce --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/.gitignore @@ -0,0 +1,4 @@ +args/ +data/ +DeepMimic/ +**_results/ diff --git a/reproductions/algorithms/pybullet/amp/README.md b/reproductions/algorithms/pybullet/amp/README.md new file mode 100644 index 00000000..651d20ce --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/README.md @@ -0,0 +1,172 @@ +# AMP (Adversarial Motion Priors) reproduction + +This reproduction script trains the AMP (Adversarial Motion Priors) algorithm proposed by +XB Peng, et al. in the paper: [AMP: adversarial motion priors for stylized physics-based character control](https://arxiv.org/abs/2104.02180) + +## Prerequisites + +Install [DeepMimic env](https://github.com/xbpeng/DeepMimic). + +```sh +$ git clone https://github.com/xbpeng/DeepMimic.git +``` + +Set the environment variables in `DeepMimic/DeepMimicCore/Makefile` (line 5 to 16). + +An example setting is as follows: + +```sh +export EIGEN_DIR = third/eigen-3.3.7 +export BULLET_INC_DIR = third/bullet3-2.88/build_cmake/install/include/bullet/ +export BULLET_LIB_DIR = third/bullet3-2.88/build_cmake/install/lib +export GLEW_INC_DIR = third/glew-2.1.0/install/usr/include/ +export GLEW_LIB_DIR = third/glew-2.1.0/lib/ +export FREEGLUT_INC_DIR = third/freeglut-3.0.0/install/include/ +export FREEGLUT_LIB_DIR = third/freeglut-3.0.0/install/lib + +PYTHON_INC = /usr/include/python3.8 +PYTHON_LIB = /usr/lib/ -lpython3.8 +``` + +Then run + +```sh +$ cd DeepMimic/DeepMimicCore +$ ./build.sh +``` + +This should generate `DeepMimicCore.py` in `DeepMimic/DeepMimicCore`. + + +Copy `DeepMimic/data` to amp reproduction directory. +DeepMimic env internally set the shader and other environment setting data prefix path as `data/`. + +```sh +$ cp -r DeepMimic/data . +``` + +Copy `DeepMimic/args` to amp reproduction directory. + +```sh +$ cp -r DeepMimic/args . +``` + +### Troubleshooting + +If you encouter segmentation errors such as + +```sh +*** Process received signal *** +Signal: Segmentation fault (11) +Signal code: Address not mapped (1) +Failing at address: 0x10 +``` + +Comment out the `glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, mTexture, 0);` at `DeepMimic/DeepMimicCore/render/ShadowMap.cpp`. + +This error is caused by openGL version mismatch. + +## How to run the reproduction script + +To run the reproduction script do + +```sh +$ python amp_reproduction.py +``` + +If you omit options, the script will run on Humanoid Cartwheel Imitation task environment with gpu id 0. + +You can change the training environment and gpu as follows + +``` +$ python amp_reproduction.py --args_file_path --gpu +``` + +If you want to run training with the goal conditioned enviroments, add goal conditioned env flag. + +``` +$ python amp_reproduction.py --args_file_path --gpu --goal_conditioned_env +``` + +``` +# Example1: run the script on cpu and train the agent with Humanoid Backfilp Imitation task: +$ python amp_reproduction.py --gpu -1 --args_file_path ./args/train_amp_humanoid3d_backflip_args.txt + +# Example2: run the script on cpu and train the agent with Humanoid Locomotion goal conditioned task: +$ python amp_reproduction.py --gpu -1 --args_file_path ./args/train_amp_heading_humanoid3d_locomotion_args.txt --goal_conditioned_env + +# Example3: run the script on gpu 1 and train the agent with Humanoid Backfile Imitation task: +$ python amp_reproduction.py --gpu 1 --args_file_path ./args/train_amp_humanoid3d_backflip_args.txt +``` + +To check all available options type: + +``` +$ python amp_reproduction.py --help +``` + +To check the trained result do without rendering + +``` +$ python amp_reproduction.py --showcase --snapshot-dir + +# Example 1: check the trained result with the imitation enviroments. +$ python amp_reproduction.py --args_file_path ./args/train_amp_humanoid3d_backflip_args.txt --gpu 0 --showcase --snapshot-dir ./train_amp_heading_humanoid3d_locomotion_results/seed-0/iteration-100000000 + +# Example 2: check the trained result with the goal conditioned enviroments. +$ python amp_reproduction.py --args_file_path ./args/train_amp_heading_humanoid3d_locomotion_args.txt --goal_conditioned_env --gpu 0 --showcase --snapshot-dir ./train_amp_heading_humanoid3d_locomotion_results/seed-0/iteration-100000000 +``` + +To check the trained result do with rendering + +``` +$ python amp_reproduction.py --showcase --snapshot-dir --render_in_showcase + +# Example 1: check the trained result with the imitation enviroments. +$ python amp_reproduction.py --args_file_path ./args/train_amp_humanoid3d_backflip_args.txt --gpu 0 --render_in_showcase --showcase --snapshot-dir ./train_amp_heading_humanoid3d_locomotion_results/seed-0/iteration-100000000 + +# Example 2: check the trained result with the goal conditioned enviroments. +$ python amp_reproduction.py --args_file_path ./args/train_amp_heading_humanoid3d_locomotion_args.txt --goal_conditioned_env --gpu 0 --render_in_showcase --showcase --snapshot-dir ./train_amp_heading_humanoid3d_locomotion_results/seed-0/iteration-100000000 +``` + +# Evaluation + +- We tested our implementation with following Author's environments using 3 different initial random seeds: + +### Humanoid3d Imitation task + +- Cartwheel +- Back-Flip + +### Humanoid3d Goal conditioned task + +- Target Location (Locomotion) + +## Result + +The reported scores are rough estimated from the Figure 9 and Figure 10 of the [amp paper](https://arxiv.org/pdf/2104.02180.pdf). +Note that reported scores of this table are normalized to 0 to 1. +As the author mentioned at [this issue](https://github.com/xbpeng/DeepMimic/issues/112), we divided the original score from the enviroment by 600. + +| Imitation Env |nnabla_rl best mean score(normalized) | Reported score(normalized) | +|:---|:---:|:---:| +|Humanoid3d Cartwheel|0.075|~0.15| +|Humanoid3d Backflip|0.132|~0.1| + +| Goal conditioned Env | nnabla_rl best mean score(normalized) | Reported score(normalized) | +|:---|:---:|:---:| +|Humanoid3d Target Location (Locomotion)|0.669|~0.65| + +## Learning curves + +### humanoid3d_backflip + +![humanoid3d_backflip Result](reproduction_results/humanoid3d_backflip_results/result.png) + +### humanoid3d_cartwheel + +![humanoid3d_cartwheel Result](reproduction_results/humanoid3d_cartwheel_results/result.png) + +### humanoid3d_target_location_locomotion + +![target_humanoid3d_locomotion Result](reproduction_results/target_humanoid3d_locomotion_results/result.png) diff --git a/reproductions/algorithms/pybullet/amp/amp_reproduction.py b/reproductions/algorithms/pybullet/amp/amp_reproduction.py new file mode 100644 index 00000000..f54dac22 --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/amp_reproduction.py @@ -0,0 +1,289 @@ +# Copyright 2024 Sony Group Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import os +import pathlib +from typing import Union + +import gym +import numpy as np +from deepmimic_utils.deepmimic_buffer import RandomRemovalReplayBuffer +from deepmimic_utils.deepmimic_env import DeepMimicEnv, DeepMimicGoalEnv, DeepMimicWindowViewer +from deepmimic_utils.deepmimic_evaluator import DeepMimicEpisodicEvaluator +from deepmimic_utils.deepmimic_explorer import DeepMimicExplorer +from deepmimic_utils.deepmimic_normalizer import (DeepMimicGoalTupleRunningMeanNormalizer, + DeepMimicTupleRunningMeanNormalizer) + +import nnabla_rl.algorithms as A +import nnabla_rl.environment_explorers as EE +import nnabla_rl.hooks as H +import nnabla_rl.writers as W +from nnabla_rl.builders import ExplorerBuilder, PreprocessorBuilder, ReplayBufferBuilder +from nnabla_rl.environment_explorer import EnvironmentExplorer +from nnabla_rl.environments.environment_info import EnvironmentInfo +from nnabla_rl.environments.wrappers import FlattenNestedTupleStateWrapper, NumpyFloat32Env +from nnabla_rl.environments.wrappers.goal_conditioned import GoalConditionedTupleObservationEnv +from nnabla_rl.preprocessors.preprocessor import Preprocessor +from nnabla_rl.utils import serializers +from nnabla_rl.utils.reproductions import print_env_info, set_global_seed + + +class DeepMimicTupleStatePreprocessorBuilder(PreprocessorBuilder): + def build_preprocessor(self, scope_name: str, env_info: EnvironmentInfo, # type: ignore[override] + algorithm_config: A.AMPConfig, **kwargs) -> Preprocessor: + assert algorithm_config.state_mean_initializer is not None + assert algorithm_config.state_var_initializer is not None + + if env_info.is_goal_conditioned_env(): + return DeepMimicGoalTupleRunningMeanNormalizer( + scope_name, + policy_state_shape=env_info.state_shape[0], + reward_state_shape=env_info.state_shape[1], + goal_state_shape=env_info.state_shape[3], + policy_state_mean_initializer=np.array(algorithm_config.state_mean_initializer[0], dtype=np.float32), + policy_state_var_initializer=np.array(algorithm_config.state_var_initializer[0], dtype=np.float32), + reward_state_mean_initializer=np.array(algorithm_config.state_mean_initializer[1], dtype=np.float32), + reward_state_var_initializer=np.array(algorithm_config.state_var_initializer[1], dtype=np.float32), + goal_state_mean_initializer=np.array(algorithm_config.state_mean_initializer[3], dtype=np.float32), + goal_state_var_initializer=np.array(algorithm_config.state_var_initializer[3], dtype=np.float32), + epsilon=0.02, + mode_for_floating_point_error="max") + else: + return DeepMimicTupleRunningMeanNormalizer( + scope_name, + policy_state_shape=env_info.state_shape[0], + reward_state_shape=env_info.state_shape[1], + policy_state_mean_initializer=np.array(algorithm_config.state_mean_initializer[0], dtype=np.float32), + policy_state_var_initializer=np.array(algorithm_config.state_var_initializer[0], dtype=np.float32), + reward_state_mean_initializer=np.array(algorithm_config.state_mean_initializer[1], dtype=np.float32), + reward_state_var_initializer=np.array(algorithm_config.state_var_initializer[1], dtype=np.float32), + epsilon=0.02, + mode_for_floating_point_error="max") + + +class DeepMimicExplorerBuilder(ExplorerBuilder): + def build_explorer(self, env_info: EnvironmentInfo, algorithm_config: A.AMPConfig, # type: ignore[override] + algorithm: A.AMP, **kwargs) -> EnvironmentExplorer: + explorer_config = EE.LinearDecayEpsilonGreedyExplorerConfig( + initial_step_num=0, + timelimit_as_terminal=algorithm_config.timelimit_as_terminal, + initial_epsilon=1.0, + final_epsilon=algorithm_config.final_explore_rate, + max_explore_steps=algorithm_config.max_explore_steps, + append_explorer_info=True) + explorer = DeepMimicExplorer(greedy_action_selector=kwargs["greedy_action_selector"], + random_action_selector=kwargs["random_action_selector"], + env_info=env_info, + config=explorer_config) + return explorer + + +class DeepMimicReplayBufferBuilder(ReplayBufferBuilder): + def build_replay_buffer( + self, env_info: EnvironmentInfo, algorithm_config: A.AMPConfig, **kwargs # type: ignore[override] + ) -> RandomRemovalReplayBuffer: + return RandomRemovalReplayBuffer( + capacity=int(np.ceil(algorithm_config.discriminator_agent_replay_buffer_size / algorithm_config.actor_num)) + ) + + +def build_deepmimic_env(args_file_path: str, + goal_conditioned_env: bool, + seed: int, + eval_mode: bool, + print_env: bool, + num_processes: int, + render_env: bool) -> gym.Env: + env: gym.Env + if args_file_path == "FakeAMPNNablaRL-v1": + # NOTE: FakeAMPNNablaRL-v1 is for the algorithm test. + env = gym.make(args_file_path) + else: + if goal_conditioned_env: + env = GoalConditionedTupleObservationEnv(DeepMimicGoalEnv( + args_file_path, eval_mode, num_processes=num_processes, step_until_action_needed=not render_env)) + env = FlattenNestedTupleStateWrapper(env) + else: + env = DeepMimicEnv(args_file_path, eval_mode, num_processes=num_processes, + step_until_action_needed=not render_env) + + # dummy reset for generating core + env.reset() + + if print_env: + print_env_info(env) + + env = NumpyFloat32Env(env) + env.seed(seed) + return env + + +def build_config(args, train_env: Union[DeepMimicEnv, DeepMimicGoalEnv]): + if args.goal_conditioned_env: + observation_mean = tuple([mean.tolist() for mean in train_env.unwrapped.observation_mean["observation"]]) + observation_var = tuple([var.tolist() for var in train_env.unwrapped.observation_var["observation"]]) + desired_goal_mean = tuple([mean.tolist() for mean in train_env.unwrapped.observation_mean["desired_goal"]]) + desired_goal_var = tuple([var.tolist() for var in train_env.unwrapped.observation_var["desired_goal"]]) + achieved_goal_mean = tuple([mean.tolist() for mean in train_env.unwrapped.observation_mean["achieved_goal"]]) + achieved_goal_var = tuple([var.tolist() for var in train_env.unwrapped.observation_var["achieved_goal"]]) + + config = A.AMPConfig(gpu_id=args.gpu, + seed=args.seed, + normalize_action=True, + preprocess_state=True, + use_reward_from_env=True, + gamma=0.99, + action_mean=tuple(train_env.unwrapped.action_mean.tolist()), + action_var=tuple(train_env.unwrapped.action_var.tolist()), + state_mean_initializer=tuple([*observation_mean, *desired_goal_mean, *achieved_goal_mean]), + state_var_initializer=tuple([*observation_var, *desired_goal_var, *achieved_goal_var]), + value_at_task_fail=train_env.unwrapped.reward_at_task_fail / (1.0 - 0.99), + value_at_task_success=train_env.unwrapped.reward_at_task_success / (1.0 - 0.99), + target_value_clip=(train_env.unwrapped.reward_range[0] / (1.0 - 0.99), + train_env.unwrapped.reward_range[1] / (1.0 - 0.99)), + v_function_learning_rate=2e-05, + policy_learning_rate=4e-06, + actor_num=args.actor_num, + actor_timesteps=4096 // args.actor_num, + max_explore_steps=200000000 // args.actor_num) + else: + config = A.AMPConfig(gpu_id=args.gpu, + seed=args.seed, + normalize_action=True, + preprocess_state=True, + gamma=0.95, + action_mean=tuple(train_env.unwrapped.action_mean.tolist()), + action_var=tuple(train_env.unwrapped.action_var.tolist()), + state_mean_initializer=tuple([mean.tolist() + for mean in train_env.unwrapped.observation_mean]), + state_var_initializer=tuple([var.tolist() for var in train_env.unwrapped.observation_var]), + value_at_task_fail=train_env.unwrapped.reward_at_task_fail / (1.0 - 0.95), + value_at_task_success=train_env.unwrapped.reward_at_task_success / (1.0 - 0.95), + target_value_clip=(train_env.unwrapped.reward_range[0] / (1.0 - 0.95), + train_env.unwrapped.reward_range[1] / (1.0 - 0.95)), + actor_num=args.actor_num, + actor_timesteps=4096 // args.actor_num, + max_explore_steps=200000000 // args.actor_num) + return config + + +def run_training(args): + env_name = str(pathlib.Path(args.args_file_path).name).replace('_args.txt', '').replace('train_amp_', '') + outdir = f"{env_name}_results/seed-{args.seed}" + if args.save_dir: + outdir = os.path.join(os.path.abspath(args.save_dir), outdir) + set_global_seed(args.seed) + + train_env = build_deepmimic_env(args.args_file_path, + goal_conditioned_env=args.goal_conditioned_env, + seed=args.seed, + eval_mode=False, + print_env=True, + num_processes=args.actor_num, + render_env=False) + config = build_config(args, train_env) + + amp = A.AMP(train_env, + config=config, + env_explorer_builder=DeepMimicExplorerBuilder(), + state_preprocessor_builder=DeepMimicTupleStatePreprocessorBuilder(), + discriminator_replay_buffer_builder=DeepMimicReplayBufferBuilder()) + + eval_env = build_deepmimic_env(args.args_file_path, + goal_conditioned_env=args.goal_conditioned_env, + seed=args.seed + 100, + eval_mode=True, + print_env=False, + num_processes=1, + render_env=False) + evaluator = DeepMimicEpisodicEvaluator(run_per_evaluation=32) + evaluation_hook = H.EvaluationHook(eval_env, + evaluator, + timing=args.eval_timing, + writer=W.FileWriter(outdir=outdir, file_prefix="evaluation_result")) + iteration_state_hook = H.IterationStateHook( + writer=W.FileWriter(outdir=outdir, file_prefix="iteration_state"), timing=args.iteration_state_timing + ) + + iteration_num_hook = H.IterationNumHook(timing=5000) + save_snapshot_hook = H.SaveSnapshotHook(outdir, timing=args.save_timing) + + hooks = [iteration_num_hook, iteration_state_hook, save_snapshot_hook, evaluation_hook] + amp.set_hooks(hooks) + amp.train_online(train_env, total_iterations=args.total_iterations) + + eval_env.close() + train_env.close() + + +def run_showcase(args): + if args.snapshot_dir is None: + raise ValueError("Please specify the snapshot dir for showcasing") + eval_env = build_deepmimic_env(args.args_file_path, + goal_conditioned_env=args.goal_conditioned_env, + seed=args.seed + 200, + eval_mode=True, + print_env=True, + num_processes=1, + render_env=args.render_in_showcase) + config = build_config(args, eval_env) + amp = serializers.load_snapshot( + args.snapshot_dir, + eval_env, + algorithm_kwargs={"config": config, + "state_preprocessor_builder": DeepMimicTupleStatePreprocessorBuilder()}) + if not isinstance(amp, A.AMP): + raise ValueError("Loaded snapshot is not trained with AMP!") + + if args.render_in_showcase: + viewer = DeepMimicWindowViewer(eval_env, amp.compute_eval_action) + viewer.render(args.showcase_runs) + else: + evaluator = DeepMimicEpisodicEvaluator(run_per_evaluation=args.showcase_runs) + evaluator(amp, eval_env) + + +def main(): + parser = argparse.ArgumentParser() + script_dir = pathlib.Path(__file__).parent + parser.add_argument( + "--args_file_path", + type=str, + default=str(script_dir / "args" / "train_amp_humanoid3d_cartwheel_args.txt"), + ) + parser.add_argument("--goal_conditioned_env", action="store_true") + parser.add_argument("--gpu", type=int, default=0) + parser.add_argument("--seed", type=int, default=0) + parser.add_argument("--showcase", action="store_true") + parser.add_argument("--snapshot-dir", type=str, default=None) + parser.add_argument("--save-dir", type=str, default=None) + parser.add_argument("--actor_num", type=int, default=16) + parser.add_argument("--total_iterations", type=int, default=200000000) + parser.add_argument("--save_timing", type=int, default=1000000) + parser.add_argument("--eval_timing", type=int, default=500000) + parser.add_argument("--iteration_state_timing", type=int, default=100000) + parser.add_argument("--showcase_runs", type=int, default=32) + parser.add_argument("--render_in_showcase", action="store_true") + + args = parser.parse_args() + + if args.showcase: + run_showcase(args) + else: + run_training(args) + + +if __name__ == "__main__": + main() diff --git a/reproductions/algorithms/pybullet/amp/deepmimic_utils/__init__.py b/reproductions/algorithms/pybullet/amp/deepmimic_utils/__init__.py new file mode 100644 index 00000000..7e82ca49 --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/deepmimic_utils/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2024 Sony Group Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/reproductions/algorithms/pybullet/amp/deepmimic_utils/deepmimic_buffer.py b/reproductions/algorithms/pybullet/amp/deepmimic_utils/deepmimic_buffer.py new file mode 100644 index 00000000..882c50cf --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/deepmimic_utils/deepmimic_buffer.py @@ -0,0 +1,70 @@ +# Copyright 2024 Sony Group Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Any, Sequence + +import nnabla_rl as rl +from nnabla_rl.replay_buffer import ReplayBuffer +from nnabla_rl.typing import Experience +from nnabla_rl.utils.data import DataHolder + + +class RandomRemovalBuffer(DataHolder[Any]): + def __init__(self, maxlen: int): + self._buffer = [None for _ in range(maxlen)] + self._maxlen = maxlen + self._length = 0 + + def __len__(self): + return self._length + + def __getitem__(self, index: int): + if index < 0 or index >= len(self): + raise KeyError + return self._buffer[index % self._maxlen] + + def append(self, data): + assert float(data[0][2]) == 1.0 + self.append_with_removed_item_check(data) + + def append_with_removed_item_check(self, data): + if self._length < self._maxlen: + index = self._length + self._length += 1 + elif self._length == self._maxlen: + index = rl.random.drng.choice(self._maxlen) + else: + raise IndexError + removed = self._buffer[index] + self._buffer[index] = data + return removed + + +class RandomRemovalReplayBuffer(ReplayBuffer): + def __init__(self, capacity: int = 100000): + assert capacity is None or capacity >= 0 + self._capacity = capacity + self._buffer = RandomRemovalBuffer(maxlen=capacity) + + def append(self, experience: Experience): + state = experience[0] + assert len(state) == 3 or len(state) == 7 + # NOTE: if state is valid and add it + if float(state[2]) == 1.0: + self._buffer.append(experience) + + def append_all(self, experiences: Sequence[Experience]): + for experience in experiences: + assert len(experience) == 12 + self.append(experience) diff --git a/reproductions/algorithms/pybullet/amp/deepmimic_utils/deepmimic_env.py b/reproductions/algorithms/pybullet/amp/deepmimic_utils/deepmimic_env.py new file mode 100644 index 00000000..03d4e8f2 --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/deepmimic_utils/deepmimic_env.py @@ -0,0 +1,454 @@ +# Copyright 2024 Sony Group Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pathlib +from typing import Callable, Optional, cast + +import gym +import numpy as np +from gym.envs.registration import EnvSpec + +from nnabla_rl.environments.amp_env import AMPEnv, AMPGoalEnv, TaskResult +from nnabla_rl.typing import Experience + +import sys # noqa +sys.path.append(str(pathlib.Path(__file__).parent)) # noqa +from deepmimic_env_utils import (update_core_for_num_substeps, initialize_env, compile_observation, # noqa + generate_dummy_goal_env_state, compile_goal_env_observation, + load_goal_env_observation_and_action_space, load_observation_and_action_space, + record_invalid_or_valid_state, label_task_result) + +try: + sys.path.append(str(pathlib.Path(__file__).parent.parent / "DeepMimic")) # noqa + from DeepMimicCore import DeepMimicCore # noqa +except ModuleNotFoundError: + from nnabla_rl.logger import logger + logger.info("No DeepMimicCore file. Please build the DeepMimic environment and generate the python file.") + +try: + from OpenGL.GLUT import (GLUT_DEPTH, GLUT_DOUBLE, GLUT_ELAPSED_TIME, GLUT_RGBA, glutCreateWindow, glutDisplayFunc, + glutGet, glutInit, glutInitDisplayMode, glutInitWindowSize, glutKeyboardFunc, + glutLeaveMainLoop, glutMainLoop, glutMotionFunc, glutMouseFunc, glutPostRedisplay, + glutReshapeFunc, glutSwapBuffers, glutTimerFunc) +except ModuleNotFoundError: + from nnabla_rl.logger import logger + logger.info("No OpenGL lib. Please build the DeepMimic environment and generate the python file, " + "OpenGL lib is installed automatically.") + + +class DeepMimicEnv(AMPEnv): + unwrapped: "DeepMimicEnv" + + def __init__(self, args_file: str, eval_mode: bool, + fps: int = 60, num_processes: int = 1, step_until_action_needed: bool = True) -> None: + assert fps > 0 + assert num_processes > 0 + + self._args_file = args_file + self._eval_mode = eval_mode + self._step_until_action_needed = step_until_action_needed + self._num_processes = num_processes + self._update_timesteps = 1.0 / float(fps) + self._agent_id = 0 # NOTE: agent id is always 0. + self._total_valid_step_count = 0 + self._seed = None + self._initialized = False + self._action_needed = True + + (self.reward_range, + self.observation_space, + self.observation_mean, + self.observation_var, + self.action_space, + self.action_mean, + self.action_var, + self.reward_at_task_fail, + self.reward_at_task_success) = self._reward_range_state_and_action_space() + self.spec = EnvSpec(pathlib.Path(args_file).name.replace('train_amp_', '').replace('_args.txt', '-v0')) + + super().__init__() + + def reset(self): + if not self._initialized: + self._core = initialize_env(self._args_file, self._agent_id, seed=self._seed) + self._total_valid_step_count = 0 + self._initialized = True + + self._num_timesteps = 0 + self._action_needed = True + self._core.Reset() + # 0 means TRAIN and 1 means TEST + # See: https://github.com/xbpeng/DeepMimic/blob/master/DeepMimicCore/scenes/RLScene.h#L11 + if self._eval_mode: + self._core.SetMode(1) + else: + self._core.SetMode(0) + + assert self._core.NeedNewAction(self._agent_id) + return compile_observation(self._core, self._num_timesteps, self._agent_id) + + def render(self): + raise NotImplementedError("Use DeepMimicEnvViewer instead of calling render().") + + def seed(self, seed=None): + self._seed = seed + super().seed(seed) + # NOTE: Need to regenerate env to apply the random seed. + self._core = initialize_env(self._args_file, self._agent_id, seed=self._seed) + return [seed] + + def task_result(self, state, reward, done, info) -> TaskResult: + return cast(TaskResult, label_task_result(state, reward, done, info)) + + def is_valid_episode(self, state, reward, done, info) -> bool: + valid_episode = info.pop("_valid_episode") + return cast(bool, valid_episode) + + def expert_experience(self, state, reward, done, info) -> Experience: + amp_expert_state = np.array(self._core.RecordAMPObsExpert(self._agent_id), dtype=np.float32) + expert_state = list(map(lambda v: v * 0.0, self.observation_space.sample())) + assert expert_state[1].shape == amp_expert_state.shape + expert_state[1] = amp_expert_state.copy() + expert_state[2] = record_invalid_or_valid_state(self._num_timesteps) + dummy_action = 0.0 * self.action_space.sample() + dummy_next_state = list(map(lambda v: v * 0.0, self.observation_space.sample())) + return tuple(expert_state), dummy_action, 0.0, False, tuple(dummy_next_state), {} + + def update_sample_counts(self): + # NOTE: In the deepmimic environment, the sample counts should be the total number + # of valid steps across all processes. + # Instead of obtaining the number of valid steps from other processes and summing them, + # multiply self._num_processes and estimate the approximate value. + self._core.SetSampleCount(self._num_processes * self._total_valid_step_count) + + def _step(self, action): + self._num_timesteps += 1 + if self._action_needed: + self._core.SetAction(self._agent_id, np.array(action, dtype=np.float32).tolist()) + + done, info = update_core_for_num_substeps(until_action_needed=self._step_until_action_needed, + core=self._core, update_timesteps=self._update_timesteps, + agent_id=self._agent_id) + self._action_needed = info["action_needed"] + next_state = compile_observation(self._core, self._num_timesteps, self._agent_id) + + reward = self._core.CalcReward(self._agent_id) + + if done and info["_valid_episode"]: + self._total_valid_step_count += self._num_timesteps + + return next_state, reward, done, info + + def _reward_range_state_and_action_space(self): + dummy_core = DeepMimicCore.cDeepMimicCore(False) + dummy_core.ParseArgs(["--arg_file", self._args_file]) + dummy_core.Init() + assert dummy_core.GetGoalSize(self._agent_id) == 0, "This env has a goal! Use DeepMimicGoalEnv." + + (observation_space, + observation_mean, + observation_var, + action_space, + action_mean, + action_var, + reward_at_task_fail, + reward_at_task_success) = load_observation_and_action_space(dummy_core, self._agent_id) + reward_range = (dummy_core.GetRewardMin(self._agent_id), dummy_core.GetRewardMax(self._agent_id)) + + return (reward_range, + observation_space, + observation_mean, + observation_var, + action_space, + action_mean, + action_var, + reward_at_task_fail, + reward_at_task_success) + + +class DeepMimicGoalEnv(AMPGoalEnv): + unwrapped: "DeepMimicGoalEnv" + + def __init__(self, args_file: str, eval_mode: bool, + fps: int = 60, num_processes: int = 1, step_until_action_needed: bool = True) -> None: + assert fps > 0 + assert num_processes > 0 + + self._args_file = args_file + self._eval_mode = eval_mode + self._step_until_action_needed = step_until_action_needed + self._num_processes = num_processes + self._update_timesteps = 1.0 / float(fps) + self._agent_id = 0 # NOTE: agent id is always 0. + self._total_valid_step_count = 0 + self._seed = None + self._initialized = False + self._action_needed = True + + (self.reward_range, + self.observation_space, + self.observation_mean, + self.observation_var, + self.action_space, + self.action_mean, + self.action_var, + self.reward_at_task_fail, + self.reward_at_task_success) = self._reward_range_state_and_action_space() + assert self.reward_at_task_fail < self.reward_at_task_success + self.spec = EnvSpec(pathlib.Path(args_file).name.replace('train_amp_', '').replace('_args.txt', '-v0')) + + super().__init__() + + def reset(self): + if not self._initialized: + self._core = initialize_env(self._args_file, self._agent_id, seed=self._seed) + assert self._core.EnableAMPTaskReward() + self._total_valid_step_count = 0 + self._initialized = True + + self._num_timesteps = 0 + self._action_needed = True + self._core.Reset() + # 0 means TRAIN and 1 means TEST + # See: https://github.com/xbpeng/DeepMimic/blob/master/DeepMimicCore/scenes/RLScene.h#L11 + if self._eval_mode: + self._core.SetMode(1) + else: + self._core.SetMode(0) + + assert self._core.NeedNewAction(self._agent_id) + return compile_goal_env_observation(self._core, self._num_timesteps, self._agent_id) + + def render(self): + raise NotImplementedError("Use DeepMimicEnvViewer instead of calling render().") + + def seed(self, seed=None): + self._seed = seed + super().seed(seed) + # Need to regenerate env to apply the random seed. + self._core = initialize_env(self._args_file, self._agent_id, seed=self._seed) + self._initialized = True + return [seed] + + def compute_reward(self, achieved_goal, desired_goal, info): + # NOTE: In deepmimic env, reward is computed intenally. + return self._core.CalcReward(self._agent_id) + + def task_result(self, state, reward, done, info) -> TaskResult: + return cast(TaskResult, label_task_result(state, reward, done, info)) + + def is_valid_episode(self, state, reward, done, info) -> bool: + valid_episode = info.pop("_valid_episode") + return cast(bool, valid_episode) + + def expert_experience(self, state, reward, done, info) -> Experience: + expert_state_and_next_state = np.array(self._core.RecordAMPObsExpert(self._agent_id), dtype=np.float32) + state = list(generate_dummy_goal_env_state(self.observation_space)) + assert state[1].shape == expert_state_and_next_state.shape + state[1] = expert_state_and_next_state.copy() + state[2] = record_invalid_or_valid_state(self._num_timesteps) + dummy_action = 0.0 * self.action_space.sample() + dummy_next_state = generate_dummy_goal_env_state(self.observation_space) + return tuple(state), dummy_action, 0.0, False, tuple(dummy_next_state), {} + + def update_sample_counts(self): + # NOTE: In the deepmimic goal environment, the sample counts should be the total number + # of valid steps across all processes. + # Instead of obtaining the number of valid steps from other processes and summing them, + # multiply self._num_processes and estimate the approximate value. + self._core.SetSampleCount(self._num_processes * self._total_valid_step_count) + + def _step(self, action): + self._num_timesteps += 1 + if self._action_needed: + self._core.SetAction(self._agent_id, np.array(action, dtype=np.float32).tolist()) + + done, info = update_core_for_num_substeps(until_action_needed=self._step_until_action_needed, + core=self._core, update_timesteps=self._update_timesteps, + agent_id=self._agent_id) + self._action_needed = info["action_needed"] + next_state = compile_goal_env_observation(self._core, self._num_timesteps, self._agent_id) + + reward = self.compute_reward(next_state["achieved_goal"], next_state["desired_goal"], info) + + if done and info["_valid_episode"]: + self._total_valid_step_count += self._num_timesteps + + return next_state, reward, done, info + + def _reward_range_state_and_action_space(self): + dummy_core = DeepMimicCore.cDeepMimicCore(False) + dummy_core.ParseArgs(["--arg_file", self._args_file]) + dummy_core.Init() + assert dummy_core.GetGoalSize(self._agent_id) != 0, "This env does not have a goal! Use DeepMimicEnv." + + (observation_space, + observation_mean, + observation_var, + action_space, + action_mean, + action_var, + reward_at_task_fail, + reward_at_task_success) = load_goal_env_observation_and_action_space(dummy_core, self._agent_id) + reward_range = (dummy_core.GetRewardMin(self._agent_id), dummy_core.GetRewardMax(self._agent_id)) + + return (reward_range, + observation_space, + observation_mean, + observation_var, + action_space, + action_mean, + action_var, + reward_at_task_fail, + reward_at_task_success) + + +class DeepMimicWindowViewer: + def __init__(self, + env: gym.Env, + policy_callback_function: Optional[Callable[[np.ndarray, np.ndarray], np.ndarray]] = None, + width: int = 800, + height: int = 450, + playback_speed: int = 1) -> None: + self._env = env + assert isinstance(env.unwrapped, DeepMimicEnv) or isinstance(env.unwrapped, DeepMimicGoalEnv) + self._env_unwrapped = env.unwrapped + self._width = width + self._height = height + self._update_timesteps = self._env_unwrapped._update_timesteps + self._display_anim_time = int(1000.0 * self._env_unwrapped._update_timesteps) + self._playback_speed = playback_speed + self._reshaping = False + self._action_needed = True + self._initial_step = True + self._prev_time = 0.0 + self._updates_per_sec = 0 + self._current_episodes = 0 + self._policy_callback_function = policy_callback_function + + # NOTE: Create window first, then rendering should be enabled. + self._initialize_window() + self._core = initialize_env(self._env_unwrapped._args_file, self._env_unwrapped._agent_id, + seed=self._env_unwrapped._seed, enable_window_view=True) + self._env_unwrapped._core = self._core # Force to overwrite core + self._setup_draw() + + def render(self, num_episodes: int): + self._prev_time = glutGet(GLUT_ELAPSED_TIME) + self._num_episodes = num_episodes + glutMainLoop() + + def _initialize_window(self): + glutInit() + glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH) + glutInitWindowSize(self._width, self._height) + glutCreateWindow(b"DeepMimic") + + def _setup_draw(self): + glutDisplayFunc(self._draw) + glutReshapeFunc(self._reshape) + glutKeyboardFunc(self._keyboard) + glutMouseFunc(self._mouse_click) + glutMotionFunc(self._mouse_move) + glutTimerFunc(self._display_anim_time, self._animate, 0) + + self._reshape(self._width, self._height) + self._core.Reshape(self._width, self._height) + + def _draw(self): + self._update_intermediate_buffer() + self._core.Draw() + glutSwapBuffers() + self._reshaping = False + + def _reshape(self, width, height): + self._width = width + self._height = height + self._reshaping = True + + glutPostRedisplay() + + def _mouse_click(self, button, state, x, y): + self._core.MouseClick(button, state, x, y) + glutPostRedisplay() + + def _mouse_move(self, x, y): + self._core.MouseMove(x, y) + glutPostRedisplay() + + def _keyboard(self, key, x, y): + key_val = int.from_bytes(key, byteorder="big") + self._core.Keyboard(key_val, x, y) + + if (key == b"r"): + self._state = self._env.reset() + self._initial_step = False + + glutPostRedisplay() + + def _update_intermediate_buffer(self): + if not (self._reshaping): + if self._width != self._core.GetWinWidth() or self._height != self._core.GetWinHeight(): + self._core.Reshape(self._width, self._height) + + def _animate(self, callback_val): + counter_decay = 0 + + num_steps = 1 + curr_time = glutGet(GLUT_ELAPSED_TIME) + time_elapsed = curr_time - self._prev_time + self._prev_time = curr_time + + done = self._update_env() + + update_count = num_steps / (0.001 * time_elapsed) + if np.isfinite(update_count): + self._updates_per_sec = counter_decay * self._updates_per_sec + (1 - counter_decay) * update_count + self._core.SetUpdatesPerSec(self._updates_per_sec) + + timer_step = self._calc_display_anim_time(num_steps) + update_dur = glutGet(GLUT_ELAPSED_TIME) - curr_time + timer_step -= update_dur + timer_step = np.maximum(timer_step, 0) + + glutTimerFunc(int(timer_step), self._animate, 0) + glutPostRedisplay() + + if done: + self._initial_step = True + self._shutdown() + self._current_episodes += 1 + if self._current_episodes >= self._num_episodes: + self._current_episodes = 0 + glutLeaveMainLoop() + + def _shutdown(self): + self._core.Shutdown() + + def _calc_display_anim_time(self, num_timestes): + anim_time = int(self._display_anim_time * num_timestes / self._playback_speed) + anim_time = np.abs(anim_time) + return anim_time + + def _update_env(self): + if self._initial_step: + self._state = self._env.reset() + self._initial_step = False + + if self._action_needed: + self._action = self._policy_callback_function(self._state) + + self._state, reward, done, info = self._env.step(self._action) + self._action_needed = info["action_needed"] + return done diff --git a/reproductions/algorithms/pybullet/amp/deepmimic_utils/deepmimic_env_utils.py b/reproductions/algorithms/pybullet/amp/deepmimic_utils/deepmimic_env_utils.py new file mode 100644 index 00000000..a9ea5784 --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/deepmimic_utils/deepmimic_env_utils.py @@ -0,0 +1,251 @@ +# Copyright 2024 Sony Group Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pathlib +from typing import Any, Dict, List, Optional, Tuple + +import gym +import gym.spaces +import numpy as np +from gym import spaces + +from nnabla_rl.environments.amp_env import TaskResult +from nnabla_rl.typing import State + +import sys # noqa +try: + sys.path.append(str(pathlib.Path(__file__).parent.parent / "DeepMimic")) # noqa + from DeepMimicCore import DeepMimicCore # noqa +except ModuleNotFoundError: + from nnabla_rl.logger import logger + logger.info("No DeepMimicCore file. Please build the DeepMimic environment and generate the python file.") + + +def update_core(core: "DeepMimicCore.cDeepMimicCore", update_timesteps: int, agent_id: int + ) -> Tuple[bool, bool, Dict[str, bool]]: + num_substeps = core.GetNumUpdateSubsteps() + timestep = float(update_timesteps) / float(num_substeps) + num_steps = 0 + for _ in range(num_substeps): + core.Update(timestep) + num_steps += 1 + valid_episode = core.CheckValidEpisode() + + if not valid_episode: + return False, True, {"_valid_episode": valid_episode, "_task_fail": False, "_task_success": False} + + if core.IsEpisodeEnd(): + terminate = core.CheckTerminate(agent_id) + # 0 is Null, 1 is Fail and 2 is Success + # See: https://github.com/xbpeng/DeepMimic/blob/70e7c6b22b775bb9342d4e15e6ef0bd91a55c6c0/env/env.py#L7 + return False, True, {"_valid_episode": valid_episode, + "_task_fail": True if terminate == 1 else False, + "_task_success": True if terminate == 2 else False} + + if core.NeedNewAction(agent_id): + assert num_steps >= num_substeps + return True, False, {"_valid_episode": valid_episode, "_task_fail": False, "_task_success": False} + + return False, False, {"_valid_episode": valid_episode, "_task_fail": False, "_task_success": False} + + +def update_core_for_num_substeps(until_action_needed: bool, core: "DeepMimicCore.cDeepMimicCore", + update_timesteps: int, agent_id: int) -> Tuple[bool, Dict[str, Any]]: + if until_action_needed: + action_needed = False + done = False + while (not action_needed) and (not done): + action_needed, done, info = update_core(core, update_timesteps, agent_id) + else: + action_needed, done, info = update_core(core, update_timesteps, agent_id) + + info["action_needed"] = action_needed + return done, info + + +def record_invalid_or_valid_state(num_timesteps: int) -> np.ndarray: + return np.array([1.0 if num_timesteps > 0.0 else 0.0], dtype=np.float32) + + +def compile_observation(core: "DeepMimicCore.cDeepMimicCore", num_timesteps: int, agent_id: int) -> State: + if num_timesteps == 0: + # In an initial step, a dummy state given as the concatenated st and st+1. + dummy_state = np.zeros(core.GetAMPObsSize(), dtype=np.float32) + return (np.array(core.RecordState(agent_id), dtype=np.float32), + dummy_state, + record_invalid_or_valid_state(num_timesteps)) + else: + return (np.array(core.RecordState(agent_id), dtype=np.float32), + np.array(core.RecordAMPObsAgent(agent_id), dtype=np.float32), + record_invalid_or_valid_state(num_timesteps)) + + +def compile_goal_env_observation(core: "DeepMimicCore.cDeepMimicCore", num_timesteps: int, agent_id: int + ) -> Dict[str, State]: + observation = compile_observation(core, num_timesteps, agent_id) + goal_env_observation = {"observation": observation, + "desired_goal": (np.array(core.RecordGoal(agent_id), dtype=np.float32), + np.ones((1,), dtype=np.float32)), + # not use an achieved goal + "achieved_goal": (np.array(core.RecordGoal(agent_id), dtype=np.float32) * 0.0, + np.zeros((1,), dtype=np.float32))} + return goal_env_observation + + +def generate_dummy_goal_env_state(observation_space: gym.spaces.Dict) -> State: + state: List[np.ndarray] = [] + sample = observation_space.sample() + for key in ["observation", "desired_goal", "achieved_goal"]: + s = sample[key] + if isinstance(s, tuple): + state.extend(s) + else: + state.append(s) + state = list(map(lambda v: v * 0.0, state)) + assert len(state) == 7 + return tuple(state) + + +def label_task_result(state, reward, done, info) -> TaskResult: + task_success = info.pop("_task_success") + task_fail = info.pop("_task_fail") + if task_success: + return TaskResult.SUCCESS + elif task_fail: + return TaskResult.FAIL + else: + return TaskResult.UNKNOWN + + +def initialize_env(args_file: str, agent_id: int, + enable_window_view: bool = False, seed: Optional[int] = None) -> "DeepMimicCore.cDeepMimicCore": + core = DeepMimicCore.cDeepMimicCore(enable_window_view) + if seed is not None: + core.SeedRand(seed) + + core.ParseArgs(["--arg_file", args_file]) + core.Init() + core.SetPlaybackSpeed(1) + + # Build all settings + core.BuildStateNormGroups(agent_id) + core.BuildStateOffset(agent_id) + core.BuildStateScale(agent_id) + + if core.GetGoalSize(agent_id) != 0: + core.BuildGoalNormGroups(agent_id) + core.BuildGoalOffset(agent_id) + core.BuildGoalScale(agent_id) + + core.BuildActionOffset(agent_id) + core.BuildActionScale(agent_id) + core.BuildActionBoundMax(agent_id) + core.BuildActionBoundMin(agent_id) + return core + + +def load_observation_and_action_space(dummy_core: "DeepMimicCore.cDeepMimicCore", + agent_id: int) -> Tuple[gym.Space, Tuple[np.ndarray, ...], Tuple[np.ndarray, ...], + gym.Space, np.ndarray, + np.ndarray, float, float]: + action_space = spaces.Box( + low=np.array(dummy_core.BuildActionBoundMin(agent_id), dtype=np.float32), + high=np.array(dummy_core.BuildActionBoundMax(agent_id), dtype=np.float32), + shape=(dummy_core.GetActionSize(agent_id),), + dtype=np.float32, + ) + # observation for policy and v function + # observation for discriminator + # DeepMimic env returns the concatenated st and st+1. + # valid or invalid + observation_space = spaces.Tuple([spaces.Box(low=-np.inf, # type: ignore + high=np.inf, + shape=(dummy_core.GetStateSize(agent_id),), + dtype=np.float32), + spaces.Box(low=-np.inf, + high=np.inf, + shape=(dummy_core.GetAMPObsSize(),), + dtype=np.float32), + spaces.Box(low=0.0, + high=1.0, + shape=(1,), + dtype=np.float32)]) + # Offset means default + offset, so mean is negative of the offset. + obs_for_policy_mean = -1.0 * np.array(dummy_core.BuildStateOffset(agent_id), dtype=np.float32) + obs_for_policy_var = (1.0 / np.array(dummy_core.BuildStateScale(agent_id), dtype=np.float32)) ** 2 + obs_for_reward_mean = -1.0 * np.array(dummy_core.GetAMPObsOffset(), dtype=np.float32) + obs_for_reward_var = (1.0 / np.array(dummy_core.GetAMPObsScale(), dtype=np.float32)) ** 2 + observation_mean = (obs_for_policy_mean, obs_for_reward_mean, np.zeros((1,), dtype=np.float32)) + observation_var = (obs_for_policy_var, obs_for_reward_var, np.ones((1,), dtype=np.float32)) + action_mean = -1.0 * np.array(dummy_core.BuildActionOffset(agent_id), dtype=np.float32) + action_var = (1.0 / np.array(dummy_core.BuildActionScale(agent_id), dtype=np.float32)) ** 2 + reward_at_task_fail = float(dummy_core.GetRewardFail(agent_id)) + reward_at_task_success = float(dummy_core.GetRewardSucc(agent_id)) + return (observation_space, + observation_mean, + observation_var, + action_space, + action_mean, + action_var, + reward_at_task_fail, + reward_at_task_success) + + +def load_goal_env_observation_and_action_space(dummy_core: "DeepMimicCore.cDeepMimicCore", agent_id: int + ) -> Tuple[gym.Space, Dict[str, Tuple[np.ndarray, ...]], + Dict[str, Tuple[np.ndarray, ...]], + gym.Space, np.ndarray, np.ndarray, + float, float]: + assert dummy_core.GetGoalSize(agent_id) != 0, "This env does not have a goal! Use DeepMimicEnv." + (observation_space, + observation_mean, + observation_var, + action_space, + action_mean, + action_var, + reward_at_task_fail, + reward_at_task_success) = load_observation_and_action_space(dummy_core, agent_id) + # Add goal state to observation space + goal_state_space = spaces.Tuple([spaces.Box(low=-np.inf, # type: ignore[operator] + high=np.inf, + shape=(dummy_core.GetGoalSize(agent_id),), + dtype=np.float32), + # valid or invalid + spaces.Box(low=0.0, + high=1.0, + shape=(1,), + dtype=np.float32)]) + goal_env_observation_space = spaces.Dict({"observation": observation_space, + "desired_goal": goal_state_space, + "achieved_goal": goal_state_space}) + # Offset means default + offset, so mean is negative of the offset. + obs_for_goal_mean = (-1.0 * np.array(dummy_core.BuildGoalOffset(agent_id), dtype=np.float32), + np.zeros((1,), dtype=np.float32)) + obs_for_goal_var = ((1.0 / np.array(dummy_core.BuildGoalScale(agent_id), dtype=np.float32)) ** 2, + np.ones((1,), dtype=np.float32)) + + goal_env_observation_mean = {"observation": observation_mean, + "desired_goal": obs_for_goal_mean, + "achieved_goal": obs_for_goal_mean} + goal_env_observation_var = {"observation": observation_var, + "desired_goal": obs_for_goal_var, + "achieved_goal": obs_for_goal_var} + return (goal_env_observation_space, + goal_env_observation_mean, + goal_env_observation_var, + action_space, + action_mean, + action_var, + reward_at_task_fail, + reward_at_task_success) diff --git a/reproductions/algorithms/pybullet/amp/deepmimic_utils/deepmimic_evaluator.py b/reproductions/algorithms/pybullet/amp/deepmimic_utils/deepmimic_evaluator.py new file mode 100644 index 00000000..03f64bfa --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/deepmimic_utils/deepmimic_evaluator.py @@ -0,0 +1,42 @@ +# Copyright 2024 Sony Group Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import List, Union + +from nnabla_rl.environments.amp_env import AMPEnv, AMPGoalEnv +from nnabla_rl.logger import logger +from nnabla_rl.utils.evaluator import run_one_episode + + +class DeepMimicEpisodicEvaluator: + def __init__(self, run_per_evaluation: int = 32): + self._num_episodes = run_per_evaluation + + def __call__(self, algorithm, env: Union[AMPEnv, AMPGoalEnv]) -> List[float]: + returns: List[float] = [] + while len(returns) < self._num_episodes: + reward_sum, timesteps, experiences = run_one_episode(algorithm, env) + state, action, reward, non_terminal, next_state, info = experiences[-1] + # the last element is always done + assert not non_terminal + # the info of last element should have valid_episode key + assert "valid_episode" in info + + if info["valid_episode"]: + returns.append(reward_sum) + logger.info("Finished evaluation run: #{} out of {}. Total reward: {}".format( + len(returns), self._num_episodes, reward_sum)) + else: + logger.info("Invalid episode. Skip to add this episode to evaluation") + return returns diff --git a/reproductions/algorithms/pybullet/amp/deepmimic_utils/deepmimic_explorer.py b/reproductions/algorithms/pybullet/amp/deepmimic_utils/deepmimic_explorer.py new file mode 100644 index 00000000..bdb96cd6 --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/deepmimic_utils/deepmimic_explorer.py @@ -0,0 +1,80 @@ +# Copyright 2024 Sony Group Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import List, Union, cast + +import gym + +from nnabla_rl.environment_explorer import EnvironmentExplorer, EnvironmentExplorerConfig +from nnabla_rl.environment_explorers.epsilon_greedy_explorer import (LinearDecayEpsilonGreedyExplorer, + LinearDecayEpsilonGreedyExplorerConfig) +from nnabla_rl.environments.amp_env import AMPEnv, AMPGoalEnv +from nnabla_rl.environments.environment_info import EnvironmentInfo +from nnabla_rl.typing import ActionSelector, Experience, State + + +class ExploreUntilValidEnvironmentExplorer(EnvironmentExplorer): + def __init__(self, env_info: EnvironmentInfo, config: EnvironmentExplorerConfig = EnvironmentExplorerConfig()): + super().__init__(env_info, config) + + def step(self, env: gym.Env, n: int = 1, break_if_done: bool = False) -> List[Experience]: + if break_if_done: + raise ValueError("DeepMimic Env Explore does not support break_if_done") + + assert 0 < n + + experiences: List[Experience] = [] + if self._state is None: + self._state = cast(State, env.reset()) + + while len(experiences) < n: + # Instead of using step once, rollout episode and check if the episode is valid. + tmp_experiences = self.rollout(env) + _, _, _, non_terminal, _, extra_info = tmp_experiences[-1] + + # the last element is always done + assert not non_terminal + # the info of last element should have valid_episode key + assert "valid_episode" in extra_info + + if extra_info["valid_episode"]: + experiences.extend(tmp_experiences) + else: + # Do not count steps if its not valid episode. + self._steps -= len(tmp_experiences) + + self._begin_of_episode = not non_terminal + + return experiences + + +class DeepMimicExplorer(LinearDecayEpsilonGreedyExplorer, ExploreUntilValidEnvironmentExplorer): + def __init__(self, + greedy_action_selector: ActionSelector, + random_action_selector: ActionSelector, + env_info: EnvironmentInfo, + config: LinearDecayEpsilonGreedyExplorerConfig = LinearDecayEpsilonGreedyExplorerConfig()): + super().__init__( + env_info=env_info, + config=config, + greedy_action_selector=greedy_action_selector, + random_action_selector=random_action_selector, + ) + + def step(self, env: gym.Env, n: int = 1, break_if_done: bool = False): + experiences = super().step(env, n, break_if_done) + assert isinstance(env.unwrapped, AMPEnv) or isinstance(env.unwrapped, AMPGoalEnv) + casted_env = cast(Union[AMPEnv, AMPGoalEnv], env) + casted_env.update_sample_counts() + return experiences diff --git a/reproductions/algorithms/pybullet/amp/deepmimic_utils/deepmimic_normalizer.py b/reproductions/algorithms/pybullet/amp/deepmimic_utils/deepmimic_normalizer.py new file mode 100644 index 00000000..68b66471 --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/deepmimic_utils/deepmimic_normalizer.py @@ -0,0 +1,117 @@ +# Copyright 2024 Sony Group Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import List, Tuple + +import numpy as np + +from nnabla_rl.models.model import Model +from nnabla_rl.preprocessors.preprocessor import Preprocessor +from nnabla_rl.preprocessors.running_mean_normalizer import RunningMeanNormalizer + + +class DeepMimicTupleRunningMeanNormalizer(Preprocessor, Model): + _normalizers: List[RunningMeanNormalizer] + + def __init__(self, + scope_name: str, + policy_state_shape: Tuple[Tuple[int, ...], ...], + reward_state_shape: Tuple[Tuple[int, ...], ...], + policy_state_mean_initializer: np.ndarray, + policy_state_var_initializer: np.ndarray, + reward_state_mean_initializer: np.ndarray, + reward_state_var_initializer: np.ndarray, + epsilon: float = 1e-2, + mode_for_floating_point_error: str = "max"): + super(DeepMimicTupleRunningMeanNormalizer, self).__init__(scope_name) + + self._normalizers = [] + policy_state_normalizer = RunningMeanNormalizer(scope_name + "/policy_state", + shape=policy_state_shape, + epsilon=epsilon, + mode_for_floating_point_error=mode_for_floating_point_error, + mean_initializer=policy_state_mean_initializer, + var_initializer=policy_state_var_initializer) + reward_state_normalizer = RunningMeanNormalizer(scope_name + "/reward_state", + shape=reward_state_shape, + epsilon=epsilon, + mode_for_floating_point_error=mode_for_floating_point_error, + mean_initializer=reward_state_mean_initializer, + var_initializer=reward_state_var_initializer) + self._normalizers = [policy_state_normalizer, reward_state_normalizer] + + def process(self, x): + assert len(x) == 3 + normalized_policy_state = self._normalizers[0].process(x[0]) + normalized_reward_state = self._normalizers[1].process(x[1]) + return (normalized_policy_state, normalized_reward_state, x[2]) + + def update(self, data): + assert len(data) == 3 + self._normalizers[0].update(np.array(data[0], dtype=np.float32)) + # NOTE: Only use valid reward state + mask = (data[2] == 1.0).flatten() + self._normalizers[1].update(np.array(data[1][mask], dtype=np.float32)) + + +class DeepMimicGoalTupleRunningMeanNormalizer(DeepMimicTupleRunningMeanNormalizer): + _normalizers: List[RunningMeanNormalizer] + + def __init__(self, + scope_name: str, + policy_state_shape: Tuple[Tuple[int, ...], ...], + reward_state_shape: Tuple[Tuple[int, ...], ...], + goal_state_shape: Tuple[Tuple[int, ...], ...], + policy_state_mean_initializer: np.ndarray, + policy_state_var_initializer: np.ndarray, + reward_state_mean_initializer: np.ndarray, + reward_state_var_initializer: np.ndarray, + goal_state_mean_initializer: np.ndarray, + goal_state_var_initializer: np.ndarray, + epsilon: float = 1e-2, + mode_for_floating_point_error: str = "max"): + super().__init__(scope_name, + policy_state_shape, + reward_state_shape, + policy_state_mean_initializer, + policy_state_var_initializer, + reward_state_mean_initializer, + reward_state_var_initializer, + epsilon, + mode_for_floating_point_error) + goal_state_normalizer = RunningMeanNormalizer(scope_name + "/goal_state", + shape=goal_state_shape, + epsilon=epsilon, + mode_for_floating_point_error=mode_for_floating_point_error, + mean_initializer=goal_state_mean_initializer, + var_initializer=goal_state_var_initializer) + self._normalizers.append(goal_state_normalizer) + + def process(self, x): + assert len(x) == 7 + normalized_policy_state = self._normalizers[0].process(x[0]) + normalized_reward_state = self._normalizers[1].process(x[1]) + normalized_goal_state = self._normalizers[2].process(x[3]) + return (normalized_policy_state, normalized_reward_state, x[2], normalized_goal_state, x[4], x[5], x[6]) + + def update(self, data): + assert len(data) == 7 + self._normalizers[0].update(np.array(data[0], dtype=np.float32)) + # NOTE: Only use valid reward state + mask = (data[2] == 1.0).flatten() + self._normalizers[1].update(np.array(data[1][mask], dtype=np.float32)) + + # NOTE: In deepmimic env, expert goals are dummy, so skip to use it. + if np.all(data[4] == 1.0): + self._normalizers[2].update(np.array(data[3], dtype=np.float32)) diff --git a/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/evaluation_result_average_scalar.tsv b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/evaluation_result_average_scalar.tsv new file mode 100644 index 00000000..1d652651 --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/evaluation_result_average_scalar.tsv @@ -0,0 +1,201 @@ +iteration mean std_dev min max median +500000 583.570 7.019 562.456 595.740 584.458 +1000000 580.980 9.264 545.730 596.244 580.784 +1500000 582.436 8.095 561.848 595.211 582.756 +2000000 581.645 7.951 562.126 595.146 581.411 +2500000 583.616 6.890 565.757 595.129 585.707 +3000000 581.971 8.525 556.257 594.021 583.373 +3500000 582.261 7.994 562.835 594.297 584.087 +4000000 580.727 8.510 552.543 594.028 581.984 +4500000 580.928 8.006 558.441 594.751 580.737 +5000000 579.852 10.069 547.981 594.629 581.825 +5500000 579.327 9.842 552.966 593.972 581.976 +6000000 580.295 7.371 562.660 593.900 579.644 +6500000 579.913 7.446 561.850 593.874 580.550 +7000000 580.475 7.327 565.016 593.805 580.763 +7500000 579.161 7.040 561.549 593.217 580.595 +8000000 578.196 8.035 555.867 593.662 578.591 +8500000 577.763 7.324 557.799 592.260 578.659 +9000000 577.009 9.082 551.667 590.112 579.197 +9500000 577.131 9.803 544.968 596.404 577.779 +10000000 576.293 9.754 550.143 595.562 577.434 +10500000 577.509 8.780 552.718 591.314 578.178 +11000000 576.848 9.480 550.891 589.935 579.021 +11500000 577.929 8.091 551.979 589.832 579.476 +12000000 577.168 9.127 535.574 589.828 579.436 +12500000 578.424 8.179 556.165 589.605 579.919 +13000000 578.091 7.978 562.021 589.509 579.988 +13500000 576.342 9.044 546.694 589.749 577.557 +14000000 577.468 8.900 541.172 589.575 579.102 +14500000 576.316 8.216 557.690 589.788 576.792 +15000000 577.012 7.932 552.072 589.520 578.088 +15500000 577.013 9.138 531.869 589.675 578.126 +16000000 577.398 8.542 553.193 589.949 577.891 +16500000 576.781 8.371 550.704 589.314 577.856 +17000000 576.932 8.142 549.199 589.325 577.087 +17500000 576.830 7.788 554.760 589.697 577.812 +18000000 577.625 8.056 559.274 589.736 577.731 +18500000 576.054 8.420 549.711 589.816 577.029 +19000000 575.509 8.220 558.445 589.598 575.742 +19500000 575.324 9.801 536.957 589.378 576.560 +20000000 575.566 8.049 554.519 589.528 575.358 +20500000 576.107 7.601 552.999 589.469 575.851 +21000000 576.047 8.592 554.741 589.333 575.851 +21500000 575.199 9.464 548.644 589.500 575.937 +22000000 577.275 7.749 554.127 589.597 576.978 +22500000 575.350 7.755 558.031 589.448 574.959 +23000000 575.421 8.487 558.123 589.331 574.576 +23500000 573.441 9.144 545.505 589.369 573.505 +24000000 574.824 9.247 552.873 589.471 575.260 +24500000 573.397 8.352 547.111 589.116 572.134 +25000000 573.205 8.978 551.441 589.437 573.271 +25500000 573.659 10.252 546.135 589.372 573.535 +26000000 573.944 9.590 547.562 589.450 574.508 +26500000 574.793 8.270 551.892 589.322 574.457 +27000000 573.012 10.102 546.815 589.473 572.694 +27500000 573.999 9.077 550.290 589.533 573.963 +28000000 572.319 9.901 549.326 589.235 573.640 +28500000 573.127 8.898 540.542 589.362 574.126 +29000000 572.334 10.078 541.623 589.314 571.782 +29500000 571.682 9.546 541.474 589.289 571.715 +30000000 571.395 9.974 551.096 589.432 571.407 +30500000 571.677 10.311 537.792 589.444 571.975 +31000000 572.206 10.807 533.916 589.267 573.486 +31500000 571.053 8.939 544.951 589.397 571.481 +32000000 570.148 11.936 545.018 589.329 570.278 +32500000 567.693 16.438 509.485 589.443 571.119 +33000000 564.312 19.363 488.835 589.427 567.547 +33500000 556.596 26.189 473.629 589.485 565.112 +34000000 537.467 73.629 180.910 588.703 563.243 +34500000 529.102 103.578 175.813 589.439 565.322 +35000000 495.122 139.613 180.425 589.278 563.185 +35500000 477.771 157.065 171.171 589.481 562.943 +36000000 487.077 146.600 178.874 589.501 560.402 +36500000 465.038 151.932 170.691 588.968 527.719 +37000000 472.054 148.513 181.797 589.223 547.067 +37500000 456.484 155.566 178.682 587.472 544.057 +38000000 463.119 141.568 175.924 587.810 537.584 +38500000 491.326 136.479 176.132 589.319 550.201 +39000000 467.362 146.384 166.889 589.353 536.243 +39500000 450.290 153.815 167.847 589.078 528.402 +40000000 428.555 168.630 155.809 589.152 528.465 +40500000 425.739 166.002 174.278 588.959 529.435 +41000000 430.159 161.978 142.090 588.600 525.130 +41500000 409.899 168.595 153.786 587.283 514.236 +42000000 442.888 158.787 162.193 589.042 530.727 +42500000 398.196 177.913 160.059 589.561 523.861 +43000000 397.375 166.565 167.326 589.573 489.755 +43500000 449.037 156.086 164.419 589.546 531.479 +44000000 442.780 159.899 162.507 589.346 525.947 +44500000 427.239 163.840 121.260 587.837 524.448 +45000000 416.235 168.059 159.281 589.590 513.137 +45500000 428.614 159.025 124.831 589.465 509.170 +46000000 417.593 171.028 119.671 589.595 520.595 +46500000 430.858 154.642 157.145 589.568 502.973 +47000000 483.375 101.121 127.132 588.647 513.014 +47500000 471.204 110.662 144.520 589.693 513.030 +48000000 471.670 113.583 144.425 589.676 507.649 +48500000 445.999 131.926 99.231 589.230 484.374 +49000000 448.425 116.412 122.170 589.632 487.212 +49500000 433.158 138.520 102.150 589.431 482.932 +50000000 400.204 140.662 79.584 589.658 420.096 +50500000 444.473 140.547 109.011 589.588 505.543 +51000000 406.431 161.136 95.650 589.230 456.551 +51500000 418.740 137.237 96.612 589.421 464.485 +52000000 418.316 135.098 94.592 589.439 450.795 +52500000 367.828 162.233 79.879 588.178 412.115 +53000000 386.082 166.069 82.304 589.651 415.041 +53500000 327.405 170.469 72.553 589.644 340.853 +54000000 285.994 166.194 74.248 587.794 289.808 +54500000 361.725 163.702 76.765 589.728 387.760 +55000000 351.499 181.709 72.074 589.590 405.272 +55500000 333.365 185.323 72.588 589.431 371.668 +56000000 339.733 163.197 74.275 589.678 359.432 +56500000 304.076 183.249 73.055 589.657 317.581 +57000000 255.929 198.397 56.676 589.604 179.526 +57500000 212.880 203.204 59.554 589.049 75.448 +58000000 201.614 197.866 52.918 589.616 78.927 +58500000 208.907 209.298 44.799 589.671 68.285 +59000000 143.227 172.027 36.104 589.221 65.930 +59500000 187.073 199.610 45.090 589.752 66.283 +60000000 208.524 212.192 50.190 589.722 67.327 +60500000 193.526 201.918 57.189 589.698 68.459 +61000000 167.591 178.515 53.275 589.478 72.584 +61500000 210.469 210.957 56.223 589.674 70.505 +62000000 136.373 159.781 58.652 589.683 64.030 +62500000 149.457 172.865 52.731 589.614 62.433 +63000000 161.149 183.103 62.070 589.062 69.043 +63500000 134.650 151.130 49.299 589.748 63.946 +64000000 160.704 197.530 54.943 589.735 66.174 +64500000 112.492 141.749 59.881 586.771 64.037 +65000000 112.905 155.132 50.758 589.725 61.204 +65500000 141.921 188.519 51.626 589.727 61.614 +66000000 139.742 185.883 46.649 589.747 63.884 +66500000 89.238 115.754 48.378 588.471 62.651 +67000000 127.881 177.859 45.624 589.435 60.626 +67500000 190.299 222.596 47.913 589.776 64.757 +68000000 125.646 179.596 48.134 589.791 55.901 +68500000 139.765 189.025 49.878 589.612 57.836 +69000000 113.281 158.978 48.424 589.374 60.902 +69500000 97.901 142.719 47.353 589.359 53.040 +70000000 124.538 172.221 47.796 589.754 62.569 +70500000 90.377 133.780 46.066 588.626 51.394 +71000000 157.732 203.594 45.199 589.369 60.784 +71500000 124.101 172.923 47.765 589.614 61.776 +72000000 93.823 136.087 47.550 589.625 55.957 +72500000 89.718 122.826 47.547 589.499 58.821 +73000000 105.319 152.859 49.344 589.723 56.151 +73500000 157.923 202.567 49.793 589.707 63.082 +74000000 109.533 160.588 46.142 589.574 54.739 +74500000 116.036 159.359 57.605 589.661 61.474 +75000000 155.319 210.404 45.652 589.775 51.017 +75500000 93.979 134.518 48.844 589.333 57.693 +76000000 115.410 166.496 42.764 589.783 54.238 +76500000 147.419 201.640 40.767 589.775 55.691 +77000000 113.926 166.219 49.624 589.445 54.668 +77500000 86.592 126.630 46.776 588.863 54.584 +78000000 96.192 136.062 48.937 589.673 56.852 +78500000 114.871 163.739 47.961 589.513 56.778 +79000000 128.994 185.574 45.735 589.737 51.117 +79500000 112.588 169.326 41.688 589.823 51.241 +80000000 139.511 195.961 39.723 589.617 51.660 +80500000 110.287 165.174 44.639 588.753 50.441 +81000000 158.627 209.532 46.732 589.812 57.014 +81500000 79.597 117.625 47.410 588.646 51.081 +82000000 143.828 192.734 47.134 589.665 56.913 +82500000 144.180 192.310 45.925 589.840 59.816 +83000000 124.169 179.081 42.168 589.536 52.894 +83500000 130.712 183.804 47.724 589.349 56.068 +84000000 102.876 151.878 46.179 589.780 54.915 +84500000 83.153 128.476 38.763 589.781 49.839 +85000000 134.858 196.366 35.502 589.799 48.392 +85500000 113.218 168.547 48.980 589.387 52.262 +86000000 90.030 135.962 45.186 589.294 51.633 +86500000 110.733 155.948 49.172 588.095 58.777 +87000000 100.005 153.640 46.111 587.721 50.770 +87500000 117.351 173.577 45.241 589.737 50.489 +88000000 215.969 241.999 41.353 589.808 56.303 +88500000 87.384 136.411 35.382 589.511 50.365 +89000000 106.536 159.350 44.640 588.947 51.913 +89500000 87.551 133.438 37.655 588.414 50.022 +90000000 116.365 173.386 45.296 589.893 50.419 +90500000 178.977 223.624 47.944 589.869 54.629 +91000000 101.176 154.540 47.419 589.877 50.647 +91500000 122.073 179.681 46.104 589.786 51.093 +92000000 112.794 166.510 46.538 589.716 53.592 +92500000 94.404 145.918 34.647 589.896 50.621 +93000000 113.959 174.658 34.033 589.693 48.344 +93500000 83.137 127.750 38.792 589.439 50.523 +94000000 109.709 169.195 41.805 588.878 49.055 +94500000 99.161 155.047 42.812 589.247 49.309 +95000000 154.094 207.306 37.643 589.780 52.041 +95500000 140.176 193.353 47.212 589.788 54.754 +96000000 110.010 169.266 44.031 588.680 49.028 +96500000 132.367 190.011 37.551 589.736 51.715 +97000000 115.150 174.752 44.931 589.806 49.237 +97500000 175.328 224.442 43.498 589.740 50.149 +98000000 125.811 186.381 38.844 589.846 49.556 +98500000 103.533 159.536 38.107 588.922 49.294 +99000000 109.876 167.066 38.762 588.621 50.810 +99500000 93.159 146.938 38.972 589.855 48.752 +100000000 184.259 228.172 46.123 589.931 54.538 diff --git a/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/result.png b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/result.png new file mode 100644 index 0000000000000000000000000000000000000000..22d700aeb8a9536ad5146016cdc6665b90589b6b GIT binary patch literal 28404 zcmb4qby!r<*X}ShgE-XCFd!f?bVy4J5-QzDcXtR32qG;=mmuBU-Hk{~%1B5^mmqwH z-~GOO|GD>%`^P-@8oW8V+!}QaCNhBa^&ND#wmb+Tf4hEyNPgd zIsETGa5}kKaUEx6=>mh`IxFb9fk61G4khwB0ZCm0_7_dUjYI8HDNga{f8$H_$~NIqPxfuqp_-y^~Q zA3xf1!s8i#c4O1Y1_nN_XxhMAcAFFj1*sRRnru&GE>xMId+skF%?4vqw||Ms1Cu}y z2$02123*vx3lThhmDTs@$%~_%ud!edt@k?G{%Skb!^Pgm&!Y@mJ^#-=1{|%&@(hIT z9v(lJo854*Lbmo$DAdm0Uhml%zw8?fGkilsL+|5$GD3VTH`=|uz0%nkT;P@PZEcYm z67ML-$H%>YeR|=1KC6xTyH_~~O!C90PY>fsk;s8SgDyM2e|H}pIj@=lX6oCZpF1&) z$bD;VjgxHXNzrk;$%R_)4rw}{(?33&ex+@3EADskb}~zRYx3*Yuhx!^oIcb8Aj@#XFbtGob>)!XIN| z2pEZQae_ghg=#bGyI-&FFfP{u17{6&R#sMoy#5#rpDuR>K6mW=cTw}F+Nk)0U%=jm zm}<Czab%4D;lgf^P`a_Aub5RvJqSqSZx4LQ?r)ytNt4j>C;YsKM9wumA^Borg{`+Qh zy};7pXKf!Zn8li$@6LMfR}WU%&2x&K3_Sr>ZK2hx(nqz!Y%|wJ&nP)OmqmEIE8iC8 zMva|i+>tLnO9BPOX+C-}G1;|ERNWx}(w&8~vN7OdKB9dJg6HJ*nM-g!NqfESF?Tx| z22WxXxL4BY3=j{vJI%Ig?{GoMx80tMHUN&M#r9Da+}qn5XCb`p_v6P8=i5I0*LA-( zx&3v3k0D!wg9E}>e($`w%Y3@6BaQrk5vr3@*5q_|bi@rtg7ozC zTse<`b$0e`kNY*!BLl9)Hl#ooB5*zt6H;v?!N@{4!)G%CWp zx|zz+iYR+ad)31kNy_YwQ708)Og4!`ebP0#7_!s+Lp4!JNiaT+1z61Bjz2h>7F#y! zL#_?fn-*8I-(NXwp0#I>gbX|Jmbh9Lt% zsYUOL6~MT1Atg2nMU*YUwC)1lP(>E!NU$vOg{<1T=aJ2Z09^t-9`$lAD64WpT7)hk z$C~n%lhCz$vVfQQiOY0PwVp^S3f^M&f41DcQ=TH#aa z9fu1kl6}JnT)9wn64;g{POf|z3mT6pZNCI7!KCcZbzy}PEEIm{DDwC;I zrnYyP0FCwo;1OS}Da{k5)`g2G(a}Q&>C;fwf@sSdhfmI(vHYhGBkOf8F$7iy0H(X==UD>GkIf4&CqsT=auu)-nhv0MbL=$(;utgo|P6<%5 zg$ao_!6RDiTTX0@EE(ykb*PX#miW3bL42;M1g9A&R4;F#fH7L>M~+L}YtmB}AiQ-VRe_5#pm52wf!C`^TA)9xZK#|L@>JSD)Afx0I?~ zGgVXy0b_qD84dSj?mi^SvBnp}4i|fjl{B{g6Pjdx%Id+3kecH^%IH{+ zP&|fuPt=k7s}eeX0Db7{Wj)b_MPaRE_9OYoxRBdW6_(cmSito?k}f1VI{Jr=zBrz+ z#gr)d*stc=kx3c|O|yd6vcz}<+1cYA1aX_T-wmaIQz$>>{85Nfm1BI*#KbORo3pHq zl|YC)kyjt*i2Uri(v+LlJvP!L3DwtosnGL>m>Qh25Y2fQp3BE;r{>Ilhr}s(tJ@*rNw_t6m;{1o>EI zTcE^NQS>^&aa5U1tJo|nJ2JO%G26qQllci}Ddf%v*nraDc=SRzJjeR2a-#yd`(7`K z1e%~Z6k&-qRE|T9P2an6vH_VyO;!5iMysd@9dEhZUOxXv9dPvT@aI_<=QkTK`|@hoOkkxD6No^X!forDqO3et()slN~$2PBhO6 z-awB!J5DR1vS_NYw1;n%Lj(`{tQ=S07pH(@rX$~h9kJ*5eU48S6{*S72DntCpO7Ty z@M3kU%eKnMD@9^xnt5OEGcv?SwKiUEEZdX#-JN2PsDuoiHr>Swwh8h^1HPXAcWLUE z2R#F;&~vi>9RvLBZBv|ni#9hI?3VPl2QQsCchH&N7(8;vppo)Q+ToP5%*CzyyTYUo zPmTJ(sE_uEgtWFALxd(PV&G|bzj;3%jv0PV(>ud%e*>&-jre2CM}N#`+j4Dj26fqz zzyvh~(o^J=%LI%X<0K?m(`IOtX3h~}rc*cpw+U898%kV1A3yh{GZOX3Pe>rXT6lM9 zI$NT7)subC)L_39Hh6jGz zU(l_DU_bAmdO^?@mA>jzE9|9$0)m{NCx6glQ;B1H9i-9dN8)*lpgXz$q5RS$%FL+~ zBkFh031G|HyIDIPs)Pr#zGuQTDh$$mWMsdOvyn+9vJUmWz1s1i?%<9TP?5OZd=(2% zdi~QY5~rWE?ysTF+Qy60NlfRKC0jNG5+!86=h$ zEd_rt#|FVs9mG^VvuF*@lp=!W2Iy9Ui6YpouM!S59om{Zuc7{&gf6<6nyx^~)aApMkM6k}XTC&!9Z2-8^NGqDwv%-llw$ti# zH)GpTKVetu;)5ucl(N>;#&mh&bOL=wX2e_OG>{p-c7?5M`J9_!9_fyOxFTVvoQ{Sl;bLHd2m zYyLwQ3(L3El);afVh3HQZ#i%3RGv6<9Qpn&U83(|Isu_`uGHaX|D((9%}+MOij@ia ztgv2Om?bUqEjHQcmMQCIG8rk`B3m(Fi^HI%XLwIo85NR(gH z)RvE!Fi;QLBaqh8-MjLYsnk4FN{Gb@EQ~k!>{^mSF*4s!RpJ9gF&Tp;;@C0hcXx*u z>#_G&v4kIGL7?orvqG2Y^LdlWwOauoOZ2o~tYJD3D`ZK5#jxb{b+fv@78Z|g>PB%> zY3bPh%+>94Lr^cN`@=0giWxw)Vz6o|5h( zuu= zn@ky0%@9HZT^+{;W_YY3(XnfcZu+?bOzv(b?{6pB(~{Tn=dH{)NHCWe8i7qzX7kc( zk9z>Bs^#*`m)cT4wz1MqhB4<0-_F3g2F9oN!CB076XWtOCY*S3W|ngar0v5k6HE?h z{>S3l8+_0GX%3gaAq6{Ib8k3Ed!%pf}vI>9R0v@#E$!4QD2)osE=P|LKC`ZDBoP&^BLxRsFRP^WO7{ z`p=r~8cm8iIKF0RV9RV_MmMeXGdu}zw9$jT`j?9+2LFwFvR>_EXwVYcoAv6ijhF%2 zyNg>D<#tu~<8Q_W_e6IPrIaL^e1 z?$9@P46f`DnVa zY+gV+X)`cDWlqPa<^;1yv9BW^hw&JNZ(0RNKLMwjcP4{|3YWt8>~J#hmOv5$`chbk z4P@XxkR#J-aY}tX+Cs@q8}YSp_`~~L z6ETv?y$d=XU6m!~`IkEJQ$Qk0q78M9ELv-2)WQSC!N=pM^OWM#6bM;p)1rzAM=@ogF&a6yv!aJ7e zF=syJKgPwW{$-=mV5GaYJGeOf7Y1$J^+Q*e+;CmJBtMvCTOn(~%C`&3sesro96o3KLl!`t8@EJnDj;oE(m4XC&ME{>^li-?~GLLdsi zd<=mAcBdFkv0kLlfBy}xcR}KG(VX;8I?Vs#)Ji4}ICP#;P*fM@ACH&zp;hDMfTJImx^A$9EuY0~bt*i|SYt zQ&aGhCr@^EcY|4WsTf_Ut^OEh9g3_9yIq%e`IQ(b3U{^78UR0XPoR zq}~19zovf|OQY@OEqSzmeBLs=e>S)U0#)LxZs=oU9nZE_a{7rm>~LSLvX=_9mrO71 z_a>I6cait1znHY5ak>z3Ibb@Fi`D)gcqP9g6~H6p7zoEECeoev#tWdYbJ|1b{05cr@x4rK77;Th&4-MxGffHJjulWhkw9-dSTN$ea$NkV0Sq zV;Q!26MC(9kZEXQn&I!wR}OaGj&_1Tw0`?M`#U#H;%zX2e^_JgE^Ruux`8(wP4lmpW`D=C6Q{*LB z8bPbX5SYswOHT05nuTwRjFu{^u%SfV@9#{eS) zB8MY1)E#0b;|F~@DC50##lqZ6Wa)4*48(mglELfdh2Up!e+Tc9l6qELIj{4rT1ivE zMO}qEdqRPS zPjDfIg}C_*XL*PtlIBB6wKX2*{pexdLv=t_)az94(0@~*6D<(EngRY!=xpZkm24X( zL;xhiLI6Zy-sJ0uP<)e9v&@M=iDOigKRg(H(rvxjo&8rg)wA`1JAyKs6BBd6rBDwS ziLjV2*rk+W5L;vsr3`=0mnZ830H&fz^(<$rQ4$mp0*%B5LXCE~u$sp_zYmWXaleLa z&+|_Hw^(C?GDJWAak@YACF3V%PkY@3TAo>p$)=_2e`X|MNE-Px$J)mX4(gW*?|%rN z?5^hldegu94U`A&|IXSx)CEAYga#s$VTJs<1?$1-6_G=3O$XmO-36Ll-g@H!Cv}vVAb9arjX-ALjx>Pa7SR!*zsua#deM@eu4=u4cfCG zx18S83}FSeD8^YhBP&i5_12_(WyMRyBHKC7hSWGnqz=M%bs`ha*3F719Q*J15!Jd| zgpjKVY)!-&7NTwfk}O@r%tBS=hzBL0PIv4e8t;sNV|^|0uiGx3Z;2(6Bp3lTt%gGY zYZ#dRskHa&dX%lyS16bg2&Cy$tw4w!( zZ)R|FBvgqQ@PrEI&1y+}N-@1?9iPE40*n;`4Dn*Q_D=C|x7s(djF=MI9-V(vIT10a zc$YY#Ihggc?8ognrgwgpAV#^6r8hbTA9r(Y@cpxzmR&zQENFxw+n)Q@=OqRWJ)i=i>lMRrc5mj&1nxVK)?b!v^a zYxv{FicVB@uBSNuQxc5jn7a9v;6H2@rlbUU>KsEGRT*A=2&{)UW?{yPk3HuI;1ew+ z&!QtA47{J}4u;6FRCH}CKig@g6cZ9B>{l<&&qgqKpak*DCJjzTHgxVf`D5oxa@vfT+4PI^cb zh^~RuGh9S^{kpDwN-4ik@$h5f-sAiJX=0nf9v2EjsmC4XBa3a39kjBqyi6Q+@i*?9 z_t?a|d*!L=()o}l9PRUK&}P&$AFBBTVu~~`1_PHQ%}# zB-BK+g_2?CH4kec%Jwk?N9@CFv=RPN9e?UaW}tl3Zy0#gPkOb&P@yv${)}s4DTbAm zji@9{GG^v&rMj$BEu9l{dE9lL^O(jP$sw>VHC}zH?w^M(@}l1*j+sl|Ua$NWGspXD z@0XH2@lgQwp+eKm|Lk*ORbFcYZ^(`o=b>%aF^^%;Ry=A_%O%qABO*=?X$r@9W2K>Y zSXD5*3g$6Tc7vheG8w9;i%@Y3kv2q!01yG~hq&5VF_6I=MPKz)9%ejsU`qs8`al_m z4X`prd~7P42R0Y^4uN+3hztcsIXe%N->~p-txia}1lcO(q^B9h;qV{;|Kd-|ezC=O z8$PxwVS!VcLFP)bh8|%~;pR>hg+cZJ{3d?H`RW!w;Ql!Id+_pUDomk9(plXKeU)0J zCC3z(n*4iX1x?n++$THo5_5{wAQtELu1-=L=9MD4m_rdoHg(1@5)HIoxATd8v{J@)RCuuDKYLRCl z9Hpm?@-8@Hlwt(Ra*Shx7Va1;DKRfeS6(n{K-ByI{wa6DS<4y;EMBMgW#Ymd+lFCs zdC!E019=9X85_dnUF4cO4@I}j*ACRKz_|D6hS-)VZkwQ3sI_$e-jit|{{XC|IexM> z$I{8rVFj=o4@LWUM+w#xnyppML+F>yq(4avbdW<1zN2byvKkaQ6TIQ(r|H&UM4p!i zOox&tk$7i<-6*Zn=NZ5(jk*buAGUkiJOjn#chJx4a>(%8S<1H^p;1G2bO zmgcHmnwKc1aFHi#4Go(Bc=6%E9xs^6>=bboSU9aTlZ{(D9=&Q4e7|Z*x9Zhzi?8yc z%EKdpmG|2EyqTLKiJMO8twZf&zBjm0JZ%!Z(Lm7 zQvlFMG8q?cEFhhD!0K%AO%#VmDtvERwE9RNXH8~ zVwe6eoSiZzcKl~$mT*Mp?QcT=%h{ZWKfP>{o*Q2*#5hKGM~rSux?eU*T0e*8{(*YG z!w$3k_gl~}6Q@ZoTrAeIk{I9D){(_5T@M7*P0phOs>|Qz39?W}iI+}t3G=!$9zZFu zpG}F0-L76a496zsuq7op$zf|wO8HG0JQxb=ICl?2CAYvPiK9C93~8T#vp ziy;`j!Y#)~Z`5NRcGz0J$`Qv^7Dua3xL>oOd z65~VCh;!hy$h}7;_R9h;;AXcphR>y9He|3z#MZCO7WxqD;z|ak(*9W=|4xz(Swdc? zlnqKQ&+>iO_pkVM_17a!OqG%3k@h)%@1ZN4QFCs?aEe^oNc@>+ zhx%$xmeRF<$}IVUKvJ>9r#^@{R~`(u6oj(uB}af zT+r(7`|7iW@Z9PWOl0JufJ<`@Pgp(-JRIf5!5>M4PC-rG_x%3!IV#Prg2(t~-|Bg! zT}3n2q}VAw0ku%j+I8ky_hPNpPiLVM+J{LH!U4g3MTM`irK`D<=y~tX~wi z_kG6UdVVvuj!5gYu$#k9I^%!4+CN?MgZ6{z9?^m;f!po)9|cw&{+B<<<;;-c>UT4(1kmyKg@-R)Vv zbI-||63x58;*oD*1Xk_TQG>^)r$m;-_#KP%)-q<udjO9z)j76PAYa$el`*8+d0T&I=U2C<>~kYp|*sRGQUlwm%!2BCWPO|DljvGqW(6Tk5k+MC7a zRqn2z$k7>#Jp)GtNaKv}PLj!~sUNs?&|7+AdN z`}g=$9p=a4XHZ(-9s1L4fWlo4xH({&bOY)ui%jjwnI&<$cJ9bp^`AXXV6uM>4E zJ8LzA-EYBR1y6RG-O;^Yxp>g_SJgketPa}K4zIgFIzcox^$y$Y6Pp8Xl?n%WuD439 zJI-wP4c4$gLPEUJ9StC`AnXk*Kmcu-x@w~2W=-ik=S>s`fQa0bQ`vjrE&Zn3CF5GO z2lciKOi+a@+Qz(Lnw8?bqjjpG3vPm^wQ{LqbBDw$kj5&MO0H0?%FqzHdG3 zpfbMsF%JS^6Hs?upKiOLqMw2PQz)C$8|rXKko{S#Cb+*mNS}Hwcg*sB%`j6LfnG{A z>Kv_WX#O(M|Egp_%Ut|@0lgC}X#iF*tJv|*SW6a`L}PqCqV0Uxewo|ZNvB#!d~jWEb+_!Oij1uDxwn02t3W)O1fbSy{-lXI3CxEX~1lg7(ePQa9g z%GJzlzyZ+$$yEezb+9A0cTC7UYaZtJS5f1MZ9+xDrf|qckKUKi(ue!;{Qh5wZ;JlWQ2Kf{t4djKkl@)M6aWB5xHrwNz~84+p9-F8e;gJoRv&V9=~s+r^JZK z_tPQA8)!-Mj<(;DA*yzi^d*!CqpIci_? zWjqaSeLcmj3nb2rv#UjgYEd-T-dVjZus}JpYlGb8IP#m+drRlgSwa1bIz5p$zHEl9swK_(dG2aT4-xTW8N8EdQKL0m`(F zP?MwvcY;*vYpX3oNktnCt`MAMDY?PhK|tcyNs-3p8)d+W02O#7ICZm{bC7=~LQKqu zp%1}0I)iEo>#@Yx7CvXx}{e~*MS zku=GnrHh0J2@taR;`fG{HiBLxY<%V_GPJI4G%8$>Gn%Svn;#?L5Jh9%X4Rh^aeKP? zH4aj0a6HX#sTb~P1|FhtV|!II@=!zRFUxU$b9`Z;LJ-MRTQ$X+bicjnhG)Zxh*j?b zstthm8XJsQs^>OdW9$VFlienL-q_#>y*<(5=V;~Ze_0SYI^oKqweWqwygsFC`ZJdWwX~y_5k%m$P1Enua7(UEj--18Kk+k zV}f^Rd9d8E{>c^)=|K;#dN8C@+YH||%l!ue(l^k;%JivAWN>#-@}#w@j+cE(Kx+X! zoEWdni3nziS3|_<;V2|ws!73D?0yf~^#OcDr9cq!Bb0vtkMpP`snd-;ZYA1_GmHD) zung1GAU8!wAx9)^4BoQRlie)m#8ae+H=u8_b?-KV{LHFXqV*nA8W_0uoM?7HTuo%?( zOV00^Qm-a1XW6jgb?0|VSg;tF>E0e4;S6k{d&p;QaoXDN_gZrS;;QS)2+ zJHM6&eU89rsWq7v!JFwDF^fS-UZ*;f3F)dbFR04O`mE((QXX9h%Rh z<~NgiA5Ao1pgi@? zytr{DuYQc&CTlxa^rQ(7Xm?Fx|C{;uq5)SQ#IVO;RnmCc(Z~{W}A9IX;Ra(6rsVeHh#dMJykN62x&hoLu>X;aLubC6;jn!Ey@-Sq_FV@&g z!hm)74%6E6!{4J{16OVqt5la-Pewhlreqgsaxx5>jY`8eE-A|riNO$iH6x# zW}GiyQ6GHIgpd-=MPr`ibG^f@?7S06OG^WR^c(EEzkPc>%PbG=2Lcgjp{2SEawt6@ zCA1^;jy()g+Kpn-ZIeZQm}CVMPEV3v+b4k1+EtZb)^SFJpd7b~n35{6UmjBg~nTGDGQ)+H6=q zCw!XSad|74CTZ}-p}%r*yT@G$l6PcU%GSoW&tZXg8 zP97eOsUC%?rp)uDfTz|WqGP)uDT*%d`P7dC`uJ-NIz<*A_HluvP7#S(OkYc;miVU< zaexSEYr~P|gRX(nby*Y;p7y*`HEK+f=^f|%>h1!9me0lOJxvy0&_=Ga8(-tCo>zGN z982YE`qQ%Ke6g=9_U~+ZHiJrvQ+WXrZoaqT)8q(4qMw~=>Zp` zqfPNYDk<66ets_;a9(PRw*-AQ zL-PA(q(qN2WA^R!99LhrnUPo^t7eEfzi=50NSAYM70;hvF6qNd07v`P=CFT?HC4ZF zS3>c-FRY5Rq-uUUy@tPx6JeLZREep^f)!s#)c*PIZS#bHgwp`|7K&HvYYMr-@A=aA zHFvq*S%ZI8T8{^)oYoBweYNYiWuX>R>r=JWLNOug>pw|+aFR}(jbk*{Y~w~lXV<67 zb6ic~fbb6hE&I%wUf}0dK}u83We?jw>me)z>Ng$!Ze+H57u%TT&d2|%Jv;Hh5%jaQ z2#;T(cAb@~GLPj>mQk4O`Oa@0^=!@Ttq%N@he9g$i9?xbZB+@a>|~Xsxh5Ymagqv5 z3n&k;X*0%{e0Fwg+V8ti@S!-1EvXrcNgu$@QY&H{ZO0XE<+}d`MP^AbRmB zi2o)7N9pC1p_|($8g#|{5xx1}(wt?l4bVc~{R@`rfSsn^y_?-)HEQUS+>axf9m|T> z9Oox4qk5?;$5m0Jz*6FXD1MEV&I%XwG|FMlsi2^?L7bkLApN>> z)yr0DO&{CI_gt@8bX3_Bfyit||IXx8sOFGq$5V1$7|PpDy-MOaN&3-K?sP#_^UTf7CCJ#6jX2=m6xhH^ApUs+@;Z&PQIhZHtrB&~WT7Kfelj-jya` zcVrcKVRbdv*b(|a%Kn5!KI#vEpd0`3<85(yXtVXu)LWMv-fBEuxbNQejKAyopPKLM za}YOi0{U%qy{?0y-B+4y^sN8`s^GawHy>%i7YjV;cKo7pJKlhOl1n zPo317^VQ1^GN-_srQ?sU{K253`pS2YxZ2N%0&Y=sWa0y;*yk}13WWz;;rLUmKZaBL zd6Lh*gOeZCLleSRKoh=Q?bUIbX@fdgti|@b*yjn%%FOHsWc#`&?fod1rj!662@3nhAOc5zT_CpHx-HK*He6yB5Kp6vs|8zq!=o} z(o`~>UhtUuyU48ZC~d$sU{(HxsBma+Ud^Iu#j($VRBW)D^<=9lwMn+SjwI^vZWace z|13A>t{FE3J!ly}5YVt)>CubPKE}evo?2Ur{r%e}JQrtxyrre(Xd{w~fgC@#vU2i5 zhn`Fe&>1Mwg>~QkyK%WWXiWAu60cSJqdQHWCE;mwfBDVis9jsjVi_RT?TuzrF2x^I z2d2CQ)fN4*08-X=h#ho)a$wxcfp>K;(bju$Wqd#Aa#oLdgecbDN7KgcGVkW?#2Tf}f4^Y&d@!!-8)bP@LI{Kc9d%A5m z-}rN1gPd&3R0oh;th=-6BTo6E6!45BMA1BUoPmV_lol4PRpe&mR8)L{v{Y2=J0a_g)tgO)yR2D2sZXK5$Bbhm@HOER^PmTH=c73=GVFU<0o4@ju#>dd)7 zFs4XJU369aBA(S0tJ$<&xHYttM*WO*HCd#YbUtO$;9#FK|6q8}V|Mo`s@xwyiab7t zo~KUwV=Xl}@Ii31eYPlW$JcIER^7I?wwy0lyq>@!k=s6X_4Pjiu_$=Z<^R^YV$@-V z@rKRu!)tdXXUW)flD{af0>jqXa&>#|&TdrQ!H6x?JrdK489^#n`#6^>(uT(`XsE=p zCB?J`FIHVSl9Z%&KGYDF1wmWAX1D1%+ktmqu}|H@vIqrKC|FQU2{!QPo5d zTA#mJ;gyyZ80dY9;v7tM)5rM7Vl4Tm{nE&Ot%K(I{q-c;{}O**ZzgYx7dAGMRkoc( z98^bBJ=@q!Hs-u0m--y>r<3ch_?<)Tn){1ixh!akdPEG9q=u=hJ1%hJ*3zIQWX^Bv zH)f=fgpnZL?7K)vE|nR1iU7XN@1|z573JfXqdmO4lJ*!1mC~=YlJtonYOvRTJ!-Zy zIHHjoQLl)0o^?>cb1U zBJlm?_xmC|T=+_h9Mpo#&5foT2pC_%lFW<68UvUCsOmd-_}HbOxk@Jhty-&?Y(&=V zo4U(aT&D87e%pMC1wFX%RuzeXj)iE*^Q-R1uyaZ&guqK1c2n~kcY$A(wJiOin?ycK zEd-(!hjzW?RHAOQk6Zd9%;2dD9C^)Io{>Iju@-edK@rNR@o*%!5*2}WuDLU}rrRXGKEjH3;0xw#l8+o^remB&_v%({P_OR(o5`C1_D@hqdAsIKF z_T`~UNPh=8-dKtx=^SZsB>QclxsJp{)PdJZZqR5erTt`cp1|952lLm_B60raEs4Cw zle06E6QPM)1fyi=!*v1neItMT?F8PXL6j65gI>CtY=$FsDlIMvbq0A2bR=7<7VG0D zGxUWfd!@FPcSpcHY(tMCh5^7bU$UdDV9ZEYJ|OVx(|gBsAdja8JIygTQ(NhA{5wD^ zb9(g4AtWmjAaCOG5DRNYmUb>7J+Sbk3nw`hr%}i4q|uR{k*mP1lvEwR;QaH}c)pMw zIdhZh<@w>Zq!n*ZDR+>Ksgo7bJRmEzKcso9bn@%PXBzbDUr(QZZ0!7Z&~&-#hXw*b z_g=D&qtFtSC^#&_AI&~nNqH~PLI)3MLMiOpK6^oi>iJ$erA~vS5qqquln>IpA z&#X_DD_r*jqEH&*05ohu6N|&0xFBPNCg|1!icy4UGk~prQL_z-{Y{! zN%`premliQuDga)~hT; z(rHmX3no;7Fly4N5dgr>>2Z$$*5+$&ta!8T1jOui#K4y#3Q>q9;w~ybX3*l%hsnu2 zn%Z<30IU0TN7IjS2hmjuHH9zg>e!x$DY;7h;Ecn6qsuxB=GhV?O!}@?`7j@b(Z9r# z5U#c$eaB`@f)Bm>DN0Z!no?3z(vM?!E>rQ2>A!n;11^O6a~t`bMc-@S%L3(@_jGJ_ zse?B?xME}}^%sM-T!Z1KY|`5N7K{5Bf19>Bv-sQsUE*f&k5mSYnY+W`LQl~$x0*fa z43VT&$?tREYU;*6Q7NxAxCg%2QWDvgG#BLBge$yMbs6pVH;`w{abnZbwrNX$<}}c{ zdd?|!KBMlvExPv6x~^rm3Zptsha;@R{D~NkO{&g~o-hJ4Fd*5Q79~t@Ff8xc-%=Tb zPX?RJAOHF-i=i2(r5`gANe;2GY$Y+Pj4-g%8vCwBqtK#XX496|4qr5}AJHhr1nWjeEO^p>w$^)97XPUWnu`@Hr`EV@~5I`0W?{x6|{(B_nYN4n*eFVCC; zPSd@&Qmv{iMq%FVMj6ioX^sDWPcC^_NbaaE55KNxpyYQlB~XoIXZ>VwRR-`bZh#hG ztlu1CxmbMu;DTm2bg8=#bE+K70Mj){83qvSqO`lZjONI%1Fo&XXQ-AX=JLR#O&3iS zJ#g5$ruE8#d zr2wSO`E^0f0{^c>bZBjC9T*l~LfRMv!xJ1W!6M^Y5d8F+>e=qSCjO?8T^8N8dV&V4epghx57R#dr&lKrYKgBfn?8TLsN8bKU4 zb~=s1@BdPLJ6~f*&Z^H_G|+p@4*@G+Uds&Uc8)D5i=qC-=UR9OYVm6&VaB(}XEs;i z_^9a2Ux5 zJCzW_p%zShSZaSZrq(M0UKpWknpu8IPXyXjwK$~C?8y>5ayS@4a~!7X+sTed?xfD& zUskf70t#4q(k4~9gw%r{rxqy`DDqQ*bQ$JKllj#=@{O7nmhwD+yTjQzrwgk$smIvg zl>@|>)4MoLG@JTx@Z+hCPh1WCe#}4z@s=rM{`Hij?noJ;@kvF|7A-2ZTsdkU|HL6J zf0Dkn+=mrx{)I{1+U--bAAKAxdi9mDWl=?N?M&I3AAHV zSx_oJTXQ3(Yxo)yfuj$}iz3G{yXNb_rym7!h~6Upu z&oQ|OB%l_Af6<3~iWl!Apms_LbLPr<)YM|xTa6WYM20GJgfn>2i7?s5TA({P?l!U_ zQ}VNGhg1%Ec-}8hlg*{oIqP33uj>$GNh<wLU}79trcdF;p?rL`taga>{x_<%ZzJ@@ zAh-%W?k4%zQxs;xWYz;}kzNdoEfRD9!fU(8SgN*vL8faB$h*M4kHQCS>d1# z(Tg|r!8{43)t;B-qz~4AM<}?g8OHS5KJvo$jU$r?h`;4rNTHnNjM3@sBZSqVhY4xW zZDjV!bl@US9K*%JP?_wc6+N(8Y^rKeN+VUU83t44{s&%12OMtc)=Q}mC&lRUfG~=# zc;>J$hdatm)s>|vvVvb5Lh_vP`+V(625M}Dc?XrfOcIZpi)P(SH~=v&#wVnSkI+bz z;%6nMq!G@$^#6RAYK}LhM(OR zW0Bd^w_V}tc&U)rQt?8 zspb(u=f&+u%@>C}OJB%@ll@n`%TE#G;A)I1&GNVUF!l(ocJd)pNw74Of;?%k1nbp! zrD1?*LTI`Cq$~$R^s@xz92`a0sX3VnIbE&#_&=@WIn_!Z#^*VobA)r2GW7#%sR-X4lP8kfIEp0AeUa_jTzcbUR6q9ieEm%Io_X03vC=uMPC5mqh{eN63$vZF zbW+mSLQ6LjRYQ5vJ@(WnM{^D{f%uW`k~`4p7Pe)v)3|$+RXEtaobvi_sE7z0LLAnbqkXPJ}@Uht7Z*69zv?x-KWM3ZgB#45^xZ0;%g zq=XduIzR`}HWVps^eqG_mKVTx&7X0-oi+ZQ5rXXNW`j-BVJUZHmlSo#Ug*lht`Q@{MhDg&CoW&pN zQVO%zjPKiyNyMAPoqga+wz0863@IJ3*j1Yv_e|F~QS7gOL7pipD8vK2BSZ0qBHQJ) zmcZzZ02lE0-(e&jmBQVsE7c4>J!Ij00*W-q>dyBDOt)NnUoam(9Br5RWVaew^JF-B zVJzq9lX_YKIjeM7*-~x~W{*tNJpXjv zX)CZ5{!waCA(6=9mtwNAv5-}L_wLt{oQdUvMU!@{tl zIiDfj_|7+?Nfwz>VZJ26BLv=xh|NjH_cXM@9x9GV;{LwNi~DR8XKv1HBZGRG6uJm2 zjcG>2Y!Etfy4ygNS)Q!z;3EN}c^)&4C*d_6_QUaxNQ)Onz?}FwJf9s>>AKPN6^f<} z>UlxsY*A%+a?-gi6mmI>uGYs)h&f;u$cCLMy0>iiL}G~S%EgQcSSmje-$+g)rLcm5rk*`H<%D=sE$V+U?xcU8`ODt6LrUEDEYe)Z0a^XsCsjWl=G8QUyU`sE+Lynq*QA_K|-3WI-m*ahfK7P}2m;aPeY4&s`aI z2+^jIM2yY5#1<}eu@ePOw)`d0RYlJ`%gs4pgVlmF8UCjazLL$AM!SzZsWPp@@3 zJEWFUpF$oJ?Adh~I#fep7tho7ZsZ$KgukbLwA}b^hFGgW6UPe$24=_9*#4nWi;W7ZN*Y730x=?E3n5i7zk2yDZ%>vd9_6eKo{+UEXv{%9*TJGja19 zOwW?L*RF4FOwoR3mS%EW6tq0yBBm8HEARVenr5@#_3_p@YCS$$w{!>0Y8>U+$)y-? zw&Xq-u<#>xRhvHSY?<0|;0|?eesoKb)nZdT2X*omMcK^c)AyqDS2*UPkp-z8{_yQ= zT26ie#q$@P=u9LFOhRg2kNjZ(^Y6}JuO1BDk1}l|WVJe{oj)4d3{i?OO2F#B;G&^w zD&3Xg@=Ya!t2$N)$GY41qR?v8D8hW*{x5dCsX|p{yeW@RkBh!v4}MHT9*`$kavob{ zx5{vBiDG77#z#!>(@pz)T%#0~X4iR$$=VOR{qP)42GOlK!8%n2WHCbPb`C*d=O)e0 z9geZOkA=hpB|Z0(bYW)2fhf{^xGd{UksEFv*0M`i?OK50x9jhTs%{dN~I=Ba4Oi0R(L)Ui*6`PfeCQzQv$mg_Es9w_scZ! zBoY!;WMD&o$*P7p>avatXV@sE%XigksyY#=E>`o=DAL$oXEmcuR6{0U2U`O*A6Iz~ zj@7wwB*!0mlGcL4?D{8_#;V%Oc88PoVQx)Vuvh{DiBfoc_mr4fo?HC6`8!i|}+{jI_ z`{!2UI+7!`Pz^b@>U$4Oxq4IaxJH_U8MKf@U1d8}#XEs4k!BYRL}T-W6eUZBe^vFU z!aWF7^=Vs0D>rAH>TjAscRbADY&l=ecYE@{ioJ_@+38+#ZWh^Muf{6weNX$Z(?hM) zp!{Vh>5?TRHg3NimLw#^RV!EFtmSu8`oqK>-h421NXp_Xm&SJj%S4@0mnP%&-+(*x z_|QRCyt?>FT%w|V{o~)N`d~wX=lx(dB|R(fvWZDodPpc)ci_hHVm%ctHws=yqi&g@ zjgmt2)Kep`ygfyAwzJD6XPmo4nq(gPxX5VwEgB`3KE$tH9T#Cb6Y$dNz)-&}`U29s z4#Sxm8Ls<|yigZKQg1rNlZy>Vd>ciGSjKd19o5VDLcFA;swS*gmZa?7qVT#6SHP7B z-WKg;Btz~f!TXJ?6R7#F-?H)X5g<}7=G+$%>b7*WWO1@1)+`+sP^QT!%{CC^XVT1j zsQd0RcLFz!#J*7pv+F(OBv8$`B}0Igk7NrX)ijx>c5RkX_}42E&>c*g=faboU*w32 zTsivFiHqHz^|Em$@i3o44L(;Gz~vv0`XShbdrL}bOOdgzUbV}>H{2hzC)^sDKoAP3 zL}G$1D()(B7QFV1Q-l<(Aje2i_|vZfJy&dGgKfw6{jn&6xj{xvzZ8&r;v*VZzqquh z3Z&J0UMwK0|F9e)uqTWEh=&oy;2f?2?TwnS>m5lz~+NJ&aZ%|yED zBbh-e=n}zQ`3A^6rkr}2yy{-TCx2UT-)M>v8Jnr@qVEhns;O7~{C(NrPC+r%qO6>9 zKFYSH+AuTg8cfup9sfslVr`XMfU z2Z$`=b%$6_JGhR(S|I)I+`W9Ca!rS^{w@Lg2!;ooAV#RUBI2_5XpuxR`rUd3c;1Z? zZ3T3AZ;LFwG}7zo-3|y|im6CMoH04bq{1BmI1sp z1M!V5CVWHNBfIkS5@v9bRG+

-yahDLalfPUzlI;>@~};~Ag;$+0tr~jBCF=8|Kx}WJ@;fO zqKpo|_sd<}dX21UWNc1*_}3M0+r*fK!?`*((4eixRySNCC1!0RxDWl|)ur{RL>&iO zwG6yOt5@X&ROwIOHS}ET= z2tWR9VTy){Q8$)%#0xpuw@oAQ8`_s~-Ngnblz|x0y%{;nlifuvMnas63(@5T{gNmh z>I>bF)&&8@8#uyp_}tw5umLMJBLRFO5Jj1Z2xWYrcZh(uO21F-h-(cGsuCE>fy z6b)3K3jJEj##dh7wkK6Qr{$2D#6A4e?`0x$8m&JIu0^4ZAP2DFZa>8McnoM>FomlA zaGeHKqDJG7-Q2AwK%ua2AjayHnZ!%!xtjLd%S;P`44D4>UeFU8cl-05kLh?ZvM8yt zM(TYFP(`F>WB0V=p$C$vf0MMT9DUVXbqy84x7Ezz{9FFwZx-Gz>Lnzx;)8YEiVc_O zA%5=B7`aE>U+%f#6)lLXp1qH`t4;@V2-|79KVpyXZ#VnQhIIT8mARaq@P3|BRx&WR z_nI>op`E?$>QLeBvb&n4vkv1areb*~<{=^y4DL4X`J05a?$?MhmNM@RR3;!!zF_M7-Q-A|zZ*7jo027PxgB8)hxCb(UUb|f^XKU?ks0kedbWlN2 zyz}QJWrXETOKm!n^ElgbS`BDuC5o7Wu}$o>6A4y}KkN8QcH)q=V8J+`UxgQ$4}eKH zk|R~fhm4yYr@mY0UNZyg#mpw*kQWpH(WNLJJCUbHbWPX?cN#`EZ}r$Ki43oMXN%F` zaotE+>O%2CTnb;_B>+}pKjueK_@p_%<;hqclLg|+byrq}C-Ffc@v2tO9OHE=^nh`6JwFxCF;_Hd~^+((Z{hAj`$sjyj zFF4=8Y8K&h)dbc;oZ!;s=~o9y^t?C8oLnm^NRhih>5Do#HjyD>TD$TB3&vLO$z`*I zl^*mTquN8r7F;65HTKWpymR`64zQ?m)BzwQcq94E8CQ?(9Fzudbl$|`$8^l6(y2HW z#+4=JFd)HdNp}ge3{!s%*ex)&0sx-|QG)^Ft&}1jd<67}*efIu%wC%5%@@&1io0Is zAlAKjF}y6)RQtYK?*k5Er9^rJ+9yMhK-i{ZeL^b|2r-$SHkiCskoRuhdr&qh{ygdy2tg`XoRTMJ= zgLVX6zMvoxTdF<2MUs867NM?5flNT|7O(5|u2g`k^pPD7y{Cp{-+-7%KbkVt-jgK; z_?g30o-YV)u_&>3kB{jA9R5X}asC4-z>x$(zo!ENcsxB~O#bJkJED?w%10v6$Q@>uN<|S~KP+n!}z4I^! zL+bOr{AsxPK`qzH?f-LdNdEX|0xOBVDVEduDP-mWoGepB)n}L5gHH(XfTSeN{Xhx zm8Ur?Cn7%ZlNKq>^^|A$7D%kzSgWQ@x4-91VI!Ln{`!qPCBm$hL;Kzb;h%IL&SZ49 z_c927*WHy-iTOVL6;}kt1B$D+ybRm(R&0o@{hrA5$%}t2{Y;HrjxBtreN5nEi=#SR z9v{Vq=fz_^T2tltBJSO;^}|7X6=8&|6FMrUnvuHNipe_-`U-xRDk4~_mBAK=So&Iv)S{fkwG4p z&0_ou0#V#h=JKg#wCtvWUnIvhb&I)~WwH!|Vgl-PA9|A~dX?pX!@79&@*K0S@|eCB z_YAJrihDjZsSD|s&K`4jZ;Fd2Xkv}b+R1q5BV@pLM1YGZS9Z!~P7sUcqIdNAQKAjS zZ!_3UNvVewgxr9y^h$-uL`u0`EMkZRE|bs~~rj^EMb zNjQC8F~Aw$&#I9S(a&+z_=V3zCJ={%QRk}gI{1qUVI`Lu=l1AiVhq<#wXwzNyW@w6Iufo2$X72`_^$S1qG)`vI5VO-*UNTt5(5402 zQsLiHB>mOZ^y||N3$Raz-S2a7zN&nBZkkiwi?K%R%QzrT0Q}kVz>5v(Ed~RdC~Hc8 z1L83mWlXu)xtS<}72Gjk2Y}iNZ}@;U`O1-Duzn3ixVxnV*-QMDU3&)C?BJ#ci{A4E zepaYj;m~(Yd%JdAiGK3gAF`Nc*sh?}Kv5rB&oyAYJ9GQoHo)p2zd7$k@+PtMaQDt* zulVMnUz8mDOi*%OSIrTL?&kpb08LWkx``hB>#q|(gQk(RQW&Xbef zGMNx}h}NR?x|y~7wM9#~zkBsVsUb~BfbjyV(BnTxZwy~mc`yG<$tw7+cT^)WD0yv4 z!K`4d=&`v^gM=p=#;pw-snR=A?YcvEm?+RAnJ+9)U^XYKES+3^lO@AX%0`@XHEpGr z!_&MYiZ~weXyMK7Sp8nz+~UMumYJT_tLILpXxg%?BE_s~G9u9iF7-~l-3>)!9%sRZ zVdoy%3!V&p^OYN~$NF<&gIyFbU1D@74e<5TkmF>;N+t5+{6W9*I{7|HkdsYR&@PM+ zX&kG%mFWIn9~90$_ za$O$Szb)>Khkmn7uOb(j&(i!jAwtNT^!r2h6Ar83ZLQt?{o>ZM4m=8*gN+&4fZyC~ zp@+60vn_oM*|k*ucb7h>+bCYle->BBk8zL5cpyDDP%Q`38_$5-z){rz8pc{xy(%X$ z`d;5Qi1j=l=*I{2FVk!)TIr+xuwKhIjyGVk@&w?dW>!)#h7UG9FfaR zhi_~E9_0THg~C^}-^^+omc?(~M~dWOqQ=-df-QQCxC>NHFO?GmLT4y80Xkl-I>Ny$2# z-*WsF*OTY;Q2XTlJ5^kF2_j|M6j4T)gy{_X3RxTYBpjZ5ez_kjn^zZunQvxtujzz= zs%mO{fC#C*@e4Ll3bcd7^Vyj>Ey;qp;YLQ#EqaE0N}HI?%PuvX+a7Od^TTBIiuQDS zNhmLP5zX1qK1PW2_juk7W>W|>7o|!ZvVQxmnEDG8l7 zc>)R6|4(HtNJn+qF0mzNJg`y%e0Td5lu4B;IpR6k!0*@dT_#Yev|&;8To86P+{g8O zb6Z^!w`!itnaE`x$MwFGX}S4?-nyy^a*^dMgz%r+m@)KI}~Tfj<+-e00Q$qCKFQ+*bL(Y+My zk`r}p54!)jwIZw ze!luW8*FUCw7JHRszpvZMz8mp>#=LxoLuH=86oIIqUndO&z0aR6^9!sa^9w+d+xWa zBrl(_bWQxHXqkwlptkU!FtdUfEMvc{U0;h&>+MP6IGVzBz7ZMBBJ|%N1+)0DnFD7wr#MKH7X)}QBl!w3|kNx*1N!!tQct{8rvFlko^zNFPIxu zK~UYjN#|BN>^-vJ?O+@>8{i<*cJ>Kj_cpRm{?{UV__u|Sp>q|Hf{P~r;2z3jh$?cP zY^e+LK>?vH?rhsi`1dK5g~)O(sWqs z{?FXF=Ey%o{O{{Fc&8g3^t6yqH3kU2S7X>}LP7x8=MTD8U1b;ob0NVh)07)~jPfvS ztLDl~uOnUIFIg;*wPIk2}%Rl%w*KvpUr~KTA6|EnDf>r_))7gb2BQ9po}A#0R#g6g;(7^%3lDGQJ0ZmavfJ zx}0Un23E(}5}3zw&WVJYx$QKIigOiPR_1}7GgjV7Oz5!gF1xq0JiA}? z*U|0{M?hKHemFA_fdG!RKvAiOM*3OSw5{wQTA#l)I2g0T=3gHSs>>Kzl)!qWzFe5) zSQL;bgZ6&27F#Sa08FZu*6C23X!vp8%*j(thQJ&vx+okpBcnHIg)r!7YbT=Y)g8?= zK$4H33-K2}0-=oKXHL|&abLNVQcIFsY`X(ovGOth za9#i2;3eTm96F{g0RPtVXKy-+TeJVzIvR9D)uzKT$s9jf@|HWi?V~7b|7}v^7?G+A z5$=|A#X5A@y_2{I7U@V+!p8*v`JrkXc>4VU zIMQ*jAL9Ji4?m}5n3AoS>rnO~-m1o;!`mL3_o$9PS z+<8m!T*Q$rl~gn~lSzzy%;+{R{Oaq^Wr=RNt}w&(@PRUSmmHhsy#TVJyW}B@M0Qzo z&pG68A)!FwSDM}^ts~fppgSiUTw%vs5lht^bBv$iv zeyaDWg(HjjL$_ESy=HyD#X+ICh49_{miXk7{=$3=dryUBGhNU%{OY1Dpay^XX}#`3 zDHz*C`FMNVtL5ltX~S|}5CVZk5Nc~{L;tP%Ai)*;QY$P7q5P_0a+Je_=)pyf|HXw2 zV_?A){KwcEuP6~|dWT3cxxU;j;vw!&O>$F{WC1XZbOPq2KOfW6Gdwe6`CE40lOgo) z$NL1sN|(b-zMkUx480T=6T9{4SgwabaP69uJpgY)LPCH59gQ6b3Q9{!FSi|X0-3cW zv=vYzISPIiKNm$DR`N1b1b>C%G%ZIJi>y!Y@B3n<>LB*TLn!|F{$yoi!-{enjve7Z zy>PcMO;*}x@cs2QN{1}~zte^iHvTQ4sPNUwoPTPoO1n?TW>|+d@=gS<6vW)UpZgMj zX6Lul%bCln2Q9;&wV<04MVbcwuV0`Q!oeL5*fx!?_LKnXj}reDouGj#>eqVnv^;{o zDc@f)Nnx|)AM-O^*xYliyng&ad$mDW7~C1A;fEv1p+?V$MG)w3HQZPIw>tlMO9U$# zy4EFbC({HCsr>2HuL?Q##d=V%Do^n0SS@Cm#OR0qeqsth8ZcEAXvExatK?myH;-sp zWZkrZD?22J?N|Ois$2)|XT?g$o_fJ?9NKPu^;N!OcClCw!|~7C?H{ol)J#Kf1E2mr zRtVY`3Ob&e9mEPE_Pg27s-!PiAW*H#`XN6J*WsKM$*>79Le*y5jqxw#N$DZ=^z_yf zWxm-YthRe(^r4rQmtEz?O14gRhHAhDH9j@fcb-i#b0?(MwA~~p+@i%lg#Z_aw@(~- z{jc2vAD=2XsU>Z%EwCWxSk7|}vG(g%`3PC5F8@Jki9qw8rDtDCE8G4(UlZ+PyG=Qk z^EIj*9pIRtLuMPloD3S5Oq7z5saehs%M=Du3;C#O_P8RyN|QSAaG zWPSH7-C4u?8uQ!#9=BtTXaAnv(W@?bdcPgp7;7i2;!7)}f(Co42_YYL>>gq)HcYmhS zIz^P3)eu5m+@v8u0FV?8{{R%v$3W}Wn;%dAw|WBj+#sE(&AV&Nw;vkzr_UP8yE#2Q z#WtDH(=}@(tZ)urg&n;@XZmVEGlMDCTmT!koG1{Jb#BaHnT+AmN%|Z-m}ao9#4hhc zL@#2|0jmeZzY}Acnw!10<~p;78tFdYJ1r^ED7(=B7S+*6-P@KAjI}mP=}}PXr&H|? zQ}rHBqobozd6s+p%LliI#3*}E?aSsKt!YZ&1Wpj^8O)LEhOq=oDrWV`u!~SJz_H5ryuaOgC=l}?U2k_Nw zU>>%fsw*OvJQjFb=!k+?plMdt0IV?x1FR6Z|6fiwiWLwCVM}GmFV}b_^2iUmU|eaQ zJ$0W3wbJ2=j>?^VS=eK^r3LuYz_~9@`TyD;G<>%6F?c%3Y{ITAFevanF%^o&@_`%H z-}Yfe*3-UIZij~$m8AM_fu!d3?r5-+DkF}1l(BV^2r{HOtS=TTUdcwn$UYRZ;f<|z z>3fsmSeu|6hBx+Zwfl^`CMOj_RhC6tLqo%C@urLw+{q~~fUu^fMmF?B7GV<@$P`1t z-t$U%kKg;1tg-QSQ2Rm9WW5KwNb9bF=8IccuE1gW?2#~bSPB>61k~*NED5K72O?ol z0P1{ruBL~VNI@B*+yYk9Bqk~O2)c&d+Iaa=H3W%ytR?pQcWx#ormX>w&a#whekSeKg*`&ZaUlC`g&t)6pY}opZ!JCZSh$dXh@a=bKrG9WRCa*Xe#!c-GlU-a zh0$XR1BOZ}lBnyph;S@g3{e$&8aVCQO^#Kbp_rbTp25*bIZ8p&zof3Ff`ZHW>;wc! zl-RK+Fes>IFl;X3Top*laufroDO65GVKgB?_@8WJw&y9r7(Ckk@ZK>u-!8R2Eh+nx z0tmn?tcVAb%#LC8n~un^3M9sc@&5knUxOHsaEMb6gzx^p*kh57H<~XmH?Ux6rKGD* z<#nvHX)0<}%%^O`{b^;&ma~G!U zXU}jDaPU-SZmzIvD7NkJf|>{qoMqrCj?rNcp-B(}4V8_%`(W@;Pa-oMT~+P3X|+=u z5fLGo@zm=c1d4WWePSKcQ%OqV;s(vnxYF^l}8{x@OsMcC?12 zP}3{Q%vL;N|MNko3NAGbeF+P#c5mGqf4ih3hHak^OXl?d?&^0kJS^nH+HtBO?PL-9 z=f`AAfW&yEb#mC>gD{MtzETu+#5rtkKUR2Mf*Kz;3C4Cn%q?SDFwkjmQ+KMIbgS6> z`dWLqsvnjuwV!s|sxj6NI*o$g#(S01QI+}PXYO4Xl{2rCFZritXr#21)I4;Xa(|Y) z%QqZRv!|}(>FX!X%+B;b{eeTORjL#ryO8EUW(0}~LabZjL0?`J3fzy7%W7jM0RQT&PTPdL*K Pfw-!5L$gBNCh~s(YzK!J literal 0 HcmV?d00001 diff --git a/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/seed-1/best_score_scalar.tsv b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/seed-1/best_score_scalar.tsv new file mode 100644 index 00000000..d4a48b1b --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/seed-1/best_score_scalar.tsv @@ -0,0 +1,2 @@ +iteration best_mean_iteration mean std_dev best_median_iteration median +1 99500000.000 53.346 3.422 85000000.000 44.243 diff --git a/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/seed-1/evaluation_result_histogram.tsv b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/seed-1/evaluation_result_histogram.tsv new file mode 100644 index 00000000..cbb3ecf7 --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/seed-1/evaluation_result_histogram.tsv @@ -0,0 +1,201 @@ +iteration(key) values +500000 (returns) 590.667 591.856 591.852 582.508 585.011 590.011 581.282 586.711 579.324 584.501 581.960 578.911 584.574 587.924 573.074 588.015 583.376 589.542 589.729 582.500 588.734 583.380 583.773 585.224 584.416 580.467 586.727 571.887 584.691 588.827 579.402 589.332 +1000000 (returns) 570.954 580.046 575.771 585.751 591.757 593.760 589.254 576.014 575.211 578.945 589.551 577.559 576.193 589.145 575.948 570.255 590.072 590.145 593.104 577.288 578.667 575.036 584.102 569.805 577.593 574.060 587.916 581.260 573.349 581.586 583.255 569.510 +1500000 (returns) 588.225 561.848 577.896 589.570 581.312 590.243 581.688 585.758 593.012 570.226 583.351 583.606 589.684 581.695 590.282 588.385 589.102 589.739 577.340 590.243 578.341 572.523 582.735 577.284 569.167 576.373 582.846 593.037 574.183 576.473 589.927 575.286 +2000000 (returns) 589.894 587.561 576.587 575.400 588.747 576.284 589.098 590.655 575.160 578.041 593.732 589.892 576.527 593.697 577.633 580.651 575.136 579.993 577.435 588.277 588.950 590.558 586.017 589.008 581.584 589.659 586.347 575.470 587.562 574.192 589.193 593.746 +2500000 (returns) 591.695 589.015 573.249 585.907 576.644 585.112 587.350 584.273 590.351 565.757 587.058 574.111 575.827 577.268 588.870 582.037 589.027 580.279 577.419 588.126 586.253 573.669 584.079 587.423 579.196 590.684 577.351 588.060 576.756 588.388 587.893 586.852 +3000000 (returns) 586.009 584.108 585.710 574.448 588.665 589.836 593.003 588.550 578.904 589.067 559.711 585.668 586.591 573.789 556.257 589.687 577.125 576.365 579.846 589.093 579.136 588.373 586.028 582.252 574.852 589.447 584.423 589.499 581.939 588.447 587.784 590.023 +3500000 (returns) 589.117 578.021 563.432 590.289 588.158 590.304 584.677 590.078 590.067 589.399 590.520 586.183 580.046 589.338 588.695 585.761 586.829 589.699 580.948 573.407 585.213 579.948 581.716 590.169 585.091 588.235 577.456 578.396 567.192 589.695 587.718 585.026 +4000000 (returns) 571.082 572.343 575.121 586.306 587.422 585.127 588.971 572.554 585.370 579.705 582.833 590.193 582.740 573.129 589.619 577.273 580.856 564.926 580.865 584.740 574.876 590.958 585.568 571.867 583.966 571.088 571.577 571.264 566.906 574.938 580.362 568.247 +4500000 (returns) 580.651 571.294 588.893 578.427 590.535 577.549 571.664 589.374 583.096 580.701 588.324 560.654 589.880 577.933 578.705 578.864 594.751 575.618 590.147 577.807 589.981 568.002 590.130 588.346 574.096 582.516 574.758 590.197 590.282 577.075 574.520 587.152 +5000000 (returns) 569.076 587.318 552.592 582.126 589.898 590.123 575.520 581.322 579.563 570.888 590.108 577.076 590.332 576.355 588.259 587.480 579.834 547.981 568.876 586.198 558.532 589.876 580.864 570.544 570.504 572.760 577.000 568.025 569.689 590.325 549.954 576.640 +5500000 (returns) 565.092 553.029 568.854 589.054 577.792 565.634 577.155 584.451 569.771 585.973 584.752 577.894 569.102 577.716 565.720 584.004 580.625 576.016 560.054 567.474 589.262 573.886 567.440 589.152 577.476 566.059 552.966 576.318 553.532 585.741 554.215 578.539 +6000000 (returns) 574.373 574.041 567.079 579.371 583.451 569.151 583.583 578.298 574.875 589.525 576.748 564.479 589.936 575.780 574.633 589.272 562.660 564.425 587.536 574.730 584.694 571.753 577.216 575.186 580.650 563.817 586.336 582.852 577.890 577.910 583.633 570.734 +6500000 (returns) 590.135 578.273 579.159 570.501 569.327 567.160 579.159 574.711 578.510 589.423 582.667 581.014 577.748 589.007 578.347 575.944 581.500 575.656 583.578 561.850 589.883 566.465 579.189 577.924 583.572 578.284 562.870 585.376 580.630 579.046 574.060 578.870 +7000000 (returns) 588.111 578.561 579.097 571.824 578.109 586.702 576.098 573.093 578.374 586.516 573.420 580.883 586.910 588.860 578.640 574.365 582.453 582.034 582.427 576.932 578.599 581.158 567.213 573.690 571.982 577.463 590.137 570.187 579.802 572.791 570.259 590.229 +7500000 (returns) 571.850 576.435 577.475 583.291 576.829 584.540 580.815 588.522 579.565 588.548 589.019 583.555 586.289 561.549 570.721 567.960 577.411 583.497 577.626 573.407 581.108 583.518 572.997 584.246 580.842 584.023 589.017 579.527 583.310 586.015 576.351 570.230 +8000000 (returns) 574.179 567.632 578.236 564.971 576.304 578.739 567.228 575.540 576.052 563.435 587.345 562.861 582.272 575.783 577.312 588.413 576.353 574.092 569.124 576.635 569.244 579.264 571.492 588.805 576.245 588.259 589.914 568.417 580.714 587.563 575.693 562.762 +8500000 (returns) 575.654 565.973 588.482 573.128 582.245 583.944 573.732 582.890 582.071 577.911 578.563 579.591 573.703 578.976 577.546 575.699 577.902 576.422 580.652 575.591 576.426 572.667 564.538 573.181 572.074 572.076 576.590 571.209 581.528 566.178 579.533 580.953 +9000000 (returns) 574.156 580.713 583.997 581.134 575.034 577.739 568.290 581.602 573.601 570.122 572.190 580.408 561.568 563.031 566.467 588.486 580.709 580.696 572.879 551.667 578.225 582.154 567.675 561.936 590.112 579.505 580.691 581.193 582.416 577.987 580.489 588.553 +9500000 (returns) 572.673 580.586 588.491 573.074 585.202 573.986 574.538 572.274 554.899 560.311 572.488 566.882 589.943 569.290 580.432 588.954 582.483 589.699 580.986 588.735 580.600 580.973 576.655 578.221 586.082 575.037 567.881 579.443 575.957 572.231 586.754 587.246 +10000000 (returns) 569.644 572.054 577.327 575.846 580.591 561.260 580.402 562.592 583.765 571.179 565.271 576.020 560.634 585.536 585.147 569.418 570.494 589.987 580.643 588.887 578.068 583.461 588.568 574.783 567.972 560.901 589.965 582.208 561.444 579.836 588.352 577.512 +10500000 (returns) 572.577 576.116 578.574 565.402 582.388 574.083 580.219 572.925 590.150 582.058 570.566 589.949 580.994 575.531 589.435 567.245 571.326 568.314 573.964 569.722 576.406 578.038 589.591 577.684 582.225 578.317 581.032 579.646 570.913 570.811 575.407 589.645 +11000000 (returns) 572.718 575.761 572.786 582.570 586.605 566.653 577.637 556.286 580.348 581.695 589.439 566.103 578.671 564.724 557.727 588.573 588.487 580.892 588.916 580.855 561.980 573.549 589.916 567.195 587.547 583.679 579.357 577.392 575.324 574.836 573.918 573.381 +11500000 (returns) 584.908 578.080 589.832 587.723 582.655 573.828 576.218 568.601 581.363 566.832 564.067 573.671 573.180 568.158 577.057 582.352 588.416 583.720 566.371 568.090 580.510 567.346 566.530 573.326 569.197 573.504 588.417 568.165 579.315 582.417 587.155 578.113 +12000000 (returns) 580.541 563.682 582.411 578.398 577.244 569.373 589.225 566.764 582.472 578.414 565.082 580.939 565.832 573.167 567.893 569.178 583.242 583.344 582.145 583.273 588.262 564.479 579.109 578.844 587.353 553.273 579.203 580.394 573.602 589.697 580.707 572.043 +12500000 (returns) 576.537 566.074 588.257 565.141 574.161 589.605 583.909 575.916 560.745 582.180 566.411 581.075 587.565 587.099 571.293 584.436 588.027 589.152 586.721 577.679 586.639 576.644 588.301 566.560 579.078 588.102 579.359 577.613 589.460 581.072 584.645 576.255 +13000000 (returns) 576.972 566.279 580.981 587.964 580.094 562.021 588.432 569.593 579.290 572.186 564.890 570.357 572.973 584.964 580.191 571.048 567.704 568.728 571.825 579.451 588.071 562.021 587.334 578.644 566.981 580.031 580.037 580.235 580.072 589.212 570.392 589.509 +13500000 (returns) 571.351 589.171 586.770 576.941 571.129 575.376 579.477 589.442 582.798 585.675 576.360 588.573 589.320 573.530 573.313 566.744 564.061 568.057 589.247 580.045 577.414 578.956 566.822 588.594 564.639 571.134 569.578 584.921 579.976 564.458 571.596 566.477 +14000000 (returns) 569.384 584.252 564.265 589.236 564.269 563.684 577.395 573.572 578.315 580.577 574.047 584.708 575.328 586.721 575.469 579.083 589.260 568.658 578.803 567.132 585.753 580.885 567.389 567.912 589.479 566.444 572.014 565.241 567.915 566.355 585.935 581.301 +14500000 (returns) 576.864 578.576 562.947 576.820 564.493 584.922 589.151 578.858 567.383 580.134 589.416 587.739 573.987 578.042 574.817 567.900 586.862 573.556 585.204 584.303 576.456 571.116 575.083 569.177 576.764 578.630 573.912 578.645 570.354 568.292 569.950 577.847 +15000000 (returns) 580.410 566.791 578.384 563.366 581.378 577.041 578.474 584.314 571.721 573.452 570.804 569.297 579.835 568.438 571.271 579.982 580.928 582.240 572.202 583.229 578.536 564.218 562.398 577.736 579.974 577.929 589.508 569.021 568.833 584.678 585.662 574.007 +15500000 (returns) 589.447 573.668 585.833 574.938 573.148 578.462 568.154 582.443 581.635 584.649 579.257 577.413 570.257 587.808 574.821 585.627 573.958 573.652 578.046 574.804 569.926 585.968 567.942 570.881 589.503 581.744 577.381 576.860 577.060 589.532 561.844 571.599 +16000000 (returns) 576.202 584.250 580.313 559.121 575.274 561.471 574.855 583.603 561.180 578.264 558.628 589.416 589.400 585.630 589.577 570.355 579.116 577.799 562.461 575.558 578.004 587.735 568.713 589.529 581.474 589.443 572.998 583.483 589.432 572.141 575.358 562.006 +16500000 (returns) 589.314 575.052 577.760 576.386 577.561 580.476 576.103 586.648 579.111 558.696 572.458 582.524 584.391 574.242 584.505 561.246 568.914 550.704 561.932 582.994 577.764 568.074 588.050 584.464 579.074 586.633 567.904 584.926 570.553 565.893 584.990 572.927 +17000000 (returns) 572.058 578.925 581.644 577.911 588.361 585.027 587.381 584.552 570.996 577.847 570.059 585.011 586.020 584.051 571.570 576.048 581.216 562.338 589.238 560.532 569.375 588.861 574.389 581.826 586.302 567.504 572.707 579.104 557.186 572.124 578.869 565.483 +17500000 (returns) 575.975 575.817 565.795 587.935 577.937 567.532 569.967 575.252 567.243 564.364 588.432 567.903 569.958 567.801 586.617 585.799 584.107 581.258 571.436 589.360 569.271 567.956 563.812 583.487 582.020 567.377 588.979 587.931 575.420 569.464 577.953 573.426 +18000000 (returns) 577.601 566.712 567.379 577.878 577.817 588.964 589.278 572.203 579.085 559.274 570.226 584.817 562.858 583.221 572.500 579.867 568.926 581.514 580.090 575.469 568.607 568.221 566.960 576.852 585.472 574.899 570.663 585.228 574.986 578.390 583.176 584.562 +18500000 (returns) 578.177 557.399 583.405 573.948 580.072 589.556 580.672 580.733 576.698 576.318 586.114 577.491 572.301 583.372 563.430 574.188 589.066 576.073 572.459 571.251 580.160 578.670 572.954 573.939 576.424 566.972 559.043 558.768 574.210 558.802 562.193 574.853 +19000000 (returns) 559.257 567.401 585.385 578.774 579.719 577.757 569.818 570.765 582.859 565.341 566.396 566.629 580.371 569.684 581.674 587.247 578.959 588.792 583.494 578.809 573.654 574.991 571.225 569.807 574.573 563.153 588.568 567.715 572.882 569.264 583.851 587.896 +19500000 (returns) 569.877 577.839 588.849 562.188 568.651 579.928 585.141 569.134 563.727 583.395 573.419 562.979 579.699 573.575 568.792 579.118 563.538 586.562 572.630 578.933 585.203 576.335 579.360 568.713 580.831 571.195 559.937 580.764 567.363 566.643 580.823 579.185 +20000000 (returns) 587.800 573.282 576.687 582.186 566.025 563.296 575.445 584.312 577.037 573.529 580.859 589.377 560.156 577.844 580.900 569.862 568.042 577.564 565.848 582.966 579.408 576.002 582.238 567.482 585.078 574.590 577.906 573.258 568.727 571.433 570.056 568.582 +20500000 (returns) 573.148 582.363 578.089 586.003 584.153 578.743 568.736 573.642 563.768 574.434 574.806 577.910 560.717 565.204 575.985 580.661 567.640 578.353 568.608 575.680 576.165 568.508 579.356 582.287 577.998 569.017 582.916 582.724 562.867 579.953 575.716 570.613 +21000000 (returns) 560.693 583.216 585.459 589.333 580.511 587.504 565.266 584.647 586.447 575.536 569.520 570.056 582.591 565.286 567.888 572.734 581.121 580.170 579.093 583.227 554.741 564.922 579.777 587.991 566.392 565.446 574.720 575.970 578.035 570.873 575.731 565.206 +21500000 (returns) 570.221 577.431 578.327 587.801 576.749 580.260 572.445 581.285 560.411 588.160 575.965 577.677 566.992 589.040 566.248 566.263 573.340 569.059 577.681 574.408 583.256 572.130 561.862 578.775 578.067 582.738 571.339 585.333 567.304 571.547 569.836 560.155 +22000000 (returns) 576.848 585.581 575.177 570.383 566.830 577.862 583.088 572.468 587.470 580.358 582.847 558.210 561.324 578.917 585.292 570.781 567.480 581.814 581.754 576.794 584.860 571.137 564.896 576.848 559.938 589.159 569.829 573.155 588.578 568.943 579.791 587.298 +22500000 (returns) 567.289 583.704 565.620 566.389 573.434 570.409 585.747 575.257 586.379 577.904 578.360 571.265 562.246 583.292 564.777 573.587 574.237 572.356 565.419 558.031 577.366 576.276 565.454 564.082 574.302 567.296 567.394 573.199 583.917 573.754 587.669 574.620 +23000000 (returns) 577.107 565.482 567.417 583.458 558.123 573.782 585.128 584.450 566.063 582.826 588.603 584.447 566.194 565.238 580.539 572.022 581.003 568.892 567.513 574.514 589.177 574.638 567.653 573.742 571.615 565.316 570.831 566.215 568.903 576.623 585.908 584.094 +23500000 (returns) 568.506 589.369 575.805 559.176 565.156 578.569 574.260 588.894 575.751 579.607 585.661 563.000 588.193 572.738 565.282 587.704 571.420 577.655 545.505 570.921 573.593 579.409 577.276 577.573 568.289 570.185 588.428 581.773 566.106 565.552 564.492 582.361 +24000000 (returns) 588.909 581.318 557.925 584.859 589.243 576.037 571.919 588.426 574.442 573.316 583.226 571.526 576.089 581.143 553.290 557.159 569.218 587.502 583.865 581.964 575.511 575.787 586.789 580.290 563.580 589.471 573.312 578.355 579.060 574.696 554.184 582.261 +24500000 (returns) 566.936 586.762 578.126 566.939 566.725 571.243 564.372 578.685 556.401 579.018 573.402 589.084 586.612 572.785 575.343 566.293 572.479 567.526 587.063 572.211 578.166 573.607 573.764 567.796 584.185 566.841 563.754 569.890 573.160 570.523 569.972 575.173 +25000000 (returns) 559.405 560.828 567.295 577.686 569.702 585.548 559.268 572.568 575.762 554.369 577.310 567.332 564.134 586.971 557.922 567.224 565.147 575.251 573.378 566.431 565.408 584.861 565.052 568.138 566.217 589.437 573.583 576.430 589.345 586.407 563.597 572.180 +25500000 (returns) 562.369 559.187 575.312 566.338 561.610 558.938 563.699 587.651 579.124 571.037 572.177 568.601 558.305 566.137 567.493 576.595 564.164 586.315 564.361 587.696 578.624 571.765 586.950 589.372 561.048 563.848 572.412 586.971 573.083 578.583 574.588 580.073 +26000000 (returns) 576.013 566.685 559.614 556.511 564.694 557.770 555.694 574.273 562.983 574.612 585.119 577.360 573.095 575.371 571.604 582.739 562.859 583.941 578.135 572.802 547.562 567.026 589.196 589.171 567.443 564.000 588.716 584.464 572.446 584.438 573.463 588.495 +26500000 (returns) 576.488 582.359 555.881 569.066 584.214 576.656 561.238 563.600 562.163 573.588 581.392 557.639 584.352 572.428 583.970 579.483 573.489 589.322 572.607 572.570 551.892 569.540 575.460 570.541 576.622 573.146 577.877 567.508 589.066 587.758 577.406 572.598 +27000000 (returns) 564.308 572.807 572.753 582.510 573.576 571.878 572.249 555.580 556.732 585.644 569.996 575.652 585.923 586.109 571.868 555.298 564.254 578.692 556.218 577.594 553.766 566.105 546.815 589.342 580.732 561.874 585.909 566.942 554.560 564.297 575.072 578.479 +27500000 (returns) 562.274 558.304 589.533 576.076 579.928 581.881 585.608 586.582 582.039 574.126 578.782 571.668 563.898 558.643 566.168 584.659 579.647 574.137 564.343 569.976 580.386 574.459 589.054 564.450 572.689 580.761 572.727 571.602 555.774 574.927 576.363 560.321 +28000000 (returns) 556.899 564.936 581.110 579.460 582.578 589.094 571.710 570.138 563.545 554.695 553.479 576.105 583.114 573.972 582.425 561.552 565.315 584.069 568.034 555.766 574.148 557.763 583.608 589.102 549.788 582.365 581.823 578.806 578.986 566.209 584.608 570.276 +28500000 (returns) 586.462 576.921 579.766 585.239 563.620 570.494 572.878 566.695 572.547 576.392 582.511 559.481 560.857 579.067 580.524 574.572 573.620 569.161 563.042 577.499 581.524 571.393 576.784 574.131 564.267 568.982 577.818 568.058 568.917 561.548 567.895 580.176 +29000000 (returns) 547.099 571.613 558.374 580.990 576.187 559.276 574.190 574.798 577.730 557.509 584.467 571.091 569.625 589.227 567.866 578.500 560.241 572.489 571.951 567.344 553.437 584.067 584.862 569.813 564.030 575.533 579.691 587.170 585.995 581.386 561.233 559.871 +29500000 (returns) 583.733 582.879 571.980 563.934 583.921 573.406 550.877 563.573 566.415 560.598 573.320 581.854 582.856 574.140 566.139 573.781 564.068 582.348 558.900 573.617 579.827 559.377 575.417 581.950 565.403 585.450 586.089 581.826 565.797 583.616 570.540 583.539 +30000000 (returns) 585.556 564.526 558.012 572.857 576.689 571.746 582.084 584.005 579.833 579.848 585.416 579.345 557.703 571.004 581.824 571.636 558.500 567.787 560.552 566.069 588.908 563.179 584.228 579.986 583.273 558.015 567.722 581.339 563.854 585.860 564.680 564.057 +30500000 (returns) 570.136 555.019 563.763 566.873 565.300 565.365 560.515 557.738 579.845 581.846 558.732 581.125 561.180 576.194 581.675 577.761 571.559 559.517 559.806 572.896 567.060 585.366 560.320 574.072 570.806 574.995 584.357 557.955 565.449 583.508 578.755 570.059 +31000000 (returns) 581.007 560.676 558.072 588.261 558.118 559.307 584.819 571.416 567.657 579.613 579.843 562.910 565.253 562.427 584.116 571.886 558.666 537.955 585.603 573.597 576.599 571.065 589.267 573.471 567.754 588.494 559.949 570.832 559.058 578.151 587.540 577.381 +31500000 (returns) 561.497 579.877 575.361 553.381 574.166 583.237 569.951 584.989 565.186 557.222 544.951 564.733 578.466 573.612 556.193 566.703 566.271 571.842 572.080 572.367 578.289 561.483 574.551 572.943 580.092 576.980 570.604 574.558 579.534 589.036 578.068 563.174 +32000000 (returns) 588.787 582.894 585.470 574.947 575.151 585.928 546.245 550.055 565.419 582.902 578.975 585.295 554.670 589.285 562.428 566.729 560.383 557.291 562.573 568.773 570.940 564.896 565.829 586.723 584.435 562.242 572.922 554.966 585.179 578.942 568.012 580.125 +32500000 (returns) 554.939 576.172 582.335 581.629 560.731 579.916 579.455 572.095 578.131 589.252 583.356 578.005 573.480 587.151 588.940 566.869 587.319 567.476 560.256 574.806 578.006 586.043 567.669 562.264 577.494 585.339 580.323 577.514 572.694 563.964 585.108 576.058 +33000000 (returns) 574.256 561.288 563.722 564.361 565.522 571.360 582.558 573.765 564.698 566.438 556.722 573.822 582.627 563.698 577.063 573.588 571.833 564.501 574.893 562.420 580.091 561.108 562.452 567.364 588.808 543.745 570.318 563.007 589.427 565.236 579.946 589.424 +33500000 (returns) 551.430 572.376 572.917 585.986 555.410 552.471 589.485 554.249 589.386 569.492 571.992 573.093 557.346 578.471 560.681 571.264 585.032 558.268 574.419 583.924 567.547 558.430 574.914 585.742 576.621 577.876 548.906 536.880 578.741 580.530 558.205 570.386 +34000000 (returns) 556.797 579.222 561.288 567.059 547.533 546.246 571.284 562.856 572.280 567.267 566.444 556.766 569.246 552.716 556.174 577.304 563.614 574.846 560.030 572.318 588.514 570.321 568.377 549.053 567.310 551.344 560.749 557.007 587.433 572.879 569.743 557.865 +34500000 (returns) 571.145 564.411 567.820 555.330 567.661 553.127 553.594 572.340 577.527 563.333 531.238 567.852 576.767 564.189 565.230 564.862 560.359 563.430 575.109 565.095 589.033 581.456 548.573 569.391 546.718 549.741 582.021 583.695 559.976 567.405 567.895 579.629 +35000000 (returns) 568.862 557.634 565.282 571.606 565.834 555.496 569.368 543.023 562.977 574.160 555.468 549.171 571.430 556.343 549.952 552.501 561.291 580.914 559.211 560.433 552.165 534.259 572.518 566.285 587.490 570.482 586.415 567.548 565.400 573.376 587.582 571.174 +35500000 (returns) 564.373 570.589 564.372 569.870 570.520 552.817 574.398 561.811 549.526 555.984 561.399 571.455 564.293 565.659 560.289 549.162 573.358 548.889 558.284 551.073 581.462 574.414 569.779 587.450 556.242 574.074 565.121 562.943 566.105 567.063 580.257 567.937 +36000000 (returns) 544.334 589.501 563.018 551.023 589.300 566.803 489.970 505.834 540.394 574.366 587.350 544.991 589.447 577.994 564.772 574.939 566.668 536.372 555.372 575.366 491.052 551.752 527.322 561.621 569.929 572.439 533.221 567.948 519.504 539.479 501.186 574.031 +36500000 (returns) 519.969 547.622 569.079 575.151 510.058 478.129 506.107 503.863 503.571 524.394 500.802 500.594 515.551 497.594 526.633 574.365 558.680 505.705 508.375 496.347 521.843 581.451 553.597 518.342 578.650 530.150 577.751 495.457 504.059 586.508 500.009 486.442 +37000000 (returns) 534.913 533.860 547.322 495.841 425.774 513.382 532.807 564.660 507.885 530.371 487.301 468.974 482.910 574.533 542.778 567.140 560.236 497.171 502.757 483.975 489.396 494.597 575.482 588.124 497.185 572.195 529.506 510.207 548.333 559.292 529.022 525.935 +37500000 (returns) 543.591 572.897 455.905 531.243 496.403 573.394 575.288 459.094 466.781 474.248 498.226 511.453 481.632 486.645 586.768 503.738 564.828 572.588 454.234 483.174 504.602 574.685 513.895 491.087 536.989 452.243 581.547 586.204 541.251 587.472 555.951 561.187 +38000000 (returns) 567.047 513.339 511.302 485.207 444.496 576.553 568.166 542.729 371.250 439.039 530.487 480.380 517.910 579.389 472.381 527.486 574.307 436.869 423.531 557.891 498.661 479.641 472.863 441.731 524.620 578.119 497.551 543.024 504.683 408.504 587.237 500.251 +38500000 (returns) 550.382 499.383 579.407 573.953 522.701 554.292 578.061 440.884 571.120 578.586 515.548 578.873 431.306 487.783 542.016 538.943 578.120 489.941 409.979 577.304 564.248 486.846 587.952 470.700 547.315 578.417 521.290 586.113 566.034 544.714 480.301 563.942 +39000000 (returns) 504.847 540.022 575.654 569.391 514.827 550.753 519.922 440.269 574.862 543.806 581.035 479.869 498.808 476.454 436.881 453.829 538.182 580.477 575.753 585.502 517.228 540.314 537.399 585.538 487.554 479.167 535.086 511.211 541.867 530.936 506.783 514.360 +39500000 (returns) 517.581 529.755 583.347 578.194 558.321 557.114 524.145 563.136 498.502 498.543 416.136 470.363 580.557 502.185 529.367 543.695 582.340 545.763 522.566 558.227 579.948 563.609 502.683 557.569 496.279 516.983 530.317 573.385 538.206 562.781 453.740 589.044 +40000000 (returns) 174.825 573.365 485.094 284.327 539.009 586.792 524.919 543.493 586.412 556.053 584.825 548.177 433.378 420.364 510.069 586.824 377.149 188.825 182.330 561.156 155.809 514.681 372.572 487.286 179.915 419.469 548.375 573.274 549.722 181.386 489.895 505.867 +40500000 (returns) 588.959 421.727 560.075 579.320 427.868 563.400 380.718 490.962 475.366 535.870 475.628 197.320 401.450 559.483 564.341 497.476 363.430 574.421 538.528 313.283 573.785 568.329 551.093 528.000 551.566 545.459 580.884 547.347 391.781 499.651 573.702 487.430 +41000000 (returns) 559.779 525.031 467.971 314.719 534.906 567.574 523.787 142.090 345.252 477.482 508.066 585.201 526.789 569.041 588.600 539.002 535.635 528.062 515.275 370.292 517.319 217.777 431.832 530.421 570.382 578.424 539.045 525.228 562.213 449.174 534.088 575.195 +41500000 (returns) 448.903 169.725 526.678 170.351 534.281 538.683 467.027 174.789 405.849 503.534 536.224 570.682 534.198 504.151 514.102 576.319 520.136 571.876 512.601 527.050 153.786 471.364 574.324 546.071 564.225 339.672 365.542 173.291 438.956 519.958 580.889 523.290 +42000000 (returns) 483.340 523.615 450.170 404.689 299.639 486.073 580.104 547.985 562.188 535.844 490.078 367.699 429.401 569.423 494.475 475.101 563.443 541.524 557.026 503.993 353.404 410.095 572.648 583.743 544.432 463.409 567.100 511.468 515.881 580.807 530.084 494.693 +42500000 (returns) 194.030 512.284 180.873 160.059 542.982 193.258 539.843 192.332 188.909 445.409 525.019 193.251 187.719 579.240 188.446 522.703 579.826 564.494 456.498 277.178 193.235 202.724 192.566 527.235 449.252 170.414 557.245 196.644 192.703 445.140 186.902 579.307 +43000000 (returns) 431.875 469.122 565.633 485.808 509.719 454.605 181.538 373.372 501.711 543.460 357.656 497.138 569.041 417.144 497.923 580.029 167.326 512.911 368.017 196.091 211.474 560.777 532.245 573.970 291.321 332.922 589.573 498.728 547.148 493.703 350.690 471.382 +43500000 (returns) 558.091 496.727 338.668 493.297 544.366 541.413 514.668 494.374 208.962 483.696 557.526 455.363 435.481 572.902 421.012 389.465 561.283 580.761 525.253 489.065 575.788 380.206 588.552 580.883 501.509 588.619 453.980 515.894 531.637 528.073 571.362 574.921 +44000000 (returns) 533.114 468.909 176.922 543.008 574.452 520.557 506.749 585.299 169.645 535.749 545.295 181.497 504.277 483.865 373.265 503.887 487.646 540.653 577.887 472.150 503.921 456.280 536.581 494.468 534.008 456.784 420.214 545.518 481.974 562.872 529.340 568.433 +44500000 (returns) 563.853 553.689 547.177 575.072 524.058 549.879 555.817 550.314 511.318 586.200 315.160 554.759 357.218 497.590 432.906 450.354 531.912 565.548 551.445 121.260 527.970 471.295 534.774 549.318 586.134 474.084 544.139 569.136 579.174 509.936 550.223 564.703 +45000000 (returns) 493.437 400.430 557.298 446.983 586.857 513.472 483.874 578.687 578.585 573.567 589.590 556.638 445.705 560.335 552.289 550.413 421.859 544.560 434.446 556.269 554.492 485.269 464.987 519.450 527.536 460.364 558.204 537.462 248.596 543.923 430.699 586.754 +45500000 (returns) 452.013 558.499 559.675 563.163 381.883 509.787 550.051 456.387 441.552 124.831 551.944 547.984 546.670 542.374 554.446 549.711 307.953 571.804 550.464 549.185 557.790 442.871 402.843 514.307 459.876 460.122 490.297 446.129 526.682 456.237 260.640 556.055 +46000000 (returns) 582.476 561.426 472.271 533.468 537.739 547.422 589.595 119.671 535.986 495.609 562.884 537.930 589.476 589.466 493.590 354.840 546.892 545.067 515.222 540.667 520.337 561.642 539.447 545.366 523.587 457.603 550.731 524.841 589.413 462.510 589.526 586.669 +46500000 (returns) 481.038 589.348 447.395 563.046 512.484 492.995 517.057 447.873 549.928 239.371 530.283 489.644 553.122 519.075 585.565 585.833 544.717 541.558 487.133 461.125 562.705 358.462 463.065 448.689 480.610 503.184 483.810 543.689 492.001 540.079 587.685 543.494 +47000000 (returns) 581.031 561.654 389.685 528.790 560.189 381.978 517.156 526.393 509.285 527.512 513.528 562.773 434.294 563.871 511.149 576.641 428.779 490.335 540.013 502.967 548.337 367.261 527.193 542.842 411.809 433.366 520.182 425.464 541.244 464.562 465.879 291.869 +47500000 (returns) 587.704 536.152 553.110 436.464 554.261 431.775 535.086 560.393 394.842 567.486 517.491 536.317 467.082 314.272 469.555 514.015 546.116 412.722 589.693 414.566 493.320 537.664 530.488 589.385 556.693 542.058 533.109 556.398 526.436 432.175 572.974 552.109 +48000000 (returns) 557.933 399.032 548.246 533.607 588.873 546.017 546.495 265.174 412.788 414.564 303.768 516.726 556.383 456.985 587.387 525.837 417.626 578.287 538.306 589.637 397.979 554.344 585.660 545.921 487.642 478.612 527.122 513.249 510.876 579.671 464.663 446.989 +48500000 (returns) 403.798 449.849 341.949 426.167 99.231 577.462 291.440 587.771 470.239 508.414 520.681 506.545 491.725 589.230 539.302 452.091 426.336 456.930 570.954 524.716 483.769 537.785 450.139 367.005 588.290 562.786 557.685 295.620 141.259 587.882 481.086 569.620 +49000000 (returns) 550.394 279.741 532.908 501.050 529.137 431.462 122.170 395.575 541.807 460.798 562.811 174.809 408.253 435.176 438.203 538.550 589.630 561.893 541.199 416.893 348.003 547.580 367.893 262.787 507.549 409.060 395.170 233.833 586.853 392.564 527.169 562.764 +49500000 (returns) 454.718 229.868 102.150 403.991 524.925 397.497 498.219 535.603 435.217 327.728 353.362 329.768 400.294 589.304 131.743 266.366 403.708 585.934 556.170 542.231 362.050 507.774 511.713 428.304 567.580 587.888 426.587 502.307 147.835 534.010 367.813 420.429 +50000000 (returns) 448.984 439.027 487.478 310.818 408.235 375.094 558.515 490.182 105.633 569.823 332.911 396.695 588.619 352.238 373.102 586.229 559.418 535.180 585.747 330.220 556.011 428.287 271.957 451.534 465.761 537.543 386.038 524.746 385.256 437.122 397.408 481.154 +50500000 (returns) 219.213 163.614 560.935 362.081 441.683 124.116 547.500 585.680 357.220 406.133 451.821 344.031 450.935 566.153 517.249 545.913 375.774 378.070 308.830 589.588 515.964 533.201 214.944 542.798 109.011 460.790 306.945 547.962 588.459 340.492 551.884 115.558 +51000000 (returns) 367.658 567.620 488.472 110.287 515.812 218.632 102.906 95.650 107.600 334.727 103.775 107.696 491.667 512.411 445.612 191.972 529.774 588.203 479.683 104.893 410.681 448.102 104.983 284.589 587.856 446.771 571.784 585.134 101.893 401.483 180.933 530.039 +51500000 (returns) 545.471 114.811 241.798 150.481 482.176 316.366 502.314 442.398 205.851 478.777 283.603 98.590 348.777 137.661 421.554 435.283 232.376 373.717 510.385 98.644 511.021 138.277 369.848 293.725 96.612 447.148 357.556 262.449 504.217 387.827 531.783 586.129 +52000000 (returns) 484.294 133.676 427.377 530.344 554.666 518.481 569.273 131.709 547.086 133.999 204.386 129.252 138.572 362.314 111.419 461.862 409.215 406.931 505.768 459.553 420.761 589.439 564.924 540.740 200.471 533.248 143.899 525.013 373.968 560.864 343.508 547.769 +52500000 (returns) 100.670 343.553 211.260 487.390 417.247 94.368 283.298 329.281 115.413 459.657 363.746 267.437 440.892 578.932 93.064 95.814 588.178 88.473 510.083 100.776 526.071 79.879 448.200 442.472 552.762 549.853 446.820 462.525 338.654 522.476 560.573 492.408 +53000000 (returns) 557.587 497.746 432.371 450.753 365.946 82.304 497.240 588.930 488.107 516.073 96.329 92.196 89.228 88.402 396.156 586.839 300.021 106.694 512.916 559.349 587.588 536.006 570.096 536.269 306.033 375.200 512.899 327.081 579.697 93.536 364.360 569.614 +53500000 (returns) 82.192 97.257 195.654 547.736 438.739 326.124 488.770 341.198 568.967 233.634 72.558 87.064 491.420 561.441 378.030 560.599 453.719 493.762 310.394 85.113 304.655 176.561 339.670 82.999 240.872 589.628 420.594 558.208 77.904 90.147 82.355 88.024 +54000000 (returns) 318.501 297.883 357.402 449.181 467.322 198.260 471.076 361.672 223.542 181.720 494.024 490.977 487.956 428.809 100.911 315.853 527.781 382.524 106.319 193.098 92.905 220.156 525.681 205.060 233.946 87.051 354.855 102.620 256.609 495.990 90.392 342.133 +54500000 (returns) 489.484 358.783 471.419 263.330 227.793 81.656 306.042 561.843 280.652 254.647 282.556 80.748 454.157 257.914 451.309 572.921 76.765 526.316 79.757 572.729 561.632 417.680 449.929 502.648 408.789 310.880 339.577 138.132 82.880 120.718 585.276 358.989 +55000000 (returns) 78.129 75.468 413.154 267.208 76.541 84.088 92.468 319.797 139.377 264.030 153.992 399.536 76.668 573.973 557.786 316.760 174.512 413.875 72.074 568.793 588.138 569.977 560.820 163.373 451.296 109.542 585.180 578.422 466.032 587.658 276.897 415.464 +55500000 (returns) 541.385 357.519 408.504 96.255 92.306 97.940 511.128 233.970 99.449 456.272 94.757 485.748 107.366 498.336 99.755 107.256 370.777 572.791 588.086 527.240 105.922 372.558 589.431 573.891 588.232 490.653 114.101 582.898 536.533 392.725 508.160 103.753 +56000000 (returns) 74.415 539.953 84.213 588.061 294.222 217.963 285.107 220.776 181.589 588.041 438.979 74.275 96.469 84.336 482.213 85.391 431.653 448.480 482.215 78.884 174.044 153.512 159.874 83.754 74.934 86.034 561.791 330.509 437.762 363.899 201.323 469.989 +56500000 (returns) 494.165 307.716 214.024 425.699 195.230 88.348 346.155 387.250 316.102 82.439 451.423 439.279 372.690 560.593 82.826 177.824 80.015 374.177 567.849 380.491 279.588 419.487 256.139 86.091 75.695 427.126 103.976 86.758 460.050 468.596 373.877 148.679 +57000000 (returns) 307.418 420.731 498.718 253.959 466.729 264.858 376.357 464.506 317.293 77.827 586.481 460.655 336.549 474.887 281.089 290.016 228.246 386.548 587.310 83.924 589.378 386.272 83.786 587.494 87.283 290.575 80.154 242.681 84.026 87.689 277.211 89.022 +57500000 (returns) 74.198 73.270 67.892 67.040 76.756 65.215 67.075 560.555 76.978 69.217 74.361 586.649 64.636 68.056 73.298 560.900 183.734 73.349 69.714 237.551 73.571 572.172 73.836 563.612 560.463 77.954 571.180 66.097 66.349 76.534 72.867 177.954 +58000000 (returns) 76.025 84.362 76.438 71.267 589.616 79.746 562.582 77.591 68.453 70.651 78.651 76.934 75.338 70.108 76.132 75.681 72.726 71.597 70.946 73.314 118.880 79.162 77.489 73.007 78.691 589.614 72.722 79.192 561.649 73.786 150.798 70.298 +58500000 (returns) 47.519 48.723 587.869 48.509 44.799 50.215 50.690 48.976 49.446 47.001 55.222 49.349 50.453 53.032 48.679 50.466 571.898 44.844 48.215 54.081 47.956 51.641 54.091 58.444 49.922 49.358 50.892 49.832 48.527 54.393 586.039 50.655 +59000000 (returns) 45.908 47.753 48.307 565.174 47.783 49.839 48.741 44.980 36.104 61.861 49.073 46.758 47.740 49.162 47.613 43.402 586.704 39.691 45.171 58.054 48.157 42.354 47.022 51.822 58.395 49.201 48.442 50.903 49.387 49.129 49.519 49.410 +59500000 (returns) 49.736 48.017 48.709 51.078 48.483 50.738 46.243 48.597 49.127 48.127 555.398 45.090 49.941 52.089 48.527 45.548 569.723 50.456 51.642 50.255 46.210 51.038 50.751 49.915 52.142 50.272 536.166 51.175 50.535 49.151 50.396 578.003 +60000000 (returns) 54.058 53.984 61.049 69.172 64.954 52.276 570.196 60.924 589.582 50.190 55.827 53.519 539.111 588.980 59.485 64.254 58.511 59.546 56.600 53.451 584.631 589.583 56.491 62.334 64.308 58.190 586.868 54.552 64.921 61.342 53.279 57.710 +60500000 (returns) 64.733 589.426 64.652 559.614 587.107 59.913 66.930 64.208 586.162 64.865 569.781 63.178 66.370 585.162 65.657 59.231 569.450 64.507 65.227 63.960 61.624 65.857 63.968 63.583 566.467 65.252 64.324 70.695 556.172 67.737 533.922 66.568 +61000000 (returns) 61.653 64.737 64.076 63.899 61.765 63.058 61.348 61.860 589.478 64.508 588.009 62.355 61.256 59.824 61.116 61.179 56.657 57.287 63.469 55.404 585.792 56.815 568.662 61.515 571.312 59.510 62.580 58.853 53.275 58.412 63.022 62.688 +61500000 (returns) 587.246 61.386 568.964 62.883 63.397 588.489 65.380 65.172 62.834 63.712 61.353 63.195 63.005 65.255 65.678 62.545 62.850 580.232 61.469 62.501 63.060 65.750 61.278 63.691 56.223 66.741 63.225 562.304 64.423 63.435 66.914 63.253 +62000000 (returns) 63.787 65.511 61.693 61.465 61.261 569.823 62.445 62.448 586.839 58.652 64.527 62.115 61.865 63.857 65.035 60.579 62.265 62.666 63.210 66.420 60.052 65.711 62.712 62.936 59.914 65.848 62.841 60.465 62.761 59.407 67.493 59.776 +62500000 (returns) 61.541 55.496 60.878 577.287 61.302 57.644 61.665 56.751 60.234 57.042 59.151 56.684 566.478 58.946 543.574 56.478 59.962 55.406 61.491 63.579 58.868 58.492 59.092 59.696 52.731 55.802 58.613 58.896 61.866 61.797 56.875 55.474 +63000000 (returns) 68.474 73.072 588.406 67.075 64.962 67.236 65.663 63.696 70.333 68.400 67.232 70.230 69.269 71.847 66.949 63.344 68.768 64.465 63.740 64.999 548.627 63.760 64.796 68.750 65.533 68.816 554.867 67.741 65.385 70.664 70.591 585.838 +63500000 (returns) 61.820 59.741 58.185 56.827 64.879 61.635 57.193 57.694 588.200 57.006 56.330 52.944 59.478 59.893 62.016 57.161 59.917 63.182 63.783 59.903 60.755 62.339 58.557 61.621 60.374 59.368 49.299 56.826 55.827 59.609 52.043 57.950 +64000000 (returns) 62.672 586.051 588.618 66.115 71.339 572.636 65.454 72.449 563.090 68.554 572.864 69.835 589.662 62.151 62.980 65.631 62.435 63.582 63.051 553.434 65.177 571.297 64.368 63.598 70.101 65.866 68.201 62.346 63.219 64.151 62.581 61.790 +64500000 (returns) 62.176 62.777 62.702 62.736 64.135 62.677 63.454 60.638 72.854 566.226 60.291 63.131 62.292 59.902 586.771 62.677 63.340 578.197 61.767 64.467 65.150 61.933 63.305 69.003 63.762 63.237 62.549 62.761 63.487 59.881 583.955 61.492 +65000000 (returns) 52.246 560.998 51.753 53.281 566.428 55.494 53.957 56.722 57.310 56.504 524.704 54.474 59.327 50.984 52.980 56.198 53.830 55.218 579.979 56.798 60.025 50.758 59.509 53.700 59.348 554.800 56.113 53.363 53.557 56.584 61.111 61.838 +65500000 (returns) 64.329 583.901 53.431 61.861 57.237 55.415 63.427 60.499 63.829 61.533 560.448 56.213 57.543 573.494 57.336 61.645 62.104 61.583 60.255 57.910 63.372 587.838 57.474 58.822 60.112 56.978 56.851 572.062 53.133 60.654 57.312 57.154 +66000000 (returns) 48.525 56.068 49.991 49.158 49.270 48.483 51.850 48.978 46.929 49.025 586.529 589.559 48.608 49.384 572.691 48.981 48.992 49.524 587.804 50.166 49.754 49.484 585.440 49.048 51.144 51.375 51.837 49.062 46.649 555.687 51.595 51.560 +66500000 (returns) 50.801 58.030 54.084 52.497 49.758 52.108 50.163 52.277 54.642 63.343 48.996 54.717 52.046 51.263 51.764 566.454 50.492 588.389 62.525 52.451 52.634 58.996 48.927 50.701 57.761 48.378 58.972 52.602 55.159 49.285 49.600 56.254 +67000000 (returns) 51.192 50.474 45.624 53.417 51.237 49.160 51.806 51.707 585.984 49.117 49.854 50.900 53.147 51.999 61.157 51.787 52.459 588.758 51.232 48.802 589.435 50.934 49.828 563.787 49.789 62.062 52.192 49.244 50.306 49.350 556.069 48.965 +67500000 (returns) 47.963 49.527 47.914 50.775 58.176 58.006 50.783 48.034 48.704 50.652 48.496 569.089 59.221 50.999 587.587 54.387 49.341 49.626 49.186 48.298 586.466 53.884 53.060 50.270 48.161 569.198 47.913 48.616 57.233 585.969 51.666 51.723 +68000000 (returns) 49.735 49.611 51.697 49.291 53.672 49.861 48.134 49.382 573.283 48.756 49.593 49.281 48.899 48.252 585.568 57.779 587.953 49.775 589.502 48.643 48.384 559.532 49.424 48.781 50.560 50.571 49.940 56.656 49.890 589.267 49.638 58.337 +68500000 (returns) 60.032 52.712 50.800 57.616 55.738 54.355 50.620 589.612 588.159 63.493 54.118 53.413 52.621 60.385 569.680 60.304 54.567 56.273 589.235 58.037 52.166 53.902 51.232 56.054 53.005 54.330 54.934 50.744 59.598 589.054 57.139 57.742 +69000000 (returns) 62.815 588.326 63.060 62.615 63.260 65.105 65.583 64.277 63.357 61.971 63.678 64.002 64.761 554.071 60.596 64.020 64.837 552.954 577.730 62.472 62.668 68.441 64.801 64.368 63.811 589.374 586.221 63.167 67.246 65.573 64.094 60.564 +69500000 (returns) 49.069 49.994 588.684 58.857 51.297 52.030 54.427 52.734 52.294 554.436 50.916 50.155 59.229 49.147 50.192 52.040 59.124 57.275 50.574 58.477 55.967 58.889 48.862 51.593 56.574 52.116 50.039 49.495 59.342 50.160 51.394 49.246 +70000000 (returns) 47.796 55.781 50.624 49.319 49.302 52.425 51.157 51.768 49.748 586.944 52.383 48.562 49.741 51.094 589.754 52.439 589.609 48.537 50.437 58.662 48.515 572.057 53.128 51.429 564.500 47.879 50.281 51.728 57.242 589.530 49.464 49.690 +70500000 (returns) 50.840 565.756 49.771 50.744 48.477 50.454 62.310 50.868 49.636 50.919 51.074 51.340 567.808 48.318 48.975 51.646 50.092 54.133 50.683 48.297 49.834 48.973 50.560 46.066 51.439 57.125 48.674 54.309 48.998 587.751 49.840 50.342 +71000000 (returns) 48.162 572.689 48.287 586.075 47.784 571.084 46.767 580.900 49.241 49.375 557.649 49.032 51.373 585.893 49.604 48.305 48.233 48.459 47.963 48.021 51.005 49.386 46.905 47.241 54.143 49.740 48.891 525.710 50.583 51.588 47.958 45.199 +71500000 (returns) 48.325 57.985 48.219 589.614 49.534 48.226 49.952 48.595 48.187 48.341 49.045 57.980 47.941 569.336 57.867 53.797 49.482 57.238 48.918 49.777 589.611 558.915 586.135 50.606 47.811 587.076 49.142 48.190 47.765 49.437 48.109 50.094 +72000000 (returns) 55.189 55.079 47.673 50.334 560.735 50.634 54.072 55.636 50.293 55.724 58.440 52.069 52.252 56.728 57.415 51.502 56.557 56.207 56.683 51.310 55.767 53.144 51.757 51.097 50.368 589.625 53.042 55.092 577.642 50.705 53.255 58.678 +72500000 (returns) 53.670 52.950 49.016 48.130 59.276 48.843 50.769 47.547 50.796 56.568 55.070 53.240 54.446 50.714 49.734 53.039 565.829 57.920 49.866 48.949 50.433 50.256 52.329 561.535 52.344 47.781 48.215 53.735 57.584 48.835 48.046 49.122 +73000000 (returns) 49.675 53.157 54.644 49.344 53.263 56.188 51.443 53.456 53.380 55.221 586.580 53.176 51.943 51.050 568.870 49.530 59.168 58.517 53.041 54.755 51.925 52.285 55.851 52.074 51.943 49.798 52.674 50.600 54.431 59.170 50.812 52.934 +73500000 (returns) 571.237 63.192 589.466 56.460 62.918 60.657 61.006 586.788 61.545 64.044 60.776 60.128 62.688 63.359 56.622 62.727 64.663 60.683 56.723 589.707 61.936 67.104 60.658 59.107 61.004 63.082 61.102 63.897 61.167 586.105 586.165 559.890 +74000000 (returns) 50.299 50.642 50.393 50.375 589.252 52.523 52.556 49.403 51.978 589.566 53.415 49.639 50.724 48.689 51.326 51.310 55.029 49.420 51.313 49.400 53.483 584.778 52.142 57.586 51.633 53.531 52.975 570.363 55.120 48.811 48.813 49.659 +74500000 (returns) 61.977 63.754 583.550 60.825 64.858 64.573 584.857 61.734 66.032 60.740 65.325 63.527 566.196 61.578 60.496 58.111 61.302 65.142 572.728 60.295 61.055 65.785 61.288 61.186 61.047 586.813 61.474 61.266 64.014 589.661 63.989 61.534 +75000000 (returns) 46.757 548.776 48.276 47.817 50.197 51.716 47.875 51.363 49.802 48.998 45.925 588.251 47.748 46.229 47.979 47.902 48.241 45.652 572.717 48.693 56.850 48.666 48.344 585.148 47.609 49.722 564.265 50.626 48.018 47.898 55.145 49.982 +75500000 (returns) 61.722 59.667 60.365 60.327 60.858 64.512 56.093 63.561 55.329 57.645 55.615 62.508 59.212 60.144 63.128 57.239 58.636 57.496 58.911 56.414 58.632 568.083 54.625 60.073 61.366 60.346 56.855 59.615 61.226 571.813 62.108 60.640 +76000000 (returns) 564.357 50.351 50.078 52.196 52.563 54.774 48.487 50.696 565.632 59.743 55.126 54.452 54.127 49.248 47.064 559.539 51.366 51.103 51.096 50.721 50.362 47.883 49.831 55.467 52.137 51.827 58.243 51.785 52.342 51.470 57.209 52.897 +76500000 (returns) 587.530 51.770 48.764 48.607 589.582 50.649 50.830 50.038 569.574 48.519 48.740 50.115 50.652 48.377 48.677 49.865 48.880 589.275 48.552 48.614 47.850 51.174 48.445 49.853 48.219 586.598 50.099 51.829 48.292 40.767 48.200 48.593 +77000000 (returns) 51.423 53.848 52.008 50.846 55.065 51.156 50.516 55.519 53.834 52.714 54.891 52.574 52.664 55.896 56.879 562.766 588.200 56.179 568.545 568.345 55.232 55.043 50.434 59.260 53.359 585.437 589.445 54.157 52.605 54.680 59.142 50.800 +77500000 (returns) 588.863 50.262 47.543 48.965 51.884 48.336 49.367 48.443 49.010 48.910 49.049 48.134 46.776 48.901 47.997 49.154 48.816 47.425 586.952 47.739 48.379 48.673 49.006 48.233 48.898 55.809 48.618 48.081 50.415 48.537 49.540 49.171 +78000000 (returns) 60.341 589.673 52.327 54.537 589.541 58.341 58.581 59.347 62.285 56.897 57.873 59.889 56.848 55.172 54.589 51.258 57.016 54.263 51.664 56.815 58.433 58.852 59.667 54.731 56.490 59.345 61.411 52.619 61.362 59.031 558.093 57.729 +78500000 (returns) 58.810 55.230 50.615 54.440 55.829 57.271 58.321 52.288 589.513 53.436 54.348 59.996 50.676 57.257 58.164 54.770 56.054 56.192 55.068 51.772 54.324 54.440 55.996 55.003 49.251 564.899 53.868 558.078 51.269 55.675 56.122 587.675 +79000000 (returns) 49.702 50.547 578.958 51.834 565.991 48.487 48.831 589.695 589.649 48.366 48.681 49.110 49.113 571.110 47.413 50.200 567.747 49.163 48.056 574.984 50.614 47.769 50.457 49.699 56.926 48.747 51.219 50.124 586.167 52.042 49.224 52.451 +79500000 (returns) 49.318 48.785 48.919 48.268 50.132 48.176 48.814 48.726 48.025 537.591 50.211 48.833 48.708 51.396 48.480 48.364 50.549 587.973 48.552 50.943 49.779 49.226 49.725 48.738 48.135 50.079 586.631 49.177 41.688 48.575 48.916 50.552 +80000000 (returns) 560.975 54.080 49.319 50.154 585.709 49.907 50.573 48.581 58.197 588.189 50.783 589.616 48.261 51.302 589.176 52.861 52.718 51.212 51.242 57.332 59.068 57.557 48.346 51.534 50.355 566.763 55.753 52.652 53.382 57.337 54.284 589.617 +80500000 (returns) 51.787 58.179 48.372 49.340 563.059 49.610 555.087 49.458 569.641 50.091 50.090 53.754 58.543 50.104 51.627 53.617 48.838 588.753 49.537 49.375 49.013 49.073 51.074 49.771 49.022 49.928 57.655 50.818 48.650 51.136 50.331 50.250 +81000000 (returns) 55.748 60.170 61.048 60.907 61.216 57.034 61.439 62.860 56.189 59.729 52.011 61.135 56.109 57.806 62.220 56.994 61.530 60.849 56.240 60.497 567.022 64.708 58.328 588.293 586.714 55.945 62.867 64.589 57.826 59.932 57.117 61.369 +81500000 (returns) 48.643 47.635 53.102 48.737 51.261 48.535 48.092 47.949 47.410 48.121 47.773 49.085 48.153 47.850 49.256 48.691 47.810 49.441 47.728 48.183 48.301 48.243 47.699 48.014 56.878 48.816 48.877 48.099 586.683 47.468 47.962 47.651 +82000000 (returns) 57.736 51.059 50.207 53.486 47.832 570.113 52.890 55.289 50.137 568.633 47.134 53.843 50.691 49.882 56.219 52.928 48.973 54.261 53.151 51.326 56.429 56.816 52.316 49.576 51.540 55.968 49.660 50.090 55.107 589.254 50.386 55.915 +82500000 (returns) 58.314 61.961 59.701 59.833 560.169 59.382 57.620 57.846 60.190 47.585 57.499 61.923 57.070 60.235 585.915 52.735 56.751 59.079 58.833 61.578 57.359 586.221 60.786 57.640 56.488 45.925 61.563 58.122 557.110 55.056 589.433 59.525 +83000000 (returns) 60.433 59.394 52.933 59.545 64.823 59.883 56.364 57.602 60.679 56.256 61.064 57.493 60.601 54.414 60.755 61.842 58.899 54.709 56.539 58.358 60.711 58.597 58.520 52.025 54.337 58.501 60.017 60.092 62.211 54.681 60.005 566.754 +83500000 (returns) 58.071 58.791 53.618 50.606 55.203 52.250 52.475 57.445 57.053 49.841 556.341 56.915 588.174 57.365 54.381 58.023 51.995 53.256 58.245 50.667 553.273 52.074 54.785 56.804 49.561 54.173 51.870 57.575 52.117 57.198 58.246 48.560 +84000000 (returns) 58.672 59.496 59.950 59.962 64.066 60.189 60.165 58.747 58.258 60.973 58.991 60.210 62.945 59.273 57.126 55.268 54.741 61.675 60.165 57.683 61.104 59.995 56.978 61.995 572.638 60.339 61.203 572.627 560.569 56.692 60.168 54.536 +84500000 (returns) 48.850 585.419 50.327 52.064 49.119 51.108 50.305 49.968 55.717 49.350 47.193 48.474 48.510 48.941 50.758 48.052 48.338 49.300 52.472 48.438 47.915 585.766 48.547 55.154 48.405 48.597 47.942 47.828 52.876 47.614 49.476 47.833 +85000000 (returns) 47.367 589.634 47.372 44.699 589.326 35.502 44.416 43.814 40.441 587.226 44.583 44.669 39.395 42.366 39.468 41.875 43.248 44.370 572.643 39.615 42.960 39.766 41.104 46.303 43.221 550.369 570.967 40.555 44.115 47.493 44.476 43.777 +85500000 (returns) 49.569 50.668 51.241 50.275 51.640 585.641 53.480 58.488 55.046 52.916 48.980 52.150 52.374 54.796 570.191 49.388 53.448 54.310 50.245 589.387 54.188 51.377 50.310 49.025 53.360 52.106 51.752 587.478 568.069 55.126 50.836 585.321 +86000000 (returns) 48.424 47.885 46.794 49.381 51.907 540.054 49.242 48.277 587.364 48.716 48.065 48.616 49.852 49.820 48.835 48.322 48.657 589.294 50.374 48.341 48.942 48.249 50.417 48.041 49.023 57.035 51.887 48.899 47.934 48.142 48.775 49.278 +86500000 (returns) 55.049 49.172 58.350 54.334 57.799 58.709 53.468 53.469 58.203 566.917 53.939 56.629 57.813 52.403 59.817 54.182 55.197 59.607 55.826 567.873 56.453 56.291 584.364 588.095 52.144 52.456 55.391 53.278 54.538 55.894 54.707 56.096 +87000000 (returns) 46.530 48.798 46.534 49.656 47.547 48.143 47.526 48.694 47.258 46.611 46.804 46.876 46.617 46.580 47.281 47.383 47.122 48.043 46.792 46.111 48.622 46.252 55.345 48.641 55.724 54.509 49.587 49.121 47.646 46.694 48.073 562.374 +87500000 (returns) 48.991 49.766 48.949 48.662 56.100 48.258 48.121 48.458 48.096 587.340 47.418 48.035 56.759 47.922 49.036 47.754 47.539 48.970 48.966 588.764 47.430 47.092 49.109 47.965 47.818 586.557 54.324 50.481 49.431 56.436 48.818 48.156 +88000000 (returns) 56.408 57.567 57.975 586.676 57.775 51.794 53.258 52.895 57.006 57.533 59.871 56.027 565.592 54.169 566.410 57.335 59.104 57.639 58.358 53.922 55.139 549.077 53.239 53.220 58.933 58.851 59.100 55.231 56.441 53.164 54.900 58.237 +88500000 (returns) 587.700 564.492 53.018 53.478 51.693 51.757 50.673 53.428 51.861 50.655 50.565 561.714 588.847 51.342 52.225 52.936 51.365 52.252 52.532 576.501 53.415 55.501 49.508 51.488 544.924 55.205 51.982 50.904 49.968 50.261 55.380 53.304 +89000000 (returns) 57.072 50.457 52.548 57.241 51.034 56.075 53.364 56.335 57.714 55.243 53.641 56.983 53.392 57.002 58.134 562.932 587.290 58.424 48.305 58.753 60.158 58.286 587.579 57.834 52.701 57.095 55.941 57.246 54.267 55.726 56.907 57.014 +89500000 (returns) 49.881 45.705 50.379 50.325 50.623 564.929 48.671 49.585 48.146 49.561 48.263 48.985 48.595 49.696 49.038 48.857 49.113 51.086 48.418 48.062 53.045 49.294 48.977 49.235 50.743 50.497 50.960 49.060 48.879 48.423 48.400 50.749 +90000000 (returns) 50.649 51.102 58.273 48.837 56.859 567.692 51.110 48.209 52.454 586.643 53.592 58.153 54.555 52.521 53.930 56.582 54.661 50.137 53.122 53.854 54.324 53.934 538.997 51.711 580.812 586.977 49.268 51.532 51.462 48.517 53.647 52.830 +90500000 (returns) 48.193 53.763 51.893 53.212 58.190 48.661 585.716 51.991 50.014 49.533 53.103 49.724 49.728 48.211 570.325 50.379 53.278 50.962 53.841 48.193 52.468 552.016 49.008 53.234 50.345 47.944 49.804 51.339 53.335 52.268 587.617 48.183 +91000000 (returns) 50.116 49.017 580.053 50.292 47.505 48.797 48.195 49.233 48.287 49.768 51.909 50.286 57.356 48.159 47.985 49.227 47.754 585.478 59.617 47.419 51.611 47.473 47.630 59.174 54.091 49.856 51.735 586.638 48.681 47.764 50.566 49.990 +91500000 (returns) 46.885 47.708 46.628 564.866 561.605 49.827 54.934 47.161 46.939 46.831 48.686 47.089 47.172 54.733 47.537 50.996 48.838 47.632 46.884 48.215 50.061 47.404 47.486 47.598 553.417 48.561 47.421 47.479 47.475 589.111 46.104 47.808 +92000000 (returns) 55.478 56.263 53.670 56.964 58.566 589.551 56.707 57.494 53.398 50.499 555.714 59.155 58.581 48.257 59.069 55.296 586.703 57.500 52.340 55.119 57.291 56.869 59.349 62.119 59.578 59.641 53.056 53.733 53.919 57.690 59.660 51.983 +92500000 (returns) 47.910 45.023 49.287 47.068 47.566 589.171 47.332 48.461 34.647 51.358 46.886 47.923 44.211 46.227 50.468 47.381 50.227 47.249 45.534 46.062 580.246 48.270 46.216 49.792 48.256 51.116 48.948 43.819 47.437 45.281 47.624 47.539 +93000000 (returns) 53.371 49.549 48.315 55.475 52.061 48.606 586.488 48.641 48.381 48.900 49.022 565.332 47.989 49.616 48.715 48.771 57.235 573.113 48.697 51.301 48.373 49.740 587.270 48.664 52.083 42.383 48.266 50.311 57.644 569.681 51.189 48.197 +93500000 (returns) 584.646 48.735 52.960 48.497 50.152 51.442 53.905 51.676 56.689 52.060 55.396 49.006 52.204 553.683 47.226 51.723 56.492 587.276 49.556 49.000 50.608 47.291 48.962 49.490 49.741 56.319 52.266 52.778 52.737 55.124 49.966 51.692 +94000000 (returns) 47.606 47.955 47.824 47.768 48.066 587.499 47.813 47.385 47.945 47.521 48.062 47.440 44.993 49.406 585.557 47.245 588.878 586.579 46.853 47.589 47.643 47.471 47.980 50.952 49.435 47.707 569.221 569.113 47.695 47.768 47.940 50.384 +94500000 (returns) 48.105 55.415 52.167 48.573 48.923 49.030 48.221 48.550 49.966 48.920 46.095 47.597 49.372 567.202 47.366 49.276 49.488 47.365 56.249 47.533 53.574 56.023 49.717 47.756 48.941 49.360 51.391 589.247 570.917 565.382 586.483 50.670 +95000000 (returns) 59.105 555.555 55.344 572.053 55.851 54.130 53.799 49.688 54.204 559.621 55.951 59.469 544.113 53.164 587.028 589.474 49.053 51.838 56.264 586.422 53.883 587.125 50.150 51.070 568.503 589.076 555.661 589.655 51.254 50.762 53.111 51.942 +95500000 (returns) 56.818 64.049 57.281 50.503 60.464 60.973 566.980 60.644 64.481 587.367 58.382 57.091 589.620 56.821 585.442 589.604 61.194 57.249 565.669 59.414 554.401 55.099 61.497 62.091 57.371 60.676 55.258 62.255 59.694 60.011 57.042 62.440 +96000000 (returns) 53.068 56.786 49.282 48.919 50.846 587.946 570.866 573.179 50.757 52.400 56.792 50.495 50.482 50.987 52.401 51.510 49.335 56.049 48.297 58.075 47.998 55.804 49.226 586.457 587.776 51.525 52.158 54.033 49.755 566.122 55.834 54.306 +96500000 (returns) 53.871 53.500 589.610 60.247 54.746 60.013 59.640 589.631 589.150 589.265 572.499 538.959 59.372 60.182 56.770 57.049 59.837 585.943 60.208 57.648 60.396 59.279 562.752 55.730 572.970 550.757 59.637 60.618 55.766 59.700 60.661 60.335 +97000000 (returns) 49.400 48.298 49.798 48.907 560.189 50.824 49.677 586.205 48.401 49.405 49.866 572.604 566.229 48.702 572.581 50.596 49.668 50.141 49.118 573.901 49.469 49.324 49.259 49.046 49.245 48.460 49.366 50.073 50.069 49.130 49.229 577.658 +97500000 (returns) 47.858 47.951 566.114 563.527 48.083 587.786 589.657 589.500 48.784 49.007 48.333 47.771 589.740 57.195 47.787 561.497 557.716 50.147 48.988 566.984 587.241 546.942 586.836 566.727 585.579 50.007 579.884 49.713 589.686 49.534 589.396 52.550 +98000000 (returns) 47.889 48.250 49.687 53.214 49.150 49.005 57.603 58.328 51.712 48.617 49.580 49.699 47.862 47.533 49.038 51.301 47.890 48.399 586.441 51.548 47.681 51.959 58.559 587.144 46.522 48.556 49.263 49.224 51.526 48.817 49.776 586.887 +98500000 (returns) 588.121 49.442 50.053 48.888 50.250 51.118 50.978 48.335 51.991 50.273 49.982 48.329 50.421 51.677 57.842 588.922 587.314 48.037 48.444 49.257 38.107 48.916 49.700 563.554 52.158 553.102 50.393 48.642 557.034 52.581 49.319 53.665 +99000000 (returns) 49.294 562.308 50.194 50.357 587.479 586.898 54.580 47.176 50.898 48.816 567.006 52.553 51.293 47.880 587.753 51.189 50.726 559.420 49.426 51.263 50.072 558.112 52.352 51.151 49.980 50.595 40.273 49.898 51.512 51.058 49.666 48.845 +99500000 (returns) 59.725 47.244 55.764 47.813 55.542 53.421 54.006 55.963 48.909 54.953 55.636 48.883 52.005 51.445 53.924 51.938 57.664 54.086 47.704 57.003 48.531 54.996 53.000 56.697 57.763 47.579 57.469 55.623 49.874 55.398 53.034 53.472 +100000000 (returns) 54.889 56.554 58.767 55.549 53.038 49.645 61.034 59.320 53.886 59.204 51.883 55.091 55.911 588.885 59.473 56.562 58.517 589.728 50.351 49.351 50.495 58.522 60.110 58.272 53.301 54.187 59.626 57.251 58.998 589.708 53.088 57.464 diff --git a/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/seed-1/evaluation_result_scalar.tsv b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/seed-1/evaluation_result_scalar.tsv new file mode 100644 index 00000000..e779cc66 --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/seed-1/evaluation_result_scalar.tsv @@ -0,0 +1,201 @@ +iteration mean std_dev min max median +500000 584.693 4.811 571.887 591.856 584.632 +1000000 580.714 7.245 569.510 593.760 578.806 +1500000 582.231 7.659 561.848 593.037 582.790 +2000000 584.146 6.549 574.192 593.746 586.954 +2500000 582.999 6.385 565.757 591.695 585.509 +3000000 582.957 8.283 556.257 593.003 585.859 +3500000 584.401 6.714 563.432 590.520 586.506 +4000000 578.837 7.382 564.926 590.958 580.033 +4500000 581.623 7.974 560.654 594.751 580.676 +5000000 576.426 11.777 547.981 590.332 577.038 +5500000 573.273 10.810 552.966 589.262 576.167 +6000000 577.082 7.654 562.660 589.936 576.982 +6500000 578.120 7.116 561.850 590.135 578.690 +7000000 578.966 6.162 567.213 590.229 578.580 +7500000 579.690 6.564 561.549 589.019 580.829 +8000000 575.965 7.834 562.762 589.914 576.149 +8500000 576.488 5.252 564.538 588.482 576.508 +9000000 576.107 8.564 551.667 590.112 578.865 +9500000 577.906 8.484 554.899 589.943 578.832 +10000000 576.243 9.163 560.634 589.987 577.419 +10500000 577.539 6.866 565.402 590.150 577.045 +11000000 576.735 9.112 556.286 589.916 577.515 +11500000 576.535 7.683 564.067 589.832 576.638 +12000000 576.550 8.541 553.273 589.697 578.976 +12500000 579.866 8.139 560.745 589.605 581.073 +13000000 576.515 8.177 562.021 589.509 578.967 +13500000 576.936 8.402 564.061 589.442 576.650 +14000000 575.649 8.317 563.684 589.479 575.398 +14500000 576.506 6.953 562.947 589.416 576.792 +15000000 575.814 6.888 562.398 589.508 577.833 +15500000 577.758 6.966 561.844 589.532 577.220 +16000000 576.962 9.762 558.628 589.577 577.901 +16500000 576.008 9.278 550.704 589.314 577.661 +17000000 577.016 8.577 557.186 589.238 578.390 +17500000 575.862 8.264 563.812 589.360 575.336 +18000000 576.053 7.525 559.274 589.278 577.227 +18500000 574.366 8.486 557.399 589.556 575.463 +19000000 575.522 7.984 559.257 588.792 574.782 +19500000 574.510 7.801 559.937 588.849 574.955 +20000000 575.243 7.122 560.156 589.377 575.723 +20500000 574.899 6.557 560.717 586.003 575.851 +21000000 575.316 8.827 554.741 589.333 575.850 +21500000 574.753 7.712 560.155 589.040 575.187 +22000000 576.116 8.514 558.210 589.159 576.848 +22500000 573.157 7.493 558.031 587.669 573.511 +23000000 574.610 8.202 558.123 589.177 573.762 +23500000 574.319 9.794 545.505 589.369 575.006 +24000000 576.396 10.009 553.290 589.471 577.222 +24500000 573.276 7.508 556.401 589.084 572.632 +25000000 571.381 9.454 554.369 589.437 568.920 +25500000 572.326 9.492 558.305 589.372 571.971 +26000000 572.759 10.881 547.562 589.196 573.279 +26500000 573.810 9.301 551.892 589.322 573.538 +27000000 570.423 11.141 546.815 589.342 572.063 +27500000 573.806 9.194 555.774 589.533 574.298 +28000000 572.359 11.164 549.788 589.102 574.060 +28500000 572.901 7.170 559.481 586.462 573.249 +29000000 571.802 10.564 547.099 589.227 572.220 +29500000 573.474 9.415 550.877 586.089 573.699 +30000000 573.128 9.793 557.703 588.908 572.301 +30500000 569.986 9.003 555.019 585.366 570.097 +31000000 571.586 11.786 537.955 589.267 571.651 +31500000 570.981 9.558 544.951 589.036 572.655 +32000000 571.857 12.050 546.245 589.285 571.931 +32500000 576.087 8.967 554.939 589.252 577.760 +33000000 570.314 9.965 543.745 589.427 568.841 +33500000 569.452 13.022 536.880 589.485 572.184 +34000000 565.059 10.385 546.246 588.514 566.751 +34500000 565.811 12.017 531.238 589.033 566.317 +35000000 564.552 12.166 534.259 587.582 565.617 +35500000 565.343 9.427 548.889 587.450 565.390 +36000000 553.041 27.896 489.970 589.501 562.319 +36500000 526.777 31.915 478.129 586.508 516.947 +37000000 524.183 36.321 425.774 588.124 529.264 +37500000 524.351 45.255 452.243 587.472 522.569 +38000000 504.895 55.124 371.250 587.237 507.992 +38500000 534.264 48.706 409.979 587.952 548.848 +39000000 525.893 41.520 436.881 585.538 533.011 +39500000 535.137 40.223 416.136 589.044 540.950 +40000000 444.551 145.990 155.809 586.824 507.968 +40500000 497.145 90.755 197.320 588.959 537.199 +41000000 492.364 104.574 142.090 588.600 527.425 +41500000 454.954 135.636 153.786 580.889 517.030 +42000000 499.799 70.978 299.639 583.743 513.674 +42500000 347.429 167.928 160.059 579.826 239.951 +43000000 441.689 122.480 167.326 589.573 489.756 +43500000 501.681 82.866 208.962 588.619 520.573 +44000000 480.476 107.945 169.645 585.299 505.513 +44500000 511.138 92.904 121.260 586.200 548.247 +45000000 510.720 72.060 248.596 589.590 540.692 +45500000 482.632 98.926 124.831 571.804 520.494 +46000000 521.980 86.891 119.671 589.595 540.057 +46500000 504.565 69.400 239.371 589.348 514.770 +47000000 492.126 69.420 291.869 581.031 515.342 +47500000 511.310 65.252 314.272 589.693 535.619 +48000000 499.262 80.740 265.174 589.637 526.479 +48500000 464.305 120.649 99.231 589.230 487.747 +49000000 442.303 121.089 122.170 589.630 449.501 +49500000 419.784 131.591 102.150 589.304 427.445 +50000000 442.405 106.600 105.633 588.619 444.006 +50500000 410.142 149.240 109.011 589.588 446.309 +51000000 347.478 184.788 95.650 588.203 406.082 +51500000 340.863 150.848 96.612 586.129 363.702 +52000000 392.649 166.022 111.419 589.439 443.465 +52500000 356.007 174.275 79.879 588.178 429.069 +53000000 395.736 180.327 82.304 588.930 469.430 +53500000 308.312 184.925 72.558 589.628 318.259 +54000000 308.194 145.286 87.051 527.781 317.177 +54500000 341.498 166.193 76.765 585.276 349.180 +55000000 327.219 195.058 72.074 588.138 318.278 +55500000 353.303 197.483 92.306 589.431 400.615 +56000000 277.333 178.717 74.275 588.061 219.369 +56500000 297.824 156.003 75.695 567.849 331.129 +57000000 314.052 167.512 77.827 589.378 298.997 +57500000 191.970 202.572 64.636 586.649 74.017 +58000000 141.358 165.014 68.453 589.616 76.285 +58500000 100.054 155.030 44.799 587.869 50.069 +59000000 81.361 127.816 36.104 586.704 48.591 +59500000 113.227 168.899 45.090 578.003 50.263 +60000000 172.184 215.153 50.190 589.583 60.235 +60500000 222.697 234.565 59.231 589.426 65.757 +61000000 142.043 188.797 53.275 589.478 61.813 +61500000 143.683 186.716 56.223 588.489 63.416 +62000000 94.887 124.861 58.652 586.839 62.689 +62500000 105.931 146.913 52.731 577.287 59.019 +63000000 130.110 166.187 63.344 588.406 68.071 +63500000 75.386 92.163 49.299 588.200 59.544 +64000000 192.666 220.669 61.790 589.662 65.748 +64500000 127.616 170.566 59.881 586.771 62.954 +65000000 134.059 182.334 50.758 579.979 56.351 +65500000 139.867 187.547 53.133 587.838 60.377 +66000000 149.161 206.857 46.649 589.559 49.639 +66500000 86.127 126.938 48.378 588.389 52.474 +67000000 133.493 190.877 45.624 589.435 51.234 +67500000 133.779 191.933 47.913 587.587 50.779 +68000000 149.989 207.050 48.134 589.502 49.818 +68500000 138.177 192.394 50.620 589.612 55.896 +69000000 159.682 199.525 60.564 589.374 64.186 +69500000 85.457 125.633 48.862 588.684 52.035 +70000000 150.673 207.294 47.796 589.754 51.293 +70500000 99.877 152.477 46.066 587.751 50.622 +71000000 162.601 215.024 45.199 586.075 49.308 +71500000 149.727 206.837 47.765 589.614 49.508 +72000000 102.647 152.313 47.673 589.625 54.575 +72500000 83.643 123.986 47.547 565.829 50.782 +73000000 85.966 127.016 49.344 586.580 53.099 +73500000 175.206 214.971 56.460 589.707 62.707 +74000000 118.004 175.970 48.689 589.566 51.480 +74500000 159.585 202.306 58.111 589.661 62.752 +75000000 130.725 189.921 45.652 588.251 48.679 +75500000 91.399 123.585 54.625 571.813 60.108 +76000000 100.130 148.959 47.064 565.632 51.982 +76500000 132.735 194.445 40.767 589.582 49.366 +77000000 151.983 204.296 50.434 589.445 54.785 +77500000 82.684 130.457 46.776 588.863 48.900 +78000000 106.094 152.229 51.258 589.673 58.107 +78500000 119.895 172.115 49.251 589.513 55.452 +79000000 181.971 228.719 47.413 589.695 50.329 +79500000 97.875 152.264 41.688 587.973 48.918 +80000000 168.339 218.672 48.261 589.617 53.122 +80500000 115.799 171.421 48.372 588.753 50.177 +81000000 108.326 151.978 52.011 588.293 60.673 +81500000 65.567 93.613 47.410 586.683 48.168 +82000000 101.526 152.658 47.134 589.254 52.909 +82500000 138.733 188.185 45.925 589.433 59.230 +83000000 74.345 88.485 52.025 566.754 59.146 +83500000 102.405 149.192 48.560 588.174 54.994 +84000000 107.106 148.461 54.536 572.638 60.080 +84500000 83.146 129.747 47.193 585.766 49.030 +85000000 143.035 208.427 35.502 589.634 44.243 +85500000 151.349 206.447 48.980 589.387 52.645 +86000000 98.276 152.611 46.794 589.294 48.867 +86500000 120.577 172.488 49.172 588.095 55.860 +87000000 64.359 89.479 46.111 562.374 47.537 +87500000 99.923 156.860 47.092 588.764 48.883 +88000000 120.089 168.973 51.794 586.676 57.434 +88500000 149.402 202.499 49.508 588.847 52.392 +89000000 104.772 152.677 48.305 587.579 56.993 +89500000 65.506 89.708 45.705 564.929 49.174 +90000000 133.967 188.746 48.209 586.977 53.619 +90500000 116.452 172.994 47.944 587.617 51.616 +91000000 100.364 155.605 47.419 586.638 49.812 +91500000 113.159 171.706 46.104 589.111 47.615 +92000000 105.038 152.004 48.257 589.551 57.127 +92500000 80.767 130.154 34.647 589.171 47.552 +93000000 132.293 191.156 42.383 587.270 49.582 +93500000 100.603 152.739 47.226 587.276 51.707 +94000000 147.915 208.150 44.993 588.878 47.882 +94500000 132.027 191.045 46.095 589.247 49.366 +95000000 248.572 252.032 49.053 589.655 55.901 +95500000 172.434 214.190 50.503 589.620 60.660 +96000000 150.921 205.563 47.998 587.946 52.401 +96500000 219.586 239.253 53.500 589.631 60.195 +97000000 163.901 216.381 48.298 586.205 49.569 +97500000 329.641 263.267 47.771 589.740 552.329 +98000000 100.583 156.419 46.522 587.144 49.421 +98500000 148.026 204.283 38.107 588.922 50.333 +99000000 164.376 216.167 40.273 587.753 50.978 +99500000 53.346 3.422 47.244 59.725 53.965 +100000000 105.896 155.557 49.351 589.728 56.906 diff --git a/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/seed-1/result.png b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_backflip_results/seed-1/result.png new file mode 100644 index 0000000000000000000000000000000000000000..b9c47dd5270aca679221263d7717381112046975 GIT binary patch literal 32058 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 literal 0 HcmV?d00001 diff --git a/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/evaluation_result_average_scalar.tsv b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/evaluation_result_average_scalar.tsv new file mode 100644 index 00000000..813904b2 --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/evaluation_result_average_scalar.tsv @@ -0,0 +1,201 @@ +iteration mean std_dev min max median +500000 584.071 7.395 560.626 595.361 584.427 +1000000 581.011 8.360 562.463 594.784 580.396 +1500000 579.703 6.986 560.341 592.839 580.147 +2000000 576.612 23.136 367.493 592.927 580.777 +2500000 577.282 20.306 393.452 593.646 579.975 +3000000 572.221 24.797 396.422 593.513 576.437 +3500000 556.495 61.073 352.374 590.766 575.917 +4000000 572.220 22.861 364.047 587.267 576.158 +4500000 566.494 36.948 358.718 589.048 572.938 +5000000 567.021 23.536 372.097 589.053 569.375 +5500000 566.078 14.153 517.577 585.300 568.080 +6000000 559.360 36.262 323.668 584.736 565.126 +6500000 521.087 86.635 335.554 584.643 561.815 +7000000 528.226 76.797 332.108 586.404 561.079 +7500000 538.413 57.686 334.358 582.654 555.663 +8000000 542.911 54.695 358.026 581.315 559.292 +8500000 543.792 42.234 363.788 579.546 551.129 +9000000 540.199 46.393 337.515 580.268 552.122 +9500000 542.150 37.614 331.504 578.188 551.487 +10000000 539.567 40.839 330.238 578.929 546.524 +10500000 522.388 61.754 318.950 582.512 538.878 +11000000 541.293 31.272 344.629 581.590 546.276 +11500000 539.061 40.828 334.297 581.328 550.206 +12000000 536.810 29.880 384.322 581.295 538.981 +12500000 537.381 33.931 335.698 580.655 540.791 +13000000 538.535 27.480 341.904 578.230 540.415 +13500000 525.706 44.349 344.465 573.922 530.291 +14000000 528.953 45.787 335.446 573.005 545.010 +14500000 519.086 53.745 313.045 572.676 529.278 +15000000 457.967 113.995 102.980 573.796 507.989 +15500000 418.408 155.487 93.003 573.164 507.536 +16000000 457.799 105.651 101.535 579.016 506.781 +16500000 382.785 166.211 110.761 577.919 386.693 +17000000 418.897 111.951 91.917 573.284 392.999 +17500000 444.180 95.364 160.930 577.110 444.458 +18000000 442.537 92.835 206.726 572.894 445.956 +18500000 362.532 157.814 107.080 577.217 355.363 +19000000 370.497 145.698 150.105 577.542 373.745 +19500000 375.663 161.463 76.067 578.220 385.974 +20000000 350.980 149.876 105.843 574.775 353.622 +20500000 340.129 169.936 92.780 576.285 347.853 +21000000 332.184 140.552 114.866 568.699 339.647 +21500000 379.396 147.726 171.336 577.820 364.693 +22000000 338.313 159.600 108.453 573.843 355.935 +22500000 342.806 144.591 88.325 579.817 332.267 +23000000 356.019 158.765 145.439 579.748 356.548 +23500000 278.655 165.871 105.979 578.464 313.476 +24000000 238.143 168.894 73.083 577.381 147.710 +24500000 227.858 134.772 110.430 577.706 150.156 +25000000 215.194 148.699 73.615 577.281 142.868 +25500000 209.639 141.422 76.953 578.500 144.660 +26000000 215.591 150.221 97.194 568.907 124.883 +26500000 170.057 132.131 101.137 576.413 113.585 +27000000 197.830 132.269 105.243 577.161 153.858 +27500000 213.335 158.169 93.474 571.229 131.428 +28000000 154.530 95.873 103.239 571.329 113.740 +28500000 138.877 55.955 87.802 359.740 129.032 +29000000 137.942 86.878 94.254 567.969 107.146 +29500000 143.565 93.314 93.239 571.313 108.876 +30000000 123.965 94.004 91.040 567.856 98.872 +30500000 117.505 62.667 79.978 546.426 93.740 +31000000 116.399 59.714 80.150 559.345 101.853 +31500000 129.658 84.204 86.722 567.256 96.506 +32000000 113.691 64.492 78.784 525.595 91.210 +32500000 112.594 44.074 88.862 346.290 96.720 +33000000 105.038 48.601 84.739 566.255 95.071 +33500000 106.029 54.504 79.798 570.958 103.478 +34000000 110.167 84.778 70.639 564.534 90.011 +34500000 94.947 6.237 83.392 105.152 93.594 +35000000 100.979 63.106 74.650 546.220 95.237 +35500000 103.574 65.440 82.299 557.562 94.658 +36000000 101.898 88.972 62.599 568.285 84.555 +36500000 97.966 50.234 69.420 564.967 99.721 +37000000 97.332 33.344 76.077 399.171 90.937 +37500000 92.949 69.142 65.501 566.978 80.764 +38000000 93.896 56.907 67.568 534.767 80.918 +38500000 85.842 28.705 70.219 340.239 76.095 +39000000 90.573 31.663 68.860 373.166 88.342 +39500000 103.889 83.675 71.672 560.263 79.048 +40000000 84.867 43.909 64.410 483.317 70.457 +40500000 83.266 51.031 65.899 571.219 74.376 +41000000 90.222 64.464 60.584 539.139 69.198 +41500000 92.259 82.443 61.477 563.083 70.184 +42000000 75.475 11.837 59.298 95.722 74.035 +42500000 89.789 57.921 66.573 555.991 73.005 +43000000 80.016 14.736 63.058 103.046 75.982 +43500000 82.450 49.473 62.024 551.784 77.602 +44000000 87.997 84.315 61.435 566.219 67.864 +44500000 79.046 13.311 59.974 104.352 77.480 +45000000 82.164 15.291 60.662 104.815 86.104 +45500000 80.440 51.847 59.890 571.802 74.111 +46000000 84.479 48.437 64.631 543.175 78.380 +46500000 83.566 49.363 69.391 560.124 78.589 +47000000 89.663 57.696 62.773 557.382 77.279 +47500000 82.436 17.466 63.829 114.960 74.221 +48000000 83.014 57.133 60.783 558.662 77.023 +48500000 76.591 48.725 55.461 544.844 74.370 +49000000 73.999 30.196 55.845 355.015 69.129 +49500000 75.343 41.157 58.635 352.641 67.987 +50000000 68.448 9.131 52.663 88.436 66.049 +50500000 72.126 50.569 55.274 557.387 68.952 +51000000 75.139 57.835 56.058 560.254 67.731 +51500000 73.697 29.378 62.697 352.802 69.995 +52000000 80.670 66.456 62.698 565.761 69.581 +52500000 79.630 51.550 58.105 565.281 69.346 +53000000 60.494 3.269 55.734 69.328 59.640 +53500000 70.660 32.606 58.999 385.599 68.249 +54000000 79.911 48.715 61.620 540.189 70.165 +54500000 76.375 7.564 66.819 92.979 72.583 +55000000 67.756 51.472 41.197 557.077 66.701 +55500000 67.642 5.178 56.534 83.179 68.073 +56000000 74.477 10.077 64.363 95.158 67.654 +56500000 74.991 7.532 65.041 93.296 73.231 +57000000 65.960 2.704 61.050 74.326 65.972 +57500000 67.388 3.994 61.554 79.197 65.695 +58000000 72.665 49.719 56.640 554.946 67.130 +58500000 75.779 57.292 57.241 554.163 64.886 +59000000 68.499 7.418 59.930 85.923 65.879 +59500000 69.469 7.311 55.297 82.684 70.479 +60000000 69.709 18.123 43.628 102.275 61.879 +60500000 57.704 6.590 41.394 68.498 59.721 +61000000 71.807 31.116 46.923 358.580 72.969 +61500000 67.361 50.701 54.306 559.739 60.516 +62000000 56.829 11.229 33.223 71.933 62.814 +62500000 66.699 5.819 57.011 80.507 65.066 +63000000 65.107 30.944 38.533 345.250 67.155 +63500000 69.029 6.262 59.815 84.324 66.537 +64000000 68.336 33.129 49.477 381.596 63.485 +64500000 66.053 11.254 42.543 83.677 71.219 +65000000 56.994 9.939 39.395 70.799 56.270 +65500000 70.185 33.740 49.773 380.414 62.839 +66000000 59.133 5.411 47.490 70.690 57.989 +66500000 62.348 3.598 52.573 71.999 61.954 +67000000 58.902 6.040 44.238 71.107 58.118 +67500000 62.536 3.526 57.527 74.062 61.656 +68000000 61.509 4.115 49.506 67.495 62.517 +68500000 58.804 7.578 39.893 69.982 62.272 +69000000 54.967 6.033 39.249 62.638 56.517 +69500000 62.743 9.645 42.545 81.293 63.955 +70000000 54.718 13.545 32.967 69.816 62.890 +70500000 59.885 10.556 36.776 76.432 63.831 +71000000 61.754 4.583 51.173 69.675 63.054 +71500000 58.708 4.147 48.137 64.321 59.359 +72000000 65.884 51.114 55.684 563.457 61.202 +72500000 58.963 6.524 43.490 70.265 60.448 +73000000 61.602 4.266 55.443 68.418 62.916 +73500000 58.752 6.617 44.539 71.251 61.239 +74000000 65.194 47.626 42.182 522.160 64.283 +74500000 59.837 10.171 38.071 74.814 62.109 +75000000 59.680 8.128 42.039 68.731 63.553 +75500000 58.754 5.926 45.241 69.917 60.752 +76000000 58.615 3.580 52.453 65.924 57.067 +76500000 60.322 8.984 49.140 74.500 55.662 +77000000 65.517 3.770 59.515 74.242 64.952 +77500000 62.768 52.918 35.466 565.225 63.115 +78000000 57.571 10.444 35.223 74.338 55.678 +78500000 57.676 8.599 39.996 72.383 62.329 +79000000 49.757 9.330 34.026 65.479 54.029 +79500000 56.003 9.844 35.974 66.715 61.559 +80000000 60.120 51.528 36.529 555.767 58.236 +80500000 47.283 14.052 27.554 69.909 43.689 +81000000 62.001 4.852 54.242 76.643 61.292 +81500000 55.922 7.556 43.177 72.981 54.786 +82000000 55.589 8.249 38.470 73.912 56.728 +82500000 63.279 5.340 52.047 74.359 62.662 +83000000 68.461 51.558 50.845 568.443 64.320 +83500000 58.811 7.273 39.832 72.825 60.286 +84000000 48.429 7.920 35.386 65.405 48.276 +84500000 51.480 5.293 40.671 63.853 51.938 +85000000 53.638 8.509 38.822 68.017 55.574 +85500000 60.451 11.036 37.913 75.541 64.373 +86000000 63.502 52.685 41.839 568.772 57.145 +86500000 58.835 8.421 40.422 73.213 59.628 +87000000 52.764 10.278 33.155 68.447 56.796 +87500000 48.166 6.438 36.700 62.142 47.610 +88000000 53.906 11.306 36.924 80.242 49.138 +88500000 57.534 4.575 48.359 66.382 57.247 +89000000 57.540 5.372 44.278 66.007 59.425 +89500000 57.261 28.609 33.560 309.170 58.945 +90000000 55.779 36.804 33.942 383.917 45.653 +90500000 63.453 51.417 46.628 561.805 59.231 +91000000 47.148 8.697 35.505 61.224 44.647 +91500000 50.704 9.825 30.087 65.761 54.279 +92000000 62.539 51.852 40.360 562.227 60.963 +92500000 57.389 52.496 30.622 554.905 53.665 +93000000 68.467 60.288 44.499 563.475 59.035 +93500000 54.917 13.336 37.977 78.921 49.544 +94000000 52.730 9.458 36.506 67.414 50.950 +94500000 45.440 14.828 27.040 71.134 43.904 +95000000 61.552 3.648 51.432 68.062 62.624 +95500000 54.522 5.014 45.333 66.146 54.746 +96000000 54.010 12.449 32.731 78.816 52.868 +96500000 55.889 4.176 44.526 61.435 57.231 +97000000 60.803 52.258 41.454 565.893 57.038 +97500000 59.692 35.137 41.420 390.754 52.609 +98000000 48.629 11.182 31.032 64.312 46.871 +98500000 56.225 50.383 37.412 538.605 47.685 +99000000 65.227 74.101 32.018 569.228 60.838 +99500000 67.153 52.891 37.495 561.560 60.318 +100000000 48.683 12.078 30.871 80.666 54.325 diff --git a/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/result.png b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/result.png new file mode 100644 index 0000000000000000000000000000000000000000..21426b52f26a673df274cdd17b214c7fed04ded3 GIT binary patch literal 27516 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 RH(?RoR@S;ztYjVbe*mvu+KB)F literal 0 HcmV?d00001 diff --git a/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-1/best_score_scalar.tsv b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-1/best_score_scalar.tsv new file mode 100644 index 00000000..10fd8c3c --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-1/best_score_scalar.tsv @@ -0,0 +1,2 @@ +iteration best_mean_iteration mean std_dev best_median_iteration median +1 94500000.000 29.031 1.055 94500000.000 28.876 diff --git a/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-1/evaluation_result_histogram.tsv b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-1/evaluation_result_histogram.tsv new file mode 100644 index 00000000..53495b32 --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-1/evaluation_result_histogram.tsv @@ -0,0 +1,201 @@ +iteration(key) values +500000 (returns) 593.972 593.843 593.450 576.541 573.692 595.305 585.597 586.734 580.044 574.497 584.960 576.282 585.359 595.252 584.297 587.486 582.198 594.700 594.696 581.084 588.363 576.046 573.152 562.134 583.607 585.629 586.848 584.205 585.870 594.429 575.065 591.146 +1000000 (returns) 584.991 581.096 579.246 567.388 588.986 590.698 588.940 575.363 586.425 581.594 594.700 584.339 586.043 588.459 579.210 575.332 593.841 594.488 590.005 585.746 580.453 591.553 587.784 575.273 581.627 574.166 587.159 581.838 582.571 579.626 587.211 584.984 +1500000 (returns) 586.412 580.344 585.179 586.263 580.991 588.407 581.705 588.167 588.856 577.414 584.367 585.137 574.706 581.613 590.161 576.277 577.700 587.796 584.070 572.605 584.594 573.536 583.742 575.023 578.435 584.669 583.841 588.801 574.941 583.958 586.454 584.645 +2000000 (returns) 590.002 584.217 585.897 578.386 581.818 572.586 587.316 592.249 584.823 578.795 584.581 591.162 582.915 584.414 583.415 581.110 584.765 580.444 585.748 589.526 586.014 592.927 579.743 586.287 583.180 586.989 588.988 574.084 583.773 572.099 587.121 584.204 +2500000 (returns) 584.067 586.824 573.250 589.798 574.124 589.211 582.266 585.551 588.709 578.865 393.452 579.730 583.504 582.473 586.777 583.806 586.827 579.703 582.550 586.338 590.083 579.728 585.164 589.784 578.530 587.579 580.680 585.854 582.933 589.691 589.175 584.468 +3000000 (returns) 584.281 583.250 566.935 584.211 568.183 575.609 584.594 585.574 580.630 577.080 579.919 396.422 582.806 575.490 579.927 580.455 576.221 573.462 585.499 583.756 576.709 584.116 585.395 427.733 585.203 582.736 580.648 584.418 577.815 583.996 584.860 565.101 +3500000 (returns) 590.766 579.816 579.571 584.493 568.904 582.908 355.075 578.984 573.187 589.947 584.724 574.520 575.360 567.473 353.819 575.508 570.683 589.947 352.374 572.490 575.416 572.440 571.486 558.301 575.408 589.302 574.815 574.597 573.760 589.908 563.125 578.173 +4000000 (returns) 582.432 576.979 576.467 568.616 573.122 570.494 579.785 562.282 553.853 585.209 580.623 586.540 577.964 576.161 583.302 576.620 573.844 581.498 573.229 587.267 580.861 581.127 580.808 574.372 566.256 582.950 583.075 576.676 576.820 579.115 586.036 577.617 +4500000 (returns) 584.316 575.887 584.465 571.520 588.656 584.325 579.139 583.195 582.442 569.879 584.231 358.718 586.118 586.807 575.114 586.141 586.100 584.633 589.048 586.948 587.425 373.391 587.614 584.268 568.770 569.102 586.751 586.323 585.427 580.005 375.691 583.102 +5000000 (returns) 582.222 583.318 574.047 586.088 587.800 588.324 576.447 581.046 586.081 585.883 588.273 582.365 585.212 585.848 584.003 584.843 584.979 568.966 585.919 582.449 573.607 589.053 581.260 572.423 559.840 567.049 582.334 585.036 575.788 584.256 372.097 585.334 +5500000 (returns) 569.589 566.105 568.143 583.298 582.853 571.837 582.876 579.437 579.957 577.631 583.194 576.813 563.903 583.178 575.591 574.882 574.442 581.073 574.299 574.253 585.300 567.186 564.441 582.896 584.191 572.748 569.081 584.713 569.060 576.600 570.292 582.491 +6000000 (returns) 573.270 569.485 565.554 580.515 566.347 569.852 569.312 572.099 579.599 583.723 584.736 569.372 577.998 579.492 579.695 580.158 574.885 572.417 582.523 569.550 569.662 567.472 579.935 577.326 560.930 572.407 583.236 566.084 578.197 325.437 323.668 564.232 +6500000 (returns) 581.976 341.795 563.285 576.432 573.085 573.400 563.269 549.543 335.554 351.333 342.621 557.279 580.236 551.711 566.780 578.864 580.329 580.447 341.934 566.060 568.525 572.723 562.035 339.530 341.919 342.208 568.745 584.643 340.712 342.348 573.317 568.984 +7000000 (returns) 586.404 332.812 540.954 563.668 581.517 584.767 551.361 567.159 345.639 584.568 569.861 572.903 585.397 577.292 568.230 563.484 335.777 336.571 340.638 569.754 333.725 578.964 560.206 571.077 563.662 346.177 582.854 559.986 336.229 570.318 563.361 565.366 +7500000 (returns) 564.860 565.886 547.548 555.446 561.917 554.951 552.304 558.567 549.113 559.312 559.251 554.143 558.887 564.116 561.879 568.032 574.598 557.053 561.387 582.654 553.732 570.569 566.798 558.799 552.077 557.145 552.532 576.215 555.881 570.220 575.252 551.900 +8000000 (returns) 568.292 557.993 567.418 566.040 578.488 541.974 552.792 558.616 578.394 568.924 575.273 578.430 539.897 576.608 579.416 560.357 578.430 568.522 563.481 578.577 568.579 581.315 563.242 561.981 576.821 559.327 567.202 567.108 542.797 557.982 568.965 569.331 +8500000 (returns) 539.964 565.683 572.608 574.024 570.391 570.129 563.523 553.339 548.691 578.662 542.232 579.546 576.654 542.050 562.183 544.521 578.647 574.087 539.169 578.289 574.741 574.331 565.228 553.949 574.471 557.666 560.706 571.633 541.944 567.355 567.730 573.241 +9000000 (returns) 553.226 579.863 576.689 548.222 558.508 564.067 574.904 538.037 567.484 569.378 574.143 541.160 558.509 563.871 563.565 556.855 579.878 580.268 575.475 568.040 578.571 544.913 572.215 572.936 559.187 524.078 579.791 543.022 550.167 577.941 563.589 554.682 +9500000 (returns) 574.505 576.713 552.304 561.979 549.513 562.280 560.029 557.105 559.512 569.438 515.816 559.595 560.696 512.969 540.058 551.600 546.024 559.993 538.023 546.897 576.532 576.569 565.022 535.385 552.380 564.769 557.691 538.028 578.188 545.922 555.664 556.171 +10000000 (returns) 564.209 559.649 573.888 531.289 531.664 577.874 577.923 577.408 520.049 575.328 558.344 570.239 568.565 541.186 541.502 553.270 577.786 552.471 535.591 523.220 574.467 541.580 527.686 561.388 561.083 578.109 547.873 515.039 565.180 557.560 541.306 578.929 +10500000 (returns) 575.605 514.961 582.512 562.887 534.707 576.925 533.186 567.827 539.352 536.954 575.099 541.629 533.999 561.362 539.094 572.749 550.794 541.112 559.023 573.876 521.680 570.489 536.327 568.729 538.567 523.186 532.870 534.036 547.059 547.539 556.841 533.362 +11000000 (returns) 553.652 556.832 575.405 559.200 547.349 563.422 580.096 557.726 535.286 533.718 557.064 563.279 581.590 560.974 561.756 549.908 548.384 527.961 548.257 532.571 563.540 545.719 551.675 571.875 570.216 571.078 525.472 551.186 577.892 544.800 547.482 549.024 +11500000 (returns) 562.774 581.294 568.850 540.563 545.838 563.476 578.813 564.483 531.837 571.016 572.817 517.154 557.718 549.133 516.558 567.928 544.305 541.762 575.684 557.027 528.102 558.882 564.804 563.186 557.000 576.454 543.396 551.210 573.254 525.766 552.383 581.328 +12000000 (returns) 522.805 554.353 541.898 576.426 581.295 543.443 533.000 572.723 572.912 501.792 555.395 570.192 558.477 559.375 573.016 574.374 571.777 570.766 543.586 540.408 572.113 555.400 557.990 519.199 530.854 564.395 567.906 554.781 542.321 529.244 465.894 509.444 +12500000 (returns) 545.296 566.385 541.175 553.400 527.643 541.866 536.407 517.705 552.390 567.831 570.120 543.446 540.407 538.847 574.693 570.317 542.018 568.168 556.071 566.918 551.035 557.430 557.013 578.107 551.588 542.359 575.600 580.655 534.884 543.421 558.515 576.478 +13000000 (returns) 525.197 569.168 562.100 555.020 561.351 556.448 553.170 575.172 521.901 574.824 496.671 573.992 552.137 558.221 541.380 551.500 544.344 550.626 505.615 522.859 554.977 556.437 556.564 544.985 578.230 536.309 536.508 542.506 539.376 547.385 497.595 552.514 +13500000 (returns) 552.568 553.054 485.904 491.819 512.558 565.428 529.188 554.991 527.817 540.505 554.157 556.684 545.109 552.144 497.947 568.281 526.466 570.847 543.136 566.085 524.744 563.643 568.153 556.532 554.167 548.002 545.775 556.595 523.508 567.412 573.922 568.579 +14000000 (returns) 573.005 558.381 561.525 541.773 364.953 560.857 571.234 562.084 511.935 542.742 487.795 545.286 565.141 527.629 511.297 515.312 540.844 555.752 518.564 556.479 545.738 541.931 557.208 571.994 545.127 550.583 556.750 523.594 555.547 569.476 547.296 566.942 +14500000 (returns) 401.731 549.534 562.549 567.734 313.045 544.954 541.371 505.996 340.048 537.224 540.359 546.890 518.590 511.201 503.670 569.696 529.878 571.561 560.735 542.369 368.491 503.020 412.290 557.128 564.061 517.202 322.479 515.500 328.733 551.427 558.176 557.031 +15000000 (returns) 374.123 348.221 368.276 573.329 378.396 362.495 518.336 372.960 572.081 408.941 553.148 390.619 375.517 390.410 571.777 554.686 563.282 386.772 388.908 360.574 399.683 325.014 542.430 317.944 554.836 516.420 387.818 396.154 569.611 365.226 367.992 552.642 +15500000 (returns) 367.978 333.801 351.331 335.030 329.163 394.072 350.059 344.171 366.938 350.643 353.212 341.115 569.937 383.403 572.813 364.048 544.474 334.456 358.059 553.654 569.012 366.812 317.506 565.808 370.848 365.243 353.101 338.072 346.660 373.684 309.757 553.774 +16000000 (returns) 509.521 357.417 354.881 349.645 331.158 347.317 554.511 366.288 573.443 507.022 351.017 368.616 368.656 362.133 535.985 385.900 358.123 358.340 572.441 392.477 510.218 365.329 326.391 367.420 348.615 372.163 380.330 343.545 368.854 384.105 329.279 571.065 +16500000 (returns) 375.799 345.682 399.983 515.502 522.949 355.370 519.435 350.972 364.873 573.199 354.174 346.292 385.905 287.651 368.438 577.653 565.648 389.442 387.481 346.178 523.818 563.096 375.112 368.182 364.651 370.427 395.414 367.660 323.518 382.976 368.046 506.515 +17000000 (returns) 361.966 404.350 371.043 558.424 382.331 358.335 391.448 369.817 393.086 367.328 404.399 363.718 378.116 372.625 506.031 363.085 375.355 393.905 388.581 351.180 392.911 384.033 365.760 374.759 378.407 392.054 364.445 394.931 351.708 362.656 405.437 360.131 +17500000 (returns) 359.284 392.647 322.026 385.879 410.952 391.798 507.441 550.063 393.617 357.748 394.916 356.590 559.102 404.688 387.982 381.392 380.124 368.114 368.848 381.674 401.078 503.523 394.521 380.845 393.657 559.306 387.683 385.978 364.466 560.673 410.062 540.105 +18000000 (returns) 311.243 495.916 344.911 358.549 402.295 378.038 374.713 352.668 367.999 336.738 401.990 370.886 558.529 366.502 358.401 370.346 571.840 370.546 391.562 337.156 397.613 503.627 572.392 314.791 370.495 292.546 402.451 370.793 463.589 373.543 371.298 388.227 +18500000 (returns) 359.714 340.445 368.136 351.739 558.109 538.661 355.316 355.410 396.189 321.013 297.383 555.679 345.642 368.039 381.746 346.545 371.067 323.799 474.375 384.537 366.933 555.749 354.868 350.623 370.656 324.892 573.420 551.878 345.884 319.896 562.576 287.457 +19000000 (returns) 333.748 340.903 373.464 396.643 369.559 379.553 335.734 385.516 373.029 352.729 551.368 341.291 370.374 374.027 371.207 377.151 380.776 381.710 370.941 368.609 344.526 361.090 384.636 334.420 310.245 572.250 379.928 336.799 393.726 573.123 370.618 379.310 +19500000 (returns) 394.518 368.015 377.401 344.072 544.799 388.833 388.077 569.360 387.882 385.328 534.078 387.870 383.757 358.520 353.265 385.103 303.962 374.471 386.619 398.619 371.276 359.852 387.085 388.452 372.234 359.592 345.679 564.025 337.090 349.558 372.182 380.993 +20000000 (returns) 354.295 374.665 383.017 362.981 326.434 574.775 366.857 354.556 345.673 322.084 365.416 310.045 376.712 353.425 356.452 327.997 377.348 389.874 339.922 353.819 355.821 342.332 364.992 329.774 300.910 363.793 351.423 343.516 381.991 347.525 520.026 326.583 +20500000 (returns) 571.773 346.236 340.359 360.551 486.242 344.620 353.533 302.832 352.727 338.563 569.401 342.903 321.359 367.497 338.462 345.477 372.963 308.836 494.347 567.009 349.004 373.676 344.627 346.244 342.857 322.150 345.288 346.433 299.646 346.701 572.107 370.218 +21000000 (returns) 355.505 340.664 341.133 346.932 343.488 345.439 351.910 342.658 345.507 325.401 363.098 536.611 342.371 358.771 317.897 312.385 343.113 357.618 359.125 341.935 316.269 244.904 341.531 347.418 319.303 566.125 568.154 331.483 338.631 311.630 332.181 331.544 +21500000 (returns) 374.996 341.780 358.820 355.697 515.025 365.677 365.226 367.599 326.463 356.410 336.553 372.313 378.808 357.186 330.497 345.901 367.432 562.823 346.255 572.613 349.445 572.108 563.634 560.756 355.163 350.352 340.715 351.116 358.313 365.247 562.197 364.161 +22000000 (returns) 351.889 361.513 313.132 573.843 568.383 355.174 354.991 349.824 363.135 355.652 369.026 341.408 339.486 378.858 382.242 544.666 384.540 355.673 356.407 353.049 356.197 325.942 533.007 560.881 326.679 368.495 315.832 337.224 369.230 387.547 355.258 363.335 +22500000 (returns) 383.283 427.990 326.523 515.359 577.681 454.744 352.076 378.477 354.852 336.454 334.058 575.631 285.022 341.073 323.398 460.354 330.477 449.539 554.396 370.353 288.784 387.716 499.810 302.694 579.221 382.476 298.856 364.581 307.106 579.817 371.108 268.848 +23000000 (returns) 361.080 306.608 555.234 345.791 497.928 362.579 518.768 351.212 563.734 341.965 346.123 344.865 562.334 337.825 533.077 310.635 342.098 372.982 555.357 579.748 352.017 579.210 302.697 578.979 547.104 493.296 315.551 567.420 505.855 499.489 336.221 325.530 +23500000 (returns) 478.424 325.604 314.980 572.211 449.235 342.602 576.647 327.434 325.415 321.297 320.210 515.051 330.518 576.025 311.972 325.291 339.997 321.172 481.193 574.143 578.464 331.923 317.783 317.392 372.827 298.049 329.642 508.854 318.924 311.492 535.749 320.116 +24000000 (returns) 333.355 526.335 313.679 345.015 330.921 319.078 575.287 353.904 321.756 577.354 324.566 517.620 321.280 524.064 297.989 256.301 361.718 347.055 317.667 552.634 530.305 472.777 325.256 322.628 523.816 480.912 577.381 521.921 329.097 313.326 298.704 329.040 +24500000 (returns) 291.254 282.876 328.783 287.557 389.126 330.270 321.099 375.685 317.796 343.597 573.170 286.998 279.724 315.230 321.606 290.136 575.758 568.340 264.593 293.607 287.912 298.623 307.226 371.179 330.726 447.364 308.539 332.045 577.691 307.417 375.259 312.710 +25000000 (returns) 558.105 294.017 381.354 239.590 332.595 475.691 338.076 577.281 307.517 323.615 328.529 297.094 336.457 484.187 373.611 379.740 333.665 272.831 572.884 315.222 337.120 279.120 340.058 383.452 339.228 287.870 303.767 195.177 481.641 472.361 391.456 341.038 +25500000 (returns) 288.072 322.389 297.727 452.404 340.726 302.043 293.181 300.850 289.150 576.084 293.235 344.687 319.230 265.784 274.967 313.438 295.676 298.628 269.137 307.135 293.009 576.014 301.878 494.197 364.378 274.349 578.500 302.309 276.935 473.029 295.232 289.858 +26000000 (returns) 271.395 467.368 266.722 568.495 458.340 269.249 454.388 452.052 336.809 257.762 241.885 358.279 398.226 483.550 383.755 484.563 249.744 313.282 349.577 365.899 463.137 273.884 365.208 412.268 270.034 459.718 350.062 504.507 367.445 504.459 518.280 358.778 +26500000 (returns) 159.617 116.777 108.016 358.841 156.681 111.136 367.721 111.386 372.365 126.709 144.309 371.804 274.293 576.413 146.910 348.775 324.241 131.698 573.359 574.049 568.540 567.472 148.397 572.070 318.413 356.995 226.959 140.144 152.989 114.549 122.931 572.485 +27000000 (returns) 199.123 571.859 572.003 228.794 211.830 577.077 570.337 203.451 205.323 221.086 568.603 205.765 218.848 219.330 577.161 215.532 202.185 205.357 519.438 217.855 574.518 197.320 564.076 218.493 217.015 213.727 218.459 208.649 570.255 216.805 216.091 332.540 +27500000 (returns) 161.334 353.635 143.663 306.913 183.055 521.608 207.944 151.715 322.873 141.626 307.882 471.551 366.034 251.359 516.502 157.916 331.628 474.351 246.756 389.467 349.265 476.081 323.551 467.928 569.649 483.883 569.014 570.094 571.229 115.320 472.845 404.207 +28000000 (returns) 321.887 166.956 167.737 170.370 161.874 170.387 571.329 169.305 385.546 171.099 342.209 176.753 175.780 161.532 171.263 167.466 157.106 170.640 170.249 159.022 524.831 172.359 170.171 147.074 153.745 277.992 171.886 169.798 155.194 165.876 170.293 159.180 +28500000 (returns) 154.368 156.560 158.655 157.749 160.211 332.625 158.271 159.414 154.959 158.638 157.890 161.816 151.810 158.834 158.124 157.110 161.234 158.399 164.089 161.259 161.920 159.469 162.205 159.820 159.248 310.521 158.946 166.318 330.623 162.268 162.489 340.706 +29000000 (returns) 142.928 148.405 141.244 145.199 150.412 147.291 150.961 144.479 145.570 141.991 144.518 529.733 337.506 143.343 144.399 142.122 369.052 150.310 145.012 144.104 567.969 144.762 144.384 340.267 148.638 143.832 146.759 139.867 141.260 144.862 144.764 142.495 +29500000 (returns) 173.491 167.140 164.828 163.219 171.951 157.363 164.573 166.581 165.930 165.030 176.904 170.341 165.768 168.720 162.405 168.359 157.019 166.648 144.275 165.605 167.559 172.858 167.477 164.283 168.093 150.092 165.886 164.317 160.401 170.297 159.488 169.804 +30000000 (returns) 107.477 117.887 117.073 109.783 110.535 130.999 106.714 108.242 110.822 108.155 107.256 108.886 115.522 350.040 109.873 117.801 115.206 109.483 567.856 112.125 108.759 118.280 108.957 107.810 106.251 123.594 218.211 107.284 130.990 107.668 528.422 126.699 +30500000 (returns) 145.071 143.486 146.914 144.685 145.826 144.529 142.557 145.368 143.925 145.903 144.122 145.738 142.899 144.315 145.235 144.848 146.575 144.497 144.615 142.719 143.269 145.882 375.421 143.862 147.259 145.879 139.922 143.288 144.963 146.996 144.496 350.948 +31000000 (returns) 130.874 139.987 130.495 134.728 130.503 128.203 135.240 135.521 132.640 135.925 128.208 138.357 141.127 136.323 133.167 128.941 137.362 141.734 131.160 139.217 131.138 132.470 126.327 130.585 559.345 128.345 142.294 132.632 134.741 133.775 124.083 299.028 +31500000 (returns) 157.494 157.066 151.319 564.738 156.092 159.806 157.547 149.827 158.969 158.367 148.642 160.478 168.651 169.050 567.256 166.412 159.238 170.531 166.796 161.960 151.240 171.117 167.455 166.027 164.150 158.534 149.218 170.911 160.117 160.219 166.898 156.317 +32000000 (returns) 125.522 128.387 127.753 138.821 128.294 127.750 123.078 124.764 127.967 129.385 126.682 125.187 126.238 125.817 135.965 137.809 122.025 135.986 134.532 136.131 525.595 135.701 355.962 128.443 133.343 141.736 128.324 350.681 124.106 132.953 136.887 128.328 +32500000 (returns) 129.012 125.871 121.674 125.032 135.105 129.253 127.080 136.009 128.473 124.000 129.641 345.151 128.225 123.967 124.953 123.049 125.394 136.257 127.255 128.064 346.290 126.621 136.803 137.576 130.215 126.430 131.432 128.376 136.564 130.069 127.608 130.816 +33000000 (returns) 110.355 107.735 117.786 114.758 119.476 111.775 109.853 111.466 119.172 117.709 119.891 113.272 109.376 118.386 112.035 111.022 113.547 121.910 111.425 122.183 112.185 116.024 120.730 118.605 109.452 109.523 120.693 121.323 109.561 119.315 112.622 110.537 +33500000 (returns) 106.553 106.816 105.907 106.317 106.798 107.108 107.601 111.057 106.069 112.150 106.694 106.261 108.131 105.758 110.105 110.255 105.898 106.670 106.517 105.580 107.685 104.596 106.234 106.255 106.479 106.096 339.808 110.809 106.137 106.444 105.803 107.943 +34000000 (returns) 105.888 103.359 109.961 107.292 103.569 342.365 103.472 102.456 103.036 109.243 109.693 107.311 346.323 104.908 109.092 103.357 109.153 105.815 105.254 558.143 103.618 103.485 354.426 106.121 110.048 355.242 110.827 107.007 103.738 107.082 103.808 105.079 +34500000 (returns) 100.639 104.882 101.208 105.152 101.955 103.920 102.886 100.824 103.004 104.071 103.959 100.923 101.066 105.096 102.036 104.191 103.949 103.477 100.987 103.764 101.307 101.032 101.111 101.127 101.452 104.745 102.383 101.245 101.893 101.071 101.045 102.047 +35000000 (returns) 97.520 99.304 97.897 97.536 98.527 99.107 98.145 96.677 98.498 101.310 97.694 97.281 97.462 101.301 99.180 102.954 97.712 97.792 102.858 101.664 101.242 98.855 98.229 513.761 97.852 97.893 97.603 100.729 546.220 97.626 97.415 98.251 +35500000 (returns) 103.272 98.890 99.432 102.640 99.552 101.368 104.380 97.932 100.830 100.659 101.560 104.923 99.101 99.875 100.854 101.354 99.286 100.706 101.793 97.127 102.308 543.118 101.215 98.454 103.692 99.685 100.505 100.487 99.593 100.241 102.183 102.057 +36000000 (returns) 101.929 102.863 100.428 104.703 102.330 102.805 110.379 102.832 104.961 101.988 102.249 111.056 102.483 103.209 395.378 537.205 103.730 101.709 101.172 107.410 102.105 101.625 108.021 103.270 107.373 103.100 102.517 102.480 102.512 105.044 101.791 109.349 +36500000 (returns) 104.507 107.456 109.272 107.573 108.755 104.828 105.258 108.907 108.305 104.156 103.072 101.556 109.946 103.807 106.005 104.981 107.843 107.572 109.841 106.576 105.963 111.878 106.558 105.794 113.317 108.752 112.275 104.874 108.462 103.578 103.614 108.219 +37000000 (returns) 112.201 399.171 108.661 108.617 107.618 108.493 112.539 114.516 108.194 109.587 109.068 109.596 112.194 108.309 112.438 109.003 110.418 107.795 113.342 107.103 108.664 107.566 114.596 107.524 114.197 108.123 115.137 107.612 107.769 108.262 112.371 113.696 +37500000 (returns) 99.450 98.227 98.286 98.816 98.677 99.611 98.673 98.361 98.839 551.344 99.394 97.963 99.322 97.108 99.729 102.840 98.939 98.102 98.450 97.944 99.402 99.483 98.668 98.444 99.795 97.882 98.277 99.448 98.375 98.406 566.978 98.488 +38000000 (returns) 107.213 105.992 107.908 105.346 103.739 105.544 106.432 106.650 104.756 104.122 534.767 393.596 105.054 105.365 105.601 107.364 104.667 104.108 105.781 107.218 107.371 105.253 103.918 106.720 106.588 106.357 108.284 106.105 105.227 107.658 107.561 105.854 +38500000 (returns) 98.043 98.389 97.592 98.354 99.775 98.744 101.322 98.358 98.619 99.435 97.211 98.347 340.239 104.407 114.561 100.154 99.512 98.168 97.930 99.069 98.944 97.318 98.499 99.090 98.714 98.054 98.308 97.590 97.955 97.110 99.151 99.643 +39000000 (returns) 102.569 102.023 102.706 101.586 100.773 103.697 99.486 102.393 102.967 100.553 101.066 103.660 101.913 102.449 102.375 103.866 103.424 105.230 99.628 102.309 101.623 103.154 104.400 102.756 104.893 100.394 102.102 103.503 102.319 102.269 102.860 100.749 +39500000 (returns) 106.211 108.198 106.215 110.386 108.065 108.269 108.152 108.995 101.621 104.742 527.019 104.241 110.558 109.628 105.715 105.583 107.482 104.548 103.807 102.601 105.047 108.536 108.702 104.634 550.978 104.261 110.906 309.650 103.305 105.949 109.822 105.632 +40000000 (returns) 102.505 102.065 99.156 100.883 108.049 104.503 99.006 107.633 109.025 99.281 102.078 109.540 100.647 100.840 103.566 109.769 98.593 101.088 98.667 101.863 101.530 102.853 103.733 100.753 108.846 103.175 102.641 101.317 99.424 102.103 103.030 102.708 +40500000 (returns) 91.541 88.938 85.643 93.699 88.091 96.136 91.655 89.514 86.811 96.210 90.114 89.069 89.880 95.197 108.590 88.384 84.913 85.348 95.853 86.080 89.623 89.615 93.761 93.133 91.539 85.972 91.406 88.643 86.491 85.082 89.290 94.237 +41000000 (returns) 108.514 109.770 106.478 104.705 367.577 104.407 103.750 104.836 102.144 105.377 103.608 103.414 108.275 539.139 104.086 104.599 102.352 104.432 106.632 103.494 108.502 102.997 104.464 102.436 106.023 107.808 104.067 108.860 104.369 102.867 103.329 107.682 +41500000 (returns) 94.777 96.033 97.263 100.744 97.261 100.618 98.461 99.254 99.474 99.074 99.778 98.103 99.937 99.642 98.393 99.737 99.600 99.002 100.130 95.400 98.706 96.654 98.643 542.189 97.677 94.846 95.736 97.518 98.856 99.291 526.815 93.419 +42000000 (returns) 92.461 90.454 95.722 90.573 89.457 93.882 83.510 88.149 91.249 88.201 89.765 92.942 89.383 82.655 88.620 83.975 89.558 89.031 83.709 82.956 88.417 84.674 88.848 89.814 92.224 83.761 88.367 84.071 86.738 89.110 93.174 88.584 +42500000 (returns) 102.150 102.715 97.903 99.180 102.938 103.946 105.843 99.567 97.411 95.970 104.349 107.328 100.843 101.380 106.088 101.350 102.940 102.032 101.021 101.839 100.720 104.723 99.379 104.559 107.327 101.735 99.362 101.509 100.623 97.196 103.938 105.901 +43000000 (returns) 102.342 98.283 102.137 96.194 98.845 101.312 99.750 94.589 98.952 102.112 99.435 102.059 97.771 97.610 95.474 96.953 98.034 98.616 98.772 102.706 97.886 95.697 101.846 99.232 96.454 97.104 103.046 95.569 102.336 97.335 97.596 95.833 +43500000 (returns) 90.620 551.784 95.224 90.006 86.554 89.264 95.083 84.630 85.418 84.828 91.645 95.518 92.042 97.140 86.612 89.574 86.143 88.397 90.440 85.782 90.501 87.965 95.151 85.051 85.114 89.621 85.380 85.529 95.998 85.859 88.329 85.289 +44000000 (returns) 81.927 82.363 84.723 88.198 85.565 92.135 81.205 84.217 92.838 82.592 84.180 87.928 94.184 95.024 92.426 93.193 81.885 566.219 537.024 84.693 92.231 85.237 87.945 83.518 93.584 86.524 84.030 81.579 90.806 82.824 94.070 88.233 +44500000 (returns) 100.165 90.504 104.352 96.570 98.575 100.279 94.722 100.833 93.094 86.149 91.518 90.925 98.635 99.349 90.999 101.456 92.565 93.851 100.031 97.972 96.461 94.139 90.655 93.824 94.394 89.820 93.540 99.375 91.625 90.421 88.959 92.197 +45000000 (returns) 104.815 88.288 94.514 97.555 93.513 94.841 90.736 96.195 92.923 101.093 98.245 101.423 94.544 99.892 95.758 94.949 93.356 92.659 95.827 103.127 91.971 101.669 93.592 93.871 94.966 101.658 91.413 97.711 93.318 94.947 93.893 96.225 +45500000 (returns) 92.862 85.886 95.294 89.371 86.965 87.494 87.261 85.371 84.579 93.514 89.020 89.535 88.724 89.699 90.947 86.319 93.117 89.653 88.045 89.065 95.631 85.453 88.658 95.130 92.886 89.700 87.822 92.858 88.825 89.192 89.327 87.977 +46000000 (returns) 98.767 95.664 96.410 93.570 92.917 98.423 543.175 88.250 87.536 98.515 98.541 93.225 95.091 99.455 98.015 94.018 87.700 91.036 91.881 96.196 86.804 99.602 86.972 83.599 84.295 95.756 91.179 98.940 88.126 86.974 92.551 95.908 +46500000 (returns) 84.325 90.787 89.025 91.485 84.360 83.951 79.194 84.343 79.169 83.525 83.738 85.394 80.064 83.614 78.994 80.869 79.675 79.126 82.955 81.460 91.183 83.711 85.678 82.517 82.469 92.260 90.789 83.545 82.873 79.654 81.397 80.549 +47000000 (returns) 104.374 103.387 97.160 103.664 108.176 102.600 101.352 557.382 101.861 102.180 102.309 101.199 102.509 103.258 99.857 102.879 103.876 102.016 103.755 104.935 102.289 101.132 97.962 99.207 361.403 105.145 105.897 97.896 99.996 99.495 109.448 94.841 +47500000 (returns) 106.085 106.305 101.311 110.353 96.246 114.960 101.178 108.676 107.079 100.979 103.085 101.797 95.462 106.899 103.900 105.712 105.875 104.769 112.336 104.095 106.104 104.001 103.629 111.361 102.170 112.605 110.042 102.218 112.703 113.296 104.461 106.261 +48000000 (returns) 80.145 92.084 84.062 79.939 88.252 558.662 349.400 91.806 80.472 82.697 93.505 91.620 83.676 91.361 93.113 80.561 85.095 83.808 80.265 83.497 89.555 88.931 81.755 82.735 83.311 80.496 80.481 85.280 79.909 85.197 87.276 83.402 +48500000 (returns) 82.694 73.944 75.804 82.688 544.844 76.606 73.115 72.838 74.735 73.980 75.355 82.338 74.921 78.388 81.217 74.400 74.339 75.916 83.498 75.939 73.934 74.748 76.005 82.410 73.265 74.810 73.671 72.883 74.123 72.668 72.122 83.465 +49000000 (returns) 87.523 77.532 82.502 75.412 88.639 81.831 84.376 355.015 87.712 86.437 80.294 78.001 76.043 77.396 86.362 88.330 77.215 81.760 76.650 76.876 86.541 85.603 75.019 75.865 80.372 75.910 82.886 79.747 79.991 88.093 80.945 79.504 +49500000 (returns) 82.850 87.590 77.287 74.137 83.075 77.073 78.165 82.307 80.500 77.929 77.932 86.284 79.758 81.345 77.475 75.922 76.537 78.617 85.326 352.641 77.450 79.410 85.596 88.245 86.261 78.340 77.301 83.121 82.308 349.004 80.098 89.075 +50000000 (returns) 78.685 78.980 75.203 74.646 78.773 85.828 76.431 77.064 88.436 85.496 73.516 74.166 78.781 78.215 85.659 84.720 75.021 80.872 79.450 86.740 74.468 86.443 84.681 77.903 75.570 82.664 74.617 79.575 87.439 77.068 75.055 76.726 +50500000 (returns) 74.364 67.641 69.772 67.941 69.456 68.858 67.982 72.725 67.886 67.876 70.530 67.069 67.779 72.746 69.349 73.183 68.219 69.045 68.804 67.466 69.409 71.601 67.759 74.422 72.012 68.020 69.220 69.609 66.865 66.459 73.479 67.861 +51000000 (returns) 74.491 72.846 72.050 75.221 81.079 81.028 74.389 71.811 73.791 71.953 73.719 72.953 73.818 71.348 71.613 73.701 73.439 77.021 81.322 83.444 72.767 74.081 73.860 73.580 76.312 79.156 73.590 75.503 74.124 347.617 75.931 73.331 +51500000 (returns) 76.508 84.539 77.052 82.290 80.623 76.260 78.961 75.937 76.624 72.771 73.802 83.611 77.832 75.624 352.802 83.717 74.387 77.008 74.193 86.277 81.221 74.691 82.998 85.164 81.600 75.665 86.232 76.767 74.802 78.553 72.948 75.656 +52000000 (returns) 78.315 82.535 76.308 78.405 80.920 87.419 75.505 79.040 80.009 82.633 72.987 80.518 78.415 76.297 78.852 75.057 80.162 78.845 77.810 78.430 75.452 79.221 80.798 80.547 76.647 77.256 80.927 78.561 75.128 79.940 75.519 76.277 +52500000 (returns) 86.518 96.767 89.023 98.986 96.736 90.819 87.328 85.929 88.463 90.548 93.387 89.534 96.363 89.523 86.529 93.855 86.772 96.041 97.244 98.447 99.081 90.276 91.436 85.119 89.279 86.641 99.378 90.053 89.001 88.048 98.176 88.831 +53000000 (returns) 55.734 58.303 57.250 59.271 56.411 59.734 55.843 57.834 56.942 60.345 58.325 56.575 57.406 55.907 57.788 56.956 58.129 55.830 58.401 56.699 56.716 58.263 56.181 56.100 60.279 56.442 57.397 58.270 58.982 58.238 57.035 55.808 +53500000 (returns) 63.780 62.229 64.432 63.643 385.599 63.172 63.867 64.226 64.857 63.079 63.293 62.800 64.567 63.239 62.973 67.900 62.433 68.688 67.671 68.366 66.501 64.037 64.009 63.292 65.660 65.125 64.761 69.093 63.083 64.458 64.034 68.418 +54000000 (returns) 88.990 89.357 92.170 87.982 87.512 90.911 90.036 96.153 85.138 97.569 97.313 86.189 85.425 87.229 88.776 90.568 97.749 90.204 90.003 97.541 85.761 85.026 90.307 90.610 94.490 93.370 88.415 94.085 87.092 86.463 98.599 95.498 +54500000 (returns) 84.595 92.763 84.570 92.979 82.902 88.437 78.774 85.209 84.016 85.741 74.182 90.237 79.016 84.748 80.920 84.730 85.247 84.638 82.273 89.509 88.647 90.396 92.008 80.246 90.946 83.132 86.080 83.413 79.606 90.457 91.220 86.505 +55000000 (returns) 73.117 73.568 66.616 75.124 67.183 67.214 65.873 70.559 75.965 69.678 557.077 65.181 67.916 74.564 68.087 75.660 76.502 75.347 76.152 73.628 69.006 68.840 67.527 65.569 68.770 73.784 67.662 66.775 67.406 66.621 70.113 76.692 +55500000 (returns) 69.216 67.894 76.760 66.841 67.203 65.752 68.407 67.918 68.039 69.660 68.812 72.611 67.591 68.725 69.174 67.970 73.874 66.450 68.107 67.576 66.540 66.229 66.298 66.477 68.327 67.201 71.095 70.491 68.536 67.518 73.858 76.859 +56000000 (returns) 86.756 94.363 90.288 82.218 87.354 95.158 92.700 88.920 92.190 83.279 92.111 82.861 86.984 93.276 84.540 88.627 89.258 89.194 88.243 93.113 82.219 85.653 94.155 84.165 87.684 82.280 82.889 88.193 85.207 84.356 88.195 87.545 +56500000 (returns) 83.005 92.198 82.431 83.052 82.171 81.512 85.408 84.747 88.067 84.871 81.534 82.267 85.361 84.952 85.240 84.839 82.191 81.220 83.278 82.354 82.106 84.863 84.512 93.296 85.417 83.084 82.714 84.742 83.631 85.827 89.872 82.027 +57000000 (returns) 71.164 71.085 63.555 64.238 66.250 74.131 66.033 66.804 62.790 64.147 74.326 66.138 71.603 64.199 65.183 66.754 66.640 61.903 64.745 64.038 62.097 64.074 62.468 65.886 71.664 63.872 65.938 66.232 69.897 66.159 64.060 62.535 +57500000 (returns) 68.926 64.394 67.588 70.710 70.212 76.812 76.643 71.033 70.482 69.756 78.676 70.248 71.983 70.781 72.676 75.640 64.488 77.673 79.197 69.952 68.939 70.329 78.127 77.164 69.446 69.155 67.396 73.317 66.872 70.062 69.391 76.259 +58000000 (returns) 71.845 69.118 72.231 69.218 68.822 77.917 70.296 71.783 70.653 72.275 78.314 69.668 78.992 72.508 76.817 72.202 78.863 70.607 76.546 75.936 73.720 75.038 69.761 70.306 68.884 71.897 69.548 77.255 71.801 78.440 71.945 71.870 +58500000 (returns) 74.162 70.550 72.130 74.047 70.096 68.846 81.157 76.035 75.494 80.676 74.734 69.228 80.826 82.639 80.339 73.499 75.105 81.247 80.595 72.202 81.574 68.693 81.613 69.113 70.082 68.889 81.659 82.584 81.945 73.189 68.461 82.921 +59000000 (returns) 85.923 70.610 78.933 70.032 80.228 72.271 77.367 75.574 83.036 80.844 76.566 74.604 73.423 73.638 72.715 73.812 73.805 84.328 76.357 78.123 76.896 84.597 73.288 83.793 80.528 75.065 83.674 77.537 83.885 81.679 73.758 76.176 +59500000 (returns) 67.863 71.094 70.625 75.174 76.896 78.874 69.859 71.088 77.261 70.227 71.810 66.530 70.876 79.214 79.706 70.989 64.393 68.234 71.803 69.346 77.571 77.549 79.198 71.062 78.582 79.215 72.042 77.483 70.912 77.301 64.492 70.955 +60000000 (returns) 85.171 94.218 88.911 99.831 93.237 88.562 94.234 91.909 87.446 86.273 100.178 99.818 87.796 89.970 95.645 95.422 94.083 101.433 94.906 95.015 88.413 102.055 100.619 92.785 92.817 101.345 92.404 92.430 87.129 102.275 94.105 99.203 +60500000 (returns) 61.636 60.221 62.224 57.982 65.291 68.346 61.320 59.187 60.601 58.133 60.783 60.041 61.030 59.930 59.725 68.203 59.410 61.857 58.464 59.856 58.932 62.153 58.637 57.284 60.652 60.558 64.735 59.628 61.126 67.009 68.498 65.939 +61000000 (returns) 71.053 70.503 82.498 75.901 81.018 69.505 80.625 70.304 70.208 79.938 71.635 82.408 70.569 68.935 80.759 81.607 69.694 81.360 69.905 77.886 71.936 71.328 71.092 73.422 81.250 73.869 74.032 72.899 73.038 73.479 72.162 74.375 +61500000 (returns) 59.291 57.022 59.241 57.758 57.282 59.789 57.959 58.794 59.524 57.720 59.553 60.028 56.622 58.874 60.411 60.891 58.933 57.881 58.287 56.576 57.740 60.347 60.499 60.369 59.491 57.510 59.029 58.208 58.151 56.148 57.826 58.285 +62000000 (returns) 64.640 63.876 66.015 65.657 61.393 63.538 62.157 64.056 66.992 63.716 62.285 65.068 67.778 63.198 63.005 63.019 64.703 61.932 67.465 66.633 60.868 64.851 61.730 64.789 64.895 63.501 62.067 61.645 62.125 64.806 70.289 63.986 +62500000 (returns) 75.294 72.397 73.507 70.681 74.099 72.364 80.507 75.722 72.506 77.054 77.315 74.327 70.863 75.443 73.357 72.607 72.707 75.431 73.422 77.067 71.116 72.539 72.902 72.738 72.538 72.632 71.314 73.063 77.767 72.593 75.635 75.669 +63000000 (returns) 66.974 78.384 66.360 77.226 70.646 70.117 74.017 77.280 70.130 69.878 77.717 65.896 62.829 70.609 66.606 68.741 70.157 72.185 72.929 75.038 63.823 77.503 74.795 71.041 70.295 66.354 71.680 67.338 72.265 78.200 67.241 70.155 +63500000 (returns) 83.576 72.190 84.324 77.297 83.398 80.718 70.486 70.628 72.359 75.071 67.075 78.846 77.049 74.925 74.137 75.673 78.309 83.598 77.783 78.089 71.010 77.597 68.941 78.283 74.939 71.770 75.601 83.037 71.105 83.502 72.919 71.727 +64000000 (returns) 68.306 82.472 82.335 75.795 83.051 69.350 76.987 75.433 70.982 68.905 69.700 69.685 69.385 70.119 68.767 82.832 70.013 69.472 70.012 77.224 75.895 82.553 69.130 75.740 68.719 74.232 80.330 74.443 73.461 70.024 73.972 82.504 +64500000 (returns) 82.903 70.298 70.648 75.356 71.146 74.752 75.458 70.130 70.820 81.985 82.561 70.154 75.956 78.265 83.677 74.200 75.648 81.315 72.001 73.415 70.728 76.950 75.441 82.025 76.294 75.353 69.598 74.387 70.004 70.979 75.493 75.999 +65000000 (returns) 56.018 56.254 55.731 56.068 57.670 56.378 55.459 54.554 55.943 56.356 56.684 56.152 54.934 54.598 57.570 56.030 56.498 57.838 57.171 57.086 56.945 56.636 58.389 55.766 56.528 55.412 56.253 56.271 57.230 56.268 57.828 55.827 +65500000 (returns) 86.059 75.787 82.659 79.310 84.142 82.221 87.928 91.418 78.011 75.761 90.412 77.971 81.473 83.363 83.137 75.530 77.873 78.084 82.206 77.927 77.642 85.567 81.148 84.047 81.506 78.738 79.514 84.742 83.824 80.389 79.390 82.656 +66000000 (returns) 56.205 56.051 55.534 56.080 56.643 57.509 56.145 56.785 58.297 56.160 57.965 57.296 56.443 58.822 56.088 54.536 56.447 57.164 56.487 57.780 57.048 56.592 56.792 57.115 58.118 56.743 56.145 58.061 56.473 57.304 55.803 56.777 +66500000 (returns) 64.735 64.136 65.190 64.454 66.497 65.608 71.999 65.911 66.272 63.903 66.758 64.272 67.583 68.158 65.056 67.384 64.764 66.381 71.350 64.377 65.696 64.872 63.384 64.571 64.691 64.451 64.681 70.392 66.154 65.818 65.187 69.087 +67000000 (returns) 58.060 60.073 58.036 58.293 58.979 58.065 58.226 58.133 59.222 57.805 57.189 57.338 58.230 56.409 57.571 59.934 58.312 60.616 59.285 57.907 56.889 57.111 56.126 56.777 58.840 57.878 57.398 57.608 56.460 58.564 56.246 57.110 +67500000 (returns) 58.324 59.352 59.218 58.792 57.833 57.527 59.911 58.926 62.078 58.663 58.982 57.902 61.654 62.408 62.868 58.363 60.591 61.609 59.570 57.555 57.815 57.557 60.096 60.021 58.477 59.840 57.529 58.247 59.467 59.317 58.651 59.273 +68000000 (returns) 62.092 62.338 61.957 60.876 62.189 60.253 60.593 62.262 63.001 62.253 62.199 63.022 61.521 63.011 60.798 62.576 62.154 62.986 60.966 63.743 62.382 62.777 62.769 61.799 62.937 62.854 61.118 62.600 62.765 61.908 62.457 60.778 +68500000 (returns) 64.493 64.265 64.387 68.742 64.271 67.461 64.659 65.065 64.643 65.233 64.310 66.329 64.518 64.004 65.653 66.573 64.622 64.469 64.806 65.108 66.322 66.781 64.356 69.982 63.790 64.912 65.127 69.494 64.328 64.498 63.951 64.065 +69000000 (returns) 55.488 57.465 57.191 56.415 54.677 61.324 61.795 54.500 61.125 54.661 56.956 56.340 60.761 56.372 61.329 55.016 57.222 55.664 57.362 57.602 54.339 57.443 55.006 58.260 54.658 55.564 61.338 56.159 57.530 56.079 56.619 55.341 +69500000 (returns) 71.018 69.283 74.668 73.814 71.229 77.218 72.410 73.219 71.884 70.738 71.348 75.254 72.305 74.496 70.571 69.913 76.533 73.692 70.315 71.504 71.798 68.527 70.188 70.701 71.750 81.293 77.026 70.883 73.926 74.079 78.884 72.082 +70000000 (returns) 63.786 66.862 64.838 63.583 64.558 65.448 63.409 61.881 66.450 63.064 65.075 63.538 65.370 63.051 69.816 63.983 65.679 69.335 65.410 63.038 67.648 65.215 64.923 66.537 68.168 63.428 63.436 66.354 65.838 64.397 66.091 67.757 +70500000 (returns) 68.344 74.013 70.937 68.771 67.702 67.702 71.202 71.126 68.880 68.969 69.204 69.451 67.895 72.888 67.573 72.964 66.498 66.654 67.854 67.666 72.123 68.589 69.580 68.254 69.448 70.188 68.874 72.133 68.271 70.451 67.532 76.432 +71000000 (returns) 67.427 61.039 64.424 62.772 62.090 62.772 63.990 66.694 62.346 63.069 67.213 62.032 63.728 62.903 63.043 63.456 63.887 63.065 61.708 60.988 64.029 63.038 68.745 66.711 61.244 64.491 62.364 64.018 67.945 63.149 63.667 62.509 +71500000 (returns) 55.119 53.932 58.317 61.481 57.545 50.599 56.196 55.330 59.115 51.102 56.104 54.655 58.067 58.115 51.697 57.038 59.023 59.301 58.608 56.191 53.498 56.583 57.420 54.631 60.389 52.547 53.962 55.652 55.501 48.963 56.578 59.088 +72000000 (returns) 64.044 58.770 61.185 57.153 56.341 64.063 64.122 56.981 64.742 58.476 59.342 56.398 62.217 59.492 57.103 63.698 64.316 57.097 58.235 55.684 58.178 56.037 62.032 56.558 64.683 63.648 56.607 56.497 64.499 56.218 61.685 63.742 +72500000 (returns) 63.238 60.538 59.750 63.558 60.286 61.737 65.237 61.526 61.761 62.471 60.358 59.530 57.863 60.011 63.580 66.568 67.363 62.478 57.367 60.096 57.615 56.069 59.878 58.826 59.379 57.307 60.917 61.024 59.883 58.598 61.024 61.167 +73000000 (returns) 57.404 56.926 56.277 56.538 56.338 58.315 56.200 57.331 56.053 55.856 57.869 56.431 56.558 56.659 56.803 56.471 56.433 56.057 55.443 56.002 57.996 55.680 55.948 56.595 56.257 56.187 56.362 56.408 55.792 56.324 55.983 56.207 +73500000 (returns) 65.790 59.119 60.174 58.839 58.469 64.070 61.363 61.049 60.195 61.581 63.526 62.302 60.737 58.214 64.446 59.329 61.242 60.128 61.235 66.819 61.265 60.844 60.847 60.478 62.406 61.552 64.713 61.355 65.489 61.463 60.382 61.386 +74000000 (returns) 67.441 65.937 64.357 65.872 69.749 67.924 64.959 65.716 65.425 65.989 64.822 64.653 69.100 64.934 67.830 64.871 65.676 65.197 67.715 63.978 64.448 62.361 64.359 65.360 68.139 66.208 66.082 65.519 69.354 65.484 68.873 68.037 +74500000 (returns) 58.767 63.003 59.849 61.366 62.509 61.535 61.709 64.335 58.406 56.247 64.482 65.111 58.017 61.135 63.826 61.234 62.726 55.208 69.928 66.079 61.590 68.277 67.653 66.163 63.008 64.873 61.098 58.360 61.117 58.848 68.933 63.439 +75000000 (returns) 64.218 63.311 62.974 63.812 63.386 63.790 63.465 62.404 63.030 63.130 63.482 64.201 64.431 61.130 62.758 63.732 62.247 63.810 64.245 62.416 65.580 63.647 64.406 63.839 64.471 63.625 64.149 64.003 63.249 62.643 63.133 62.216 +75500000 (returns) 64.043 62.834 64.411 62.668 63.313 60.764 60.067 62.501 64.068 64.461 62.131 62.138 62.347 60.741 62.203 61.843 63.820 62.735 63.662 65.129 62.410 62.242 64.121 63.069 62.316 64.288 62.381 63.199 63.342 63.999 63.545 64.577 +76000000 (returns) 55.124 55.939 55.164 55.221 55.638 55.471 55.496 56.696 55.329 55.965 56.489 54.662 55.575 55.093 55.098 56.665 55.197 56.103 56.105 56.921 55.467 56.278 56.329 55.444 55.828 56.362 55.521 55.898 55.944 54.824 56.420 55.422 +76500000 (returns) 54.014 54.386 53.749 53.893 54.026 52.453 52.944 54.547 54.213 52.423 53.470 53.268 52.637 52.566 53.813 51.433 53.483 52.771 52.126 53.109 53.622 52.472 52.618 54.320 54.529 54.295 53.206 52.818 53.928 53.427 51.871 53.901 +77000000 (returns) 66.136 63.128 70.081 61.975 62.310 60.585 69.372 66.612 63.262 64.940 61.133 61.311 65.576 66.735 60.348 62.843 68.889 60.968 63.398 67.305 59.806 69.814 60.785 64.601 69.216 69.621 64.663 64.636 60.870 63.249 60.432 61.679 +77500000 (returns) 54.226 63.510 60.388 66.762 63.652 54.746 65.544 62.237 62.233 62.685 61.430 57.117 67.866 63.644 63.308 57.893 54.132 64.236 67.808 62.745 62.539 55.067 63.823 65.612 69.022 67.391 64.167 53.828 62.866 64.223 62.922 68.473 +78000000 (returns) 60.982 58.436 55.649 54.463 53.877 61.841 57.351 54.535 53.163 61.667 55.768 60.074 60.019 55.131 54.187 55.183 54.165 62.381 52.403 60.063 60.411 52.388 62.638 55.707 56.492 55.035 55.776 54.144 55.071 54.007 55.137 55.782 +78500000 (returns) 60.456 59.682 62.565 57.190 62.798 64.331 64.247 60.579 63.419 66.400 56.251 67.559 62.166 62.427 55.832 62.346 64.046 64.119 61.509 62.403 62.494 62.094 64.876 64.276 61.210 61.987 62.800 63.018 61.569 62.074 60.704 62.943 +79000000 (returns) 54.810 56.063 56.295 53.900 54.189 54.778 55.271 54.681 56.591 54.702 55.932 53.902 55.072 54.587 53.578 54.383 56.448 53.545 55.046 56.395 52.938 54.707 52.275 53.901 53.483 53.601 54.431 54.769 55.381 53.845 53.612 55.671 +79500000 (returns) 61.327 61.569 61.736 62.025 60.270 62.264 63.050 64.785 62.485 62.824 59.215 59.838 60.725 64.005 58.427 59.817 58.506 61.821 60.419 60.299 66.715 60.463 61.548 62.166 59.322 62.710 60.299 63.100 60.528 60.291 65.186 61.794 +80000000 (returns) 58.044 57.336 59.142 58.444 57.795 58.674 58.106 58.196 57.865 59.616 57.487 58.648 57.874 57.920 57.368 58.560 56.949 57.900 57.906 58.990 60.537 58.874 57.243 58.277 58.298 58.444 58.023 57.841 58.511 63.671 58.438 58.467 +80500000 (returns) 44.549 43.187 42.615 43.675 45.070 43.541 50.138 43.931 51.104 38.933 49.533 49.679 49.508 45.270 51.149 38.542 34.132 45.830 41.384 37.691 44.010 43.700 52.164 34.903 49.945 37.968 43.677 44.108 36.750 36.174 42.264 38.780 +81000000 (returns) 57.198 64.736 60.492 63.197 59.008 58.086 63.141 62.815 61.344 57.610 59.021 54.806 58.174 55.432 59.019 57.805 63.017 58.585 62.438 65.864 58.856 54.626 61.217 58.454 54.534 57.515 63.972 59.562 66.281 54.242 56.432 60.545 +81500000 (returns) 55.212 55.178 56.708 55.810 55.821 52.280 57.231 55.446 54.893 57.646 53.069 53.798 54.675 55.496 57.928 53.954 56.285 54.275 53.859 54.894 51.297 54.155 52.641 53.423 56.665 54.368 54.568 54.017 55.419 53.707 53.312 54.247 +82000000 (returns) 56.699 55.708 55.123 58.946 56.546 56.137 59.960 57.457 56.606 55.797 57.553 57.934 56.381 57.680 56.041 57.088 55.351 56.411 56.757 55.821 58.900 59.481 56.075 57.848 59.198 55.643 56.842 56.477 55.469 58.397 56.870 63.100 +82500000 (returns) 53.578 62.421 52.914 61.350 59.257 53.593 52.047 61.050 58.384 61.158 58.245 59.509 58.059 59.014 60.394 60.309 61.723 61.571 60.787 61.277 60.588 58.063 60.668 52.139 60.910 53.328 54.228 58.043 59.480 61.734 52.711 54.233 +83000000 (returns) 64.859 67.586 55.878 65.732 60.168 51.471 54.443 64.670 63.273 58.857 61.055 65.114 59.336 68.500 59.292 58.123 58.356 59.231 55.984 54.409 64.957 54.043 50.845 51.626 61.985 60.510 54.923 55.628 66.095 60.943 51.085 60.389 +83500000 (returns) 68.474 60.822 62.745 60.027 51.557 56.931 54.551 60.545 59.021 58.342 63.103 60.862 62.207 68.445 61.126 58.023 54.520 61.340 60.753 60.649 57.181 67.141 58.116 59.770 59.414 55.764 67.217 63.014 67.027 54.220 58.516 58.817 +84000000 (returns) 35.386 48.362 41.853 48.798 48.774 50.564 39.836 44.262 37.633 49.137 36.622 44.617 36.679 49.443 43.987 48.590 41.572 37.646 41.851 48.191 42.083 43.394 35.450 37.128 43.322 42.248 45.960 36.483 50.877 38.471 45.438 42.935 +84500000 (returns) 52.482 51.713 45.579 45.550 55.461 47.355 40.748 51.011 52.222 46.352 51.504 46.949 55.225 45.783 57.983 56.316 42.531 47.830 59.375 40.671 52.411 54.749 55.122 50.247 49.705 42.070 54.951 50.129 49.265 42.435 41.630 51.922 +85000000 (returns) 65.413 63.321 67.461 63.799 51.776 56.761 59.677 67.169 66.933 64.498 63.401 62.158 67.849 56.542 63.536 52.744 65.556 58.682 63.596 60.141 61.553 63.882 59.765 67.086 62.352 52.871 66.099 55.545 66.133 68.017 55.854 52.727 +85500000 (returns) 47.869 45.801 41.727 54.240 46.777 38.412 39.471 47.679 45.814 44.153 55.161 42.141 42.664 38.488 47.428 50.893 49.084 52.907 51.962 49.922 54.890 44.028 53.068 52.232 44.520 44.688 40.737 37.913 42.240 42.653 45.322 48.500 +86000000 (returns) 55.970 59.463 56.213 60.090 59.283 57.204 59.678 58.497 56.233 59.500 54.324 58.113 56.930 58.165 59.406 56.042 57.166 60.977 56.546 57.125 56.052 56.845 54.757 56.507 55.861 55.966 61.301 60.520 61.056 54.721 59.743 54.768 +86500000 (returns) 62.283 60.288 59.324 59.578 59.978 58.713 58.825 61.987 59.601 59.116 58.867 59.021 60.069 58.759 59.146 61.794 63.478 60.648 60.123 60.347 62.066 60.685 59.991 59.379 58.690 59.372 59.017 61.263 59.140 59.655 61.035 58.541 +87000000 (returns) 62.064 62.579 55.875 60.179 59.922 56.307 57.268 64.510 56.879 56.718 60.211 58.128 66.188 62.396 55.547 62.109 65.188 63.583 61.758 63.588 55.662 55.252 63.739 60.778 64.700 62.177 58.532 68.447 58.580 63.996 56.298 56.450 +87500000 (returns) 45.438 54.935 52.103 57.130 48.297 51.869 53.504 56.275 58.829 56.093 57.238 48.991 59.672 54.299 59.434 56.057 53.611 47.035 60.018 53.009 56.003 61.625 53.407 53.091 57.848 49.354 53.127 53.023 54.342 54.216 56.740 62.142 +88000000 (returns) 43.090 44.240 46.652 43.752 42.410 44.833 44.700 50.414 48.241 40.593 50.637 44.533 49.327 45.535 44.590 50.194 50.514 42.309 44.480 43.000 45.080 42.709 42.155 46.182 43.966 36.924 43.825 52.965 37.389 44.565 50.365 50.991 +88500000 (returns) 58.186 50.253 56.781 57.601 54.640 56.459 64.251 54.216 56.700 55.880 54.585 54.331 50.952 51.785 54.941 56.351 60.558 50.971 56.893 54.381 59.512 55.361 51.039 56.664 63.091 50.601 59.937 50.425 55.230 55.697 51.886 53.005 +89000000 (returns) 52.855 48.476 63.008 53.816 60.093 44.299 59.469 60.668 52.049 47.457 50.978 50.943 62.473 58.882 60.508 49.332 52.057 44.278 52.752 46.045 44.752 48.160 52.814 54.899 58.465 53.183 52.929 59.206 62.699 51.769 55.260 52.886 +89500000 (returns) 63.193 68.552 68.002 62.943 67.150 68.764 59.073 67.470 66.639 74.386 67.377 68.593 64.605 67.775 69.249 68.385 70.479 69.102 65.349 59.063 68.201 67.029 65.422 65.178 66.300 66.719 69.078 61.916 61.752 63.909 69.128 60.505 +90000000 (returns) 37.261 34.371 33.956 47.265 43.334 41.191 39.405 49.596 47.662 40.489 41.083 49.415 47.406 43.996 41.801 38.075 39.813 47.215 40.789 36.737 36.634 47.505 40.987 39.924 37.644 46.494 43.695 41.554 41.902 47.817 33.942 48.292 +90500000 (returns) 53.140 47.555 49.001 49.495 46.936 54.897 59.402 63.519 53.360 60.238 55.994 47.960 60.191 54.442 53.543 52.335 46.628 59.632 60.347 57.940 54.078 52.623 49.093 61.305 54.647 48.913 60.203 62.687 53.823 52.973 61.542 54.609 +91000000 (returns) 57.191 60.325 59.205 60.317 58.885 60.488 60.421 55.838 57.935 58.438 56.780 55.923 57.172 57.093 57.832 58.989 60.364 60.001 59.190 57.019 61.224 59.594 50.908 60.447 57.995 54.425 61.000 57.688 54.923 56.398 57.336 60.345 +91500000 (returns) 58.162 49.806 51.573 52.340 55.201 59.780 59.605 55.726 50.065 54.694 56.631 60.625 53.717 54.716 54.316 59.185 56.955 52.560 53.894 61.343 59.564 55.519 55.409 61.501 55.383 48.361 53.097 60.203 53.552 59.874 53.911 54.242 +92000000 (returns) 55.230 54.211 50.295 55.551 41.132 40.360 40.561 42.662 41.426 52.291 56.156 56.725 42.902 53.987 50.767 41.733 44.035 54.734 41.621 47.576 46.628 42.029 47.296 44.840 46.571 49.400 41.806 47.892 49.059 48.653 47.163 43.683 +92500000 (returns) 66.515 70.483 66.220 65.716 65.248 64.296 64.043 70.835 66.148 65.457 67.558 66.896 67.625 64.793 67.753 65.528 65.361 70.215 67.297 63.794 65.771 69.737 64.974 66.792 65.348 65.496 65.118 65.980 65.180 65.940 65.971 65.254 +93000000 (returns) 61.210 64.853 57.198 63.879 54.332 58.483 67.383 64.792 58.715 53.346 59.221 67.303 53.531 58.475 57.214 54.955 62.855 55.858 61.458 54.919 52.809 57.659 65.363 65.376 55.791 65.797 57.673 57.827 52.384 64.595 64.277 62.562 +93500000 (returns) 44.166 43.399 47.525 50.629 49.915 49.503 49.177 40.690 39.729 45.345 38.540 38.873 54.646 38.552 50.108 47.866 52.826 49.585 48.036 48.223 52.731 44.145 47.835 44.912 38.188 47.997 42.543 48.478 46.423 46.732 50.101 53.946 +94000000 (returns) 56.531 45.227 56.326 45.923 49.608 46.307 51.895 46.641 50.895 49.777 48.003 44.677 57.102 56.408 51.265 59.131 55.579 46.128 50.373 54.750 43.319 45.442 57.811 47.353 49.944 45.071 47.833 52.974 49.730 47.331 55.992 51.004 +94500000 (returns) 29.754 30.302 27.633 28.772 28.676 27.040 27.639 28.665 29.779 31.615 29.987 28.148 28.487 29.308 28.814 30.860 28.113 30.359 29.740 28.009 28.938 28.539 27.949 27.789 29.148 29.782 27.553 29.727 30.039 30.052 28.629 29.157 +95000000 (returns) 63.871 61.698 65.616 63.177 64.033 65.710 65.308 61.730 63.827 62.670 62.200 62.579 63.993 65.112 63.953 65.234 64.062 62.834 65.159 64.570 64.444 64.132 62.901 64.208 61.646 63.952 63.540 64.232 62.931 63.874 64.708 61.812 +95500000 (returns) 53.205 55.953 47.570 49.809 50.054 53.606 51.866 51.905 54.377 55.577 54.866 54.391 54.916 52.880 46.161 51.247 48.934 46.525 47.089 52.399 53.670 45.333 46.510 52.878 46.169 53.415 59.352 46.425 60.245 54.855 55.316 51.212 +96000000 (returns) 52.009 58.998 52.850 55.420 51.911 53.325 52.887 53.202 44.574 51.806 53.186 54.785 44.255 49.250 53.709 53.028 54.709 51.250 49.931 43.967 54.690 53.788 43.626 54.666 51.753 50.006 52.738 49.407 45.879 52.814 54.112 54.558 +96500000 (returns) 53.491 44.526 50.042 56.473 55.839 49.993 47.277 53.352 53.975 52.829 55.319 55.049 53.884 52.210 48.551 50.581 45.030 48.333 53.460 57.808 45.692 56.826 51.258 45.359 54.468 54.527 54.235 54.281 52.469 54.952 48.494 56.407 +97000000 (returns) 61.610 61.554 58.593 57.987 60.855 60.167 62.746 57.820 61.686 60.655 61.031 62.115 58.847 59.753 63.340 58.093 56.989 64.163 58.389 57.763 61.837 62.942 58.507 57.767 62.108 60.640 63.142 58.114 61.518 58.711 58.330 64.151 +97500000 (returns) 390.754 51.233 52.625 60.826 47.581 48.579 61.918 53.787 47.000 45.392 52.394 55.410 62.542 52.594 47.776 46.197 51.501 48.886 47.863 51.658 50.944 52.144 51.030 52.923 51.353 60.057 51.836 54.185 51.050 51.865 58.244 48.222 +98000000 (returns) 33.717 44.722 36.918 36.388 36.580 34.981 32.742 37.664 36.002 41.804 39.752 32.860 33.348 40.392 35.177 31.972 33.758 36.589 34.238 35.436 32.260 43.628 32.659 42.373 42.636 36.490 31.032 33.514 33.012 40.232 37.677 32.392 +98500000 (returns) 45.972 46.368 42.824 40.704 39.016 44.400 48.494 44.459 38.379 39.925 38.959 46.769 43.283 42.262 45.230 42.880 41.015 43.275 45.062 41.147 37.762 51.942 38.206 44.808 43.611 45.827 50.070 49.987 46.708 37.412 37.605 42.849 +99000000 (returns) 59.272 63.608 55.360 59.438 53.352 63.389 59.104 54.003 60.365 67.370 64.924 61.911 64.220 60.909 65.704 61.676 60.947 60.963 59.796 59.093 61.332 60.767 62.545 61.883 63.851 63.591 61.574 55.795 60.440 61.318 56.917 59.465 +99500000 (returns) 44.386 46.236 43.120 51.222 44.548 37.774 47.214 46.230 50.594 49.767 47.072 45.883 46.782 37.495 44.988 37.819 52.334 43.313 45.504 42.502 41.325 44.591 42.589 41.391 44.573 50.424 52.527 50.574 47.145 45.063 38.818 42.214 +100000000 (returns) 31.673 32.704 38.316 32.953 32.352 30.871 31.816 33.546 35.864 30.931 32.463 32.277 32.630 33.070 31.393 31.185 33.291 31.292 32.081 33.237 31.013 31.534 32.845 31.877 32.674 38.699 32.007 31.539 33.889 31.782 31.651 33.330 diff --git a/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-1/evaluation_result_scalar.tsv b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-1/evaluation_result_scalar.tsv new file mode 100644 index 00000000..c26fd04d --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-1/evaluation_result_scalar.tsv @@ -0,0 +1,201 @@ +iteration mean std_dev min max median +500000 584.578 8.013 562.134 595.305 585.478 +1000000 584.098 6.325 567.388 594.700 584.988 +1500000 582.525 4.946 572.605 590.161 584.014 +2000000 584.049 5.040 572.099 592.927 584.497 +2500000 578.172 33.461 393.452 590.083 584.268 +3000000 569.470 41.187 396.422 585.574 580.639 +3500000 556.165 65.551 352.374 590.766 575.088 +4000000 577.250 7.085 553.853 587.267 577.791 +4500000 562.361 62.408 358.718 589.048 584.292 +5000000 574.756 37.022 372.097 589.053 583.660 +5500000 576.011 6.499 563.903 585.300 576.096 +6000000 558.411 60.706 323.668 584.736 572.412 +6500000 498.801 106.024 335.554 584.643 564.672 +7000000 512.209 100.811 332.812 586.404 564.517 +7500000 561.032 8.432 547.548 582.654 559.069 +8000000 566.330 10.920 539.897 581.315 567.855 +8500000 563.668 13.004 539.169 579.546 567.543 +9000000 562.914 14.228 524.078 580.268 563.969 +9500000 554.918 15.545 512.969 578.188 557.398 +10000000 555.052 19.289 515.039 578.929 558.997 +10500000 549.510 18.448 514.961 582.512 544.344 +11000000 555.137 14.587 525.472 581.590 555.242 +11500000 555.775 17.941 516.558 581.328 558.300 +12000000 549.611 25.378 465.894 581.295 555.398 +12500000 554.006 15.796 517.705 580.655 552.895 +13000000 546.721 20.590 496.671 578.230 551.818 +13500000 545.179 23.100 485.904 573.922 552.811 +14000000 540.774 37.540 364.953 573.005 548.940 +14500000 500.459 81.007 313.045 571.561 538.792 +15000000 440.894 89.792 317.944 573.329 390.514 +15500000 397.770 88.374 309.757 572.813 361.053 +16000000 405.381 81.316 326.391 573.443 368.018 +16500000 413.814 83.293 287.651 577.653 375.456 +17000000 386.949 40.967 351.180 558.424 376.735 +17500000 416.774 68.284 322.026 560.673 392.223 +18000000 395.069 70.773 292.546 572.392 371.092 +18500000 398.699 89.300 287.457 573.420 363.324 +19000000 383.406 61.943 310.245 573.123 372.118 +19500000 393.830 63.481 303.962 569.360 382.375 +20000000 363.907 52.224 300.910 574.775 354.425 +20500000 380.770 81.670 299.646 572.107 346.338 +21000000 356.898 67.862 244.904 568.154 342.515 +21500000 399.728 85.229 326.463 572.613 361.491 +22000000 386.016 75.500 313.132 573.843 356.302 +22500000 398.836 95.426 268.848 579.817 370.731 +23000000 434.166 104.895 302.697 579.748 367.781 +23500000 395.957 102.269 298.049 578.464 330.080 +24000000 401.336 104.429 256.301 577.381 339.185 +24500000 352.934 91.224 264.593 577.691 319.448 +25000000 364.823 92.462 195.177 577.281 337.598 +25500000 342.632 92.887 265.784 578.500 301.364 +26000000 383.722 91.322 241.885 568.495 366.672 +26500000 291.158 174.149 108.016 576.413 250.626 +27000000 326.841 163.305 197.320 577.161 218.476 +27500000 355.652 145.161 115.320 571.229 351.450 +28000000 210.841 104.002 147.074 571.329 170.271 +28500000 180.517 56.182 151.810 340.706 159.441 +29000000 189.326 110.348 139.867 567.969 144.813 +29500000 165.209 6.370 144.275 176.904 165.908 +30000000 151.083 112.047 106.251 567.856 110.679 +30500000 158.313 53.007 139.922 375.421 144.766 +31000000 152.015 78.741 124.083 559.345 133.471 +31500000 186.014 98.319 148.642 567.256 160.168 +32000000 156.567 85.597 122.025 525.595 128.415 +32500000 142.571 52.620 121.674 346.290 128.424 +33000000 114.803 4.492 107.735 122.183 113.410 +33500000 114.454 40.513 104.596 339.808 106.535 +34000000 150.630 108.733 102.456 558.143 106.564 +34500000 102.451 1.469 100.639 105.152 101.995 +35000000 125.815 104.450 96.677 546.220 98.240 +35500000 114.659 76.974 97.127 543.118 100.768 +36000000 126.563 89.531 100.428 537.205 102.848 +36500000 106.984 2.756 101.556 113.317 107.016 +37000000 119.199 50.347 107.103 399.171 109.035 +37500000 127.616 111.445 97.108 566.978 98.675 +38000000 128.379 88.489 103.739 534.767 106.049 +38500000 106.831 42.032 97.110 340.239 98.559 +39000000 102.365 1.366 99.486 105.230 102.384 +39500000 139.983 108.969 101.621 550.978 106.848 +40000000 102.840 3.243 98.593 109.769 102.090 +40500000 90.639 4.647 84.913 108.590 89.619 +41000000 126.906 87.000 102.144 539.139 104.531 +41500000 125.407 105.661 93.419 542.189 98.781 +42000000 88.564 3.391 82.655 95.722 88.939 +42500000 101.993 2.876 95.970 107.328 101.787 +43000000 98.809 2.451 94.589 103.046 98.449 +43500000 103.640 80.578 84.630 551.784 88.831 +44000000 116.347 112.531 81.205 566.219 87.226 +44500000 94.936 4.336 86.149 104.352 93.995 +45000000 95.921 3.803 88.288 104.815 94.948 +45500000 89.568 2.926 84.579 95.631 89.128 +46000000 107.159 78.452 83.599 543.175 93.794 +46500000 83.834 3.907 78.994 92.260 83.535 +47000000 124.482 89.925 94.841 557.382 102.409 +47500000 105.811 4.636 95.462 114.960 105.793 +48000000 108.198 93.144 79.909 558.662 83.935 +48500000 90.990 81.593 72.122 544.844 74.866 +49000000 89.887 47.818 75.019 355.015 80.658 +49500000 97.780 65.451 74.137 352.641 80.299 +50000000 79.653 4.571 73.516 88.436 78.729 +50500000 69.544 2.260 66.459 74.422 68.952 +51000000 83.465 47.540 71.348 347.617 73.839 +51500000 87.097 47.889 72.771 352.802 77.030 +52000000 78.585 2.778 72.987 87.419 78.495 +52500000 91.692 4.513 85.119 99.378 90.165 +53000000 57.481 1.295 55.734 60.345 57.324 +53500000 74.790 55.857 62.229 385.599 64.132 +54000000 90.829 4.140 85.026 98.599 90.120 +54500000 85.567 4.514 74.182 92.979 84.978 +55000000 85.743 84.737 65.181 557.077 69.342 +55500000 69.000 2.837 65.752 76.859 68.073 +56000000 87.937 3.875 82.218 95.158 87.938 +56500000 84.462 2.852 81.220 93.296 84.071 +57000000 66.269 3.385 61.903 74.326 65.912 +57500000 71.698 4.024 64.394 79.197 70.405 +58000000 72.971 3.277 68.822 78.992 71.921 +58500000 75.760 5.187 68.461 82.921 74.919 +59000000 77.596 4.440 70.032 85.923 76.731 +59500000 73.069 4.508 64.393 79.706 71.448 +60000000 94.051 5.025 85.171 102.275 94.094 +60500000 61.543 3.117 57.284 68.498 60.626 +61000000 74.662 4.541 68.935 82.498 73.230 +61500000 58.626 1.242 56.148 60.891 58.540 +62000000 64.146 2.099 60.868 70.289 63.931 +62500000 73.974 2.242 70.681 80.507 73.210 +63000000 71.075 4.255 62.829 78.384 70.452 +63500000 76.124 4.731 67.075 84.324 75.637 +64000000 74.120 5.086 68.306 83.051 73.716 +64500000 75.123 4.234 69.598 83.677 75.355 +65000000 56.386 0.899 54.554 58.389 56.269 +65500000 81.576 3.937 75.530 91.418 81.489 +66000000 56.794 0.879 54.536 58.822 56.693 +66500000 66.055 2.099 63.384 71.999 65.399 +67000000 57.959 1.089 56.126 60.616 57.972 +67500000 59.325 1.460 57.527 62.868 59.100 +68000000 62.123 0.843 60.253 63.743 62.258 +68500000 65.351 1.576 63.790 69.982 64.651 +69000000 57.113 2.252 54.339 61.795 56.517 +69500000 72.892 2.851 68.527 81.293 71.983 +70000000 65.249 1.880 61.881 69.816 65.145 +70500000 69.630 2.242 66.498 76.432 68.925 +71000000 63.767 2.002 60.988 68.745 63.109 +71500000 56.011 2.898 48.963 61.481 56.193 +72000000 59.995 3.274 55.684 64.742 59.056 +72500000 60.844 2.546 56.069 67.363 60.448 +73000000 56.491 0.653 55.443 58.315 56.350 +73500000 61.588 2.096 58.214 66.819 61.254 +74000000 66.137 1.744 62.361 69.749 65.696 +74500000 62.463 3.523 55.208 69.928 62.109 +75000000 63.467 0.848 61.130 65.580 63.553 +75500000 62.980 1.170 60.067 65.129 62.951 +76000000 55.740 0.570 54.662 56.921 55.606 +76500000 53.323 0.812 51.433 54.547 53.449 +77000000 64.259 3.214 59.806 70.081 63.330 +77500000 62.378 4.316 53.828 69.022 63.115 +78000000 56.685 3.057 52.388 62.638 55.678 +78500000 62.199 2.466 55.832 67.559 62.415 +79000000 54.649 1.059 52.275 56.591 54.691 +79500000 61.548 1.872 58.427 66.715 61.559 +80000000 58.420 1.172 56.949 63.671 58.237 +80500000 43.560 5.001 34.132 52.164 43.689 +81000000 59.626 3.294 54.242 66.281 59.014 +81500000 54.759 1.508 51.297 57.928 54.621 +82000000 57.197 1.645 55.123 63.100 56.728 +82500000 58.212 3.360 52.047 62.421 59.369 +83000000 59.355 4.971 50.845 68.500 59.314 +83500000 60.320 4.123 51.557 68.474 60.286 +84000000 43.050 4.806 35.386 50.877 43.128 +84500000 49.602 5.167 40.671 59.375 50.188 +85000000 61.653 4.920 51.776 68.017 63.361 +85500000 46.356 4.981 37.913 55.161 45.808 +86000000 57.657 2.024 54.324 61.301 57.146 +86500000 60.024 1.226 58.541 63.478 59.628 +87000000 60.488 3.581 55.252 68.447 60.495 +87500000 54.649 3.981 45.438 62.142 54.321 +88000000 45.349 3.789 36.924 52.965 44.577 +88500000 55.411 3.504 50.253 64.251 55.295 +89000000 53.671 5.470 44.278 63.008 52.871 +89500000 66.290 3.350 59.063 74.386 67.089 +90000000 42.102 4.626 33.942 49.596 41.373 +90500000 54.783 4.936 46.628 63.519 54.260 +91000000 58.178 2.229 50.908 61.224 58.216 +91500000 55.672 3.454 48.361 61.501 55.292 +92000000 47.468 5.183 40.360 56.725 47.229 +92500000 66.355 1.778 63.794 70.835 65.856 +93000000 59.753 4.571 52.384 67.383 58.599 +93500000 46.605 4.577 38.188 54.646 47.851 +94000000 50.511 4.459 43.319 59.131 49.861 +94500000 29.031 1.055 27.040 31.615 28.876 +95000000 63.741 1.157 61.646 65.710 63.952 +95500000 51.835 3.849 45.333 60.245 52.638 +96000000 51.659 3.633 43.626 58.998 52.832 +96500000 52.093 3.691 44.526 57.808 53.406 +97000000 60.373 2.093 56.989 64.163 60.648 +97500000 62.824 59.059 45.392 390.754 51.747 +98000000 36.342 3.728 31.032 44.722 35.719 +98500000 43.350 3.813 37.412 51.942 43.279 +99000000 60.778 3.160 53.352 67.370 60.955 +99500000 45.188 4.091 37.495 52.527 45.025 +100000000 32.712 1.808 30.871 38.699 32.314 diff --git a/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-1/result.png b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-1/result.png new file mode 100644 index 0000000000000000000000000000000000000000..0efcd2afa4e5adbb99c3eaa9d09347ff9481911d GIT binary patch literal 26913 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 literal 0 HcmV?d00001 diff --git a/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-10/best_score_scalar.tsv b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-10/best_score_scalar.tsv new file mode 100644 index 00000000..6e3f1632 --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-10/best_score_scalar.tsv @@ -0,0 +1,2 @@ +iteration best_mean_iteration mean std_dev best_median_iteration median +1 80500000.000 32.882 3.647 80500000.000 32.110 diff --git a/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-10/evaluation_result_histogram.tsv b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-10/evaluation_result_histogram.tsv new file mode 100644 index 00000000..7775492e --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-10/evaluation_result_histogram.tsv @@ -0,0 +1,201 @@ +iteration(key) values +500000 (returns) 587.231 573.073 580.002 571.831 590.011 576.682 593.974 593.367 594.021 581.840 579.178 581.020 575.856 588.060 580.731 586.545 584.505 579.471 577.532 584.082 592.301 578.142 593.309 587.671 591.747 567.195 571.560 594.207 580.724 594.112 584.055 580.807 +1000000 (returns) 587.541 594.216 562.463 594.784 566.660 575.786 572.709 586.927 575.010 574.748 565.406 593.793 578.976 594.396 566.242 594.534 577.497 573.540 567.115 572.341 590.146 581.223 579.980 592.935 592.389 584.851 593.707 574.179 593.020 576.630 570.055 577.602 +1500000 (returns) 572.847 584.214 583.769 584.193 588.176 578.881 576.078 560.341 565.522 579.768 584.651 561.390 579.804 589.410 579.142 586.363 575.765 576.543 588.684 577.149 586.219 577.084 584.418 565.758 591.647 562.959 580.522 561.683 570.933 575.769 577.037 572.096 +2000000 (returns) 560.842 586.285 581.291 560.902 568.291 582.193 576.829 367.493 556.934 559.058 583.258 567.576 584.961 566.148 581.656 561.622 575.343 584.354 561.403 582.036 576.349 583.613 564.151 587.445 574.995 564.748 583.231 581.442 576.731 570.127 581.420 584.841 +2500000 (returns) 581.469 584.969 583.065 564.056 583.415 577.044 584.669 583.102 580.120 584.670 584.122 584.545 573.546 582.508 581.524 577.325 584.982 572.343 575.972 572.996 565.159 573.383 580.818 575.438 570.393 566.848 579.830 572.207 580.918 585.084 562.349 582.827 +3000000 (returns) 555.950 580.074 561.681 583.979 567.882 561.278 576.478 577.832 583.950 576.343 579.763 572.074 558.774 570.612 572.762 567.346 565.142 573.055 560.116 576.020 562.054 565.991 565.616 578.933 568.097 580.108 557.720 568.376 576.395 582.361 562.889 579.062 +3500000 (returns) 582.528 558.049 578.923 567.937 416.856 557.334 578.799 567.288 562.971 584.152 572.095 575.683 581.886 577.486 417.082 576.607 586.166 576.150 560.572 577.090 575.395 576.845 586.049 581.597 569.031 569.019 569.586 570.672 567.313 576.886 568.262 571.693 +4000000 (returns) 585.990 573.464 563.204 569.404 561.791 560.694 586.460 582.442 586.099 573.731 574.837 560.141 582.926 582.583 565.813 559.701 576.155 578.816 574.801 582.968 582.534 574.107 562.006 569.606 561.276 565.367 573.054 566.805 576.295 575.675 581.036 576.256 +4500000 (returns) 575.891 576.310 585.560 560.478 585.435 566.469 568.260 567.621 580.926 571.436 553.521 577.001 571.199 580.753 564.505 564.001 580.354 576.254 567.363 580.430 564.907 574.156 576.154 565.316 580.982 581.211 556.251 576.283 577.119 563.131 565.989 564.239 +5000000 (returns) 569.671 558.972 573.886 548.327 554.501 571.888 565.437 556.649 576.730 575.615 561.693 576.964 558.037 564.485 564.953 565.448 568.642 579.499 550.098 577.271 565.433 577.452 573.587 560.676 580.211 567.128 563.416 569.078 568.608 563.456 574.401 553.985 +5500000 (returns) 576.229 580.767 579.077 563.926 568.017 573.251 563.331 576.967 565.544 580.522 578.795 575.886 563.698 572.666 571.816 567.538 573.456 564.623 557.442 566.074 582.356 580.784 562.639 582.459 571.561 564.205 558.594 575.797 569.288 570.144 563.411 576.083 +6000000 (returns) 567.411 569.788 562.215 553.862 567.895 576.376 572.960 563.880 573.655 580.019 568.212 566.719 562.567 575.138 562.264 562.597 556.922 558.109 577.715 563.044 578.533 572.082 564.611 574.963 553.137 568.990 582.804 575.352 558.644 561.291 576.009 552.556 +6500000 (returns) 577.585 570.984 570.028 572.664 567.837 572.200 553.426 564.553 566.888 559.731 576.587 565.530 560.667 566.371 571.629 573.728 561.596 560.460 565.472 571.738 570.164 570.786 571.606 555.512 572.075 570.191 559.016 569.078 571.972 567.475 571.916 571.623 +7000000 (returns) 565.294 565.312 571.440 559.546 557.831 571.723 574.204 561.831 571.394 561.864 576.140 565.064 572.587 572.111 569.867 574.876 568.157 572.789 557.744 563.609 571.149 568.569 559.206 572.147 556.143 572.180 569.905 562.603 572.410 571.730 556.773 559.820 +7500000 (returns) 566.452 556.557 569.369 554.914 552.696 568.061 566.368 556.326 569.331 552.672 555.355 548.082 564.313 551.353 551.365 556.004 571.366 571.033 557.678 552.586 568.595 557.055 556.351 572.580 566.496 570.036 570.144 566.762 570.956 569.308 557.386 560.759 +8000000 (returns) 565.167 559.257 570.433 553.785 566.701 574.256 561.488 570.040 573.868 549.127 561.566 569.612 548.511 570.126 577.183 550.901 555.770 552.237 553.002 573.972 577.817 572.625 573.844 570.351 553.880 557.992 548.450 569.877 566.950 556.520 567.614 561.504 +8500000 (returns) 539.528 557.211 552.845 537.413 572.652 564.669 534.734 573.942 572.306 555.374 551.579 567.492 535.377 544.510 538.012 540.892 539.749 569.250 535.534 569.144 563.565 536.874 568.875 547.448 554.263 555.439 551.064 539.657 563.480 548.135 572.185 569.380 +9000000 (returns) 560.732 570.549 574.018 515.824 537.862 551.018 535.664 561.111 536.889 534.144 557.149 543.123 541.180 544.146 557.195 571.291 534.321 566.712 539.674 556.951 531.209 518.233 569.148 522.856 535.037 559.122 567.424 509.238 535.294 537.039 570.190 558.587 +9500000 (returns) 565.330 566.877 564.060 564.432 539.582 530.961 563.837 537.807 539.624 540.772 565.203 556.984 566.973 564.423 554.615 559.122 541.605 572.207 535.417 566.824 570.388 558.956 520.500 563.128 563.929 551.375 556.812 530.202 559.405 535.075 568.099 519.006 +10000000 (returns) 545.120 571.685 546.019 559.034 521.098 537.841 566.237 565.098 564.006 563.416 547.168 531.308 547.956 555.381 563.778 556.886 555.957 553.211 547.072 552.804 550.424 557.153 526.037 546.797 561.140 558.134 530.909 559.363 520.982 560.933 530.603 541.878 +10500000 (returns) 569.693 533.401 570.441 517.226 526.956 515.452 506.368 527.758 565.776 527.713 528.428 558.934 561.420 533.016 564.838 564.949 528.270 556.872 567.710 562.171 504.266 565.510 567.482 542.649 561.575 410.101 563.989 533.824 526.202 568.860 553.659 540.497 +11000000 (returns) 557.723 563.794 568.926 543.878 538.213 552.410 554.528 558.104 526.800 551.108 563.658 531.541 546.833 565.871 552.383 576.539 556.145 541.938 529.938 533.380 518.319 552.421 534.793 556.805 568.372 553.709 516.163 543.581 563.801 550.795 534.393 534.604 +11500000 (returns) 539.111 546.329 553.209 569.008 559.673 567.127 552.301 554.515 575.684 548.051 517.607 538.119 550.660 568.190 548.166 533.821 542.871 559.495 541.801 566.201 526.707 555.176 565.776 574.364 563.719 549.751 534.049 570.886 537.810 554.622 568.795 564.243 +12000000 (returns) 526.743 526.034 563.992 529.277 560.466 572.457 521.833 564.276 567.711 534.232 547.691 548.988 574.640 542.036 535.282 522.292 570.859 508.299 557.093 538.077 523.280 522.875 524.858 536.992 556.915 543.208 524.006 533.243 534.489 528.168 545.649 545.407 +12500000 (returns) 517.919 561.907 546.461 514.432 508.327 522.073 565.671 534.428 571.823 524.066 513.263 515.421 552.835 556.941 519.101 557.037 537.297 520.463 562.029 548.196 548.840 563.281 512.351 527.809 573.383 534.944 560.329 555.863 529.750 509.332 563.294 525.276 +13000000 (returns) 542.712 565.696 566.064 563.375 554.784 550.703 512.660 568.320 507.692 525.822 559.300 539.229 548.226 513.591 533.988 571.138 539.542 533.895 510.502 561.340 537.233 506.465 523.587 533.694 522.608 559.741 557.740 538.917 563.247 537.789 555.039 550.612 +13500000 (returns) 555.460 525.834 522.843 501.278 548.561 515.627 554.053 560.755 513.933 530.485 492.973 539.763 557.707 571.227 519.354 512.612 530.480 529.181 563.685 515.973 564.843 543.532 545.380 553.494 522.007 550.163 555.055 525.073 544.652 554.398 532.666 564.491 +14000000 (returns) 547.438 553.819 565.446 531.058 565.998 532.324 564.557 539.558 515.471 556.503 569.746 564.993 520.028 565.119 549.789 560.273 547.988 563.342 564.072 532.981 569.490 521.044 554.186 551.342 536.629 520.057 520.364 524.110 549.684 562.077 550.788 559.062 +14500000 (returns) 534.525 566.240 557.400 562.774 569.615 534.281 506.503 543.535 565.982 536.620 518.366 553.467 521.917 501.708 543.949 565.184 545.164 559.188 557.663 566.905 572.676 504.855 564.169 552.168 547.795 572.089 513.747 548.113 531.766 515.675 543.224 501.660 +15000000 (returns) 570.793 559.162 571.426 533.983 500.584 537.145 564.076 533.569 503.889 562.245 554.162 549.801 566.151 550.920 534.625 563.006 511.950 565.858 522.785 506.933 525.356 524.095 346.459 540.143 536.412 552.742 522.034 511.814 554.781 573.796 562.093 544.869 +15500000 (returns) 559.122 530.232 535.277 573.164 548.647 561.620 571.844 535.353 522.013 555.063 536.835 572.060 555.152 543.897 558.481 514.914 523.156 494.917 568.414 500.032 546.372 543.489 534.247 564.424 523.077 515.588 512.310 314.006 555.743 514.638 532.885 535.814 +16000000 (returns) 522.568 511.933 502.528 558.836 507.944 529.355 555.392 538.479 551.104 554.892 579.016 531.765 507.095 540.951 489.729 553.066 567.071 578.600 537.857 521.018 531.234 538.798 552.255 508.790 577.308 565.476 539.363 523.136 563.290 506.162 567.368 528.928 +16500000 (returns) 531.292 344.551 500.072 553.451 546.273 556.472 577.919 558.347 546.808 548.631 550.922 547.293 566.392 544.776 558.566 528.435 561.163 502.995 528.899 551.754 505.818 570.739 559.617 559.970 500.821 533.181 528.958 548.477 529.885 548.062 533.701 518.482 +17000000 (returns) 542.847 535.402 568.135 294.985 562.846 563.290 573.284 536.477 526.113 566.617 527.471 530.286 494.451 541.028 530.471 556.175 568.801 538.969 545.560 521.691 571.193 529.200 532.117 561.001 534.005 568.002 569.032 542.739 501.947 522.545 562.425 314.791 +17500000 (returns) 488.319 296.552 520.000 552.606 559.216 568.717 536.691 553.303 530.275 547.948 547.834 566.353 510.743 300.408 577.110 452.700 511.417 535.737 559.729 556.647 533.930 561.059 505.163 555.201 565.914 503.301 535.906 510.801 554.318 549.417 498.932 541.129 +18000000 (returns) 550.064 542.883 560.641 546.802 534.241 571.263 544.381 521.812 505.509 525.270 558.388 559.950 528.120 566.478 504.122 531.530 503.477 505.660 555.174 560.425 528.514 528.467 510.365 536.946 524.916 557.203 562.629 560.577 522.558 567.067 572.894 481.478 +18500000 (returns) 533.338 508.818 540.227 554.072 529.551 546.081 548.491 547.934 547.844 530.057 539.137 508.650 529.396 286.458 332.995 528.331 565.254 493.269 511.087 525.853 303.366 554.063 506.941 305.106 542.761 281.042 544.457 334.588 577.217 529.820 551.732 547.605 +19000000 (returns) 510.602 288.476 516.313 513.478 483.941 531.932 508.274 480.588 452.360 548.578 554.056 505.147 443.563 563.845 566.906 517.785 453.490 508.964 296.622 508.126 563.038 516.616 516.643 538.571 562.279 510.437 568.596 510.080 518.933 577.542 478.825 279.163 +19500000 (returns) 553.973 521.664 514.913 578.220 545.271 561.546 508.875 549.189 576.842 524.462 321.324 534.282 518.152 512.206 549.203 510.876 518.879 553.485 557.047 546.968 548.420 529.741 510.765 513.107 274.165 521.061 521.045 566.499 514.123 552.198 455.303 557.850 +20000000 (returns) 532.365 535.134 562.581 460.518 543.955 517.927 281.944 562.837 510.704 498.858 536.160 555.318 539.176 508.824 549.083 311.788 551.295 551.267 508.572 500.718 282.812 562.305 567.649 472.265 563.644 535.799 546.208 507.650 528.358 510.540 544.912 535.508 +20500000 (returns) 564.160 523.724 463.105 512.846 278.692 388.149 511.219 506.173 511.782 372.163 503.424 501.917 478.425 508.830 499.420 539.588 410.154 500.223 516.044 478.172 522.235 508.178 508.935 571.098 478.445 389.442 501.635 434.353 576.285 564.783 567.691 407.749 +21000000 (returns) 497.867 417.123 515.119 346.378 556.098 515.165 305.032 509.761 510.430 490.926 284.521 440.395 427.554 204.429 555.522 549.391 568.699 385.796 305.329 336.037 492.991 481.868 334.470 515.002 556.094 509.486 547.826 502.895 305.928 514.973 288.933 357.114 +21500000 (returns) 508.154 513.699 537.869 575.191 426.138 577.820 577.464 487.488 508.950 539.520 524.885 276.020 548.211 533.070 555.467 300.046 561.784 278.992 540.943 368.932 577.667 538.593 536.661 529.443 548.535 538.554 557.840 548.721 539.545 523.101 546.994 532.669 +22000000 (returns) 490.246 517.137 514.192 436.460 370.489 490.159 503.270 357.041 563.547 379.031 505.504 551.099 526.912 442.012 412.108 422.168 569.315 525.872 508.054 518.494 538.456 568.509 564.162 457.228 387.846 449.831 525.741 563.093 506.933 553.736 542.760 331.840 +22500000 (returns) 518.614 262.871 530.409 560.207 543.497 424.210 537.835 247.933 479.792 450.006 537.709 542.006 224.349 266.540 267.812 219.403 414.843 265.470 88.325 537.821 520.339 568.824 448.289 524.281 145.424 315.459 336.061 563.850 564.340 528.314 541.123 504.364 +23000000 (returns) 477.126 481.294 569.226 224.537 509.551 418.099 273.227 491.995 504.621 423.543 502.209 477.668 460.551 533.366 495.279 549.199 477.519 479.452 422.603 473.207 445.032 463.588 488.481 568.802 549.574 500.077 485.341 551.960 477.263 482.297 456.155 407.776 +23500000 (returns) 473.545 119.090 421.537 115.199 386.253 566.154 121.535 573.353 132.050 119.991 116.241 571.516 346.450 207.456 577.697 126.970 429.020 569.395 430.367 436.061 551.892 125.754 437.688 136.352 127.083 121.483 122.039 105.979 317.080 109.850 145.984 134.992 +24000000 (returns) 74.560 81.068 76.893 75.389 79.188 77.711 77.381 76.334 73.376 564.212 87.637 75.677 80.523 81.628 73.083 76.477 78.717 568.751 82.944 82.837 73.569 79.094 76.918 77.043 78.999 96.963 76.433 80.552 86.451 76.169 74.555 483.706 +24500000 (returns) 120.415 577.706 124.240 117.450 120.609 549.781 120.073 131.578 124.839 131.653 119.873 119.634 120.527 110.430 118.211 115.666 123.553 126.183 113.428 119.978 125.502 122.614 124.829 117.940 112.443 573.257 114.564 124.846 123.307 119.314 120.825 118.047 +25000000 (returns) 77.350 77.957 86.952 75.731 77.401 77.350 569.078 79.508 84.773 75.930 77.205 88.846 84.569 76.412 87.631 75.477 83.563 73.615 568.553 79.403 79.911 77.082 82.195 84.322 78.089 86.605 84.512 77.759 81.095 84.936 77.558 76.385 +25500000 (returns) 80.603 88.962 94.391 91.558 87.178 79.425 79.786 88.857 93.101 102.604 91.541 87.222 82.566 87.284 91.507 79.806 79.555 92.188 89.365 87.902 79.832 93.645 79.493 88.083 556.096 90.995 94.588 76.953 89.683 92.262 85.069 88.636 +26000000 (returns) 132.824 122.678 121.953 127.219 125.793 119.695 124.581 127.232 119.598 121.311 125.186 128.142 130.515 125.337 126.805 116.197 563.046 135.257 125.194 492.434 122.380 108.641 126.404 118.888 120.763 123.995 121.064 119.380 130.400 124.226 121.045 122.946 +26500000 (returns) 111.076 114.832 114.177 113.371 114.595 118.112 113.763 115.049 111.771 112.483 114.534 114.934 107.787 113.647 111.935 115.836 117.143 113.726 111.351 114.893 118.005 112.707 116.550 113.523 109.698 116.635 116.448 113.151 114.259 113.229 110.161 113.884 +27000000 (returns) 114.343 117.801 110.224 119.490 115.764 108.899 113.854 109.314 114.780 114.283 115.366 113.333 114.773 105.243 111.569 114.697 115.462 112.038 107.134 116.154 114.506 115.512 114.056 118.221 110.708 107.462 107.551 113.776 116.704 108.607 107.389 112.618 +27500000 (returns) 93.474 104.513 98.443 102.157 100.581 103.350 94.462 105.618 101.681 103.324 558.149 104.069 93.794 106.650 103.993 102.499 94.397 97.374 100.624 106.230 97.342 100.994 99.043 94.717 96.017 103.796 101.195 98.176 98.579 93.759 95.628 93.805 +28000000 (returns) 112.839 109.622 108.668 112.406 113.190 109.877 109.848 110.899 115.542 112.027 113.090 109.883 110.598 113.593 112.309 114.207 107.981 110.650 111.349 111.847 116.231 113.936 110.537 116.547 115.289 112.358 108.362 113.887 114.223 107.818 111.507 110.433 +28500000 (returns) 102.841 101.229 88.993 94.390 94.035 89.117 91.346 90.231 101.015 92.077 96.643 87.802 94.688 93.489 96.359 94.633 96.273 89.032 96.625 88.139 97.378 101.272 87.917 93.346 97.073 90.268 100.575 102.006 88.935 94.894 95.906 102.926 +29000000 (returns) 105.905 105.414 98.756 101.122 103.491 106.622 101.207 94.254 107.202 99.185 98.339 98.360 104.011 102.774 101.579 106.524 101.754 109.538 100.523 106.278 99.905 97.114 102.882 108.519 97.555 94.799 94.510 95.331 100.558 101.206 101.810 105.806 +29500000 (returns) 95.935 103.381 101.160 101.690 94.369 99.033 105.900 99.959 98.639 98.574 97.743 102.458 565.211 95.432 100.989 96.747 101.909 96.091 94.674 98.466 101.297 101.633 97.395 93.239 96.446 102.068 99.001 97.240 99.269 571.313 102.696 95.551 +30000000 (returns) 98.762 92.304 98.824 98.879 92.130 98.506 92.828 93.029 93.114 106.087 92.963 99.546 105.084 102.097 106.121 93.155 99.251 100.602 99.860 106.485 99.570 93.340 98.690 98.465 98.113 105.927 98.505 98.865 98.335 100.997 99.805 93.755 +30500000 (returns) 83.581 82.193 85.396 80.867 82.098 93.808 86.922 88.880 89.241 80.883 84.933 84.951 81.160 84.636 80.390 82.239 82.079 89.281 95.587 83.412 86.649 85.772 91.540 87.167 80.070 86.179 93.256 82.771 79.978 92.685 84.572 81.725 +31000000 (returns) 85.672 82.033 82.447 94.977 85.953 95.777 94.458 86.562 83.539 80.150 81.620 86.773 85.637 82.209 86.500 85.036 83.919 84.210 86.147 87.502 96.556 81.726 83.346 81.558 89.270 80.910 85.434 96.160 81.622 95.334 94.724 87.524 +31500000 (returns) 96.456 96.555 87.949 87.128 87.017 95.429 88.885 97.447 94.060 93.905 90.290 94.141 87.415 95.514 95.926 96.160 89.565 97.478 94.341 92.768 89.375 93.989 93.042 86.722 94.434 87.548 93.013 93.101 94.454 93.954 87.314 90.766 +32000000 (returns) 86.462 93.294 83.162 93.777 79.676 79.124 85.145 84.090 92.606 79.277 83.652 92.531 79.446 87.197 92.478 81.570 81.281 78.784 92.120 89.980 79.300 85.678 79.398 83.858 85.431 89.951 93.698 92.429 82.629 84.379 81.549 83.942 +32500000 (returns) 96.553 92.305 98.352 95.994 95.729 96.887 94.865 94.124 96.533 94.951 99.587 95.733 101.767 96.319 97.178 92.711 98.746 97.284 97.178 91.825 90.726 100.526 100.939 100.590 93.074 96.118 96.371 99.638 102.021 94.472 98.032 102.799 +33000000 (returns) 89.754 90.478 84.933 91.643 84.739 98.229 88.987 97.957 91.080 85.362 92.512 90.936 92.400 98.752 92.262 97.068 89.946 94.876 91.974 91.717 98.444 91.105 87.730 88.939 87.511 89.013 88.582 98.125 98.898 90.008 96.345 91.295 +33500000 (returns) 84.701 88.535 94.681 80.076 85.002 80.481 85.658 81.748 94.714 92.622 85.425 84.726 81.048 80.408 84.978 84.806 83.793 82.109 85.247 89.211 84.255 79.798 93.928 86.455 80.894 82.317 84.785 91.711 93.395 82.149 85.128 84.769 +34000000 (returns) 75.245 71.903 71.916 72.163 81.198 80.652 71.241 71.811 79.324 74.249 73.619 71.386 75.362 71.560 73.693 77.361 76.107 72.391 80.135 79.286 72.751 73.478 74.571 71.531 82.668 72.889 80.549 72.348 70.639 71.206 75.126 73.084 +34500000 (returns) 94.148 92.570 93.792 91.316 87.923 94.589 94.841 90.769 91.177 97.946 98.479 93.769 93.725 88.610 89.750 97.359 88.411 86.884 94.801 90.012 93.458 87.898 92.401 98.206 92.743 98.501 98.240 99.326 93.464 86.269 99.096 98.940 +35000000 (returns) 77.668 80.347 79.462 76.980 78.009 76.982 77.265 90.913 74.650 76.661 79.753 81.988 82.028 80.770 77.235 89.733 85.580 91.177 91.759 90.913 89.971 76.605 86.234 90.238 82.511 78.252 82.197 80.952 87.612 79.854 78.510 81.362 +35500000 (returns) 98.776 89.917 82.299 89.560 84.048 87.016 97.478 95.305 87.719 88.065 97.079 87.826 96.745 92.936 86.332 88.703 82.623 96.532 97.305 90.596 87.937 86.439 90.576 86.974 87.402 94.826 90.741 86.542 84.008 88.544 87.701 89.124 +36000000 (returns) 63.713 64.311 71.654 64.679 69.203 64.959 64.353 63.313 68.601 63.977 71.169 64.422 64.614 64.347 71.598 64.042 63.888 63.180 63.522 65.726 69.082 63.587 64.514 62.599 63.871 62.869 64.267 62.754 64.893 65.214 64.015 64.296 +36500000 (returns) 73.397 72.412 70.668 71.412 77.612 71.808 69.420 72.789 77.264 72.038 71.130 72.164 72.192 78.034 71.526 72.384 70.312 72.012 72.861 70.127 71.345 70.765 70.975 70.951 71.870 72.203 77.238 77.224 70.529 70.919 76.073 71.000 +37000000 (returns) 79.577 80.189 86.977 79.269 76.077 89.245 79.846 79.522 81.001 89.245 77.584 81.182 85.065 77.930 80.501 81.015 77.795 88.900 79.579 88.181 79.679 79.952 85.182 78.990 81.186 79.300 79.132 79.649 77.898 89.550 76.996 77.999 +37500000 (returns) 69.171 67.043 73.050 66.644 73.156 65.501 68.065 67.136 68.362 66.900 72.828 76.326 67.544 67.218 68.040 66.331 66.817 72.589 66.928 66.835 69.836 74.882 66.967 67.277 67.583 73.855 68.177 67.795 72.442 68.155 66.707 67.210 +38000000 (returns) 76.263 68.933 74.074 73.782 69.246 69.452 69.877 68.285 68.522 69.234 69.455 74.504 69.195 69.917 74.949 68.877 73.108 76.610 69.291 68.954 70.033 69.964 67.568 75.213 71.599 68.511 68.460 73.492 69.217 68.486 68.807 69.257 +38500000 (returns) 71.637 72.284 71.001 71.131 77.977 72.452 74.814 73.794 71.290 72.507 73.750 70.219 75.357 70.664 71.307 72.460 73.983 73.246 73.585 77.429 73.898 73.891 74.307 72.544 74.497 74.148 74.414 72.050 74.589 72.965 72.888 70.497 +39000000 (returns) 71.840 70.883 77.581 70.089 75.748 80.682 70.501 71.106 76.086 72.399 70.318 69.583 70.374 71.840 72.064 68.860 74.266 70.374 70.391 71.133 77.524 70.945 69.170 69.793 69.629 71.019 70.015 69.157 75.582 74.435 77.079 70.886 +39500000 (returns) 78.984 76.974 76.191 78.143 78.752 75.736 76.377 77.054 76.211 78.353 76.753 77.281 76.240 78.372 78.714 75.674 77.680 77.823 76.974 76.578 76.527 76.573 76.647 77.387 76.064 77.616 77.943 78.694 79.667 78.457 79.047 79.893 +40000000 (returns) 67.666 70.343 67.699 67.789 67.831 67.296 67.806 68.318 73.058 67.077 69.750 70.446 68.532 70.236 71.525 71.795 68.492 67.765 66.734 68.477 68.767 67.482 66.788 67.489 67.599 70.468 67.873 72.423 67.565 67.269 70.501 67.301 +40500000 (returns) 70.168 71.491 72.487 72.043 72.986 74.865 74.414 73.705 73.878 74.048 75.000 73.439 74.875 73.645 79.501 74.164 72.046 78.722 71.960 73.462 73.299 73.756 78.552 74.337 73.595 78.154 75.485 73.283 72.822 78.313 72.998 81.297 +41000000 (returns) 68.111 67.275 68.060 72.923 70.964 69.209 67.556 67.547 67.836 68.079 66.855 68.247 68.555 67.257 73.628 68.827 68.940 68.768 66.998 67.636 69.269 67.869 69.188 69.305 67.802 68.910 67.449 69.436 68.180 73.222 67.163 69.124 +41500000 (returns) 68.165 76.487 67.335 68.216 72.793 69.155 69.537 71.458 69.910 73.480 68.049 75.832 68.321 78.135 68.528 68.426 77.889 68.476 73.101 68.115 68.601 69.424 71.063 69.614 78.164 70.502 68.081 69.375 75.825 72.797 67.722 68.638 +42000000 (returns) 61.879 60.663 61.421 62.302 60.100 61.219 59.298 61.285 60.937 60.955 61.321 60.626 61.674 63.227 62.058 60.462 60.540 61.408 61.385 61.093 61.566 61.100 61.863 60.862 61.864 61.055 62.422 60.767 60.566 60.805 61.158 59.533 +42500000 (returns) 66.573 67.697 69.602 69.945 69.180 69.834 67.787 68.778 69.430 69.735 67.472 70.483 67.987 69.156 67.906 69.628 70.549 70.032 69.390 69.501 67.085 68.496 69.428 68.284 69.973 74.088 68.710 67.524 68.067 67.977 69.600 70.811 +43000000 (returns) 64.342 64.165 63.650 63.339 64.434 63.608 63.307 64.752 63.123 63.409 64.121 63.554 63.544 63.838 64.001 63.871 63.399 64.267 63.058 63.638 63.431 63.428 64.145 64.081 64.463 64.428 63.284 64.212 63.704 63.342 64.046 63.308 +43500000 (returns) 63.296 62.879 64.292 65.747 62.638 62.748 62.663 62.024 67.032 62.677 63.131 67.267 63.434 62.962 64.411 63.209 63.326 64.719 62.776 63.000 62.583 63.453 64.450 65.898 62.716 63.192 63.045 62.581 62.387 62.795 62.931 63.107 +44000000 (returns) 66.739 66.199 66.074 66.688 65.729 66.694 66.669 66.044 67.587 66.193 68.130 68.663 66.493 65.978 66.742 66.526 67.931 67.396 67.989 66.612 67.718 66.291 68.586 66.521 67.708 67.797 67.252 66.157 66.707 67.020 66.396 66.784 +44500000 (returns) 66.143 63.311 62.335 64.187 66.100 63.462 64.373 67.917 64.759 60.955 64.580 62.128 60.832 65.351 65.394 59.974 61.894 61.467 68.083 67.743 63.000 61.472 63.959 62.064 64.932 63.238 61.611 61.538 66.395 66.035 61.299 65.536 +45000000 (returns) 62.382 60.808 64.560 60.662 61.692 61.586 61.390 61.392 60.836 62.613 61.164 61.228 61.921 61.141 61.027 61.899 60.752 61.286 61.294 61.425 62.125 61.172 61.072 61.853 61.350 61.095 62.810 61.088 62.996 61.630 63.417 61.252 +45500000 (returns) 61.822 61.841 60.147 60.758 59.894 61.561 60.013 60.754 60.202 61.403 60.255 60.872 60.472 60.738 60.411 60.601 59.890 60.245 60.220 62.262 61.184 60.864 60.126 60.760 60.299 60.856 60.796 62.251 60.848 60.376 60.065 60.807 +46000000 (returns) 66.906 66.584 65.775 64.631 66.507 66.869 64.668 68.022 67.313 66.576 65.349 66.242 64.814 67.792 66.504 66.489 66.699 67.511 66.898 67.866 66.999 65.162 66.860 66.255 67.154 66.171 66.334 65.988 67.281 66.541 67.458 66.809 +46500000 (returns) 71.498 71.903 69.478 70.950 70.823 71.158 71.069 69.653 71.125 71.096 70.429 70.891 71.052 71.437 71.339 70.526 71.020 71.154 69.391 70.907 70.605 70.857 71.721 70.905 73.188 70.852 71.583 71.729 69.956 70.240 70.698 70.437 +47000000 (returns) 65.766 66.149 66.423 66.657 62.773 66.602 66.249 66.833 66.368 66.379 66.917 66.464 66.402 66.424 66.232 67.455 67.476 66.033 66.404 66.618 66.782 66.436 67.561 67.094 66.543 65.925 69.194 65.851 66.707 70.842 66.367 67.160 +47500000 (returns) 64.411 64.966 65.938 64.661 65.969 65.253 64.855 67.612 67.337 67.015 65.233 65.357 65.313 65.389 65.206 64.231 65.017 66.448 63.829 65.862 65.760 66.227 64.713 67.144 66.499 65.279 65.197 65.305 64.577 63.941 65.113 65.293 +48000000 (returns) 61.543 61.633 62.262 62.573 61.863 61.945 62.899 61.267 62.222 61.310 62.730 61.936 62.116 61.617 61.285 63.601 62.303 63.480 62.007 62.014 62.655 61.773 61.822 62.196 60.783 62.471 61.718 62.585 61.604 64.118 62.419 63.428 +48500000 (returns) 65.036 63.627 63.463 56.171 58.567 63.672 63.081 64.201 62.047 55.461 60.146 59.391 61.157 61.237 60.945 62.330 66.264 64.863 61.471 56.456 65.684 58.527 58.603 59.839 60.589 63.623 55.727 58.259 56.698 66.561 60.580 66.402 +49000000 (returns) 58.503 68.162 58.273 59.593 62.541 60.219 59.366 62.613 65.710 61.678 68.179 67.565 55.845 64.106 64.800 59.148 56.129 60.264 57.402 61.275 58.036 61.571 58.388 61.314 56.253 58.912 60.033 68.329 63.336 62.549 64.906 61.261 +49500000 (returns) 59.802 59.566 59.465 59.808 59.762 59.006 60.117 59.509 59.240 59.156 61.268 60.068 59.353 60.087 59.864 58.635 59.841 59.540 60.930 58.914 59.453 60.332 60.290 59.577 59.461 61.042 59.871 59.341 58.998 59.505 59.339 59.654 +50000000 (returns) 58.074 57.031 59.993 58.519 55.554 57.377 56.734 60.044 62.366 62.394 57.189 57.078 56.494 62.404 52.663 58.534 59.790 62.118 56.223 59.178 61.920 61.993 57.234 60.132 60.806 55.720 56.046 60.205 56.090 60.471 64.771 62.342 +50500000 (returns) 56.078 55.375 55.552 55.336 56.240 55.334 56.360 55.601 55.590 55.287 56.055 55.927 55.292 55.407 55.741 56.113 56.022 57.462 55.976 57.346 55.342 56.293 55.658 56.383 55.352 55.866 56.055 56.069 55.274 56.401 56.642 55.700 +51000000 (returns) 59.866 60.005 57.149 56.532 59.255 56.058 56.412 56.422 56.598 57.389 59.897 59.562 62.782 56.339 56.428 56.076 60.272 56.597 56.622 56.188 59.511 56.416 60.570 56.323 57.062 56.675 58.413 60.448 56.530 59.625 56.330 56.600 +51500000 (returns) 64.193 65.887 62.755 63.180 64.081 62.937 64.143 63.909 63.958 64.229 63.067 63.058 62.809 63.312 63.578 63.388 63.288 63.722 65.621 63.445 63.389 63.961 64.330 63.452 63.488 63.502 64.067 62.728 62.697 63.932 66.406 63.089 +52000000 (returns) 64.196 64.489 62.698 64.068 63.699 64.854 64.027 63.445 65.271 63.482 67.029 63.893 64.825 63.129 63.471 64.006 64.256 65.050 64.301 63.440 67.195 65.223 64.647 65.981 65.037 64.488 64.948 63.612 64.491 63.720 64.136 62.817 +52500000 (returns) 58.352 63.528 61.894 62.846 62.128 60.718 58.105 64.039 61.167 58.310 58.437 62.757 63.229 61.541 59.647 61.025 60.942 63.204 63.978 58.159 59.342 59.605 60.735 62.377 63.446 58.277 63.609 61.115 61.182 60.088 62.207 59.754 +53000000 (returns) 58.118 59.752 57.711 61.378 58.803 60.951 60.080 59.673 57.960 58.206 60.397 59.910 59.467 58.112 59.904 59.607 59.024 58.539 59.294 59.870 61.623 59.486 60.418 59.847 59.475 59.089 59.554 58.329 58.707 58.702 58.615 60.681 +53500000 (returns) 64.603 61.096 62.395 69.000 67.302 64.062 58.999 69.227 68.169 68.328 68.046 62.906 60.620 65.359 65.221 68.456 70.390 66.388 61.346 59.449 61.404 70.700 69.531 69.368 61.871 69.292 65.002 68.372 64.821 69.461 65.178 60.591 +54000000 (returns) 63.121 62.729 62.846 63.163 64.437 64.339 62.021 62.809 62.084 63.467 62.200 64.659 61.952 63.795 61.620 64.740 63.104 62.946 62.377 62.187 64.031 61.812 62.746 65.836 63.937 63.241 64.040 62.601 62.692 62.682 63.210 64.135 +54500000 (returns) 69.574 68.845 69.009 68.057 69.451 69.536 69.666 70.521 69.550 68.625 70.163 68.852 71.071 68.227 70.127 67.540 70.496 68.837 69.910 70.597 71.116 69.170 68.721 68.648 66.819 70.219 68.405 69.935 69.707 70.380 68.201 68.643 +55000000 (returns) 55.103 42.312 50.104 42.667 46.919 46.482 53.338 48.804 43.234 42.003 49.240 50.477 55.358 46.857 47.182 50.285 43.155 41.197 44.586 47.943 46.020 45.983 53.233 50.821 42.031 49.471 46.669 54.085 51.320 42.332 49.266 46.995 +55500000 (returns) 63.613 66.594 57.903 66.215 65.530 64.935 62.698 60.286 60.312 66.867 65.376 58.720 61.440 66.170 59.650 59.652 66.668 61.184 56.956 61.181 57.861 66.875 56.534 61.868 61.923 66.818 66.284 58.402 57.997 58.267 58.643 58.574 +56000000 (returns) 66.832 66.870 66.600 67.345 67.014 67.017 67.935 66.245 65.544 66.782 68.016 67.164 66.633 67.781 66.327 66.555 64.363 66.316 67.731 67.141 67.361 66.675 66.640 67.529 68.284 66.889 67.415 65.510 67.592 67.529 67.112 65.866 +56500000 (returns) 73.283 73.298 74.229 73.046 72.048 74.326 73.028 76.948 71.520 73.393 73.676 72.432 73.083 74.248 73.123 73.902 72.969 72.931 72.583 75.043 70.704 73.385 72.762 72.462 72.864 76.304 75.319 73.179 73.557 73.132 72.436 72.280 +57000000 (returns) 62.046 62.887 62.327 66.875 67.504 62.281 64.202 65.783 63.097 67.723 62.861 64.060 63.228 65.549 67.350 61.050 62.046 68.827 61.628 64.829 68.319 61.105 65.168 67.519 68.619 65.800 66.424 67.268 66.864 62.188 62.281 67.969 +57500000 (returns) 64.986 66.774 64.420 65.275 65.678 66.781 64.350 66.120 65.266 66.541 66.470 63.998 62.952 65.653 65.774 62.759 63.316 65.292 64.263 65.396 63.071 63.914 65.579 65.067 64.484 64.863 64.846 62.174 65.304 64.348 65.229 61.554 +58000000 (returns) 62.242 61.918 62.455 63.006 63.907 61.906 60.832 61.015 62.610 62.422 63.538 63.493 61.621 62.445 61.354 63.980 63.234 63.739 61.369 63.909 63.079 61.025 62.245 56.640 62.871 64.955 61.574 62.850 62.754 63.198 63.907 64.362 +58500000 (returns) 62.189 63.854 62.069 62.522 63.059 62.481 62.096 61.984 62.940 62.041 63.313 62.138 62.742 61.083 61.610 62.208 57.241 63.333 62.154 62.645 62.261 62.112 63.359 61.326 61.643 62.551 62.503 61.413 60.848 62.370 62.039 63.098 +59000000 (returns) 61.870 60.984 61.224 61.104 61.142 61.386 61.047 61.433 60.716 61.768 61.841 60.987 61.754 60.801 61.182 61.136 61.780 59.930 61.489 60.112 62.342 61.669 61.433 61.053 60.220 61.047 61.578 61.204 60.450 61.535 61.569 61.767 +59500000 (returns) 66.615 60.923 55.874 67.631 56.234 60.290 56.894 56.905 68.239 68.001 62.125 57.438 59.076 56.257 56.490 65.773 60.309 62.663 58.044 63.265 60.966 57.881 55.297 62.397 62.526 62.900 64.529 60.758 65.700 56.128 61.149 68.663 +60000000 (returns) 53.467 55.641 54.733 53.220 58.587 51.912 52.941 54.242 49.374 52.172 53.367 44.547 52.741 53.310 53.491 49.628 46.147 55.022 47.249 60.669 60.436 59.204 45.007 58.276 49.775 58.241 54.033 55.009 47.792 48.617 51.853 43.628 +60500000 (returns) 47.234 45.484 50.093 55.856 47.767 49.235 55.697 49.887 53.043 55.233 56.426 42.560 50.328 51.626 51.099 48.579 44.738 43.060 52.969 49.011 57.118 57.287 48.372 58.828 50.931 47.712 46.735 47.214 41.394 43.060 49.402 46.840 +61000000 (returns) 57.286 47.829 61.567 59.692 58.870 52.532 60.117 60.030 50.353 56.285 55.895 59.744 59.968 50.027 55.484 54.397 64.166 46.923 58.863 59.621 55.054 56.317 51.766 51.164 55.881 49.389 57.121 57.711 54.495 52.342 55.919 62.525 +61500000 (returns) 57.358 60.532 59.395 65.584 61.235 59.023 65.712 55.298 60.440 61.280 60.308 65.340 61.588 58.937 63.420 58.503 58.298 62.919 66.501 54.306 55.835 60.360 55.891 66.428 56.004 61.097 60.716 65.844 59.013 58.044 59.007 67.220 +62000000 (returns) 34.670 33.673 42.475 43.902 41.794 41.547 40.917 39.426 39.150 38.552 40.564 41.026 36.832 40.236 48.457 40.159 47.047 50.635 46.475 39.319 45.478 33.223 43.105 43.982 46.885 39.693 39.987 46.906 37.917 41.656 48.759 36.196 +62500000 (returns) 65.033 64.843 65.156 60.994 59.457 58.045 58.704 59.078 59.748 57.011 60.963 61.108 57.356 58.819 62.897 59.179 64.905 59.407 63.173 63.640 59.193 62.356 59.136 60.373 58.900 58.763 60.785 62.859 58.719 64.897 59.695 61.248 +63000000 (returns) 52.949 52.991 50.702 42.224 54.967 40.887 45.103 55.499 39.420 52.424 53.027 38.935 53.964 39.051 38.586 42.052 45.509 48.919 49.974 47.452 40.476 47.383 47.847 46.241 60.991 48.979 38.533 48.371 40.801 46.085 53.637 50.316 +63500000 (returns) 64.701 62.616 63.318 62.605 63.136 64.323 62.919 65.451 63.840 63.117 63.194 64.659 64.844 59.815 61.430 63.395 63.810 60.215 65.225 62.657 62.460 63.407 62.953 65.071 63.230 61.124 61.168 61.147 63.007 63.862 64.480 64.496 +64000000 (returns) 49.653 61.383 59.189 62.105 49.477 51.091 58.941 58.462 59.264 58.715 49.588 54.760 57.977 62.434 52.574 57.664 54.109 52.375 60.158 57.188 60.464 62.178 61.516 62.461 58.741 50.264 51.481 60.965 59.665 56.685 62.076 51.632 +64500000 (returns) 43.982 42.543 55.174 53.142 43.032 44.978 42.924 53.276 52.026 51.709 54.495 53.125 51.161 49.842 51.370 52.292 51.564 56.965 50.780 49.285 51.987 50.899 44.992 55.624 52.965 53.736 53.312 53.859 48.991 55.447 51.594 54.582 +65000000 (returns) 48.673 47.795 48.664 48.900 39.395 42.494 49.863 42.590 40.556 49.133 54.263 42.942 54.594 42.194 39.763 43.003 40.308 48.128 49.950 55.142 42.548 39.660 41.903 53.883 41.516 43.221 48.011 42.337 43.032 46.379 42.128 46.700 +65500000 (returns) 53.273 59.041 56.285 54.999 59.335 52.481 64.192 52.594 57.139 53.330 53.650 63.563 63.217 53.738 59.753 64.093 55.063 49.773 60.232 56.232 59.625 62.090 62.319 62.503 56.049 59.200 53.622 54.409 58.599 53.599 51.631 49.974 +66000000 (returns) 55.281 54.917 60.141 47.740 54.536 62.058 63.461 47.490 48.151 58.063 64.090 60.130 57.384 48.273 57.486 59.544 48.721 57.112 57.833 56.457 58.012 50.303 62.465 54.096 48.398 57.287 58.497 60.294 47.973 60.116 48.606 51.347 +66500000 (returns) 56.686 59.680 52.573 59.937 62.085 61.354 55.987 54.799 60.311 63.244 57.415 52.738 60.319 60.286 61.222 60.785 60.349 64.234 57.585 61.092 53.150 60.652 60.886 64.217 55.031 57.394 57.352 57.405 60.822 61.379 59.711 61.931 +67000000 (returns) 56.363 49.374 53.149 56.018 55.679 46.062 55.720 46.695 57.188 59.451 52.507 54.032 58.398 58.104 56.800 46.947 56.184 44.238 46.966 47.822 48.996 52.942 57.312 50.107 52.988 55.880 54.551 57.410 47.151 50.081 48.250 58.521 +67500000 (returns) 62.514 61.255 61.420 60.389 61.279 61.511 63.474 61.600 60.576 60.919 61.871 61.681 62.802 61.419 60.022 60.893 61.672 62.043 60.625 60.670 62.140 60.665 61.347 61.658 62.716 61.056 61.777 61.160 62.339 60.786 60.788 62.751 +68000000 (returns) 60.815 57.775 61.838 58.800 61.860 61.981 57.606 57.896 54.944 58.197 62.112 52.376 52.276 58.024 50.419 55.223 58.021 58.424 55.716 63.059 49.506 54.208 54.221 52.895 63.038 62.214 63.257 62.986 50.003 51.418 52.417 60.791 +68500000 (returns) 50.960 56.420 44.449 51.171 45.429 52.785 50.074 52.290 49.238 51.812 44.244 55.633 46.080 39.893 49.276 50.669 42.426 57.317 48.289 40.308 50.690 50.138 56.011 51.013 55.869 57.176 44.782 53.478 47.548 44.515 41.325 51.493 +69000000 (returns) 39.249 49.883 41.088 50.219 48.576 45.461 46.282 40.109 53.799 51.243 51.246 41.898 48.878 41.321 52.507 51.746 47.930 40.132 41.063 48.849 45.277 50.353 53.652 49.247 42.465 49.219 52.761 49.280 51.534 48.453 53.262 49.177 +69500000 (returns) 51.024 55.916 56.991 42.545 48.201 48.446 49.270 49.593 43.807 57.576 48.391 49.881 56.568 56.740 56.792 45.456 55.773 42.699 45.161 45.194 51.794 58.290 45.027 49.377 52.714 57.164 50.205 46.910 65.530 51.303 57.139 46.155 +70000000 (returns) 37.625 34.870 33.730 33.479 33.609 33.590 38.641 36.038 34.370 37.618 32.967 35.210 35.468 35.103 37.125 34.280 38.431 35.279 39.285 35.468 33.883 33.975 34.363 50.040 34.928 38.578 34.439 34.007 33.633 38.495 34.318 34.116 +70500000 (returns) 45.699 37.610 51.769 48.202 47.487 44.064 50.972 36.776 49.277 46.208 44.866 42.448 50.576 45.886 55.410 45.279 50.051 50.029 38.646 38.500 51.049 38.142 52.274 39.354 47.506 54.660 50.940 44.722 48.144 47.874 40.475 39.834 +71000000 (returns) 55.452 57.120 60.017 60.310 55.457 59.846 52.633 60.895 57.547 51.173 53.102 52.977 59.758 51.899 62.452 52.548 52.584 54.515 59.938 60.185 57.490 60.021 52.356 58.292 56.273 57.972 60.390 61.074 55.062 51.533 53.974 51.477 +71500000 (returns) 64.321 59.990 60.729 58.583 57.977 58.979 59.418 62.251 57.561 56.025 63.024 50.752 51.634 60.584 61.570 63.257 62.558 54.398 61.795 49.792 48.137 59.647 55.450 55.025 57.494 57.431 48.493 58.600 61.553 55.467 64.219 50.994 +72000000 (returns) 56.686 61.129 62.527 62.619 64.117 64.271 61.243 57.990 57.387 56.915 56.136 64.097 57.920 61.124 63.285 59.320 64.026 63.384 61.660 57.591 59.888 62.714 57.265 60.151 59.701 63.372 57.755 57.870 59.349 61.298 60.690 57.705 +72500000 (returns) 51.670 57.286 48.670 46.982 58.082 45.625 48.094 49.921 49.652 46.642 47.906 56.942 45.275 50.756 43.490 49.120 46.774 58.343 47.650 53.237 53.281 52.769 58.410 51.628 47.135 50.219 58.828 49.699 56.575 59.565 58.591 44.014 +73000000 (returns) 66.782 66.731 60.397 61.885 65.486 62.902 61.110 62.929 64.685 65.250 65.631 66.238 59.479 66.521 59.639 58.158 58.064 63.172 62.470 57.404 65.587 65.809 59.853 59.450 59.973 60.347 59.276 68.418 65.930 64.059 60.088 65.553 +73500000 (returns) 47.962 51.534 50.834 53.876 46.556 46.897 46.111 52.857 54.359 53.020 54.769 53.956 49.124 50.691 50.604 46.109 45.105 44.862 54.164 57.978 50.138 53.847 48.814 52.942 53.768 48.533 44.539 45.557 50.935 44.866 53.061 54.314 +74000000 (returns) 57.460 51.400 48.468 51.620 53.478 46.245 43.852 44.572 51.843 50.431 49.099 50.395 42.929 53.788 49.671 45.224 51.527 45.423 57.690 60.018 43.856 55.472 49.867 48.068 52.695 43.544 43.097 44.497 42.182 49.939 50.450 58.924 +74500000 (returns) 52.862 50.866 47.039 48.286 49.184 44.681 38.559 40.784 53.127 41.686 49.394 40.587 38.071 49.469 52.187 39.670 52.719 45.363 48.639 49.295 48.339 49.756 42.486 51.288 49.918 46.083 49.250 48.044 54.235 41.327 47.348 46.786 +75000000 (returns) 53.434 49.314 49.145 51.031 52.741 43.584 55.625 50.006 58.468 49.443 43.197 53.358 50.339 50.294 47.145 54.855 43.046 54.598 42.442 42.635 54.902 42.723 50.268 50.622 48.628 49.925 43.833 42.793 47.229 54.882 42.039 45.950 +75500000 (returns) 51.895 54.234 51.401 53.428 45.974 54.531 48.070 45.679 55.322 53.213 52.777 46.524 45.241 52.594 51.813 52.119 54.971 53.577 52.097 47.081 50.538 51.845 56.164 53.748 51.969 55.118 55.321 52.358 51.584 45.941 55.074 52.928 +76000000 (returns) 54.881 58.345 57.830 60.891 59.780 54.398 59.444 55.611 58.025 53.550 61.195 54.240 57.729 57.197 55.215 58.863 55.143 54.768 61.749 56.580 52.453 54.928 61.018 54.019 54.730 58.342 62.234 56.937 58.996 54.165 53.752 61.555 +76500000 (returns) 56.151 56.015 56.619 54.506 56.251 59.029 49.497 53.046 55.121 49.713 57.799 57.875 56.282 54.043 54.811 51.487 55.309 56.455 57.358 56.816 49.140 51.731 49.829 49.758 54.486 56.724 54.996 52.024 57.168 62.733 59.247 57.137 +77000000 (returns) 71.084 67.406 64.660 65.485 60.092 71.997 72.861 72.981 72.094 74.242 66.564 64.964 63.249 66.595 62.911 64.767 65.109 66.160 67.873 70.985 67.806 65.600 63.521 73.310 70.307 73.764 71.752 70.280 71.140 72.007 65.071 68.412 +77500000 (returns) 39.035 51.634 35.838 42.317 40.394 35.466 36.123 40.033 46.544 39.508 41.863 47.578 44.196 41.314 42.533 39.648 47.709 52.063 37.276 43.052 40.361 41.255 43.008 38.131 39.915 43.548 42.593 42.979 41.109 41.593 40.865 40.457 +78000000 (returns) 52.216 48.666 48.543 52.486 42.871 39.638 52.579 35.223 44.426 50.955 40.035 46.324 44.516 43.633 43.749 52.160 40.898 51.001 51.796 50.760 38.208 41.233 43.528 45.863 40.052 50.381 48.526 40.656 43.376 42.733 52.413 51.465 +78500000 (returns) 44.646 55.121 54.270 45.140 39.996 59.126 52.138 40.715 44.710 42.648 46.879 46.191 52.625 48.001 45.343 42.086 40.535 46.749 47.210 45.140 43.835 44.849 42.502 45.352 44.594 46.274 53.227 43.651 44.262 45.482 45.544 47.695 +79000000 (returns) 35.385 43.896 35.266 34.026 43.930 37.760 34.335 34.248 37.379 36.298 35.584 34.352 37.733 36.602 36.151 34.988 37.693 41.886 37.322 38.873 34.430 37.566 38.981 38.071 37.684 36.702 37.339 34.622 35.919 36.539 38.592 36.125 +79500000 (returns) 43.935 36.324 41.509 38.248 42.529 38.428 44.425 45.847 51.334 42.467 35.974 45.105 40.566 42.049 41.648 43.610 42.927 37.208 44.621 37.941 37.174 36.500 45.600 45.902 48.396 49.852 42.308 48.718 44.468 51.628 43.142 36.393 +80000000 (returns) 43.529 38.376 41.179 43.992 37.794 42.480 42.032 48.845 42.593 37.065 48.771 39.722 48.078 42.849 51.365 43.717 48.290 44.877 44.609 42.519 44.887 42.362 36.529 42.644 48.333 40.533 46.243 51.482 47.284 48.318 42.305 42.873 +80500000 (returns) 33.058 32.978 40.701 31.596 27.554 31.068 34.737 28.336 30.762 31.994 35.374 41.598 40.154 39.979 31.185 28.649 32.595 34.208 28.371 31.869 31.431 32.832 34.701 35.453 31.705 29.354 30.841 35.490 32.226 29.399 33.848 28.188 +81000000 (returns) 68.807 68.166 70.258 70.155 76.643 75.954 66.767 67.219 69.629 64.366 63.887 67.561 69.088 59.843 67.280 67.903 64.879 62.930 67.390 64.869 69.679 64.334 63.513 65.617 64.929 65.527 69.369 69.622 67.535 66.290 67.970 66.044 +81500000 (returns) 45.765 44.124 50.004 48.501 45.126 51.040 51.602 47.503 43.177 50.752 54.598 47.493 50.631 54.930 50.199 43.745 48.992 48.191 50.104 50.261 44.428 47.186 54.679 49.630 48.951 45.261 50.219 47.106 44.064 43.555 49.513 43.862 +82000000 (returns) 42.906 47.851 42.105 40.856 48.190 44.125 42.075 41.883 52.246 49.981 42.763 50.131 38.470 46.437 52.400 47.837 40.470 39.926 51.994 47.228 46.746 38.695 52.789 43.090 47.825 49.155 42.303 46.120 45.118 44.771 44.100 50.151 +82500000 (returns) 56.841 68.665 61.679 66.891 60.365 58.265 61.739 56.774 68.335 60.141 56.942 66.770 62.653 61.409 62.901 62.029 67.401 62.268 66.832 62.672 59.752 58.736 65.795 65.302 65.621 64.110 61.071 65.320 61.989 64.180 69.015 67.252 +83000000 (returns) 65.152 58.825 64.404 62.570 63.812 57.878 63.029 70.533 62.577 67.574 58.168 56.863 53.404 64.246 67.213 65.720 77.690 58.017 72.283 68.799 65.812 63.255 58.672 73.337 70.618 59.916 69.184 69.629 66.195 61.049 68.565 60.005 +83500000 (returns) 45.927 52.812 53.560 53.421 50.303 48.650 50.664 43.800 53.119 53.850 41.737 48.543 53.380 50.064 52.312 55.723 48.972 51.867 50.466 48.714 53.514 53.266 53.036 50.294 49.155 52.967 55.310 48.329 53.655 39.832 48.315 47.101 +84000000 (returns) 37.968 48.585 44.343 47.713 51.688 43.935 45.170 40.078 49.575 52.855 46.153 47.895 39.228 47.184 53.132 47.276 38.396 39.881 36.303 48.462 40.076 38.233 47.980 44.754 41.087 36.069 49.076 43.303 49.617 47.500 46.925 48.006 +84500000 (returns) 50.411 46.907 47.024 57.455 55.506 51.381 41.737 54.688 52.637 51.030 43.090 56.694 54.329 43.198 54.498 51.228 43.897 45.239 50.561 44.814 50.120 55.606 51.449 43.192 43.350 51.645 44.591 55.141 50.500 41.774 55.450 51.389 +85000000 (returns) 46.731 40.462 47.253 48.081 43.011 40.228 41.861 38.916 48.982 39.843 38.822 46.513 41.199 52.242 41.787 41.502 53.450 45.129 47.230 40.293 39.552 56.124 47.937 42.653 41.479 43.846 48.472 39.391 39.117 40.939 39.141 44.793 +85500000 (returns) 66.448 65.523 62.910 66.152 60.647 65.440 64.185 63.382 57.608 60.580 68.827 62.943 61.892 65.430 66.461 66.811 71.727 65.408 61.419 64.441 68.905 66.487 63.939 69.033 61.064 64.305 55.026 58.896 69.591 60.071 66.188 63.753 +86000000 (returns) 45.424 43.812 52.858 46.993 43.966 48.545 45.422 41.839 53.097 43.486 53.775 47.726 45.719 50.060 48.478 46.444 42.749 42.444 53.146 45.507 43.244 46.751 45.958 47.288 51.574 47.569 52.637 47.473 47.567 45.648 46.821 53.892 +86500000 (returns) 53.108 42.762 58.631 55.277 57.312 53.394 43.661 40.422 51.586 40.908 48.258 57.405 43.781 50.116 51.061 43.911 41.913 46.051 44.704 44.157 49.641 48.266 53.748 47.300 52.794 41.902 58.388 51.420 45.112 42.926 52.467 54.889 +87000000 (returns) 38.127 42.063 39.503 37.368 38.965 36.804 37.362 37.632 40.769 39.554 34.226 36.221 33.586 39.351 37.701 40.941 39.953 35.042 45.300 33.155 39.672 36.192 40.503 40.428 40.501 37.541 46.040 45.309 42.807 33.311 49.890 36.062 +87500000 (returns) 46.012 45.973 53.358 40.152 53.794 45.496 39.023 36.700 46.798 47.020 38.007 47.265 41.903 47.809 45.759 51.365 50.958 38.046 50.961 42.671 37.363 51.250 43.063 46.475 43.696 42.667 48.318 40.259 39.645 46.220 46.420 38.131 +88000000 (returns) 48.010 40.738 49.418 43.134 50.633 48.353 46.758 55.372 47.693 53.560 47.724 45.291 41.411 46.958 40.559 45.852 53.646 49.139 48.185 46.063 48.722 44.642 54.211 47.616 40.347 45.504 46.320 50.607 47.750 49.136 46.435 48.624 +88500000 (returns) 56.748 56.169 49.244 53.721 49.723 58.075 48.359 54.147 58.053 56.436 59.458 61.451 51.085 53.313 53.330 53.898 61.591 52.780 58.206 56.324 62.181 62.561 51.224 59.796 50.268 62.485 62.420 55.301 53.494 50.655 62.618 59.904 +89000000 (returns) 51.168 58.829 56.505 58.739 61.996 50.682 62.788 64.538 63.742 52.774 60.688 61.365 51.667 61.065 57.665 61.945 49.763 61.067 49.545 62.886 52.513 60.493 59.834 60.789 54.774 56.730 61.622 59.720 49.001 60.980 50.601 62.213 +89500000 (returns) 38.942 36.165 40.267 34.686 36.018 37.738 45.313 37.789 36.265 36.376 38.765 38.076 37.533 47.414 36.627 36.903 38.657 36.699 41.498 34.937 39.245 33.924 39.486 35.075 38.235 47.907 34.979 37.200 33.560 37.440 36.601 46.202 +90000000 (returns) 39.265 37.346 42.200 38.009 49.945 44.040 44.212 43.059 38.548 46.552 53.093 42.921 38.499 43.746 41.717 36.008 40.064 36.280 48.092 37.641 44.431 42.475 43.774 45.292 38.495 42.761 37.731 45.063 43.987 47.895 37.576 46.013 +90500000 (returns) 51.150 62.306 64.067 62.834 63.106 62.799 65.064 55.092 58.182 52.705 62.514 63.067 62.072 64.250 52.420 63.100 63.420 51.302 64.954 63.247 61.201 54.199 49.819 53.009 60.073 62.068 59.007 49.319 57.634 64.303 62.267 64.102 +91000000 (returns) 39.230 37.637 37.474 44.804 37.860 41.268 41.062 44.619 42.785 46.645 36.938 44.674 41.603 42.988 44.387 44.963 43.985 51.890 39.577 38.888 39.780 39.069 41.443 44.245 46.959 36.626 50.907 37.476 45.257 47.094 45.443 38.016 +91500000 (returns) 37.047 44.420 44.545 44.524 37.148 36.189 34.106 32.820 36.337 36.798 31.421 30.087 33.650 45.568 46.003 46.497 37.284 37.341 34.962 38.213 45.505 33.254 40.023 38.145 36.677 32.411 36.004 31.802 39.790 36.664 39.883 42.503 +92000000 (returns) 66.610 62.196 66.938 60.560 61.609 59.917 61.615 60.073 65.730 65.465 60.564 67.011 59.667 62.903 61.711 60.970 60.754 61.791 68.910 64.995 67.181 65.627 66.730 59.952 62.780 62.478 63.671 60.666 60.504 66.058 59.488 62.016 +92500000 (returns) 34.811 32.351 36.063 41.720 40.730 35.180 37.185 36.169 35.824 36.452 39.044 31.618 36.753 37.800 38.552 38.566 36.290 34.290 38.455 32.373 36.424 39.657 34.839 38.512 35.866 30.622 37.021 39.283 38.336 37.880 46.175 46.178 +93000000 (returns) 50.555 45.072 53.984 44.499 54.135 59.646 45.418 45.869 54.781 53.652 54.615 51.816 57.433 55.545 58.849 54.271 51.711 54.632 56.273 52.750 49.381 56.780 45.358 54.282 44.606 48.226 47.637 53.590 54.491 56.333 55.157 57.748 +93500000 (returns) 68.254 76.082 70.499 77.875 70.701 78.921 71.262 71.974 68.815 70.346 71.030 76.191 70.844 69.388 75.672 71.768 70.419 78.596 69.886 69.398 76.538 72.746 72.603 66.842 75.750 75.474 78.822 70.372 75.068 76.617 68.800 70.291 +94000000 (returns) 63.715 61.059 64.422 64.552 62.221 67.267 65.374 61.931 65.907 62.454 61.879 67.414 66.494 64.589 67.281 65.290 64.435 62.460 61.978 64.229 61.667 66.659 64.009 66.033 65.142 63.930 63.736 66.111 62.224 63.541 62.539 62.788 +94500000 (returns) 38.126 41.996 49.215 37.660 44.517 48.980 48.856 48.946 49.922 44.852 45.254 35.129 38.293 44.557 37.163 38.059 39.059 45.131 45.384 44.446 39.227 43.022 35.225 38.059 35.662 43.189 51.210 44.055 41.493 43.753 48.361 44.423 +95000000 (returns) 61.770 61.395 62.824 59.390 67.557 63.926 66.243 61.187 68.062 60.148 57.397 61.735 67.219 66.700 57.118 61.055 64.938 59.426 59.919 63.553 58.360 64.904 66.770 58.050 65.240 64.240 65.128 59.068 58.754 65.527 63.930 65.603 +95500000 (returns) 56.685 62.677 57.676 54.747 55.106 57.172 46.861 62.399 56.716 60.418 62.423 56.707 63.211 51.163 52.586 57.507 54.702 58.430 57.783 66.146 49.294 62.801 56.601 60.858 54.745 56.628 57.098 48.088 57.670 56.680 51.001 56.719 +96000000 (returns) 40.776 45.639 48.407 40.874 39.744 48.669 50.355 32.731 38.717 40.171 33.482 39.725 48.714 37.712 33.513 38.998 46.176 40.949 41.169 34.668 50.359 35.409 47.118 33.032 35.803 47.006 55.780 33.790 40.160 33.587 34.933 48.195 +96500000 (returns) 57.128 59.861 56.785 58.263 59.255 61.373 60.311 55.628 53.319 57.089 57.644 58.451 56.887 53.551 56.126 58.215 60.203 59.499 60.090 59.946 57.419 51.292 49.026 57.335 53.225 49.373 52.455 52.894 53.011 50.457 55.625 61.435 +97000000 (returns) 56.812 46.673 48.798 43.277 44.831 48.904 44.654 44.905 45.302 53.777 53.916 54.286 45.514 55.458 48.184 45.807 42.034 54.400 47.303 44.920 43.866 42.435 43.147 50.765 52.921 53.050 47.107 41.454 47.019 45.583 47.570 53.683 +97500000 (returns) 53.947 48.501 46.842 54.075 49.029 47.349 49.837 51.105 46.026 47.682 46.392 50.784 53.810 46.050 41.853 51.133 41.420 41.469 53.046 44.303 49.421 51.647 43.019 48.060 51.745 48.151 50.531 50.070 46.683 44.860 54.101 47.134 +98000000 (returns) 46.188 46.997 51.182 53.005 52.717 52.585 49.236 46.704 41.675 41.775 40.468 52.146 52.837 43.371 52.908 41.555 47.405 42.132 49.730 46.958 48.290 46.407 43.462 44.012 46.784 46.544 52.580 41.408 45.499 49.503 39.669 53.445 +98500000 (returns) 50.277 46.503 43.432 44.118 52.626 44.136 45.750 42.780 39.906 52.980 44.880 46.719 44.407 45.438 45.486 47.803 43.976 40.201 47.598 45.718 46.865 47.772 48.426 48.407 48.241 46.551 42.705 51.753 52.032 48.493 50.826 42.672 +99000000 (returns) 39.045 39.761 41.895 39.305 33.715 41.320 39.631 33.269 40.048 38.645 37.028 40.641 44.101 36.586 36.462 32.387 39.033 32.018 37.206 37.792 39.299 40.734 38.831 38.934 34.134 39.030 35.424 35.957 37.516 37.320 32.078 41.970 +99500000 (returns) 58.241 62.127 54.895 61.016 62.267 68.774 65.404 60.929 58.901 58.429 62.832 64.066 55.387 57.356 63.776 58.523 61.509 60.239 58.706 62.481 57.346 59.844 62.427 59.985 62.635 60.479 60.397 53.825 54.360 58.757 60.991 58.674 +100000000 (returns) 59.752 59.139 56.810 52.094 56.388 59.825 57.719 56.935 59.157 59.074 59.934 57.719 56.489 59.669 60.277 52.690 60.024 58.966 60.191 56.424 61.696 57.693 52.972 56.419 58.450 61.833 54.559 58.344 57.539 56.702 57.038 54.375 diff --git a/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-10/evaluation_result_scalar.tsv b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-10/evaluation_result_scalar.tsv new file mode 100644 index 00000000..57adfbf1 --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-10/evaluation_result_scalar.tsv @@ -0,0 +1,201 @@ +iteration mean std_dev min max median +500000 583.589 7.486 567.195 594.207 582.948 +1000000 580.669 10.248 562.463 594.784 578.289 +1500000 577.463 8.639 560.341 591.647 578.015 +2000000 568.049 37.221 367.493 587.445 576.540 +2500000 577.866 6.661 562.349 585.084 580.469 +3000000 570.897 8.155 555.950 583.979 571.343 +3500000 563.688 38.604 416.856 586.166 573.745 +4000000 573.314 8.441 559.701 586.460 574.454 +4500000 571.860 8.232 553.521 585.560 572.796 +5000000 566.756 8.517 548.327 580.211 566.288 +5500000 571.155 7.094 557.442 582.459 571.688 +6000000 567.510 8.138 552.556 582.804 567.653 +6500000 567.846 5.775 553.426 577.585 570.096 +7000000 567.063 5.983 556.143 576.140 569.218 +7500000 561.822 7.485 548.082 572.580 562.536 +8000000 563.576 9.058 548.450 577.817 565.934 +8500000 553.831 13.321 534.734 573.942 553.554 +9000000 546.966 17.578 509.238 574.018 543.635 +9500000 552.923 15.174 519.006 572.207 559.039 +10000000 549.857 13.479 520.982 571.685 553.008 +10500000 541.438 31.098 410.101 570.441 548.154 +11000000 548.171 14.881 516.163 576.539 551.745 +11500000 553.057 14.312 517.607 575.684 553.862 +12000000 541.605 17.451 508.299 574.640 537.534 +12500000 539.192 20.544 508.327 573.383 536.121 +13000000 542.352 19.109 506.465 571.138 541.127 +13500000 538.048 20.000 492.973 571.227 541.648 +14000000 547.792 16.950 515.471 569.746 551.065 +14500000 543.091 22.015 501.660 572.676 546.480 +15000000 536.177 40.096 346.459 573.796 542.506 +15500000 532.900 44.524 314.006 573.164 536.325 +16000000 538.791 24.093 489.729 579.016 538.639 +16500000 535.710 39.710 344.551 577.919 547.050 +17000000 529.184 61.316 294.985 573.284 539.998 +17500000 521.480 63.584 296.552 577.110 538.910 +18000000 538.431 23.401 481.478 572.894 539.914 +18500000 493.298 91.432 281.042 577.217 529.938 +19000000 496.680 75.078 279.163 577.542 512.040 +19500000 519.427 62.594 274.165 578.220 527.101 +20000000 508.646 74.266 281.944 567.649 535.321 +20500000 487.470 65.204 278.692 576.285 504.799 +21000000 441.536 101.558 204.429 568.699 491.959 +21500000 508.093 82.538 276.020 577.820 538.212 +22000000 487.289 67.717 331.840 569.315 507.493 +22500000 421.260 141.810 88.325 568.824 492.078 +23000000 472.519 70.850 224.537 569.226 480.373 +23500000 289.877 182.172 105.979 577.697 176.720 +24000000 122.026 134.692 73.083 568.751 78.214 +24500000 162.604 130.178 110.430 577.706 120.568 +25000000 110.867 118.312 73.615 569.078 79.455 +25500000 102.211 81.726 76.953 556.096 88.747 +26000000 149.098 98.286 108.641 563.046 124.403 +26500000 113.852 2.318 107.787 118.112 113.824 +27000000 112.864 3.583 105.243 119.490 113.955 +27500000 114.013 79.872 93.474 558.149 100.603 +28000000 111.924 2.323 107.818 116.547 111.937 +28500000 94.733 4.683 87.802 102.926 94.661 +29000000 101.651 4.122 94.254 109.538 101.393 +29500000 128.297 113.639 93.239 571.313 99.017 +30000000 98.562 4.282 92.130 106.485 98.793 +30500000 85.466 4.294 79.978 95.587 84.785 +31000000 86.728 5.082 80.150 96.556 85.655 +31500000 92.379 3.431 86.722 97.478 93.503 +32000000 85.559 5.080 78.784 93.777 84.234 +32500000 96.873 3.028 90.726 102.799 96.543 +33000000 91.925 4.119 84.739 98.898 91.200 +33500000 85.611 4.417 79.798 94.714 84.795 +34000000 74.733 3.462 70.639 82.668 73.549 +34500000 93.419 3.889 86.269 99.326 93.594 +35000000 82.318 5.240 74.650 91.759 80.861 +35500000 89.927 4.547 82.299 98.776 88.624 +36000000 65.226 2.550 62.599 71.654 64.329 +36500000 72.583 2.401 69.420 78.034 71.941 +37000000 81.381 3.973 76.077 89.550 79.762 +37500000 68.980 2.872 65.501 76.326 67.689 +38000000 70.723 2.624 67.568 76.610 69.372 +38500000 73.174 1.796 70.219 77.977 73.106 +39000000 72.230 2.984 68.860 80.682 70.982 +39500000 77.481 1.147 75.674 79.893 77.334 +40000000 68.755 1.712 66.734 73.058 67.852 +40500000 74.462 2.507 70.168 81.297 73.731 +41000000 68.756 1.692 66.855 73.628 68.213 +41500000 70.976 3.358 67.335 78.164 69.480 +42000000 61.169 0.783 59.298 63.227 61.129 +42500000 69.085 1.391 66.573 74.088 69.285 +43000000 63.790 0.446 63.058 64.752 63.677 +43500000 63.543 1.283 62.024 67.267 63.076 +44000000 66.938 0.775 65.729 68.663 66.701 +44500000 63.815 2.208 59.974 68.083 63.710 +45000000 61.654 0.843 60.662 64.560 61.370 +45500000 60.737 0.639 59.890 62.262 60.746 +46000000 66.532 0.871 64.631 68.022 66.580 +46500000 70.927 0.730 69.391 73.188 70.929 +47000000 66.659 1.190 62.773 70.842 66.450 +47500000 65.467 0.929 63.829 67.612 65.286 +48000000 62.193 0.729 60.783 64.118 62.065 +48500000 61.271 3.234 55.461 66.561 61.197 +49000000 61.446 3.528 55.845 68.329 61.268 +49500000 59.712 0.586 58.635 61.268 59.571 +50000000 58.984 2.704 52.663 64.771 58.856 +50500000 55.910 0.546 55.274 57.462 55.896 +51000000 57.842 1.811 56.058 62.782 56.649 +51500000 63.738 0.862 62.697 66.406 63.495 +52000000 64.373 1.018 62.698 67.195 64.226 +52500000 61.117 1.877 58.105 64.039 61.141 +53000000 59.415 0.974 57.711 61.623 59.481 +53500000 65.530 3.511 58.999 70.700 65.290 +54000000 63.174 0.976 61.620 65.836 63.025 +54500000 69.332 1.001 66.819 71.116 69.494 +55000000 47.671 4.030 41.197 55.358 47.089 +55500000 61.937 3.477 56.534 66.875 61.312 +56000000 66.894 0.803 64.363 68.284 66.952 +56500000 73.359 1.237 70.704 76.948 73.128 +57000000 64.865 2.469 61.050 68.827 64.998 +57500000 64.766 1.282 61.554 66.781 65.027 +58000000 62.514 1.476 56.640 64.955 62.682 +58500000 62.163 1.110 57.241 63.854 62.198 +59000000 61.236 0.534 59.930 62.342 61.214 +59500000 61.186 4.056 55.297 68.663 60.945 +60000000 52.635 4.486 43.628 60.669 53.265 +60500000 49.838 4.562 41.394 58.828 49.319 +61000000 55.917 4.277 46.923 64.166 56.102 +61500000 60.670 3.541 54.306 67.220 60.400 +62000000 41.583 4.338 33.223 50.635 40.971 +62500000 60.826 2.394 57.011 65.156 60.060 +63000000 47.322 5.871 38.533 60.991 47.650 +63500000 63.177 1.409 59.815 65.451 63.212 +64000000 57.039 4.348 49.477 62.461 58.588 +64500000 50.989 3.927 42.543 56.965 51.848 +65000000 45.615 4.656 39.395 55.142 43.127 +65500000 57.050 4.217 49.773 64.192 56.259 +66000000 55.508 5.162 47.490 64.090 57.199 +66500000 59.144 3.098 52.573 64.234 60.298 +67000000 52.871 4.406 44.238 59.451 53.590 +67500000 61.494 0.790 60.022 63.474 61.419 +68000000 57.322 4.313 49.506 63.257 57.959 +68500000 49.463 4.907 39.893 57.317 50.403 +69000000 47.692 4.433 39.249 53.799 49.028 +69500000 51.176 5.487 42.545 65.530 50.043 +70000000 35.843 3.122 32.967 50.040 34.899 +70500000 46.085 5.162 36.776 55.410 46.848 +71000000 56.448 3.474 51.173 62.452 56.697 +71500000 57.741 4.572 48.137 64.321 58.591 +72000000 60.350 2.545 56.136 64.271 60.420 +72500000 51.339 4.828 43.490 59.565 50.070 +73000000 62.790 3.096 57.404 68.418 62.915 +73500000 50.396 3.634 44.539 57.978 50.762 +74000000 49.616 4.890 42.182 60.018 49.903 +74500000 47.104 4.477 38.071 54.235 48.313 +75000000 49.015 4.631 42.039 58.468 49.684 +75500000 51.723 3.154 45.241 56.164 52.239 +76000000 57.143 2.785 52.453 62.234 57.067 +76500000 54.974 3.190 49.140 62.733 55.662 +77000000 68.283 3.737 60.092 74.242 67.839 +77500000 41.873 3.878 35.466 52.063 41.285 +78000000 45.966 4.976 35.223 52.579 45.190 +78500000 46.454 4.389 39.996 59.126 45.347 +79000000 37.071 2.444 34.026 43.930 36.652 +79500000 42.712 4.381 35.974 51.628 42.728 +80000000 43.952 3.871 36.529 51.482 43.201 +80500000 32.882 3.647 27.554 41.598 32.110 +81000000 67.313 3.314 59.843 76.643 67.335 +81500000 48.287 3.283 43.177 54.930 48.726 +82000000 45.648 4.102 38.470 52.789 45.619 +82500000 63.116 3.526 56.774 69.015 62.663 +83000000 64.531 5.395 53.404 77.690 64.325 +83500000 50.396 3.693 39.832 55.723 50.565 +84000000 44.951 4.787 36.069 53.132 46.539 +84500000 49.704 4.842 41.737 57.455 50.796 +85000000 43.968 4.538 38.822 56.124 42.257 +85500000 64.234 3.599 55.026 71.727 64.373 +86000000 47.435 3.483 41.839 53.892 46.907 +86500000 48.977 5.492 40.422 58.631 48.954 +87000000 39.121 3.799 33.155 49.890 39.158 +87500000 44.768 4.821 36.700 53.794 45.866 +88000000 47.450 3.711 40.347 55.372 47.709 +88500000 56.094 4.406 48.359 62.618 56.246 +89000000 57.771 4.803 49.001 64.538 59.777 +89500000 38.329 3.634 33.560 47.907 37.487 +90000000 42.398 4.141 36.008 53.093 42.841 +90500000 59.520 5.016 49.319 65.064 62.170 +91000000 42.362 3.955 36.626 51.890 42.194 +91500000 38.051 4.655 30.087 46.497 37.098 +92000000 63.036 2.725 59.488 68.910 62.106 +92500000 37.219 3.401 30.622 46.178 36.887 +93000000 52.472 4.408 44.499 59.646 54.060 +93500000 72.745 3.435 66.842 78.921 71.515 +94000000 64.167 1.817 61.059 67.414 64.119 +94500000 42.913 4.623 35.129 51.210 43.904 +95000000 62.723 3.238 57.118 68.062 63.188 +95500000 56.853 4.428 46.861 66.146 56.718 +96000000 41.136 6.253 32.731 55.780 40.165 +96500000 56.349 3.468 49.026 61.435 57.108 +97000000 48.074 4.381 41.454 56.812 47.063 +97500000 48.440 3.628 41.420 54.101 48.326 +98000000 47.162 4.258 39.669 53.445 46.871 +98500000 46.546 3.322 39.906 52.980 46.527 +99000000 37.847 2.995 32.018 44.101 38.738 +99500000 60.174 3.180 53.825 68.774 60.318 +100000000 57.716 2.415 52.094 61.833 57.719 diff --git a/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-10/result.png b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-10/result.png new file mode 100644 index 0000000000000000000000000000000000000000..ada86e30ebd8036087489b64bda3139e9a8ca11d GIT binary patch literal 20854 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 literal 0 HcmV?d00001 diff --git a/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-100/best_score_scalar.tsv b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-100/best_score_scalar.tsv new file mode 100644 index 00000000..ab5837d9 --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-100/best_score_scalar.tsv @@ -0,0 +1,2 @@ +iteration best_mean_iteration mean std_dev best_median_iteration median +1 91000000.000 40.905 4.769 91000000.000 39.911 diff --git a/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-100/evaluation_result_histogram.tsv b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-100/evaluation_result_histogram.tsv new file mode 100644 index 00000000..985b541d --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-100/evaluation_result_histogram.tsv @@ -0,0 +1,201 @@ +iteration(key) values +500000 (returns) 586.817 584.303 579.141 583.338 584.320 586.753 594.148 595.361 584.028 589.631 577.438 588.183 588.176 584.007 576.137 590.867 581.466 582.852 560.626 586.145 584.348 590.867 586.005 586.565 591.513 585.415 586.139 581.824 575.070 575.722 585.934 576.309 +1000000 (returns) 576.060 573.435 576.901 573.994 574.584 575.100 571.006 578.623 575.735 574.559 588.077 570.971 583.256 590.456 575.000 588.993 563.697 592.044 571.726 570.696 565.281 579.343 583.828 585.677 576.888 578.713 576.157 580.339 581.794 578.802 583.927 588.833 +1500000 (returns) 580.435 584.764 577.656 576.887 575.424 573.200 581.543 569.499 583.700 579.003 570.457 584.932 570.667 589.687 574.873 592.837 580.863 575.415 577.866 579.803 575.326 575.323 575.456 578.497 592.839 576.189 570.325 580.665 582.593 584.274 579.950 580.911 +2000000 (returns) 575.758 577.369 570.809 571.253 571.485 567.716 591.390 576.089 576.530 590.650 568.599 578.534 575.581 567.668 576.683 592.218 574.607 570.314 571.676 584.008 574.815 575.986 592.186 590.635 569.004 588.464 584.070 576.788 577.734 576.177 589.147 563.643 +2500000 (returns) 593.646 577.985 571.337 566.925 579.456 564.219 557.968 567.849 573.055 588.126 571.635 577.977 570.382 569.445 578.037 572.819 592.143 577.930 578.847 582.693 569.763 568.552 569.000 570.224 584.798 578.604 578.702 592.886 574.536 570.291 584.648 571.438 +3000000 (returns) 569.637 584.115 575.122 570.315 579.136 570.861 578.585 586.705 563.597 563.273 574.730 576.822 589.901 568.824 578.043 573.861 578.266 582.604 571.770 579.633 573.535 578.689 578.866 573.150 573.961 592.134 593.513 569.217 574.734 579.906 575.488 562.518 +3500000 (returns) 390.690 586.884 578.832 582.509 582.211 356.258 585.447 582.618 562.877 581.455 579.626 582.134 582.562 582.164 569.157 573.796 424.966 582.768 580.789 577.662 585.853 357.632 382.371 585.623 583.765 583.307 587.278 574.825 575.423 582.021 582.276 582.466 +4000000 (returns) 572.086 579.291 581.918 574.439 581.236 563.815 581.098 581.863 561.814 567.882 560.638 569.871 579.720 575.308 580.257 583.308 578.434 579.435 581.484 562.374 364.047 562.436 575.798 561.381 578.589 563.030 560.665 564.240 580.166 575.878 574.690 557.865 +4500000 (returns) 573.237 571.150 576.972 561.988 556.022 556.826 548.623 572.326 558.679 547.344 572.822 573.491 563.505 559.753 557.650 559.361 572.805 574.677 561.394 572.708 577.062 555.038 572.669 549.138 553.269 571.734 554.144 570.651 572.652 576.952 570.716 573.053 +5000000 (returns) 554.398 555.635 572.674 577.424 554.187 561.956 560.837 570.076 560.077 539.769 558.744 559.773 572.947 553.223 532.240 558.802 548.637 559.661 576.564 545.812 558.577 561.930 560.633 571.965 553.938 559.727 554.048 556.831 552.318 574.791 556.333 571.125 +5500000 (returns) 551.468 546.650 551.924 533.784 562.420 556.213 553.159 559.624 542.115 557.996 517.577 528.685 565.779 523.647 532.656 555.997 553.724 550.782 548.918 544.676 561.558 550.806 556.891 549.593 557.714 559.152 558.441 575.110 563.059 541.042 557.098 565.963 +6000000 (returns) 554.527 568.633 559.758 540.119 547.712 554.847 553.345 554.026 551.747 541.584 553.814 561.873 539.379 540.472 549.135 553.240 549.543 549.504 557.177 556.303 546.515 547.261 534.863 573.881 552.224 564.699 557.614 557.486 560.615 544.543 541.620 551.030 +6500000 (returns) 545.440 543.993 354.553 555.496 342.694 540.339 562.774 555.577 353.383 560.985 548.684 544.030 550.884 557.258 557.772 541.934 538.893 355.184 353.202 542.815 357.062 564.388 370.327 566.735 353.118 551.026 351.970 570.362 545.687 550.934 544.491 559.613 +7000000 (returns) 558.795 535.232 558.817 568.054 527.267 538.050 561.983 527.964 539.383 535.743 368.472 408.424 387.420 539.157 528.240 332.108 545.047 548.684 529.644 529.503 526.582 532.864 530.585 357.885 561.225 365.472 534.644 386.575 554.040 560.932 558.435 535.804 +7500000 (returns) 543.888 560.378 549.164 550.194 523.684 545.602 540.909 536.864 555.049 366.793 374.048 528.113 541.871 537.082 366.729 539.966 378.688 357.328 367.392 388.658 334.880 547.959 535.003 544.917 334.358 553.537 538.372 527.924 539.914 551.931 537.129 557.944 +8000000 (returns) 538.778 555.278 564.064 559.899 550.015 555.534 561.578 554.212 549.122 553.018 540.829 499.057 536.648 358.026 377.300 555.884 545.255 542.399 359.148 407.694 409.175 362.708 535.664 520.288 375.619 387.863 554.943 547.381 373.936 538.263 534.546 558.286 +8500000 (returns) 511.598 526.434 544.602 529.429 545.896 555.645 559.005 551.265 541.697 363.788 516.672 551.872 548.964 370.202 535.184 547.201 387.763 372.995 535.528 539.532 540.559 388.180 548.984 542.659 536.781 538.896 530.659 541.297 530.981 522.098 551.193 536.470 +9000000 (returns) 514.779 554.044 556.605 337.515 510.686 541.435 518.897 356.132 555.279 528.000 534.602 542.553 520.233 555.249 531.835 362.725 554.248 503.527 537.404 363.774 376.005 556.843 558.424 557.789 550.851 518.451 543.611 537.120 513.335 558.042 546.997 545.945 +9500000 (returns) 513.639 535.958 544.511 506.940 536.365 541.060 546.182 331.504 549.306 554.488 517.775 555.823 522.827 522.730 536.129 546.824 535.459 540.864 514.610 538.050 514.730 430.307 552.089 538.130 532.624 342.218 452.029 557.250 522.072 550.651 556.324 556.011 +10000000 (returns) 380.700 572.838 537.220 544.477 544.108 534.407 535.198 470.801 558.329 330.238 517.268 551.145 545.323 540.912 546.170 527.249 572.809 523.919 386.022 532.676 529.947 550.175 538.898 493.837 546.250 531.440 507.766 534.897 529.919 502.698 380.662 543.094 +10500000 (returns) 536.678 505.600 381.998 472.793 318.950 443.957 538.662 571.522 342.352 502.810 326.468 357.722 473.949 543.678 507.238 383.317 543.057 528.630 566.782 528.969 432.305 535.458 544.912 326.531 542.301 548.041 461.885 557.242 325.227 541.487 504.631 543.739 +11000000 (returns) 527.584 543.466 523.038 521.922 525.677 544.623 557.821 520.358 522.887 344.629 519.336 518.218 538.612 504.927 527.012 566.858 528.569 524.872 543.637 526.224 525.724 526.711 515.112 572.969 391.217 527.812 501.345 530.562 527.746 523.477 558.921 526.375 +11500000 (returns) 522.175 452.108 452.449 563.978 334.297 551.682 549.014 519.919 511.756 552.573 556.589 514.250 338.270 459.449 428.483 513.693 495.785 528.386 556.618 552.549 540.219 511.087 508.707 556.553 517.300 552.203 534.986 503.388 506.487 527.031 518.406 536.866 +12000000 (returns) 536.203 453.419 384.322 541.534 518.249 520.371 516.838 553.875 521.226 545.484 521.994 529.726 521.985 462.392 542.220 546.997 543.540 480.581 553.468 522.568 538.374 523.018 522.067 523.594 531.590 475.068 521.059 533.799 570.797 522.306 539.587 496.561 +12500000 (returns) 545.773 537.507 517.616 451.892 529.242 541.723 540.086 554.155 517.347 533.962 526.515 527.029 530.219 532.048 524.064 555.533 525.268 564.790 486.321 526.893 544.579 522.662 515.025 533.898 538.564 527.414 537.846 335.698 379.434 531.204 519.321 552.651 +13000000 (returns) 518.485 563.168 528.879 525.889 341.904 541.606 520.948 543.054 537.585 516.700 541.288 550.050 520.374 539.530 539.214 522.331 552.489 521.128 535.421 527.436 546.124 537.212 516.784 519.949 526.574 521.285 520.752 526.701 555.988 526.012 521.892 542.243 +13500000 (returns) 504.365 473.608 562.786 362.628 514.874 386.059 477.954 568.855 477.390 517.005 477.620 529.452 387.368 530.597 549.051 365.268 526.587 528.642 518.376 470.726 519.428 530.102 513.521 344.465 539.261 520.842 514.886 519.150 527.684 514.335 512.989 518.625 +14000000 (returns) 474.758 511.949 459.737 526.986 369.099 549.167 464.466 514.873 511.170 546.081 464.948 519.635 537.374 538.550 335.446 397.383 479.535 387.439 460.417 561.239 516.378 495.599 549.829 511.958 526.055 512.551 509.715 511.594 557.524 544.894 552.872 546.182 +14500000 (returns) 527.822 510.030 513.362 527.578 508.592 560.195 507.354 553.653 520.478 513.737 514.473 529.187 449.001 559.980 502.198 469.239 517.198 522.042 529.070 480.461 466.039 518.531 545.687 518.241 467.082 529.841 520.938 487.621 502.577 514.520 529.368 522.546 +15000000 (returns) 506.583 280.151 546.040 433.774 324.384 506.687 477.443 107.937 523.261 522.337 281.587 497.610 546.706 504.913 381.850 370.912 304.436 121.399 106.400 447.434 267.608 548.316 544.792 509.045 390.804 446.558 443.049 335.367 393.748 102.980 367.812 556.630 +15500000 (returns) 97.226 371.391 97.072 99.126 542.852 448.629 111.162 96.462 540.946 513.278 503.923 96.253 444.443 557.705 512.177 101.593 100.640 511.149 514.171 555.160 538.772 385.441 95.833 552.019 447.515 106.017 512.701 512.722 104.787 93.003 125.379 96.197 +16000000 (returns) 233.460 229.193 315.852 506.541 519.283 505.344 510.592 383.457 349.041 383.083 511.183 508.516 497.829 504.881 462.303 528.996 508.812 496.699 271.400 502.089 106.906 517.269 377.934 494.633 264.782 571.068 539.135 501.810 548.678 514.292 468.579 101.535 +16500000 (returns) 123.152 436.807 410.801 126.047 111.479 120.860 148.263 125.722 160.884 149.463 568.650 153.299 352.033 128.593 519.319 156.872 153.568 157.732 112.806 110.761 120.063 157.000 122.929 121.467 335.297 121.963 128.050 360.727 130.841 130.007 150.076 157.043 +17000000 (returns) 312.231 100.210 376.659 331.878 522.697 97.050 334.002 91.917 230.169 371.978 331.749 520.081 407.890 436.322 432.847 347.279 215.789 338.033 436.344 355.197 555.317 251.980 402.001 304.933 436.051 467.597 330.352 238.758 361.752 317.952 381.196 259.669 +17500000 (returns) 384.869 446.437 437.216 199.728 410.465 427.463 449.046 446.541 498.637 519.534 160.930 445.106 453.753 200.289 366.905 291.711 552.044 430.438 383.949 361.685 543.263 330.145 443.811 311.122 348.776 445.788 339.415 316.532 434.077 359.765 315.642 562.021 +18000000 (returns) 445.661 318.551 206.726 393.946 541.849 355.176 529.569 419.150 381.584 288.425 541.961 418.145 419.517 448.561 343.322 420.217 446.250 448.665 459.178 451.408 236.664 334.045 233.187 413.748 448.106 365.448 408.496 329.517 355.772 365.391 390.873 452.404 +18500000 (returns) 179.969 111.800 166.241 192.247 180.528 112.713 169.583 550.600 119.144 121.285 182.007 107.080 374.258 173.835 150.341 115.346 179.727 178.976 183.609 112.543 182.356 554.841 107.597 167.557 182.158 375.345 170.704 185.689 177.900 117.032 181.428 194.719 +19000000 (returns) 169.307 169.004 161.364 167.010 164.894 171.242 173.750 170.606 153.150 177.828 179.288 163.788 171.107 542.293 167.203 151.697 169.230 166.095 150.105 328.694 169.936 162.992 166.694 544.256 543.395 173.577 179.477 170.454 541.225 170.488 172.213 542.620 +19500000 (returns) 78.576 344.566 90.577 78.040 325.195 79.947 80.803 80.755 408.781 164.128 196.211 166.767 78.017 323.671 76.067 302.827 77.098 321.327 378.308 85.822 83.333 81.165 78.836 491.367 88.493 77.213 379.085 197.952 491.466 393.198 171.486 568.309 +20000000 (returns) 182.266 163.072 184.885 173.902 183.452 115.427 185.392 184.261 186.158 114.751 176.836 108.116 179.264 176.938 166.261 169.937 184.193 165.974 186.183 186.313 184.721 183.009 185.588 548.479 167.959 180.974 105.843 182.848 183.391 113.503 178.448 184.046 +20500000 (returns) 145.244 106.188 92.780 129.787 147.477 94.132 103.563 106.121 102.332 102.838 100.438 97.358 567.231 101.914 97.213 105.132 122.472 101.055 563.943 147.244 106.367 99.727 125.553 104.349 100.024 129.571 133.131 103.281 532.537 99.880 102.658 97.193 +21000000 (returns) 547.714 170.639 159.484 170.905 171.351 134.625 118.327 155.706 116.006 138.683 170.254 170.345 546.595 171.125 166.025 173.106 169.539 164.393 164.805 117.607 174.945 114.866 169.692 168.185 321.435 116.462 157.138 168.693 163.698 172.354 547.398 167.637 +21500000 (returns) 535.831 320.837 181.095 173.279 182.271 185.801 182.327 180.479 543.667 182.672 182.185 385.231 180.997 188.120 183.052 541.551 183.989 182.525 176.351 183.148 182.194 179.933 180.631 179.544 320.915 182.018 171.336 185.002 182.125 182.468 185.670 184.521 +22000000 (returns) 126.357 128.810 130.888 120.412 129.798 125.939 128.520 123.702 352.960 151.580 108.453 125.943 128.766 123.661 117.453 133.176 125.791 128.813 120.398 149.012 127.084 127.865 144.966 129.417 120.498 345.870 147.417 109.558 115.562 118.141 125.012 140.470 +22500000 (returns) 181.298 182.906 181.616 339.428 180.294 178.097 192.329 187.225 180.874 174.712 178.596 178.161 181.584 327.804 180.396 180.778 562.316 182.930 180.254 180.908 182.279 180.161 181.666 186.149 177.168 346.369 191.589 177.796 184.201 181.469 183.892 181.051 +23000000 (returns) 149.858 148.663 148.087 147.698 148.896 147.991 148.403 159.984 147.756 148.261 150.222 147.781 147.873 148.670 148.239 151.185 332.671 147.541 147.122 337.979 145.951 147.502 148.767 157.544 153.314 148.226 157.324 150.795 145.439 157.174 147.989 149.000 +23500000 (returns) 336.557 126.890 321.102 117.853 123.224 111.708 120.248 123.020 120.245 126.290 111.329 127.625 330.108 112.403 123.931 106.165 126.866 120.223 118.981 107.514 529.806 113.343 112.625 115.130 111.038 113.785 111.243 121.079 115.681 111.637 110.910 125.610 +24000000 (returns) 148.852 146.045 155.302 147.138 147.041 333.893 545.588 147.520 152.078 146.364 145.890 146.466 146.760 154.266 156.204 146.345 146.640 148.451 148.454 146.368 143.195 147.493 145.760 144.716 146.070 145.963 533.085 149.114 563.311 147.900 145.743 146.168 +24500000 (returns) 152.367 147.896 148.762 150.216 149.879 150.196 147.672 147.555 151.903 334.617 149.889 147.506 149.813 149.893 149.573 149.265 148.323 151.725 151.917 153.075 150.115 148.265 141.578 549.871 149.008 152.720 151.961 149.976 150.872 149.364 152.102 149.296 +25000000 (returns) 139.258 146.430 142.474 145.476 147.942 135.309 141.165 390.339 147.850 146.625 132.411 138.635 147.486 141.018 140.360 146.135 141.215 131.206 147.399 140.003 128.225 133.941 140.781 136.933 143.262 140.072 140.315 390.583 152.958 141.204 555.914 143.604 +25500000 (returns) 144.705 147.122 141.114 557.750 143.393 135.841 140.853 147.414 146.939 143.224 147.471 142.733 144.251 560.208 146.748 142.176 568.855 143.707 148.769 144.541 147.666 147.377 142.544 151.295 144.614 144.547 143.733 142.490 139.747 153.150 142.384 152.987 +26000000 (returns) 100.820 98.441 98.909 98.962 97.952 97.294 101.309 97.852 99.508 99.439 100.024 98.509 97.743 100.547 98.153 101.322 97.403 97.585 100.131 99.661 97.979 104.061 97.194 99.375 97.539 101.583 568.907 100.022 99.066 98.385 101.823 98.979 +26500000 (returns) 110.100 110.342 107.258 102.851 103.431 101.893 104.689 102.315 107.954 103.076 109.603 106.853 104.468 106.139 107.081 101.137 104.232 107.953 104.426 102.534 104.144 109.957 103.147 103.490 101.732 104.479 107.697 104.985 104.487 104.090 103.875 104.743 +27000000 (returns) 153.326 154.587 154.768 153.421 153.066 154.569 153.451 152.265 152.944 151.838 153.513 153.966 150.226 153.894 155.307 153.557 152.240 155.558 153.381 154.155 154.677 155.297 154.768 153.242 154.010 154.041 155.844 154.345 153.821 154.796 152.606 153.682 +27500000 (returns) 132.690 131.920 127.797 124.420 127.726 126.055 131.945 131.212 549.744 131.670 125.339 131.270 129.692 131.101 131.997 131.622 561.522 132.294 123.560 128.556 132.039 132.042 130.793 565.602 131.052 132.829 132.353 133.779 131.587 131.042 128.499 127.091 +28000000 (returns) 112.765 103.239 540.180 104.300 103.899 117.293 119.313 109.873 104.502 105.434 103.641 105.037 114.991 103.542 531.101 111.338 304.258 103.425 112.862 106.409 104.725 107.194 104.055 103.361 104.840 104.717 106.762 103.764 115.950 106.605 117.154 109.881 +28500000 (returns) 128.912 308.867 129.885 129.394 123.236 129.179 129.300 129.961 126.023 126.585 128.975 127.860 129.089 127.457 128.236 125.803 127.666 359.740 130.502 129.899 127.356 128.433 128.503 122.764 130.037 127.606 128.242 131.347 131.291 129.871 132.218 129.997 +29000000 (returns) 105.564 106.225 105.308 103.699 119.436 108.772 106.210 106.264 106.128 119.053 105.634 106.903 104.597 108.078 106.176 112.215 112.817 113.332 110.740 118.896 105.627 106.442 107.358 117.398 109.818 107.090 105.919 562.826 103.866 105.483 106.752 106.516 +29500000 (returns) 105.021 110.246 105.512 109.092 116.468 104.627 116.867 106.737 105.210 111.832 116.603 106.568 105.716 104.442 106.034 568.552 568.553 103.608 115.091 105.478 109.142 108.660 114.682 111.713 119.023 105.474 103.322 103.802 102.458 104.769 104.044 110.669 +30000000 (returns) 96.166 96.624 97.513 91.114 97.830 98.378 91.702 94.461 94.025 93.526 91.326 560.822 91.208 92.356 93.263 91.848 92.087 92.640 91.085 91.830 94.545 91.847 91.751 551.354 94.605 93.507 91.689 91.632 91.424 91.040 97.094 91.721 +30500000 (returns) 97.344 95.299 92.868 92.547 92.627 92.526 96.027 92.520 92.709 92.643 97.022 93.017 96.764 96.562 97.350 92.580 93.285 93.373 98.784 92.696 92.946 98.888 93.671 97.568 97.428 96.372 97.729 92.862 92.526 92.363 546.426 92.228 +31000000 (returns) 102.009 100.765 101.004 101.867 103.464 102.165 103.437 99.922 100.567 102.333 101.522 101.222 103.104 101.839 104.068 101.226 100.719 101.451 103.780 100.789 102.277 102.631 101.571 102.528 102.180 376.671 101.279 100.667 102.093 103.442 100.423 101.552 +31500000 (returns) 92.325 95.095 93.779 96.299 94.141 95.682 93.012 564.918 93.138 94.808 98.999 98.341 98.115 96.374 97.950 93.621 94.252 98.886 99.430 94.907 98.178 93.987 94.000 99.963 94.430 96.668 96.623 98.520 94.577 96.854 95.783 94.940 +32000000 (returns) 91.624 90.796 92.562 90.183 93.138 89.559 91.637 88.831 90.069 92.843 89.858 89.906 89.267 89.875 89.275 90.589 89.574 90.713 90.088 88.901 90.653 92.480 89.100 89.105 89.949 89.013 92.722 90.376 89.908 364.583 89.117 90.025 +32500000 (returns) 92.014 90.385 94.028 90.114 91.711 93.337 90.268 89.429 91.624 93.158 91.288 92.799 89.294 89.680 90.381 89.275 327.777 90.126 91.225 93.854 88.862 90.778 89.220 90.040 89.605 91.892 89.724 88.948 93.674 89.256 93.580 89.513 +33000000 (returns) 566.255 91.505 90.925 94.888 92.929 99.356 91.859 92.181 91.769 91.925 99.843 95.254 91.784 98.401 91.453 91.980 92.520 92.274 90.935 91.930 97.716 92.064 92.096 91.473 100.537 91.753 92.273 94.690 92.326 93.078 97.759 92.636 +33500000 (returns) 102.995 102.510 570.958 105.384 103.793 103.333 104.968 103.515 99.992 104.874 102.806 102.645 102.199 103.740 103.519 104.069 103.037 102.764 103.903 101.545 101.246 102.938 103.441 104.450 104.756 105.642 104.159 105.581 104.674 103.267 101.542 102.423 +34000000 (returns) 92.117 92.105 89.969 90.699 89.650 92.529 89.639 89.276 90.283 91.096 90.537 92.234 89.355 89.198 90.361 89.668 564.534 89.813 91.646 89.797 89.839 89.284 90.192 90.053 89.785 90.912 91.173 89.356 88.801 88.705 92.176 89.618 +34500000 (returns) 89.544 88.732 88.422 90.129 88.136 89.255 89.250 92.078 87.650 88.709 84.156 89.221 92.035 89.810 91.354 88.485 89.192 86.801 92.562 89.710 90.570 89.003 87.031 89.036 84.972 83.392 92.762 85.379 88.988 91.976 89.040 89.717 +35000000 (returns) 95.148 91.019 94.323 92.837 96.009 96.560 96.545 96.266 90.757 98.986 97.485 91.777 95.831 91.181 97.376 100.410 93.835 95.206 95.842 97.376 90.785 97.133 94.380 97.494 96.593 90.270 95.836 91.324 94.294 95.268 94.281 91.249 +35500000 (returns) 97.103 92.046 92.781 557.562 91.857 96.002 93.135 94.511 90.098 90.755 94.805 90.497 94.432 91.721 85.382 95.684 84.299 90.909 91.755 91.651 95.832 90.163 90.390 84.810 85.868 93.037 96.872 84.654 90.847 95.189 91.659 90.071 +36000000 (returns) 87.020 83.272 88.088 82.695 76.172 88.434 80.941 90.730 75.926 90.640 86.377 88.118 563.014 77.154 82.450 77.929 82.035 82.785 86.279 79.132 568.285 80.966 83.037 85.837 90.112 90.075 87.321 77.744 89.738 90.171 76.255 76.269 +36500000 (returns) 94.702 97.389 97.070 101.089 99.493 100.824 99.579 94.745 103.960 100.656 564.967 96.363 101.813 105.667 94.079 100.386 99.727 94.324 103.339 97.531 99.550 103.297 92.842 98.273 104.796 99.508 99.716 106.881 104.016 96.596 100.084 105.280 +37000000 (returns) 94.618 94.333 90.372 90.678 99.523 87.403 98.941 94.802 95.971 92.761 97.896 87.501 89.908 90.861 92.468 85.182 95.078 91.747 86.455 86.598 96.539 94.336 87.557 88.586 84.855 91.013 84.684 89.250 91.055 87.509 96.646 90.192 +37500000 (returns) 90.667 90.941 90.868 75.333 76.518 76.370 78.864 81.327 75.851 90.488 77.975 81.752 81.516 80.816 79.912 89.365 80.576 79.809 80.635 80.713 90.532 80.555 79.459 85.812 80.202 82.462 80.870 89.944 81.606 79.114 81.724 79.473 +38000000 (returns) 84.933 92.389 77.157 80.899 77.826 78.043 82.834 83.910 82.555 79.763 80.993 90.990 79.357 83.329 80.938 92.583 90.617 77.844 79.621 79.078 76.279 80.493 77.985 92.059 83.353 82.964 91.821 80.372 80.102 80.534 83.661 77.481 +38500000 (returns) 86.316 74.398 72.392 82.562 70.616 72.654 71.677 74.030 84.003 74.646 72.231 80.028 86.525 74.112 74.602 80.633 71.553 80.646 87.993 73.756 84.755 71.485 76.833 87.833 83.781 74.379 72.477 73.224 71.496 73.489 82.880 82.673 +39000000 (returns) 93.351 93.146 81.350 86.150 93.463 87.187 90.872 84.454 88.437 95.389 91.041 83.461 88.515 87.758 82.821 82.273 83.573 89.881 373.166 84.221 82.040 98.564 90.058 90.510 88.247 84.387 81.890 87.866 97.918 89.076 90.802 86.048 +39500000 (returns) 75.538 79.049 83.939 74.801 73.383 87.057 80.707 71.672 87.384 560.263 88.003 74.360 78.173 78.115 81.013 83.613 73.397 76.713 87.267 87.401 75.713 87.577 79.019 73.055 81.154 87.788 76.083 75.681 76.404 73.454 73.498 73.260 +40000000 (returns) 70.090 67.230 74.146 483.317 66.090 67.677 79.618 70.582 70.140 64.410 71.550 70.245 68.153 69.985 69.326 66.990 69.803 67.057 69.448 69.352 66.879 66.971 66.822 69.325 66.957 80.952 66.817 67.064 72.720 72.204 76.092 78.201 +40500000 (returns) 67.716 66.525 66.409 66.927 67.426 66.379 67.249 73.693 571.219 78.912 67.746 67.170 66.059 66.747 77.262 67.338 78.434 67.351 73.331 76.853 66.150 68.738 73.012 66.814 66.582 66.369 66.390 66.548 66.622 65.899 67.423 68.986 +41000000 (returns) 62.778 68.112 64.173 63.415 62.007 71.946 63.623 62.814 61.797 61.952 71.389 62.207 63.411 61.042 60.991 68.413 68.193 62.947 72.884 61.182 61.334 64.521 68.015 73.011 72.738 371.733 69.519 67.004 62.399 72.086 60.584 61.928 +41500000 (returns) 69.131 563.083 63.175 61.477 62.175 64.304 64.806 65.376 65.109 62.692 62.986 62.467 63.204 67.133 67.502 71.006 62.135 62.652 62.114 64.409 65.680 63.879 70.458 63.521 62.753 68.548 62.416 64.549 65.175 67.901 68.030 62.730 +42000000 (returns) 85.480 72.184 72.348 82.744 80.849 73.689 73.572 84.310 73.522 78.458 70.744 76.315 83.697 74.043 71.897 74.673 70.671 71.477 78.827 79.026 87.171 71.889 70.531 86.311 74.026 83.729 70.445 71.167 84.019 70.912 72.578 82.870 +42500000 (returns) 73.971 72.057 555.991 74.406 73.044 78.402 70.402 72.572 72.285 72.966 78.606 77.036 70.342 71.119 85.692 77.916 77.355 83.100 72.077 71.788 71.911 369.154 72.210 74.478 71.952 71.893 73.736 70.843 70.397 73.139 71.932 72.535 +43000000 (returns) 86.685 84.531 74.477 77.050 75.936 72.370 76.671 77.001 86.459 78.249 74.164 73.592 73.103 72.731 87.042 73.356 73.898 75.473 75.079 73.719 79.621 74.125 83.574 86.771 78.677 73.201 76.900 73.013 77.401 76.028 73.255 84.182 +43500000 (returns) 87.968 75.569 78.595 74.345 87.789 75.819 71.830 77.540 73.974 72.483 72.873 77.544 84.387 74.871 77.661 76.773 88.798 83.811 81.499 88.420 88.080 72.781 82.437 74.528 84.253 88.835 76.942 74.839 88.345 87.877 74.645 89.269 +44000000 (returns) 69.256 62.040 61.686 71.057 61.435 70.792 69.449 62.546 62.653 66.675 62.100 62.932 63.191 61.524 71.001 62.740 70.622 62.139 62.187 70.096 72.656 61.565 62.397 68.325 67.192 62.419 65.856 69.690 61.940 558.030 62.497 63.938 +44500000 (returns) 85.090 88.345 83.848 72.076 74.309 76.864 77.787 87.875 71.771 72.907 72.222 79.868 80.253 85.821 73.488 85.818 76.653 80.891 76.110 74.682 78.975 77.992 76.669 77.298 73.711 75.395 85.721 78.741 77.662 80.353 76.616 72.616 +45000000 (returns) 97.873 86.493 98.465 97.856 96.823 84.100 95.672 87.894 83.261 85.816 91.708 85.147 84.955 97.768 85.494 87.311 84.915 97.941 85.123 99.732 85.496 86.068 86.333 83.930 84.582 83.878 87.213 83.921 94.099 86.140 84.438 84.890 +45500000 (returns) 71.929 73.503 72.789 79.823 74.043 79.942 75.750 74.124 74.042 73.579 73.588 74.098 72.338 74.706 71.603 85.688 73.886 75.631 74.678 78.602 74.943 72.459 86.443 571.802 74.273 73.958 71.280 75.920 73.145 72.724 85.913 75.284 +46000000 (returns) 81.302 85.721 75.153 77.115 79.033 74.908 76.516 74.251 78.113 80.322 75.240 76.582 84.157 75.595 76.107 78.646 76.393 74.502 89.477 79.621 81.478 75.295 90.568 87.071 82.085 77.739 85.642 79.221 74.889 74.463 84.610 90.070 +46500000 (returns) 560.124 76.399 77.478 92.607 76.929 79.109 75.853 78.065 76.409 77.698 88.970 87.030 75.523 77.491 79.325 76.436 76.979 92.075 79.387 76.629 86.132 95.069 80.277 78.375 78.802 76.891 82.470 78.854 78.273 77.531 85.655 91.187 +47000000 (returns) 77.425 82.188 86.270 74.109 77.053 79.481 79.073 76.874 75.406 87.679 77.325 84.521 77.763 79.553 73.260 75.250 72.994 73.652 72.882 79.878 72.448 75.664 76.168 77.753 87.673 73.588 80.677 73.689 77.232 81.068 73.949 78.625 +47500000 (returns) 74.185 75.363 75.353 84.225 75.542 74.319 75.255 72.107 75.053 76.728 72.599 73.440 73.228 73.709 73.273 73.035 73.221 73.422 73.208 81.253 73.996 73.585 86.635 73.358 73.614 85.423 73.858 75.053 85.925 74.258 76.675 82.078 +48000000 (returns) 89.941 86.758 90.093 77.363 73.284 74.815 72.818 76.783 77.311 81.791 87.366 77.773 73.492 77.689 89.424 82.973 76.778 77.122 76.311 73.813 74.335 77.516 73.414 76.924 77.510 76.669 74.910 73.887 76.562 74.174 89.942 77.317 +48500000 (returns) 75.280 75.314 77.563 79.630 86.907 73.451 81.443 73.307 73.598 74.725 75.001 77.174 75.539 80.615 77.496 75.117 76.737 76.547 76.738 87.590 78.004 78.102 78.566 76.622 78.713 74.805 77.463 76.124 73.284 75.920 80.451 82.574 +49000000 (returns) 67.779 72.504 67.839 76.735 71.162 67.951 69.403 70.256 68.455 69.277 68.324 67.328 70.095 69.515 80.668 67.476 71.143 68.606 73.986 67.554 69.637 68.328 68.831 68.125 68.741 77.316 79.366 80.701 68.314 68.980 67.416 69.421 +49500000 (returns) 67.819 68.192 67.920 71.466 69.906 70.852 68.020 66.355 67.532 68.713 66.171 70.965 67.955 66.879 67.664 68.501 67.786 67.737 68.892 71.871 67.171 66.203 67.461 68.342 68.064 73.074 67.482 68.707 65.713 67.551 73.462 68.775 +50000000 (returns) 66.159 73.628 67.145 66.551 68.385 67.340 65.282 65.730 66.084 65.901 65.130 67.065 65.649 65.416 65.623 66.995 67.045 71.261 65.727 66.537 65.866 66.216 66.209 65.434 65.746 71.893 65.364 65.715 66.013 66.479 65.281 65.768 +50500000 (returns) 86.998 75.605 557.387 72.349 71.737 73.812 71.738 71.004 71.973 76.710 74.136 73.142 84.619 71.216 75.958 86.754 74.971 86.405 87.493 71.092 73.654 76.703 80.214 73.607 74.630 73.813 74.989 72.128 72.968 73.269 73.989 74.486 +51000000 (returns) 68.641 76.961 66.123 67.356 67.167 73.873 67.778 69.876 66.974 66.898 66.719 73.556 66.897 67.226 67.152 67.601 69.915 67.012 68.718 66.020 66.388 68.449 67.695 68.285 67.190 67.921 69.537 67.768 69.696 79.007 560.254 66.814 +51500000 (returns) 71.815 67.185 70.108 69.238 68.967 68.509 70.843 69.801 70.770 69.354 69.642 70.332 70.965 70.622 70.166 70.521 70.352 68.910 77.105 70.061 69.457 69.935 78.331 70.066 69.512 68.822 70.054 69.384 69.604 69.124 68.461 70.181 +52000000 (returns) 72.574 70.594 77.317 565.761 69.048 70.202 69.307 69.087 69.569 68.220 68.331 71.301 69.293 69.449 68.952 69.549 75.327 69.593 68.765 68.980 69.366 69.085 69.958 70.045 68.265 70.000 69.134 70.956 500.535 69.682 69.950 71.453 +52500000 (returns) 68.727 67.922 78.207 69.084 68.646 69.917 68.425 78.099 72.926 69.798 68.630 67.027 69.715 70.858 69.060 72.511 69.846 68.789 68.353 68.142 69.199 68.424 70.042 67.890 69.133 565.281 70.347 80.438 77.527 69.104 69.494 73.003 +53000000 (returns) 63.777 65.104 63.747 63.385 63.171 69.328 67.732 66.247 65.095 65.296 63.234 62.944 65.909 65.114 64.332 64.265 63.950 65.336 63.213 65.147 64.023 63.841 63.377 63.862 63.913 64.140 68.733 63.451 63.447 64.980 64.053 62.635 +53500000 (returns) 68.406 70.654 69.913 69.162 70.108 69.171 69.817 72.343 69.419 72.388 72.704 68.756 69.013 82.349 70.493 69.626 69.730 77.741 69.651 72.977 81.457 71.884 71.205 69.929 70.474 69.510 69.310 76.053 78.365 71.710 69.948 68.848 +54000000 (returns) 70.136 68.661 74.566 69.437 69.674 74.338 73.900 540.189 69.398 81.149 69.628 70.194 69.467 69.466 68.937 70.435 69.484 69.012 70.741 69.398 70.136 69.731 71.247 72.290 69.992 72.483 71.625 70.655 73.482 73.195 70.522 69.845 +54500000 (returns) 80.504 72.021 73.941 75.876 72.342 71.920 75.067 72.130 72.138 84.051 71.806 72.068 72.043 72.515 73.557 72.533 71.659 72.290 80.748 73.758 75.432 72.014 72.153 72.766 77.067 72.077 72.633 75.904 83.988 72.775 72.414 73.018 +55000000 (returns) 65.895 69.682 79.005 70.660 66.457 67.137 69.677 65.098 64.809 67.421 77.195 67.342 78.905 69.357 66.627 66.406 67.491 71.866 78.895 65.346 76.687 65.511 68.439 66.174 69.357 66.542 73.888 66.414 70.892 78.407 68.990 68.774 +55500000 (returns) 72.330 71.833 69.464 71.453 71.421 69.889 69.145 76.073 70.621 77.008 72.776 70.068 71.025 75.804 71.420 71.712 71.284 71.647 70.644 72.034 69.906 71.872 71.867 71.074 83.179 70.074 71.020 71.808 70.462 72.124 71.041 71.538 +56000000 (returns) 66.223 67.716 65.730 77.077 69.708 65.957 66.463 66.031 66.049 68.312 66.692 65.744 77.784 69.740 67.029 74.800 66.015 68.122 77.302 65.946 67.449 74.845 67.032 66.637 65.225 66.205 66.456 67.501 66.176 77.243 66.115 65.870 +56500000 (returns) 72.232 65.246 66.016 66.701 66.987 65.537 67.810 75.514 65.041 65.501 65.166 66.053 65.471 65.884 76.227 66.124 66.316 66.837 66.947 66.056 67.158 65.610 68.064 67.930 65.557 67.726 66.399 66.883 66.452 66.171 66.594 66.661 +57000000 (returns) 66.351 65.560 71.431 70.693 66.210 65.036 67.221 66.927 65.629 67.590 65.388 66.734 65.966 65.305 67.939 66.066 65.625 65.430 65.977 70.355 65.784 66.402 67.122 67.280 65.239 69.166 66.374 65.968 66.609 66.025 66.344 66.096 +57500000 (returns) 65.031 66.369 65.998 65.713 65.443 65.805 64.933 67.102 64.686 70.473 68.585 64.682 65.834 64.945 65.394 65.578 65.868 67.673 64.586 65.015 64.852 65.561 65.528 65.172 64.639 65.069 64.229 65.007 64.753 67.793 64.417 65.714 +58000000 (returns) 67.691 66.030 66.288 72.413 66.227 66.435 67.136 66.347 67.337 66.189 63.792 69.925 66.287 66.880 67.427 65.772 67.516 66.627 554.946 67.315 73.454 67.280 67.123 66.717 67.679 67.266 67.809 67.242 68.188 66.297 66.179 66.462 +58500000 (returns) 63.823 64.630 64.127 65.063 64.001 65.444 66.093 65.323 65.722 65.006 64.644 64.503 67.611 64.920 64.509 64.722 64.107 64.852 65.556 63.313 65.616 64.468 64.414 64.531 66.631 66.094 69.187 63.966 64.320 68.381 554.163 351.474 +59000000 (returns) 66.357 69.237 65.853 66.111 65.728 65.860 67.844 65.111 66.940 71.852 64.916 64.209 65.524 65.898 70.891 64.933 64.884 76.902 66.021 65.294 65.662 65.629 66.300 66.684 67.094 67.163 64.581 65.689 64.475 65.581 68.069 65.991 +59500000 (returns) 70.281 78.227 71.238 68.917 71.105 70.721 70.109 71.452 75.661 70.333 79.079 80.482 72.606 69.825 82.684 79.300 77.079 69.450 71.841 74.326 68.494 72.415 69.018 81.636 81.913 78.638 71.308 77.696 73.272 81.550 71.066 71.104 +60000000 (returns) 65.610 61.576 61.982 62.194 61.844 62.562 61.723 61.306 61.448 63.116 62.055 61.913 61.426 61.245 62.305 61.181 61.692 62.376 61.247 68.907 64.619 61.595 60.970 62.159 61.000 63.017 62.159 66.770 61.699 61.125 63.971 61.297 +60500000 (returns) 60.077 59.279 60.372 59.590 68.377 62.315 60.513 67.387 59.096 60.543 60.867 65.998 60.144 61.226 67.144 62.574 59.717 60.215 63.302 60.435 59.601 60.787 59.743 64.415 59.456 60.125 60.569 61.182 59.630 60.197 65.735 64.805 +61000000 (returns) 74.862 73.106 73.503 88.750 84.554 74.916 73.144 73.503 75.601 86.751 74.796 74.747 73.393 73.450 73.847 74.703 73.646 72.754 74.088 73.770 76.080 75.720 75.040 358.580 75.813 73.237 86.935 74.589 73.475 77.815 74.665 75.066 +61500000 (returns) 66.595 67.128 66.324 66.768 67.862 67.423 67.721 68.370 67.124 66.959 66.905 68.039 67.157 559.739 67.660 67.928 67.627 67.053 67.740 67.704 65.928 67.529 65.916 67.169 67.267 67.878 67.835 67.919 68.297 67.033 67.955 68.607 +62000000 (returns) 62.748 66.067 63.997 62.758 61.426 71.933 67.435 66.869 62.817 63.477 67.128 65.885 63.410 63.226 65.025 63.756 62.525 65.850 66.040 63.332 63.589 62.308 65.925 62.810 67.718 63.373 62.418 63.615 71.865 62.954 64.139 65.813 +62500000 (returns) 69.462 65.165 65.680 64.091 65.495 65.139 64.616 64.792 64.356 69.003 63.784 65.193 65.176 65.211 64.969 65.099 66.266 65.798 65.009 64.846 65.665 64.906 64.606 64.936 64.090 65.335 67.280 64.630 64.751 64.354 64.759 65.026 +63000000 (returns) 68.047 72.593 68.104 66.601 69.201 67.513 78.233 67.188 67.731 68.164 66.631 67.066 345.250 68.250 66.675 67.243 68.450 66.667 67.370 67.811 68.514 68.172 67.710 65.639 66.727 67.122 74.664 67.688 68.640 67.730 66.783 67.407 +63500000 (returns) 73.089 70.770 65.896 66.030 66.026 72.164 65.677 66.501 74.153 70.519 66.175 72.643 66.847 70.925 65.226 67.609 73.234 66.316 65.513 65.450 66.219 67.608 66.032 67.058 66.355 66.574 67.136 66.891 66.282 65.901 65.636 66.713 +64000000 (returns) 66.903 63.543 63.806 63.215 66.944 63.306 63.021 63.416 63.047 63.427 63.397 63.547 63.796 63.571 63.318 67.258 64.315 63.363 64.471 63.721 63.380 63.287 62.911 63.326 65.177 381.596 63.304 63.252 63.780 63.398 63.804 64.570 +64500000 (returns) 72.006 72.334 71.538 72.072 72.171 71.463 71.643 71.118 71.911 75.186 73.171 70.229 71.733 72.627 71.365 71.907 72.568 70.479 72.787 70.427 74.172 72.014 75.497 70.806 73.219 71.858 70.220 72.679 71.785 71.766 71.291 71.469 +65000000 (returns) 68.992 68.822 69.322 70.799 68.898 68.863 68.716 67.808 68.916 69.130 68.684 68.866 69.716 67.917 68.301 68.863 68.315 69.044 69.453 69.112 69.941 69.382 68.931 68.810 69.108 68.933 68.862 69.465 69.389 69.068 68.772 68.176 +65500000 (returns) 63.184 64.564 61.095 66.789 63.175 61.214 59.423 60.344 60.025 61.991 65.785 68.145 59.934 59.670 64.112 59.237 60.979 61.140 64.483 61.703 380.414 59.786 59.782 62.247 58.785 64.136 59.703 66.991 59.549 58.806 65.254 59.230 +66000000 (returns) 66.799 64.001 67.996 64.001 69.031 63.317 62.776 63.641 62.232 64.702 62.574 64.155 64.465 61.767 70.690 64.041 63.840 69.473 63.441 63.689 65.705 65.103 63.417 64.195 63.627 62.496 63.808 69.908 63.862 66.983 67.006 70.374 +66500000 (returns) 61.550 61.866 61.531 61.858 62.032 60.727 61.181 61.670 61.108 61.978 63.740 61.301 61.096 62.863 62.025 61.570 62.080 62.763 60.540 61.061 61.294 61.847 61.732 61.528 63.836 62.403 61.239 62.183 62.612 61.607 61.381 62.777 +67000000 (returns) 67.290 64.279 68.330 71.107 65.478 64.340 65.315 66.684 64.583 68.547 66.310 65.342 63.919 65.172 65.015 64.170 63.656 64.774 68.960 66.325 64.886 65.304 65.591 64.727 65.368 65.926 66.445 69.650 65.091 65.005 65.625 64.810 +67500000 (returns) 66.089 66.933 65.798 65.988 66.557 65.224 66.749 65.824 66.548 66.011 66.120 66.278 65.531 65.382 68.178 72.229 65.722 64.935 73.773 74.062 65.747 68.270 65.686 65.848 66.092 65.513 67.508 66.390 65.563 65.342 65.572 65.756 +68000000 (returns) 65.140 64.746 64.595 64.963 64.573 65.158 65.020 67.273 64.446 64.501 67.495 64.143 64.788 67.156 64.534 64.591 65.526 64.912 64.815 66.833 64.440 65.258 64.316 64.752 63.971 64.322 64.026 65.633 65.112 64.702 65.846 65.059 +68500000 (returns) 58.402 62.976 56.782 60.010 63.293 63.248 64.929 62.275 63.254 62.269 59.912 57.329 57.236 64.772 65.022 59.139 63.110 64.671 63.822 62.888 66.111 61.024 65.302 61.904 59.183 57.792 59.655 57.535 64.927 63.421 57.685 61.319 +69000000 (returns) 59.879 59.566 59.571 60.572 60.109 59.213 59.576 60.256 62.638 59.948 59.716 60.568 60.446 60.527 59.897 60.603 60.427 61.541 61.819 59.302 59.761 58.651 60.151 60.326 59.520 59.375 59.190 60.770 59.667 59.614 59.902 59.985 +69500000 (returns) 64.322 64.404 64.051 64.903 64.356 63.185 63.915 63.887 63.352 64.887 62.477 62.644 63.472 64.637 64.252 64.653 63.402 63.965 63.267 63.942 63.932 64.480 64.399 63.413 64.204 63.137 66.295 63.518 63.358 71.007 63.514 63.945 +70000000 (returns) 62.729 62.424 63.912 63.583 63.811 63.549 62.745 63.102 63.219 64.013 62.587 62.412 63.519 63.024 62.756 62.328 63.820 63.049 64.108 63.241 62.594 63.331 62.591 62.624 62.597 62.291 62.256 62.667 63.541 63.457 63.887 62.243 +70500000 (returns) 64.920 63.323 63.907 64.409 63.325 64.218 63.664 64.349 63.452 62.932 62.930 64.661 64.201 63.755 66.519 63.436 62.884 64.544 63.999 66.894 63.074 63.062 64.053 63.741 63.415 63.999 64.068 64.000 63.100 64.020 63.579 63.657 +71000000 (returns) 62.581 64.175 66.123 63.878 64.112 65.005 63.415 68.412 67.626 67.232 63.989 63.852 64.894 63.114 63.352 66.708 63.822 63.089 64.393 69.675 64.054 68.936 68.840 64.229 63.548 65.098 67.424 65.317 63.183 63.777 64.746 62.947 +71500000 (returns) 61.160 61.417 61.885 62.357 61.420 62.814 64.004 61.297 62.539 62.351 61.389 61.473 62.700 63.306 62.375 62.825 63.410 61.536 62.781 62.837 62.539 62.549 63.110 61.468 62.491 61.721 64.276 62.920 61.897 63.588 62.133 61.308 +72000000 (returns) 62.314 61.333 64.316 60.373 62.511 60.226 63.997 61.326 61.592 59.602 62.765 61.143 63.560 61.042 63.006 61.345 563.457 61.843 61.052 61.679 61.269 61.345 60.478 60.350 61.047 61.858 61.417 61.513 60.272 62.115 61.219 62.518 +72500000 (returns) 63.383 63.342 67.429 63.575 63.190 64.127 64.051 64.007 65.826 63.283 67.396 63.987 66.272 65.034 65.284 64.006 64.229 64.097 63.162 64.578 63.115 63.830 70.265 63.325 65.727 64.219 64.517 70.099 63.571 63.268 64.669 63.754 +73000000 (returns) 64.476 65.288 64.462 67.637 67.748 63.619 64.218 66.347 67.422 65.126 66.751 64.511 64.823 64.191 67.088 64.697 64.441 64.687 67.317 64.952 65.793 64.289 66.774 66.628 63.968 64.258 67.246 64.968 64.888 64.208 67.139 66.872 +73500000 (returns) 64.074 68.902 61.862 67.627 61.393 67.048 63.122 62.528 67.672 62.869 63.373 62.382 63.784 62.646 62.894 63.778 63.611 64.532 63.280 64.301 62.949 63.272 64.171 63.145 66.723 67.745 71.251 63.567 61.002 62.450 62.734 66.009 +74000000 (returns) 63.335 65.627 65.629 68.861 69.210 67.964 62.371 62.387 69.516 68.795 65.556 65.989 69.056 62.716 70.647 62.953 63.309 64.209 69.972 70.344 62.543 63.792 65.336 69.032 66.710 63.490 61.589 522.160 61.963 62.467 61.265 65.697 +74500000 (returns) 65.910 67.954 68.928 73.644 69.594 72.327 68.574 67.761 74.814 73.119 67.660 67.517 72.486 72.423 67.001 67.550 67.836 69.114 67.217 72.230 68.139 73.875 72.282 68.144 66.948 71.825 67.102 71.955 73.756 68.533 73.086 68.852 +75000000 (returns) 66.870 67.116 66.936 67.410 66.282 66.307 65.311 66.606 66.535 66.226 66.334 66.443 68.731 66.997 65.645 65.812 67.683 65.592 66.649 66.146 66.513 66.524 68.380 65.452 66.992 67.384 65.256 66.697 65.731 66.355 67.022 65.903 +75500000 (returns) 66.072 68.448 62.923 54.695 56.697 53.887 54.703 59.276 64.739 63.410 57.439 66.337 69.917 61.782 63.162 57.683 57.781 58.946 63.197 60.457 64.912 66.670 64.898 66.922 60.613 64.131 64.297 63.937 58.057 62.497 53.932 57.455 +76000000 (returns) 61.461 63.124 63.084 63.091 64.190 64.066 62.479 62.001 63.980 63.367 61.836 62.243 64.313 63.072 62.168 61.430 62.324 63.763 62.581 63.393 64.347 62.278 63.424 61.736 61.828 62.671 61.584 65.924 63.563 63.909 63.366 62.178 +76500000 (returns) 74.200 69.156 72.834 71.953 71.622 74.500 70.893 71.912 73.505 72.977 74.090 73.192 74.034 72.072 73.669 71.910 72.933 73.879 72.555 71.041 71.837 72.823 72.946 72.517 73.501 72.704 72.389 74.343 72.458 72.549 72.756 71.695 +77000000 (returns) 62.077 61.653 60.996 65.109 64.543 67.077 60.453 63.909 62.064 67.784 61.219 63.401 70.382 62.198 59.515 65.419 66.805 63.761 67.563 62.344 61.172 62.658 64.596 66.657 61.189 65.549 64.883 66.316 63.585 62.608 62.118 68.660 +77500000 (returns) 73.298 71.420 73.207 64.732 75.081 68.632 70.683 66.790 71.020 71.759 72.770 68.716 69.573 71.118 64.071 64.851 65.698 565.225 66.797 69.254 65.831 66.421 66.842 68.907 64.229 71.679 66.244 65.809 67.074 64.799 66.611 70.576 +78000000 (returns) 69.619 69.632 69.549 68.651 74.042 69.247 70.425 69.539 69.227 70.369 70.551 70.336 71.662 69.196 71.330 68.985 70.000 69.789 69.707 70.788 68.448 69.688 69.717 69.749 69.483 69.870 68.908 69.601 74.338 69.036 70.489 70.019 +78500000 (returns) 63.050 64.287 62.528 62.799 62.975 63.569 70.976 68.360 72.383 63.196 65.157 65.124 61.733 64.625 64.044 64.309 64.784 63.377 62.848 62.313 65.321 63.579 62.348 65.002 63.529 64.916 63.431 62.535 64.188 65.629 62.460 64.580 +79000000 (returns) 57.186 58.093 60.706 59.080 55.275 52.604 57.467 57.247 58.515 62.152 56.855 65.479 55.323 57.429 57.066 59.575 60.063 58.802 52.637 60.171 53.815 53.753 53.241 56.275 61.207 58.465 59.012 54.723 54.155 60.690 57.098 57.450 +79500000 (returns) 64.382 62.912 62.733 63.409 63.391 63.901 64.935 64.166 64.150 63.600 64.052 63.160 63.814 62.063 63.984 62.330 62.748 64.044 64.049 63.910 62.987 63.044 63.057 63.836 64.086 62.997 65.673 64.106 64.160 65.246 64.950 64.065 +80000000 (returns) 62.931 62.625 60.485 61.274 61.637 63.691 62.986 61.290 62.321 61.840 62.878 62.369 64.774 61.722 63.163 61.654 62.055 62.379 555.767 61.480 61.700 62.620 61.824 62.491 66.200 63.335 61.858 62.481 62.029 61.860 61.989 67.901 +80500000 (returns) 63.873 64.179 63.557 67.025 69.909 68.660 63.841 63.471 64.436 64.798 69.425 65.321 67.847 64.847 65.840 67.255 66.346 66.203 64.434 69.192 63.907 63.355 67.372 64.480 62.964 63.045 63.493 66.423 67.556 64.034 62.986 62.994 +81000000 (returns) 56.321 58.884 57.862 57.553 64.539 57.308 60.287 57.467 59.961 57.650 55.982 61.240 56.722 56.765 63.345 58.449 56.117 64.605 57.020 57.624 62.268 59.580 56.762 57.766 62.370 62.101 61.410 60.482 56.381 60.070 56.293 58.823 +81500000 (returns) 71.439 70.430 62.792 67.263 72.409 65.972 63.985 64.333 66.741 68.598 62.330 66.692 61.879 64.392 59.651 59.528 64.334 65.644 70.699 58.179 69.037 57.811 68.890 63.379 65.864 58.634 68.789 72.981 57.814 60.639 55.505 64.458 +82000000 (returns) 60.814 73.912 57.853 58.349 59.993 60.069 62.467 60.963 64.108 58.537 64.944 58.295 62.614 62.902 67.067 68.044 66.713 67.296 64.935 69.180 64.105 63.949 64.316 63.717 64.025 64.960 69.535 66.531 65.047 66.192 65.864 58.212 +82500000 (returns) 65.045 72.120 64.205 71.505 73.814 69.053 66.045 64.635 64.416 68.436 64.799 70.490 69.324 64.833 70.857 65.339 71.533 68.567 65.077 70.577 71.420 70.929 70.759 74.359 65.747 70.970 69.868 68.986 66.365 64.777 69.378 68.056 +83000000 (returns) 64.863 64.374 64.216 64.606 64.600 68.710 68.033 65.219 64.618 63.827 64.753 65.471 69.915 64.246 68.251 68.151 65.701 64.312 67.843 68.968 63.606 64.801 66.010 63.508 568.443 67.921 64.327 64.544 63.119 67.723 63.937 69.282 +83500000 (returns) 63.721 63.984 66.964 64.984 70.451 67.295 68.904 63.909 63.586 64.165 63.250 69.080 64.814 63.915 67.152 64.477 64.082 67.830 72.825 63.463 66.562 65.650 62.290 64.376 65.023 67.462 62.583 62.729 70.562 69.778 65.082 62.000 +84000000 (returns) 55.695 51.618 54.993 53.926 49.770 54.542 62.906 49.142 57.674 60.328 54.096 51.851 59.063 57.118 64.469 64.273 50.248 60.184 54.422 63.200 57.103 65.405 62.241 57.133 58.128 55.616 55.210 49.334 65.228 58.666 56.512 63.012 +84500000 (returns) 49.134 55.784 48.548 55.971 49.282 59.292 50.205 53.935 55.235 54.430 56.079 61.752 57.104 58.281 56.035 53.892 59.615 59.422 53.541 53.166 52.323 59.882 52.355 51.955 48.940 56.580 56.621 63.853 52.510 55.666 55.341 57.517 +85000000 (returns) 56.092 56.040 49.230 56.243 61.593 55.322 48.306 55.931 55.329 53.053 55.603 54.987 46.429 57.154 60.244 56.739 53.028 57.586 58.042 47.835 56.814 60.244 55.645 55.969 58.154 55.052 56.728 55.450 57.659 55.925 56.353 50.587 +85500000 (returns) 74.734 67.860 69.185 74.235 74.944 66.358 69.166 67.663 69.181 67.590 68.639 71.256 69.257 70.080 74.827 68.865 66.839 74.202 67.443 75.430 67.625 75.541 71.805 73.804 74.344 70.929 67.681 70.707 68.622 70.537 71.908 73.177 +86000000 (returns) 69.737 68.422 70.493 68.177 71.350 69.556 68.994 69.934 72.478 71.492 69.538 72.711 68.866 68.099 70.458 71.676 68.878 69.462 68.140 568.772 71.658 70.810 69.040 69.337 70.232 72.535 68.063 68.130 69.878 68.901 68.064 69.370 +86500000 (returns) 67.311 73.213 65.596 65.665 66.378 67.492 65.731 65.032 65.613 66.137 71.566 71.468 64.359 65.710 67.564 72.976 71.337 65.543 64.962 67.024 66.052 66.758 65.096 63.472 70.365 70.128 70.885 65.302 66.179 66.356 67.009 71.833 +87000000 (returns) 59.067 56.905 55.641 56.271 54.755 57.381 58.118 57.864 56.703 56.961 58.012 57.830 62.310 66.792 58.216 58.915 59.319 57.306 57.731 57.504 56.214 56.853 55.975 62.441 64.053 56.739 59.645 57.067 63.261 56.506 66.543 58.912 +87500000 (returns) 50.459 40.247 45.678 47.757 46.022 39.353 47.710 38.139 52.302 39.650 45.847 42.842 44.939 45.953 48.218 49.902 40.915 47.823 46.110 44.029 40.718 43.606 40.470 41.692 41.554 37.821 49.192 40.957 55.535 42.818 47.510 56.877 +88000000 (returns) 67.285 66.500 70.786 67.778 76.473 69.560 66.787 68.722 67.986 75.625 77.904 71.121 72.285 63.949 68.902 63.678 80.242 65.251 65.844 65.376 65.880 67.815 67.650 69.960 68.937 71.073 65.865 68.521 66.971 65.432 66.924 68.300 +88500000 (returns) 61.695 60.565 65.884 58.747 65.124 58.854 65.599 52.783 63.555 60.960 54.743 61.797 64.856 59.209 63.862 66.382 61.158 64.486 61.679 55.242 60.551 60.776 62.703 60.263 59.919 59.553 60.974 66.174 60.778 61.361 53.423 61.438 +89000000 (returns) 59.816 65.846 61.777 59.086 60.582 57.673 58.053 65.135 59.381 64.939 66.007 59.855 61.418 61.901 58.881 61.159 60.409 60.212 59.536 58.327 61.573 64.478 60.314 61.680 60.288 62.231 61.441 65.082 58.740 58.597 62.508 60.725 +89500000 (returns) 59.230 58.775 58.211 58.672 58.563 58.665 59.198 58.993 309.170 59.188 58.050 58.887 59.524 58.077 59.097 61.099 58.541 57.801 59.516 60.007 60.041 57.793 58.084 58.896 59.104 58.787 59.033 58.627 58.390 68.679 59.524 63.012 +90000000 (returns) 71.111 71.725 73.206 73.592 71.812 71.794 73.286 71.299 73.795 71.293 72.251 76.553 76.658 71.715 72.526 72.464 73.044 74.986 71.877 73.792 75.649 74.880 72.154 75.220 70.735 74.283 73.862 72.935 72.012 75.453 383.917 70.885 +90500000 (returns) 66.319 65.560 60.676 55.570 57.698 59.272 61.820 66.461 63.385 60.342 56.052 561.805 53.895 59.715 59.155 59.191 66.866 69.863 57.038 53.129 65.508 59.126 54.773 62.845 60.765 64.273 53.511 59.662 69.528 56.621 58.391 55.010 +91000000 (returns) 40.033 45.347 39.748 41.178 40.914 35.505 39.974 50.194 36.155 53.511 39.132 44.339 40.006 39.848 46.099 36.681 38.009 52.047 38.436 36.830 37.204 38.003 40.040 41.595 36.965 40.366 35.893 40.991 50.459 37.932 35.873 39.658 +91500000 (returns) 60.503 54.920 62.944 55.541 64.177 59.048 60.590 53.117 53.140 61.052 56.142 59.478 61.551 51.935 55.804 54.549 54.387 59.265 57.601 58.856 55.693 58.699 63.121 58.751 53.107 60.892 57.658 56.916 65.761 60.865 62.269 60.081 +92000000 (returns) 61.834 61.364 61.925 61.546 61.018 60.891 562.227 61.148 61.096 61.566 61.037 61.240 60.957 60.868 61.018 61.584 62.996 61.678 62.046 60.894 60.749 62.084 60.784 61.506 61.575 61.385 62.731 61.320 61.867 61.867 61.767 61.098 +92500000 (returns) 51.145 56.724 52.889 46.071 52.438 54.354 54.094 50.924 47.889 59.940 48.381 55.494 50.063 52.093 51.499 49.861 53.888 48.324 57.670 46.915 54.756 55.181 53.443 56.896 54.065 54.856 57.639 56.200 54.305 53.311 554.905 48.787 +93000000 (returns) 65.900 67.099 67.046 371.428 65.281 65.644 66.940 71.580 72.570 66.326 66.856 563.475 70.151 71.893 71.454 66.650 65.603 66.380 72.113 68.343 73.087 71.778 67.922 66.260 72.456 65.911 67.214 67.775 66.186 66.296 67.679 66.317 +93500000 (returns) 41.909 44.755 53.287 37.977 43.771 54.757 42.467 46.475 51.884 40.636 45.900 40.183 43.469 42.611 43.178 53.664 44.482 55.305 42.409 45.630 38.482 44.926 46.433 43.693 51.188 44.896 44.479 42.796 41.706 39.783 55.031 44.652 +94000000 (returns) 39.224 41.302 45.443 36.506 36.960 36.971 44.076 47.416 54.631 40.741 44.693 45.939 42.013 49.933 45.039 45.417 49.568 54.296 44.246 42.790 36.563 42.057 45.983 41.590 42.098 36.935 39.565 42.293 44.082 53.769 37.536 42.736 +94500000 (returns) 64.861 65.397 65.192 65.980 62.762 65.508 65.445 64.482 65.581 63.906 62.798 64.288 64.360 64.192 62.759 61.523 64.196 63.786 63.936 61.147 65.960 71.134 66.331 65.016 62.461 64.093 64.321 63.319 63.315 64.495 63.480 63.951 +95000000 (returns) 57.888 57.520 52.691 56.977 63.301 59.155 65.250 57.144 56.879 58.157 53.074 55.657 58.913 63.066 51.432 58.353 65.007 55.469 59.243 59.454 60.749 58.732 57.207 63.061 54.535 55.946 60.908 57.158 59.161 58.097 56.325 55.595 +95500000 (returns) 60.770 54.893 49.122 53.409 50.162 58.475 48.466 48.376 58.615 59.632 51.333 48.339 62.932 53.399 47.294 54.351 53.445 52.124 56.568 49.948 55.134 55.197 64.049 63.857 58.613 52.890 65.445 56.467 48.463 46.595 62.231 55.519 +96000000 (returns) 67.666 67.903 67.537 70.422 68.085 68.311 67.455 67.975 71.745 78.816 67.215 68.436 68.712 67.545 68.452 68.197 67.241 68.667 68.117 67.815 68.015 68.638 67.639 78.159 68.062 77.227 72.876 68.243 67.334 67.897 67.660 67.484 +96500000 (returns) 58.309 58.786 58.163 57.529 59.500 59.877 59.074 59.914 58.532 58.579 58.675 60.838 60.078 60.367 58.437 60.120 60.803 60.673 58.404 58.643 58.176 61.316 58.847 58.395 58.632 60.168 59.121 58.078 59.171 58.642 59.019 60.301 +97000000 (returns) 55.043 66.101 56.837 57.646 64.765 65.682 50.202 54.424 63.190 54.817 66.112 49.440 56.884 59.765 53.797 51.315 61.363 57.099 565.893 56.041 57.088 52.047 67.417 52.834 57.363 63.690 61.276 62.337 52.995 50.349 66.161 56.871 +97500000 (returns) 68.087 67.848 67.735 67.571 68.490 67.661 68.754 67.645 67.467 67.318 68.265 67.008 68.502 67.730 69.329 67.002 67.898 67.762 67.296 68.213 68.619 67.184 67.331 67.883 68.158 68.834 67.637 67.239 67.865 67.461 67.371 66.835 +98000000 (returns) 62.227 64.312 61.443 62.131 61.678 62.180 61.346 62.105 62.284 62.280 63.185 63.036 60.901 62.341 63.086 60.914 63.997 61.923 61.519 62.292 62.909 61.698 64.137 64.117 62.465 61.329 62.298 63.141 61.631 61.948 62.580 62.840 +98500000 (returns) 68.039 63.301 538.605 64.404 63.531 65.645 63.421 63.644 62.123 63.676 65.106 63.704 63.980 64.056 62.830 63.597 63.740 64.441 63.979 64.790 62.782 63.064 63.986 63.579 63.371 64.179 64.913 64.475 63.657 63.280 63.757 63.254 +99000000 (returns) 65.733 64.947 64.279 65.228 66.101 62.919 68.333 64.954 68.251 68.178 63.146 67.920 66.939 65.174 67.928 59.420 67.975 59.677 65.259 65.934 66.724 66.470 562.889 68.372 569.228 65.455 62.503 66.663 71.922 66.201 68.849 62.237 +99500000 (returns) 79.253 79.393 78.830 561.560 81.010 85.263 78.296 84.778 79.486 85.459 80.012 78.934 83.378 79.001 85.259 79.417 83.380 78.077 79.046 84.935 80.186 81.341 77.593 84.358 78.484 78.727 77.644 82.771 78.978 86.633 84.472 79.157 +100000000 (returns) 52.319 48.549 55.010 54.274 53.261 62.871 64.838 54.819 53.995 59.067 55.292 55.549 48.358 59.690 65.048 54.444 80.666 58.483 48.090 62.771 48.298 58.465 58.437 54.608 47.023 52.687 54.765 47.959 48.612 52.312 54.489 54.844 diff --git a/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-100/evaluation_result_scalar.tsv b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-100/evaluation_result_scalar.tsv new file mode 100644 index 00000000..649f3776 --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-100/evaluation_result_scalar.tsv @@ -0,0 +1,201 @@ +iteration mean std_dev min max median +500000 584.045 6.581 560.626 595.361 584.882 +1000000 578.265 6.889 563.697 592.044 576.894 +1500000 579.121 5.829 569.499 592.839 578.750 +2000000 577.737 8.069 563.643 592.218 576.133 +2500000 575.810 8.346 557.968 593.646 573.796 +3000000 576.297 7.482 562.518 593.513 575.305 +3500000 549.633 72.825 356.258 587.278 582.078 +4000000 566.095 37.182 364.047 583.308 574.999 +4500000 565.263 9.253 547.344 577.062 570.683 +5000000 559.552 10.149 532.240 577.424 559.231 +5500000 551.069 12.597 517.577 575.110 553.442 +6000000 552.159 8.608 534.863 573.881 552.732 +6500000 496.613 89.220 342.694 570.362 544.966 +7000000 505.407 72.173 332.108 568.054 534.938 +7500000 492.383 81.717 334.358 560.378 537.750 +8000000 498.825 76.513 358.026 564.064 539.803 +8500000 513.876 60.115 363.788 559.005 537.839 +9000000 510.717 67.191 337.515 558.424 537.262 +9500000 518.609 54.215 331.504 557.250 536.247 +10000000 513.794 58.650 330.238 572.838 534.652 +10500000 476.215 83.083 318.950 571.522 506.419 +11000000 520.570 42.793 344.629 572.969 526.300 +11500000 508.352 55.278 334.297 563.978 519.163 +12000000 519.213 35.118 384.322 570.797 522.793 +12500000 518.946 46.506 335.698 564.790 529.731 +13000000 526.531 35.366 341.904 563.168 527.068 +13500000 493.891 58.509 344.465 568.855 515.945 +14000000 498.294 56.198 335.446 561.239 512.255 +14500000 513.708 25.817 449.001 560.195 517.720 +15000000 396.830 138.449 102.980 556.630 438.411 +15500000 324.555 200.981 93.003 557.705 414.942 +16000000 429.224 127.160 101.535 571.068 499.820 +16500000 198.830 127.184 110.761 568.650 148.863 +17000000 340.559 113.314 91.917 555.317 342.656 +17500000 394.284 96.755 160.930 562.021 418.964 +18000000 394.110 80.650 206.726 541.961 411.122 +18500000 195.599 110.033 107.080 554.841 178.438 +19000000 231.406 137.021 150.105 544.256 170.471 +19500000 213.731 151.798 76.067 568.309 165.448 +20000000 180.387 70.840 105.843 548.479 181.620 +20500000 152.148 130.442 92.780 567.231 103.956 +21000000 198.117 117.483 114.866 547.714 168.439 +21500000 230.368 110.484 171.336 543.667 182.497 +22000000 141.634 54.574 108.453 352.960 127.475 +22500000 208.322 78.250 174.712 562.316 181.526 +23000000 161.372 45.052 145.439 337.979 148.533 +23500000 150.130 92.141 106.165 529.806 119.602 +24000000 191.068 119.152 143.195 563.311 147.089 +24500000 168.037 75.770 141.578 549.871 149.891 +25000000 169.892 91.990 128.225 555.914 141.209 +25500000 184.073 121.702 135.841 568.855 144.580 +26000000 113.952 81.727 97.194 568.907 99.023 +26500000 105.161 2.550 101.137 110.342 104.473 +27000000 153.786 1.151 150.226 155.844 153.858 +27500000 170.339 125.035 123.560 565.602 131.429 +28000000 140.825 107.607 103.239 540.180 106.507 +28500000 141.382 50.257 122.764 359.740 129.032 +29000000 122.848 79.148 103.699 562.826 106.634 +29500000 137.188 111.471 102.458 568.553 106.653 +30000000 122.250 112.044 91.040 560.822 92.498 +30500000 108.736 78.643 92.228 546.426 93.329 +31000000 110.455 47.825 99.922 376.671 101.853 +31500000 110.581 81.627 92.325 564.918 95.733 +32000000 98.948 47.725 88.831 364.583 90.047 +32500000 98.339 41.239 88.862 327.777 90.383 +33000000 108.387 82.282 90.925 566.255 92.273 +33500000 118.021 81.360 99.992 570.958 103.478 +34000000 105.137 82.517 88.705 564.534 90.011 +34500000 88.972 2.251 83.392 92.762 89.116 +35000000 94.802 2.615 90.270 100.410 95.237 +35500000 106.137 81.153 84.299 557.562 91.738 +36000000 113.906 116.741 75.926 568.285 84.555 +36500000 114.329 81.017 92.842 564.967 99.721 +37000000 91.416 4.143 84.684 99.523 90.937 +37500000 82.252 4.755 75.333 90.941 80.765 +38000000 82.586 4.891 76.279 92.583 80.918 +38500000 77.521 5.639 70.616 87.993 74.500 +39000000 97.122 49.785 81.350 373.166 88.342 +39500000 94.204 83.875 71.672 560.263 78.144 +40000000 83.007 72.004 64.410 483.317 69.400 +40500000 84.696 87.469 65.899 571.219 67.294 +41000000 75.005 53.452 60.584 371.733 63.519 +41500000 80.393 86.731 61.477 563.083 64.357 +42000000 76.693 5.546 70.445 87.171 74.035 +42500000 98.291 96.977 70.342 555.991 72.769 +43000000 77.448 4.715 72.370 87.042 75.982 +43500000 80.168 6.060 71.830 89.269 77.602 +44000000 80.707 85.809 61.435 558.030 63.062 +44500000 78.388 4.787 71.771 88.345 77.480 +45000000 88.917 5.547 83.261 99.732 86.104 +45500000 91.015 86.441 71.280 571.802 74.111 +46000000 79.746 4.901 74.251 90.568 78.380 +46500000 95.939 83.555 75.523 560.124 78.589 +47000000 77.849 4.187 72.448 87.679 77.279 +47500000 76.031 4.175 72.107 86.635 74.221 +48000000 78.652 5.414 72.818 90.093 77.023 +48500000 77.513 3.412 73.284 87.590 76.738 +49000000 70.664 3.903 67.328 80.701 69.129 +49500000 68.538 1.891 65.713 73.462 67.987 +50000000 66.707 1.945 65.130 73.628 66.048 +50500000 90.923 83.925 71.004 557.387 74.062 +51000000 84.108 85.570 66.020 560.254 67.732 +51500000 70.256 2.117 67.185 78.331 69.994 +52000000 99.052 112.395 68.220 565.761 69.581 +52500000 86.080 86.131 67.027 565.281 69.347 +53000000 64.587 1.565 62.635 69.328 64.038 +53500000 71.660 3.569 68.406 82.349 70.028 +54000000 85.732 81.659 68.661 540.189 70.165 +54500000 74.225 3.398 71.659 84.051 72.583 +55000000 69.855 4.493 64.809 79.005 68.606 +55500000 71.988 2.649 69.145 83.179 71.437 +56000000 68.600 3.970 65.225 77.784 66.665 +56500000 67.152 2.595 65.041 76.227 66.426 +57000000 66.745 1.571 65.036 71.431 66.277 +57500000 65.701 1.314 64.229 70.473 65.418 +58000000 82.509 84.870 63.792 554.946 67.129 +58500000 89.413 97.200 63.313 554.163 64.886 +59000000 66.665 2.490 64.209 76.902 65.879 +59500000 74.151 4.481 68.494 82.684 72.128 +60000000 62.440 1.749 60.970 68.907 61.879 +60500000 61.732 2.634 59.096 68.377 60.528 +61000000 84.841 49.347 72.754 358.580 74.725 +61500000 82.786 85.666 65.916 559.739 67.578 +62000000 64.757 2.482 61.426 71.933 63.686 +62500000 65.297 1.207 63.784 69.462 65.018 +63000000 76.924 48.255 65.639 345.250 67.720 +63500000 67.787 2.672 65.226 74.153 66.538 +64000000 73.849 55.284 62.911 381.596 63.485 +64500000 72.047 1.214 70.220 75.497 71.883 +65000000 68.980 0.563 67.808 70.799 68.924 +65500000 71.927 55.467 58.785 380.414 61.177 +66000000 65.097 2.494 61.767 70.690 64.021 +66500000 61.843 0.754 60.540 63.836 61.701 +67000000 65.876 1.720 63.656 71.107 65.329 +67500000 66.788 2.254 64.935 74.062 66.000 +68000000 65.083 0.906 63.971 67.495 64.802 +68500000 61.600 2.791 56.782 66.111 62.272 +69000000 60.096 0.791 58.651 62.638 59.925 +69500000 64.162 1.428 62.477 71.007 63.943 +70000000 63.063 0.575 62.243 64.108 63.036 +70500000 63.940 0.885 62.884 66.894 63.831 +71000000 65.048 1.965 62.581 69.675 64.202 +71500000 62.371 0.817 61.160 64.276 62.433 +72000000 77.309 87.321 59.602 563.457 61.381 +72500000 64.707 1.803 63.115 70.265 64.074 +73000000 65.526 1.288 63.619 67.748 64.960 +73500000 64.272 2.332 61.002 71.251 63.470 +74000000 79.828 79.498 61.265 522.160 65.591 +74500000 69.942 2.603 65.910 74.814 68.890 +75000000 66.558 0.797 65.256 68.731 66.519 +75500000 61.559 4.343 53.887 69.917 62.710 +76000000 62.962 1.024 61.430 65.924 63.078 +76500000 72.670 1.116 69.156 74.500 72.730 +77000000 64.008 2.613 59.515 70.382 63.673 +77500000 84.054 86.472 64.071 565.225 68.674 +78000000 70.062 1.273 68.448 74.338 69.712 +78500000 64.374 2.291 61.733 72.383 63.812 +79000000 57.550 2.908 52.604 65.479 57.439 +79500000 63.748 0.805 62.063 65.673 63.905 +80000000 77.988 85.823 60.485 555.767 62.345 +80500000 65.408 2.067 62.964 69.909 64.639 +81000000 59.063 2.510 55.982 64.605 58.155 +81500000 64.722 4.598 55.505 72.981 64.425 +82000000 63.922 3.709 57.853 73.912 64.107 +82500000 68.509 2.960 64.205 74.359 69.019 +83000000 81.497 87.480 63.119 568.443 64.832 +83500000 65.717 2.698 62.000 72.825 64.899 +84000000 57.284 4.766 49.142 65.405 57.111 +84500000 55.133 3.724 48.548 63.853 55.504 +85000000 55.293 3.456 46.429 61.593 55.950 +85500000 70.763 2.878 66.358 75.541 70.308 +86000000 85.414 86.825 68.063 568.772 69.547 +86500000 67.504 2.706 63.472 73.213 66.367 +87000000 58.682 2.973 54.755 66.792 57.780 +87500000 45.083 4.708 37.821 56.877 45.308 +88000000 68.918 3.879 63.678 80.242 67.901 +88500000 61.097 3.439 52.783 66.382 61.066 +89000000 61.177 2.311 57.673 66.007 60.653 +89500000 67.164 43.509 57.793 309.170 58.945 +90000000 82.836 54.100 70.735 383.917 72.990 +90500000 76.057 87.361 53.129 561.805 59.688 +91000000 40.905 4.769 35.505 53.511 39.911 +91500000 58.388 3.485 51.935 65.761 58.804 +92000000 77.115 87.130 60.749 562.227 61.446 +92500000 68.594 87.408 46.071 554.905 53.665 +93000000 93.175 99.605 65.281 563.475 67.157 +93500000 45.400 4.831 37.977 55.305 44.481 +94000000 43.513 4.949 36.506 54.631 42.763 +94500000 64.374 1.722 61.147 71.134 64.242 +95000000 58.191 3.263 51.432 65.250 57.992 +95500000 54.879 5.313 46.595 65.445 54.622 +96000000 69.236 3.088 67.215 78.816 68.073 +96500000 59.224 0.957 57.529 61.316 58.933 +97000000 73.964 88.508 49.440 565.893 57.093 +97500000 67.812 0.578 66.835 69.329 67.733 +98000000 62.383 0.891 60.901 64.312 62.282 +98500000 78.778 82.594 62.123 538.605 63.722 +99000000 97.056 121.126 59.420 569.228 66.151 +99500000 96.097 83.645 77.593 561.560 79.749 +100000000 55.622 6.612 47.023 80.666 54.686 diff --git a/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-100/result.png b/reproductions/algorithms/pybullet/amp/reproduction_results/humanoid3d_cartwheel_results/seed-100/result.png new file mode 100644 index 0000000000000000000000000000000000000000..d1ff352581a7e1e77a1d27f0fdbb8cf10d5d3e60 GIT binary patch literal 30779 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 literal 0 HcmV?d00001 diff --git a/reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/seed-1/best_score_scalar.tsv b/reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/seed-1/best_score_scalar.tsv new file mode 100644 index 00000000..185d37bc --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/seed-1/best_score_scalar.tsv @@ -0,0 +1,2 @@ +iteration best_mean_iteration mean std_dev best_median_iteration median +1 183000000.000 418.944 44.438 183000000.000 423.071 diff --git a/reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/seed-1/evaluation_result_histogram.tsv b/reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/seed-1/evaluation_result_histogram.tsv new file mode 100644 index 00000000..31ebc436 --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/seed-1/evaluation_result_histogram.tsv @@ -0,0 +1,401 @@ +iteration(key) values +500000 (returns) 0.000 24.021 0.000 3.527 0.000 0.000 0.000 0.000 0.000 1.580 8.238 0.000 0.000 4.539 2.593 0.006 5.050 0.000 3.164 7.484 16.446 0.000 1.013 0.149 6.000 12.986 8.805 0.000 0.284 16.064 0.138 0.000 +1000000 (returns) 2.596 0.000 3.131 1.023 14.297 5.871 0.025 10.985 4.094 6.171 7.774 0.000 0.001 6.476 0.000 4.249 0.341 8.431 1.533 1.252 0.000 0.000 0.250 0.003 4.481 7.539 0.000 0.352 15.618 11.742 0.000 10.559 +1500000 (returns) 5.273 6.447 0.000 0.411 8.357 0.000 0.000 12.169 4.544 0.000 0.000 8.000 11.578 0.000 1.552 0.000 0.073 11.390 0.456 6.005 0.327 13.244 6.239 0.000 0.000 0.000 4.376 21.511 3.923 4.594 0.042 1.439 +2000000 (returns) 1.833 0.790 10.283 8.270 12.135 0.048 10.350 4.512 22.411 5.053 0.000 4.513 5.666 1.948 0.000 29.836 0.031 23.683 5.639 1.332 1.986 7.610 11.381 3.947 24.862 6.865 0.000 0.000 2.769 2.200 6.529 1.340 +2500000 (returns) 9.869 1.361 12.401 13.559 10.332 3.148 5.913 0.104 17.240 7.807 15.140 3.401 8.314 0.890 10.713 0.000 0.894 0.780 7.488 0.000 0.096 9.597 7.241 0.000 0.491 7.879 0.000 1.882 11.831 5.766 0.000 24.180 +3000000 (returns) 9.540 0.603 0.000 0.012 0.000 14.474 3.307 8.954 1.806 0.000 25.765 32.732 1.097 17.531 25.513 8.800 15.025 7.945 4.952 8.069 11.337 0.018 0.064 9.095 5.472 5.554 7.537 0.003 2.712 19.084 32.075 0.096 +3500000 (returns) 4.068 5.581 17.792 1.681 5.781 1.667 0.961 6.682 14.941 3.990 1.307 6.692 8.686 3.256 5.600 7.643 1.131 0.000 0.591 0.517 5.315 14.732 0.000 5.053 0.808 10.663 0.776 32.406 0.005 0.401 4.118 6.309 +4000000 (returns) 3.501 3.853 12.395 0.124 0.006 4.131 8.593 13.431 0.017 13.595 0.130 0.000 3.356 0.000 0.000 10.003 6.400 18.944 1.804 0.353 31.663 0.023 3.039 0.773 25.130 14.313 7.159 0.087 0.000 2.071 17.674 8.775 +4500000 (returns) 3.276 4.825 0.007 0.144 3.553 27.337 10.401 0.000 7.337 0.000 0.294 0.413 0.007 0.000 7.787 1.206 5.746 3.642 5.798 0.000 1.476 0.316 7.277 36.808 0.046 0.032 8.398 1.362 0.000 0.403 22.742 0.000 +5000000 (returns) 0.169 0.744 8.014 0.457 6.746 11.194 3.935 31.752 2.975 4.227 0.503 6.051 2.126 0.000 9.432 7.507 8.482 9.910 0.000 6.092 0.009 3.733 0.000 7.034 36.828 14.400 1.682 0.000 2.412 0.000 20.126 5.101 +5500000 (returns) 0.202 0.043 7.634 14.316 7.285 0.000 0.648 0.000 11.244 8.000 4.033 21.545 0.115 0.075 2.601 0.049 1.232 4.648 0.000 7.154 0.000 4.987 1.395 5.482 0.000 6.594 0.076 0.262 0.000 7.112 17.018 3.749 +6000000 (returns) 3.903 3.707 11.317 5.600 7.090 7.369 33.940 43.010 0.000 4.154 10.862 5.141 7.409 7.591 4.701 7.619 1.259 28.652 0.622 0.070 0.000 7.233 1.433 10.607 5.872 3.090 6.512 0.000 8.417 0.048 7.217 1.260 +6500000 (returns) 39.411 0.000 5.540 3.668 2.575 6.648 5.876 0.000 0.032 7.340 5.619 4.461 7.398 25.475 0.780 2.627 4.601 6.659 31.596 34.550 3.092 3.342 16.187 0.000 8.129 9.298 0.322 0.000 8.605 0.137 1.606 1.242 +7000000 (returns) 1.397 0.000 1.513 8.206 1.097 4.985 5.535 0.000 9.441 6.669 6.157 14.434 6.981 8.503 11.268 27.686 0.000 0.163 0.346 9.677 7.245 0.097 0.025 3.720 0.143 2.332 0.045 0.000 4.020 0.000 7.283 7.039 +7500000 (returns) 6.263 6.074 16.033 29.828 31.723 7.574 9.702 14.530 0.000 0.000 2.289 0.177 4.983 1.130 7.990 3.588 0.087 2.442 11.680 4.800 0.001 13.660 16.055 2.115 3.613 2.921 2.840 0.000 0.000 2.552 0.000 5.235 +8000000 (returns) 11.681 0.000 7.937 1.603 9.977 0.000 9.333 7.793 13.812 0.000 0.203 6.260 0.087 15.736 2.438 7.981 5.381 14.231 5.999 0.031 23.312 4.974 14.801 0.424 8.920 26.297 14.726 0.000 1.735 11.223 6.805 2.448 +8500000 (returns) 1.033 4.043 0.676 0.000 5.125 6.558 0.801 32.183 0.000 0.545 10.917 6.513 11.186 10.980 14.476 0.000 5.832 16.189 8.002 0.570 8.781 6.353 2.862 0.947 18.740 0.000 0.088 0.246 2.717 0.313 0.137 6.101 +9000000 (returns) 5.344 23.586 12.873 0.000 8.018 6.934 1.640 1.114 0.211 6.361 7.796 16.667 5.515 0.000 3.482 0.000 0.502 0.684 0.078 25.421 2.980 0.095 19.047 2.991 16.044 9.682 0.545 7.751 0.097 0.000 8.575 23.830 +9500000 (returns) 0.808 2.023 0.044 0.918 8.130 6.199 45.134 15.069 2.471 0.000 6.218 3.608 15.512 3.123 2.164 0.024 6.443 0.258 0.000 6.113 1.192 2.137 4.698 5.778 0.008 0.007 7.067 0.000 8.579 5.267 6.540 0.242 +10000000 (returns) 3.368 0.835 0.000 6.024 6.555 6.719 10.579 0.000 11.297 12.512 8.233 8.664 8.284 3.852 0.000 0.000 5.206 4.000 1.810 2.544 5.409 1.371 9.144 1.457 0.000 11.009 0.000 0.800 0.029 10.588 0.243 8.774 +10500000 (returns) 11.996 0.000 14.815 0.943 7.030 7.160 4.850 6.971 0.958 0.000 2.799 0.000 7.670 3.567 0.762 5.930 0.305 5.672 6.870 35.377 18.849 39.223 0.914 7.586 6.137 7.515 0.008 0.175 6.489 0.692 0.024 0.000 +11000000 (returns) 0.000 3.284 1.690 6.507 8.976 7.247 2.525 16.584 9.343 4.550 0.984 1.058 25.752 0.709 1.944 0.000 0.000 0.000 0.000 6.599 11.275 1.538 0.964 0.000 0.624 1.115 0.000 8.894 0.199 0.168 5.745 8.018 +11500000 (returns) 46.451 0.000 3.905 6.592 6.471 8.796 0.343 0.009 7.867 0.267 0.000 0.824 5.778 3.348 21.877 0.548 6.900 9.165 2.488 0.004 5.663 32.358 6.479 16.695 1.102 2.147 0.525 6.105 13.209 0.000 3.727 7.538 +12000000 (returns) 9.507 2.018 8.412 0.001 0.000 3.403 16.943 13.493 0.945 0.016 0.000 0.000 8.464 9.649 8.809 0.834 3.878 6.667 0.000 16.764 0.046 0.007 0.000 4.520 0.145 0.459 0.326 0.000 0.000 22.825 4.326 0.000 +12500000 (returns) 4.312 0.053 0.065 0.249 0.054 57.134 11.346 9.242 20.755 11.003 4.093 0.024 10.639 0.253 1.106 0.086 0.000 7.200 1.823 0.008 6.168 10.989 0.669 28.449 0.927 16.402 4.094 0.000 0.000 0.074 7.994 8.126 +13000000 (returns) 8.253 2.498 0.000 0.000 0.000 0.940 17.357 1.444 20.253 5.258 0.000 7.384 8.260 5.706 0.529 14.814 5.423 0.009 0.080 6.399 7.936 0.015 0.596 0.000 1.385 0.937 0.001 0.000 6.199 0.016 15.873 3.756 +13500000 (returns) 2.224 14.652 26.738 7.942 1.039 3.938 0.002 10.882 5.394 7.375 15.989 8.333 3.275 6.007 0.062 1.140 3.250 43.578 0.000 0.000 0.000 2.078 30.919 2.240 10.881 0.000 4.791 3.791 14.109 10.717 16.863 23.147 +14000000 (returns) 0.644 26.326 10.211 0.613 8.977 0.406 1.246 0.000 0.000 0.190 0.000 13.588 6.732 0.504 0.009 0.008 15.250 7.386 6.809 5.938 0.015 0.000 0.000 0.040 0.000 0.006 0.000 6.961 13.875 0.000 0.186 0.000 +14500000 (returns) 10.409 15.249 9.784 6.540 0.000 1.775 13.959 8.454 6.629 0.243 7.215 0.009 3.051 5.602 9.241 11.347 0.942 31.433 0.000 1.579 0.000 0.531 0.000 8.204 2.875 7.431 1.268 12.318 11.272 9.427 0.635 0.420 +15000000 (returns) 7.449 1.804 0.040 4.914 0.904 0.031 1.762 0.012 3.613 0.000 5.587 31.385 40.053 0.000 0.000 1.462 9.332 9.471 5.754 0.330 12.904 14.290 9.961 17.788 0.000 0.000 4.845 0.667 12.376 8.191 11.559 6.089 +15500000 (returns) 0.140 0.035 0.024 27.964 34.419 0.712 0.000 8.043 63.447 5.106 2.820 7.212 2.093 7.733 0.129 6.568 25.345 7.368 4.860 7.726 4.161 0.000 0.213 2.641 21.225 4.158 2.693 0.000 0.415 2.047 0.000 23.420 +16000000 (returns) 8.931 0.007 1.580 1.738 0.007 2.423 14.304 10.814 0.289 10.242 0.000 7.687 6.000 2.357 17.519 1.544 5.987 7.092 12.631 24.314 0.212 12.836 0.962 0.116 0.007 0.373 4.936 0.397 32.748 0.288 3.910 15.439 +16500000 (returns) 0.752 16.895 3.329 8.914 0.000 1.941 1.905 14.565 0.140 0.269 1.499 2.642 0.308 1.655 17.226 20.878 12.514 10.572 2.275 9.127 5.746 3.851 17.130 5.825 3.588 2.675 5.172 0.501 4.464 0.028 19.188 0.334 +17000000 (returns) 0.172 0.249 1.582 2.239 53.395 14.789 0.375 16.443 6.270 8.432 6.578 0.306 25.118 10.716 0.049 45.010 11.698 0.000 0.000 9.422 3.258 11.647 11.070 0.029 0.701 0.000 5.562 0.000 25.475 3.913 2.747 0.000 +17500000 (returns) 1.836 11.364 3.520 0.127 8.679 0.037 4.444 0.740 8.261 0.000 2.464 0.504 1.028 3.119 0.318 3.758 8.276 9.991 7.074 6.510 9.392 0.462 17.504 0.439 6.436 0.000 1.997 9.128 17.412 0.810 4.629 4.506 +18000000 (returns) 15.043 0.351 17.540 0.001 0.210 12.587 21.100 0.613 13.653 0.091 9.745 3.176 1.799 0.452 0.379 2.744 9.667 1.590 4.886 22.037 34.099 2.461 14.266 42.629 11.959 0.008 8.259 8.436 6.677 8.178 0.015 9.991 +18500000 (returns) 50.404 1.575 1.038 65.523 0.121 8.769 0.770 60.945 7.147 0.044 1.621 8.999 1.561 1.105 8.876 0.579 10.087 0.007 0.000 0.000 12.574 2.917 13.882 6.356 0.024 1.884 4.446 4.930 13.107 35.970 9.033 13.167 +19000000 (returns) 0.016 5.888 8.486 8.400 4.263 0.281 7.780 8.448 0.007 13.125 1.199 15.582 0.007 19.382 0.068 1.711 0.437 17.009 4.680 5.653 13.641 4.751 9.306 7.245 0.000 9.224 16.804 1.268 1.879 11.204 11.879 18.072 +19500000 (returns) 30.145 0.000 14.911 4.577 21.934 0.000 87.577 37.506 24.812 45.115 10.396 3.278 0.021 0.078 0.440 0.018 15.826 13.264 4.049 0.430 12.867 10.646 0.086 0.595 7.100 5.144 8.730 17.799 0.000 13.632 3.311 0.032 +20000000 (returns) 0.223 0.032 15.059 1.652 15.981 0.277 156.337 30.536 0.000 7.422 7.309 12.786 90.334 0.005 8.626 8.094 36.175 1.186 17.755 0.184 8.647 0.007 7.095 18.689 32.398 0.240 19.350 7.605 4.117 19.527 0.630 2.449 +20500000 (returns) 15.209 0.028 0.684 0.001 70.042 2.313 0.027 25.152 104.638 2.584 13.483 0.000 0.000 19.283 9.726 6.802 9.784 106.072 7.775 9.632 0.352 5.531 27.043 0.640 2.952 17.421 0.090 57.412 10.773 19.121 40.633 39.135 +21000000 (returns) 0.106 15.213 0.155 1.237 8.713 0.450 0.778 32.085 4.059 13.078 19.565 8.691 2.049 8.393 56.696 8.739 16.186 28.960 19.744 1.470 0.078 4.084 7.983 15.977 0.016 10.882 11.098 16.925 7.929 51.356 22.151 35.090 +21500000 (returns) 92.579 8.574 16.137 30.101 14.748 0.034 0.107 1.683 11.525 13.026 199.151 10.943 0.000 0.002 181.779 30.930 0.016 86.939 9.646 72.198 10.368 117.648 33.765 2.250 5.832 7.359 0.001 77.012 0.529 8.156 40.224 0.000 +22000000 (returns) 0.139 1.512 16.931 41.559 19.637 21.233 91.852 7.601 6.113 23.324 63.901 0.055 7.199 49.991 3.183 47.550 46.786 0.434 22.671 24.378 0.243 31.915 30.521 21.336 6.058 2.918 17.204 37.573 8.725 7.648 6.818 26.279 +22500000 (returns) 58.850 23.551 46.845 0.230 45.205 0.222 118.642 26.077 9.423 0.146 2.402 20.356 1.362 2.536 8.537 35.075 0.196 8.595 26.960 21.383 0.931 50.996 0.163 86.468 45.784 32.622 8.103 13.916 16.372 33.008 13.728 25.617 +23000000 (returns) 17.832 52.068 38.972 4.349 124.009 36.970 0.477 61.941 184.362 48.072 67.287 73.456 11.288 26.345 120.021 22.935 8.125 60.257 63.769 1.668 54.697 6.950 41.404 119.500 23.123 150.286 38.634 0.217 33.769 68.621 37.233 210.160 +23500000 (returns) 49.487 0.560 76.573 43.370 0.071 87.170 49.731 58.269 42.099 97.934 43.068 32.618 152.616 39.703 38.551 37.450 66.173 21.162 30.501 32.923 5.198 127.722 42.024 17.466 0.001 34.517 161.289 138.838 33.450 20.627 27.558 99.244 +24000000 (returns) 29.349 0.740 17.822 49.719 39.952 35.536 83.064 14.442 27.006 132.932 131.071 88.150 11.217 2.278 92.204 38.857 79.951 85.158 24.574 59.632 68.771 26.374 12.012 65.378 23.864 39.747 45.973 0.008 29.699 11.790 215.786 97.552 +24500000 (returns) 29.517 15.189 113.580 8.836 10.353 10.909 11.916 1.225 45.292 8.033 0.000 145.864 6.670 262.751 67.569 68.656 43.332 0.288 17.158 18.996 6.663 31.178 52.215 64.761 34.761 38.508 26.511 140.318 12.559 187.581 17.125 42.367 +25000000 (returns) 69.407 37.969 16.812 130.997 33.470 48.062 40.416 22.191 84.120 60.061 37.366 50.899 48.639 0.015 180.510 38.050 173.784 35.923 22.843 0.419 129.050 53.957 41.603 47.292 356.088 43.539 171.974 0.031 45.794 44.155 56.009 24.692 +25500000 (returns) 30.895 45.433 10.684 8.815 46.916 122.233 40.668 161.800 128.225 124.192 38.007 38.420 54.187 28.058 1.987 79.830 71.467 31.015 69.632 52.274 21.525 41.254 47.150 36.341 28.002 36.856 48.071 47.393 91.299 33.621 240.234 75.305 +26000000 (returns) 162.982 169.252 93.352 106.206 59.682 46.024 190.152 181.313 9.044 133.198 44.225 200.470 20.562 122.191 29.161 0.000 252.632 61.904 115.529 45.283 51.371 155.894 37.743 184.744 106.080 87.919 8.768 106.110 123.437 45.115 43.209 176.546 +26500000 (returns) 53.943 42.720 86.896 59.069 164.240 224.083 104.501 77.065 31.952 30.998 48.564 100.450 276.745 48.297 73.665 51.873 123.963 63.517 149.003 204.299 32.239 46.700 130.291 51.456 0.028 46.145 44.823 99.357 61.000 47.393 207.239 112.134 +27000000 (returns) 121.099 0.477 43.806 260.749 8.511 242.266 128.038 34.340 54.550 93.559 0.386 148.097 4.572 66.832 119.895 88.024 60.771 40.756 75.013 91.571 61.990 67.821 69.885 200.870 3.441 107.213 58.273 118.062 45.920 233.742 112.036 50.322 +27500000 (returns) 131.906 119.185 223.733 169.994 52.653 71.092 86.507 41.093 55.358 195.645 71.439 72.981 36.322 39.920 54.305 52.040 213.337 0.018 115.853 4.228 82.077 171.323 0.800 69.154 11.829 7.644 43.657 55.278 166.911 134.445 64.299 40.793 +28000000 (returns) 69.955 105.911 77.973 96.135 215.116 166.346 130.911 112.806 60.135 84.384 43.693 60.309 44.174 69.727 41.885 184.438 61.668 39.036 105.964 91.476 110.447 156.304 56.101 33.434 107.368 137.940 47.291 260.354 45.060 63.811 59.531 15.628 +28500000 (returns) 61.183 163.767 60.359 188.278 211.535 4.430 172.100 72.680 153.163 99.103 57.019 52.823 56.793 68.005 83.014 73.561 219.866 77.492 117.468 48.935 59.095 74.235 57.178 112.790 183.688 58.365 111.368 40.228 48.665 60.377 48.486 87.822 +29000000 (returns) 145.499 163.811 27.885 66.055 179.023 170.103 114.532 106.064 47.407 100.875 125.247 103.827 117.085 56.102 38.459 137.511 57.822 14.918 51.105 51.622 52.558 59.740 77.652 147.431 121.080 63.254 264.449 109.163 53.718 43.122 58.448 38.093 +29500000 (returns) 52.939 47.906 53.422 55.692 165.531 148.824 105.920 81.678 38.147 65.602 100.237 58.561 0.025 55.420 65.860 60.871 79.352 150.460 84.250 91.530 65.826 57.844 54.954 53.909 124.746 168.215 60.078 58.921 40.737 86.427 35.607 132.889 +30000000 (returns) 66.305 76.257 2.225 84.719 58.292 98.355 124.298 65.784 63.075 48.520 94.309 7.443 89.303 156.880 261.408 92.683 120.305 154.199 27.193 116.764 132.769 130.380 63.458 92.713 104.062 56.661 28.222 134.096 166.849 315.520 108.742 85.424 +30500000 (returns) 67.670 59.114 54.272 77.613 80.876 73.746 35.032 156.733 56.661 99.161 110.363 54.236 106.154 107.567 154.470 60.797 203.382 70.481 201.022 73.351 69.052 72.394 53.260 9.427 59.364 176.894 156.076 83.192 50.313 67.586 42.355 0.168 +31000000 (returns) 108.867 76.853 71.301 157.965 85.098 198.686 77.292 71.509 78.015 67.544 86.235 98.234 82.405 87.004 68.701 76.718 181.803 192.565 75.894 155.259 230.356 67.706 186.022 228.160 21.595 97.535 141.531 252.575 79.392 166.889 236.825 137.943 +31500000 (returns) 74.914 104.093 221.311 63.582 73.491 73.317 144.287 193.308 123.907 9.184 204.564 231.987 132.760 15.900 150.206 173.544 98.775 43.695 181.757 93.049 204.634 139.825 380.102 45.020 128.998 101.378 105.520 156.898 104.642 9.636 1.208 217.913 +32000000 (returns) 197.545 237.795 129.950 274.600 131.507 170.849 127.474 6.815 233.447 226.584 202.030 193.590 76.932 279.846 148.302 139.634 48.398 165.636 161.660 225.144 210.635 193.457 83.198 209.070 165.070 81.743 158.712 119.582 39.947 6.907 72.661 136.933 +32500000 (returns) 299.485 156.809 163.474 0.000 113.542 159.153 95.794 148.428 201.230 152.744 187.676 118.087 75.707 251.815 112.093 261.485 206.988 156.443 272.083 162.756 100.200 22.179 158.591 61.766 127.860 42.904 251.974 116.729 152.560 255.131 179.161 232.095 +33000000 (returns) 108.072 305.411 112.621 154.808 7.937 152.873 228.124 67.689 11.285 139.815 150.063 288.848 225.337 209.008 130.046 225.683 150.514 93.682 102.086 109.457 330.603 132.841 96.052 306.512 193.369 266.621 199.324 138.045 207.976 76.415 1.811 87.324 +33500000 (returns) 137.525 303.057 215.787 270.731 290.387 240.765 208.188 56.839 258.687 217.276 210.363 183.728 185.882 194.942 146.412 273.704 298.727 209.975 160.143 202.945 221.679 169.844 196.959 163.883 244.076 234.396 204.862 190.844 0.150 73.525 234.397 144.911 +34000000 (returns) 240.230 111.094 0.042 145.117 190.170 0.000 330.677 168.989 219.865 138.212 118.079 312.961 175.855 190.634 309.093 328.282 4.072 217.812 0.114 218.046 227.859 198.029 412.120 221.438 162.294 8.077 166.762 258.717 379.936 217.395 183.793 172.974 +34500000 (returns) 247.851 364.331 267.860 381.905 353.986 272.049 160.141 201.785 213.725 345.437 220.831 160.010 188.797 363.291 253.908 252.440 305.945 14.400 282.422 0.151 304.714 207.042 57.695 245.710 300.820 231.153 185.146 20.409 306.654 300.943 306.491 250.037 +35000000 (returns) 109.098 282.960 204.933 133.288 0.026 258.884 169.991 134.448 351.282 244.929 182.487 123.105 165.173 127.513 277.785 196.679 237.406 271.921 273.959 302.111 197.350 204.151 254.581 261.319 299.869 309.070 46.966 197.329 182.897 126.473 197.187 299.879 +35500000 (returns) 275.596 235.551 146.425 189.060 285.918 238.179 259.995 198.270 140.720 197.959 299.712 323.199 171.955 349.427 281.942 256.402 232.935 325.038 232.122 149.057 204.459 279.887 181.790 284.391 307.107 197.915 161.990 324.988 197.531 206.529 276.096 314.728 +36000000 (returns) 323.549 447.398 408.322 456.174 340.133 1.362 194.578 320.906 383.572 2.703 161.093 346.394 416.405 251.718 280.544 282.724 370.477 230.583 73.297 213.116 204.244 308.188 301.848 226.531 198.760 238.761 402.756 212.022 240.887 287.033 223.732 185.081 +36500000 (returns) 239.327 7.105 215.238 354.443 184.256 188.960 139.278 178.856 182.939 235.128 269.931 274.794 229.554 236.119 311.761 289.602 199.168 271.986 222.106 29.927 193.134 132.548 241.256 327.176 350.398 226.523 197.041 196.750 285.204 206.386 290.033 277.345 +37000000 (returns) 219.329 123.496 169.071 337.454 278.970 333.815 220.810 327.168 352.650 263.575 336.562 381.790 319.383 346.626 285.948 244.550 276.005 187.527 359.501 277.108 242.512 133.542 229.446 266.283 193.218 227.036 308.661 269.853 292.800 352.808 346.755 181.559 +37500000 (returns) 370.372 332.801 322.266 358.158 320.125 392.706 271.739 333.813 361.199 255.508 301.043 209.776 300.052 374.393 362.537 257.963 124.752 375.790 350.522 8.265 366.483 163.332 265.617 309.961 312.999 473.499 251.749 336.469 312.194 322.834 368.285 378.335 +38000000 (returns) 312.995 234.909 335.223 388.867 355.254 293.195 379.119 3.200 351.920 305.864 319.864 200.652 243.320 287.892 283.897 339.166 343.869 255.346 324.640 304.538 246.195 240.889 5.921 324.818 323.091 53.808 336.034 458.183 350.460 391.672 370.538 346.928 +38500000 (returns) 253.819 128.012 268.546 291.411 258.177 229.518 241.186 365.623 279.452 335.011 333.117 1.661 240.958 240.997 10.400 258.079 222.355 259.342 314.772 394.248 216.985 248.807 178.831 296.569 302.827 302.804 205.258 364.658 323.869 336.057 144.438 298.309 +39000000 (returns) 306.670 262.531 246.734 324.979 209.874 355.477 249.018 235.789 19.159 265.145 162.671 308.821 366.705 313.804 179.619 363.843 201.313 202.410 324.915 404.835 262.638 303.555 253.794 7.988 335.983 254.904 276.978 139.710 454.104 225.392 404.546 327.225 +39500000 (returns) 329.394 351.931 325.117 318.772 303.101 301.035 262.059 253.049 227.528 357.997 324.762 283.595 228.643 239.097 288.488 345.954 236.491 203.117 288.934 209.514 260.353 232.515 271.379 323.170 295.318 233.521 261.131 317.148 241.210 298.926 341.402 227.777 +40000000 (returns) 370.334 322.701 317.758 312.269 345.485 247.838 428.197 362.097 314.241 439.492 246.898 282.817 244.474 269.018 342.981 283.904 263.219 325.899 390.998 371.172 273.155 224.481 248.596 359.074 325.543 343.210 375.595 377.738 455.467 355.843 0.797 252.257 +40500000 (returns) 271.871 348.209 317.022 462.370 370.120 374.954 337.522 0.239 300.388 184.706 307.954 342.376 217.768 289.567 300.339 103.840 254.574 41.941 375.441 398.337 229.304 279.449 267.056 382.705 207.796 373.939 291.344 315.282 0.601 0.000 305.882 393.663 +41000000 (returns) 266.260 290.693 233.137 384.297 308.192 365.052 161.171 306.063 308.216 206.773 308.104 345.947 287.623 265.197 359.624 338.371 0.026 388.725 210.844 273.913 245.039 264.517 265.500 267.940 187.990 335.919 375.180 322.327 217.195 212.204 284.867 256.949 +41500000 (returns) 212.546 285.802 302.841 227.462 436.348 180.452 286.098 329.333 303.355 10.555 470.124 290.750 285.010 369.632 331.886 346.619 286.564 330.029 341.008 255.668 329.748 77.828 280.392 365.630 389.317 193.128 329.524 261.013 364.094 237.724 288.228 366.240 +42000000 (returns) 400.967 329.520 263.012 402.255 201.666 278.818 323.002 423.659 354.830 442.148 263.952 339.421 283.043 457.482 368.084 291.346 318.539 346.977 254.459 0.000 266.189 416.989 426.323 188.590 335.527 320.542 348.252 492.979 0.034 289.122 279.064 333.197 +42500000 (returns) 238.221 360.405 290.524 357.511 224.458 269.612 260.148 285.007 398.912 316.559 255.431 294.798 324.960 366.198 294.529 253.760 281.074 403.512 288.158 325.474 372.653 301.291 328.256 236.406 200.722 349.419 430.111 275.612 265.873 247.306 190.568 187.201 +43000000 (returns) 6.294 374.329 346.363 378.834 342.598 253.131 346.029 237.200 273.653 362.456 437.491 465.499 349.421 11.006 354.144 289.920 210.574 376.644 298.720 331.433 314.488 278.804 368.377 370.478 289.496 306.016 267.434 402.457 331.819 291.687 335.091 252.559 +43500000 (returns) 270.025 299.791 350.600 255.019 440.463 236.527 199.982 270.201 323.051 242.690 275.586 267.303 336.305 271.776 156.719 294.092 388.052 376.451 328.191 302.289 326.925 215.586 379.941 323.609 378.175 335.133 298.952 364.743 332.620 293.586 284.685 214.644 +44000000 (returns) 266.566 332.627 395.944 229.060 322.593 190.878 348.435 266.711 442.237 206.788 394.738 243.436 457.772 326.891 427.076 303.420 278.824 245.129 360.745 242.338 7.600 385.541 364.026 245.059 254.945 310.071 286.713 380.739 255.447 259.194 396.527 362.916 +44500000 (returns) 0.000 286.851 264.938 248.303 204.551 298.343 303.458 301.934 434.915 336.468 419.244 261.927 327.886 283.458 283.661 203.515 272.373 233.575 245.962 513.423 380.718 351.109 393.462 225.957 180.942 411.439 206.735 227.026 207.583 186.304 234.859 407.250 +45000000 (returns) 310.362 277.487 319.284 406.260 369.080 252.987 448.179 7.325 322.482 268.048 346.475 241.031 382.206 325.254 0.000 417.668 335.189 300.201 260.096 0.000 383.033 264.211 254.940 310.071 332.359 7.458 405.069 387.901 428.995 309.810 273.068 394.395 +45500000 (returns) 204.415 173.368 317.065 394.376 316.385 297.081 16.051 0.428 245.583 225.544 419.630 262.198 235.421 293.628 249.333 254.201 242.030 263.933 361.875 306.290 311.953 315.932 335.754 222.031 358.229 268.723 274.178 161.946 259.070 6.668 447.822 344.535 +46000000 (returns) 276.387 240.520 303.538 270.013 192.002 267.585 245.011 204.075 276.982 298.062 197.383 206.436 295.746 382.866 310.206 119.686 264.544 387.703 16.433 367.146 1.052 327.727 298.312 345.323 227.052 345.508 365.237 209.103 354.824 226.998 259.668 266.071 +46500000 (returns) 315.969 316.336 415.250 231.242 182.636 313.456 435.635 251.336 345.582 292.316 249.730 249.887 319.640 434.278 303.309 245.402 295.894 283.335 0.000 294.091 203.673 279.486 361.819 336.050 420.599 140.259 305.515 373.047 234.262 357.560 301.136 280.296 +47000000 (returns) 268.144 387.580 363.438 223.536 304.744 246.028 271.367 244.117 217.376 245.957 259.004 342.118 329.160 293.036 251.357 183.722 325.918 247.367 382.153 294.366 382.712 418.504 271.290 313.007 257.776 331.647 188.552 347.060 239.600 272.021 114.322 9.716 +47500000 (returns) 180.354 480.099 364.524 390.440 234.147 382.753 412.109 240.655 426.776 342.467 361.001 331.676 277.862 256.467 305.516 389.884 319.198 296.722 322.155 168.574 340.131 441.589 298.018 298.349 255.520 374.732 333.900 420.978 226.833 317.688 261.562 352.061 +48000000 (returns) 262.687 196.869 388.906 232.670 192.513 286.845 306.108 281.860 415.964 407.919 296.243 283.235 385.572 425.636 412.018 348.467 338.762 285.083 340.831 342.867 316.459 209.970 275.968 301.943 268.223 293.331 263.699 259.046 311.601 304.861 342.840 363.897 +48500000 (returns) 342.513 458.858 297.694 346.821 8.123 324.679 371.460 78.295 236.894 222.560 0.683 322.271 244.209 421.910 346.384 346.831 359.385 282.038 223.577 267.651 340.736 377.724 310.639 365.090 292.278 265.537 59.949 358.067 294.516 318.790 237.901 297.695 +49000000 (returns) 315.475 385.624 272.519 292.232 394.984 293.074 367.876 308.863 347.036 132.501 7.866 378.377 293.271 232.450 338.169 274.491 444.426 0.033 437.298 288.951 37.133 411.745 171.720 228.193 364.123 362.614 378.504 353.866 253.426 344.777 307.964 347.377 +49500000 (returns) 296.732 269.982 3.370 371.430 273.531 302.499 329.815 145.433 281.909 228.086 181.798 244.221 384.787 239.462 275.479 350.836 278.473 186.919 262.735 220.305 238.357 249.030 255.010 265.362 294.876 318.854 9.591 227.195 294.653 323.567 282.345 431.677 +50000000 (returns) 9.198 370.417 297.747 246.919 315.977 250.225 339.014 299.555 4.298 296.819 489.139 276.224 346.491 277.204 302.292 328.136 418.039 332.121 315.533 362.337 278.274 280.111 243.946 288.944 362.137 250.981 277.445 393.453 293.591 379.840 434.244 229.457 +50500000 (returns) 321.056 0.000 239.744 240.176 242.952 285.191 176.238 257.989 319.404 191.539 334.296 413.288 250.709 243.696 364.807 252.123 149.773 218.635 171.680 232.196 259.789 415.875 9.026 295.442 233.824 249.577 252.237 251.295 0.055 218.523 322.399 383.144 +51000000 (returns) 288.646 404.990 415.473 356.306 352.558 288.284 200.895 317.439 437.867 361.156 409.086 280.128 274.789 339.193 363.686 403.350 339.821 317.337 245.813 347.315 279.179 213.502 515.103 379.423 410.707 306.570 369.808 470.988 282.530 399.770 257.327 338.138 +51500000 (returns) 380.962 324.854 202.416 4.409 256.974 360.200 270.341 304.747 255.444 302.362 256.185 244.426 359.487 279.593 283.305 9.178 268.702 8.743 334.368 297.337 371.125 8.868 316.429 237.833 277.663 215.646 248.288 299.151 344.708 250.373 378.754 252.787 +52000000 (returns) 294.805 343.256 295.435 297.281 406.805 419.639 290.979 448.424 472.709 277.540 320.582 256.186 265.740 334.556 341.443 245.893 363.458 436.791 265.769 445.196 279.674 357.755 447.499 338.681 321.347 414.936 419.479 387.839 309.536 422.833 285.484 287.164 +52500000 (returns) 339.616 424.312 341.765 9.907 325.076 437.069 283.988 349.637 327.611 209.257 377.602 314.054 243.389 307.583 229.399 337.622 351.535 255.311 290.169 207.333 223.785 211.594 261.951 426.538 357.345 194.634 373.241 370.163 288.392 320.916 250.470 222.862 +53000000 (returns) 298.011 257.705 350.606 315.568 197.461 255.966 331.493 267.346 237.098 381.653 400.420 340.321 279.436 478.358 379.179 230.858 343.028 311.537 173.702 363.620 217.056 221.201 224.851 417.097 336.906 349.943 332.047 268.588 286.380 173.536 363.978 381.150 +53500000 (returns) 347.653 229.570 318.331 391.237 375.580 307.741 226.838 249.361 335.709 296.767 320.000 145.931 320.849 367.865 289.219 272.481 431.848 236.393 339.236 307.124 340.040 248.210 231.559 281.413 280.857 475.471 386.433 239.827 194.298 167.570 305.574 402.700 +54000000 (returns) 312.180 335.402 363.925 299.026 279.353 257.039 305.874 187.455 379.076 408.756 337.638 293.786 383.609 423.609 376.646 248.540 366.760 391.895 362.025 288.264 260.845 427.528 297.655 40.110 345.427 263.738 341.045 255.234 354.121 279.020 361.818 256.787 +54500000 (returns) 351.061 275.335 290.318 389.739 262.158 252.440 355.849 381.422 401.263 0.000 219.894 424.796 314.208 333.039 358.242 322.018 340.181 348.586 320.818 0.000 376.717 290.348 322.313 255.142 324.222 329.996 334.644 456.093 224.606 352.927 320.208 410.402 +55000000 (returns) 335.342 378.047 371.975 259.724 319.450 256.910 218.975 343.915 129.368 327.060 356.080 296.467 326.794 348.280 335.150 237.319 333.497 209.226 7.569 291.228 283.418 220.370 332.449 271.697 282.904 244.681 309.760 351.474 372.491 267.569 215.652 290.356 +55500000 (returns) 278.959 421.063 169.502 348.923 222.629 394.925 323.084 307.173 306.490 269.016 261.388 353.973 347.507 423.627 397.585 320.157 409.269 357.001 234.186 223.107 0.000 341.779 276.958 230.206 322.962 242.944 108.856 157.402 293.821 382.721 348.636 293.514 +56000000 (returns) 326.866 295.049 232.227 372.266 455.286 295.751 257.737 321.445 301.752 274.875 242.712 289.142 315.295 298.985 442.616 258.852 209.726 276.477 355.035 396.808 182.063 303.977 322.574 358.825 348.560 276.774 234.792 256.172 372.335 313.221 368.679 366.436 +56500000 (returns) 449.361 326.178 235.098 268.326 353.497 434.270 347.797 441.973 218.752 337.214 315.672 279.458 325.138 270.518 239.023 307.064 471.784 262.379 310.029 520.646 320.216 348.607 371.842 397.127 367.570 298.649 329.893 489.258 335.340 218.629 337.291 327.202 +57000000 (returns) 266.872 317.987 355.725 368.098 234.061 252.093 224.088 308.824 249.087 379.285 296.916 382.644 271.140 271.187 424.253 289.832 249.648 321.427 312.876 319.235 322.905 313.110 32.677 251.605 270.978 284.633 279.328 341.547 313.078 222.560 2.532 234.355 +57500000 (returns) 257.197 244.001 288.626 276.194 407.465 260.235 279.249 371.721 293.000 291.836 160.688 251.945 0.038 250.114 293.040 287.073 168.829 309.643 249.071 229.942 236.256 180.384 212.442 316.529 348.686 133.243 310.713 277.352 292.618 321.002 503.469 190.299 +58000000 (returns) 322.874 273.101 245.634 284.943 329.096 299.351 298.012 299.421 308.072 312.618 349.458 312.335 309.292 316.707 398.991 384.330 310.197 283.077 320.514 319.517 328.833 341.891 383.766 240.891 226.614 312.670 338.362 346.743 322.385 288.456 330.162 280.739 +58500000 (returns) 356.614 162.526 260.939 425.377 293.920 335.517 265.991 318.789 195.973 327.463 240.693 272.726 188.942 242.870 262.206 375.320 241.116 5.089 396.445 214.399 323.004 368.931 263.354 126.357 274.105 284.070 205.185 202.828 370.380 326.961 356.206 332.987 +59000000 (returns) 406.794 375.664 318.461 263.677 335.350 212.820 164.922 350.130 218.242 424.543 288.303 447.125 244.249 295.503 221.540 366.734 209.879 280.735 336.189 306.011 389.066 5.111 395.281 329.585 214.052 282.267 298.651 6.499 277.932 369.380 385.868 341.564 +59500000 (returns) 356.571 13.179 287.219 368.422 370.673 348.948 288.250 309.827 305.850 335.534 299.903 348.865 374.469 352.394 405.196 296.435 260.344 306.860 307.956 319.574 299.999 248.410 378.072 249.234 390.640 301.806 332.877 342.290 293.099 321.855 345.490 274.479 +60000000 (returns) 331.236 273.722 281.460 331.049 208.486 184.332 339.198 356.707 274.049 357.241 241.693 214.460 360.123 321.761 406.714 216.552 216.241 211.356 238.442 244.589 287.543 250.942 361.833 176.059 341.594 301.774 160.938 256.314 373.051 129.323 332.237 268.197 +60500000 (returns) 374.518 260.216 374.731 367.297 15.724 239.944 336.605 410.090 341.836 280.201 284.737 307.877 202.876 301.775 322.888 424.490 324.950 255.680 384.480 366.384 497.549 252.457 282.228 260.609 251.827 298.138 160.719 449.093 357.541 376.549 329.861 400.829 +61000000 (returns) 328.552 340.185 317.267 356.388 397.172 323.088 224.026 190.433 353.351 330.523 308.038 262.284 291.529 5.021 169.907 249.000 248.518 313.037 307.283 420.495 224.932 253.055 220.887 311.269 335.566 385.192 396.576 381.143 277.991 286.102 308.762 264.568 +61500000 (returns) 362.814 293.597 148.694 401.806 203.911 455.523 246.698 368.618 283.983 332.066 292.781 351.253 437.760 226.072 189.321 268.711 311.973 384.261 455.525 343.516 357.806 456.452 302.516 392.412 386.961 288.055 359.892 305.592 314.660 250.462 264.104 208.180 +62000000 (returns) 338.037 332.854 429.533 271.095 236.833 349.268 303.675 278.911 285.978 289.465 338.377 310.550 331.753 370.545 372.031 245.458 151.957 213.101 126.303 232.785 244.715 271.310 328.699 258.938 341.029 301.326 399.159 274.688 376.499 273.231 236.989 360.515 +62500000 (returns) 228.794 397.650 261.658 382.788 291.760 56.537 373.978 256.999 339.368 306.257 181.109 282.279 389.158 358.911 248.130 390.640 253.214 211.579 333.267 285.750 419.063 300.786 389.437 395.355 175.718 253.492 198.489 5.081 357.400 266.641 214.293 159.640 +63000000 (returns) 169.902 177.494 367.496 494.985 439.351 315.485 330.871 306.679 334.820 290.042 266.253 313.570 424.013 306.435 302.186 268.074 348.791 313.893 239.905 283.100 428.389 242.076 98.273 326.417 420.487 351.671 374.158 255.383 348.458 335.191 205.398 336.729 +63500000 (returns) 320.029 416.439 341.917 261.533 330.006 401.463 227.136 276.695 411.352 305.264 434.115 286.528 424.387 484.363 382.709 341.657 339.488 400.677 354.250 351.722 240.968 206.554 430.608 300.948 241.246 426.692 290.653 434.941 309.328 411.265 251.361 131.408 +64000000 (returns) 548.100 239.342 321.304 204.263 350.005 363.754 180.480 257.354 335.617 286.815 387.416 462.475 306.862 435.405 352.904 431.751 215.250 286.303 329.906 299.654 374.612 297.924 323.079 407.429 4.402 320.915 245.590 286.034 325.157 482.721 233.203 229.653 +64500000 (returns) 338.101 342.613 6.213 305.233 279.193 291.901 170.361 307.805 318.023 372.503 187.694 332.143 415.479 336.942 334.870 326.610 272.580 285.897 299.041 323.274 355.920 290.424 356.409 321.240 445.698 270.876 346.696 118.593 486.174 299.684 302.314 301.532 +65000000 (returns) 117.974 496.767 383.785 390.091 371.996 271.363 383.736 354.608 361.192 199.976 284.444 314.592 445.075 424.478 281.421 395.567 253.673 275.375 332.654 239.447 295.546 347.407 351.224 364.051 315.527 416.546 280.633 350.821 258.842 382.615 365.031 303.122 +65500000 (returns) 316.160 327.673 225.223 323.471 314.457 260.931 265.969 319.436 311.133 271.736 336.161 227.537 356.380 447.794 352.244 427.338 353.767 430.098 376.302 227.827 340.632 189.691 417.739 379.030 456.625 212.495 322.489 279.304 431.616 213.912 338.817 317.728 +66000000 (returns) 220.172 0.533 345.983 371.954 362.824 331.154 424.481 274.767 282.219 347.329 355.706 455.459 403.028 433.288 349.441 314.961 296.911 386.092 342.152 390.132 275.794 314.507 374.738 296.336 228.745 379.480 364.191 270.303 266.228 266.476 297.972 238.831 +66500000 (returns) 412.921 280.332 335.954 407.806 295.333 305.257 283.928 398.047 339.900 361.108 330.773 397.084 318.564 346.567 411.738 370.654 269.711 260.849 3.584 376.392 393.481 324.053 463.043 317.047 0.000 282.405 353.876 330.394 334.875 378.707 306.339 289.734 +67000000 (returns) 453.091 258.328 405.879 285.468 299.213 423.361 439.133 303.271 335.352 288.627 272.152 300.199 434.644 403.765 264.488 285.861 380.208 409.819 345.464 262.067 296.667 361.031 367.014 442.437 390.810 355.537 215.095 303.955 30.496 437.549 376.681 311.426 +67500000 (returns) 393.778 364.328 431.725 381.187 266.801 310.690 393.850 316.277 280.972 387.225 269.935 253.318 318.690 391.713 316.155 349.982 282.750 375.695 316.539 259.237 342.407 230.770 422.314 326.345 257.935 353.525 273.908 310.624 373.155 325.366 451.767 261.828 +68000000 (returns) 324.159 363.288 195.251 324.991 364.506 270.603 123.850 375.745 338.757 329.613 277.433 369.179 320.638 437.867 362.310 340.065 393.141 383.227 291.792 208.505 272.466 383.232 372.074 145.010 301.584 346.145 174.547 370.337 401.402 338.804 368.854 405.409 +68500000 (returns) 394.898 195.387 420.458 221.149 251.918 420.682 277.760 283.564 239.082 224.363 292.800 242.085 291.535 281.887 66.829 243.116 269.193 253.306 203.581 225.763 373.034 379.778 312.756 310.883 385.381 322.908 321.130 288.363 331.155 263.184 255.122 234.982 +69000000 (returns) 217.953 438.322 349.962 423.142 153.034 392.651 462.130 349.330 295.074 343.209 284.569 319.557 330.063 179.661 398.228 310.281 293.848 313.716 371.356 252.152 420.967 419.020 461.199 318.716 231.822 400.548 371.236 404.138 15.153 313.412 464.034 486.791 +69500000 (returns) 242.517 354.058 264.356 258.132 271.595 287.953 347.303 155.899 501.235 272.801 493.763 304.656 435.314 377.604 393.649 147.707 389.693 344.569 391.500 385.880 279.008 310.907 372.069 463.403 316.774 346.507 264.015 344.254 320.659 27.743 371.111 334.036 +70000000 (returns) 325.068 303.126 292.422 314.002 481.535 414.678 254.041 341.797 373.457 323.745 228.481 361.704 305.199 239.521 315.133 348.180 374.957 415.145 337.117 331.633 427.333 411.578 289.608 236.495 296.387 419.595 386.232 320.607 270.095 412.938 6.400 282.466 +70500000 (returns) 213.275 312.330 426.470 317.967 313.409 350.907 256.844 347.613 187.060 311.371 357.145 358.046 239.459 284.991 177.439 274.868 278.109 373.202 263.447 307.005 286.716 309.594 324.597 335.792 454.392 275.187 275.350 354.614 357.504 317.046 361.007 326.170 +71000000 (returns) 305.065 305.710 442.278 375.173 315.179 475.838 308.338 433.335 329.713 287.650 343.602 340.077 362.507 318.979 442.268 189.768 300.060 266.719 328.653 331.941 337.973 355.847 268.855 358.315 423.296 239.898 361.860 396.057 314.058 375.149 309.698 346.434 +71500000 (returns) 314.421 427.162 430.731 453.205 478.904 296.894 415.292 276.048 339.677 339.084 325.521 299.433 469.393 307.353 429.172 343.526 249.740 399.264 6.638 166.612 389.602 431.338 451.292 312.407 240.368 411.759 301.378 316.846 451.882 365.218 285.028 441.320 +72000000 (returns) 364.649 392.275 328.421 292.743 255.297 314.249 328.694 348.862 204.753 359.475 268.535 224.012 273.186 316.640 411.069 344.560 392.930 303.695 335.026 313.945 361.883 333.329 322.755 321.020 335.147 351.576 308.674 414.151 347.761 311.722 347.642 287.115 +72500000 (returns) 353.475 287.034 380.487 430.309 404.457 411.174 272.002 301.817 348.195 436.585 385.019 253.844 309.335 315.578 306.700 300.186 387.062 308.141 327.333 305.987 359.855 319.929 402.607 202.155 423.387 317.363 429.923 453.186 350.299 361.039 427.849 375.302 +73000000 (returns) 1.833 512.219 398.581 424.378 355.714 230.792 232.337 307.883 336.440 267.917 458.523 362.204 442.270 298.266 364.757 103.325 101.726 80.046 336.401 385.958 366.057 358.419 341.204 357.068 436.272 322.078 337.164 357.798 284.986 413.762 93.508 323.163 +73500000 (returns) 301.089 247.524 290.211 305.012 343.292 300.528 284.914 327.291 322.847 363.820 203.417 350.171 282.368 312.741 353.495 188.936 343.873 336.139 290.505 360.969 366.868 289.003 476.778 352.322 275.062 357.596 440.999 367.578 323.479 217.154 315.065 358.646 +74000000 (returns) 323.714 270.333 213.719 415.804 430.462 388.786 268.035 365.779 474.467 237.672 393.331 318.634 344.928 321.916 299.056 431.022 369.189 327.114 375.322 401.418 319.873 473.452 442.187 473.859 346.870 288.686 173.123 250.698 325.499 374.322 267.352 280.001 +74500000 (returns) 258.842 221.936 400.073 355.266 381.689 383.303 412.111 292.900 287.305 377.022 249.776 324.337 280.162 268.843 375.232 347.567 382.556 391.380 267.841 358.029 355.090 433.414 388.288 345.633 287.043 331.073 315.764 237.137 418.584 244.606 328.208 346.049 +75000000 (returns) 220.143 404.629 381.722 357.375 268.396 393.696 362.089 371.365 449.134 392.841 383.890 354.535 483.825 291.223 244.402 245.176 414.619 351.732 361.443 502.497 417.203 242.450 418.918 385.868 243.987 238.026 285.627 369.429 316.359 268.930 431.597 338.110 +75500000 (returns) 287.706 213.356 324.429 321.239 401.029 460.509 416.377 187.026 308.715 279.471 362.174 271.403 406.069 259.676 384.492 347.186 377.738 274.527 295.180 298.591 397.497 397.438 443.864 406.300 317.100 284.362 352.116 355.911 237.276 362.802 247.441 400.260 +76000000 (returns) 384.195 465.932 413.377 277.525 322.500 338.750 280.564 385.712 419.326 236.417 342.480 140.939 325.166 316.076 264.111 309.430 343.060 266.229 359.347 0.059 417.736 12.872 304.685 381.755 284.404 300.372 289.463 274.249 3.432 281.159 127.262 261.000 +76500000 (returns) 304.774 321.490 270.941 367.379 275.011 362.247 317.850 326.514 336.981 127.240 351.989 294.699 390.879 317.485 355.976 280.211 276.760 275.920 441.544 223.860 1.575 415.553 325.063 474.065 418.716 443.468 191.916 346.406 212.936 422.526 358.147 424.952 +77000000 (returns) 387.725 329.583 319.969 296.553 458.445 374.426 343.809 242.454 357.079 340.441 236.761 247.742 241.920 407.969 264.534 312.376 374.262 278.574 332.129 231.651 391.363 283.724 132.297 308.174 304.278 209.319 292.918 271.780 388.303 228.526 318.088 342.015 +77500000 (returns) 268.036 330.915 422.979 356.076 308.602 398.334 346.757 370.741 261.697 356.763 287.234 369.409 373.614 409.860 462.239 338.998 251.349 268.611 285.190 284.437 348.126 341.785 328.521 440.533 389.370 289.218 381.402 329.753 407.587 272.152 7.258 407.824 +78000000 (returns) 289.964 427.280 270.336 247.483 370.853 401.716 258.031 447.232 30.877 291.820 300.934 300.018 359.298 234.346 170.473 361.052 348.138 266.752 259.491 447.510 237.139 310.121 345.583 272.762 9.716 333.433 326.809 394.740 168.656 206.943 300.302 252.242 +78500000 (returns) 341.084 421.015 278.600 408.952 353.777 322.374 315.814 328.402 410.339 226.067 455.920 281.456 338.870 356.649 388.860 359.444 270.362 446.504 413.296 463.695 376.903 408.267 309.983 282.412 338.680 333.876 321.146 387.141 259.835 416.881 348.098 352.600 +79000000 (returns) 243.112 365.570 380.132 315.328 283.421 390.754 324.007 437.447 299.325 345.415 415.744 336.099 278.604 298.235 231.191 349.101 276.955 382.528 404.354 405.532 282.276 241.217 444.511 516.394 329.714 353.358 319.058 404.309 418.119 366.151 445.931 372.923 +79500000 (returns) 355.187 354.696 409.200 379.933 290.873 301.069 118.576 416.289 277.448 356.262 311.556 440.783 390.819 357.348 344.571 347.285 113.680 285.243 431.196 289.205 308.149 320.044 285.465 256.226 488.204 355.257 355.729 340.159 400.509 405.672 274.997 331.228 +80000000 (returns) 417.172 327.406 442.480 383.918 367.785 251.304 457.542 365.939 533.670 342.521 414.600 459.849 32.945 364.127 411.978 317.225 376.091 316.041 328.947 337.851 312.162 307.254 389.837 377.870 377.996 380.364 382.291 221.153 374.738 343.568 363.928 271.932 +80500000 (returns) 355.345 263.427 138.227 254.266 267.528 228.940 378.836 268.685 362.403 358.009 382.890 402.275 354.523 392.305 190.181 257.941 243.964 214.076 362.494 215.147 324.622 191.529 265.092 289.143 20.197 274.463 377.687 273.937 384.755 219.470 241.088 323.960 +81000000 (returns) 489.917 275.111 378.141 358.716 360.953 430.336 343.359 362.120 310.291 248.455 374.817 322.973 420.203 364.611 340.587 470.679 354.445 250.745 449.645 333.916 222.818 483.233 305.702 354.106 139.868 306.301 346.736 409.662 356.362 318.624 431.680 285.834 +81500000 (returns) 363.435 348.790 424.229 399.574 353.051 388.447 373.273 344.042 374.957 356.547 440.772 447.150 339.566 353.655 297.845 343.600 422.086 459.284 383.409 368.639 443.050 324.014 352.062 295.436 287.763 419.813 409.116 282.403 352.115 365.726 372.318 363.772 +82000000 (returns) 478.591 284.611 421.748 330.600 389.496 337.054 240.759 197.571 335.446 365.047 346.668 316.262 330.700 381.297 383.664 311.191 259.155 321.698 322.467 293.499 403.501 256.219 451.809 272.214 323.231 403.331 278.411 237.240 331.743 344.441 377.656 412.293 +82500000 (returns) 304.192 268.572 278.667 263.896 2.511 150.722 268.541 6.808 248.416 360.819 359.114 280.728 251.385 270.266 288.029 348.295 384.859 312.004 270.353 353.637 179.129 239.126 350.198 306.144 364.053 269.055 105.792 364.127 256.219 269.168 169.500 261.020 +83000000 (returns) 422.128 407.244 411.107 442.790 317.406 368.451 397.881 328.797 347.347 324.993 341.433 302.602 417.287 320.735 319.724 354.758 337.851 267.071 444.663 365.113 421.120 430.781 299.130 324.473 293.896 379.010 349.639 383.012 375.417 352.982 327.551 440.444 +83500000 (returns) 404.115 282.828 336.955 443.998 283.284 220.474 393.414 308.899 298.631 344.384 379.285 241.757 327.195 150.843 381.053 373.220 296.053 469.712 362.033 372.273 298.475 369.392 457.805 366.454 337.924 378.969 375.400 300.203 325.761 278.635 404.652 350.593 +84000000 (returns) 357.001 4.400 242.407 329.085 348.644 345.572 383.427 202.115 286.590 366.944 507.447 321.418 378.322 262.813 292.379 342.475 288.586 345.961 286.068 373.146 323.820 376.868 452.735 376.232 310.061 159.221 392.229 317.954 205.590 490.864 365.849 432.138 +84500000 (returns) 76.977 386.807 329.307 408.546 357.703 377.628 242.907 296.183 421.802 334.706 344.219 117.654 473.087 300.670 396.093 108.864 319.300 331.909 317.355 406.624 346.421 447.990 433.609 263.849 188.323 368.275 333.682 309.939 369.191 354.898 415.214 357.962 +85000000 (returns) 376.135 295.529 373.323 381.171 313.102 383.546 293.945 356.213 381.533 434.119 415.166 378.020 299.640 333.849 222.764 412.246 370.499 416.905 375.142 343.438 297.640 371.909 276.758 397.442 329.695 237.727 265.755 371.355 393.947 389.347 381.111 214.793 +85500000 (returns) 272.372 343.336 285.816 319.482 322.367 395.399 109.449 295.495 286.663 280.677 288.625 238.337 223.356 331.779 308.251 257.140 282.731 219.042 251.676 260.904 425.293 296.085 307.743 389.809 359.913 255.543 374.654 463.881 365.258 311.678 311.543 196.091 +86000000 (returns) 267.517 204.069 273.657 200.937 345.052 336.535 216.124 370.347 268.434 340.538 271.207 516.728 320.485 212.698 444.832 296.883 261.239 349.233 241.995 16.652 327.112 288.130 169.300 337.063 331.118 362.555 319.010 312.730 248.209 314.390 282.336 351.649 +86500000 (returns) 393.422 304.254 458.707 423.104 410.799 296.887 197.603 341.635 352.833 390.466 408.033 359.149 240.600 413.022 347.018 410.982 427.332 267.984 372.135 355.563 361.711 340.569 392.416 437.124 447.602 248.535 358.588 439.069 360.443 342.586 369.184 381.674 +87000000 (returns) 372.480 276.816 349.818 306.947 336.780 250.891 432.528 388.289 138.312 288.903 359.742 267.108 381.316 390.162 412.932 351.890 304.623 313.380 260.615 421.107 325.478 285.247 327.418 341.264 357.714 364.991 188.677 390.002 384.491 331.666 449.769 354.291 +87500000 (returns) 372.738 323.075 350.344 467.335 238.779 327.606 399.722 390.017 399.731 364.436 303.581 442.899 384.260 291.250 295.342 383.345 289.055 494.729 467.774 335.855 425.051 255.510 394.407 479.714 364.397 342.839 382.761 443.448 378.290 367.601 391.417 427.849 +88000000 (returns) 299.580 338.712 310.245 364.293 338.153 366.898 374.058 118.032 321.625 337.593 330.708 283.361 361.571 374.983 345.468 418.020 409.399 302.402 333.988 332.840 424.975 260.960 333.018 403.289 266.073 367.464 352.957 315.357 306.686 397.914 389.326 289.143 +88500000 (returns) 12.589 406.844 369.522 364.136 273.882 363.953 280.695 274.591 427.549 334.643 242.689 276.744 321.246 307.194 531.930 346.878 307.753 262.670 300.345 456.426 347.764 214.916 339.778 295.623 247.319 315.771 319.086 233.163 295.692 306.181 395.533 180.280 +89000000 (returns) 353.508 146.104 370.932 368.763 340.947 320.253 374.565 407.804 398.471 376.921 502.431 366.225 383.201 349.520 350.698 501.374 418.828 215.857 317.480 438.826 418.962 294.648 479.182 387.809 420.591 373.671 285.674 285.143 363.522 379.629 323.345 398.360 +89500000 (returns) 358.920 391.876 168.858 256.228 301.836 361.033 286.117 299.200 136.793 149.872 416.361 373.442 273.701 272.584 447.933 269.859 347.532 320.964 400.066 307.741 393.471 245.947 6.281 237.316 400.992 343.912 311.422 378.682 351.288 238.969 465.087 442.356 +90000000 (returns) 358.251 372.303 312.127 381.070 449.484 385.649 360.607 419.886 491.913 335.822 375.062 331.961 461.509 403.600 445.322 358.038 333.104 352.079 357.303 365.821 350.459 409.322 363.201 314.334 474.288 357.531 384.384 364.530 393.026 349.173 337.157 337.075 +90500000 (returns) 391.130 348.172 305.524 199.873 333.701 318.749 355.772 359.398 393.278 447.900 252.776 322.487 251.116 415.702 316.987 428.616 361.464 406.840 311.359 359.591 283.846 348.725 385.796 300.624 394.303 374.929 388.977 376.399 443.823 250.238 444.750 282.479 +91000000 (returns) 288.705 305.998 336.119 311.707 488.251 440.450 345.409 449.438 329.909 330.500 412.309 332.906 11.937 300.156 35.303 324.325 303.536 449.737 336.906 379.619 351.861 454.644 271.788 369.308 413.176 271.270 452.589 257.809 252.835 336.195 379.048 446.167 +91500000 (returns) 298.516 283.477 308.116 282.777 299.981 280.872 339.757 303.401 260.348 371.681 375.457 295.040 400.070 301.712 278.551 227.495 553.979 252.408 366.042 486.792 288.645 2.832 325.530 305.881 284.327 352.594 250.055 309.280 370.281 222.301 297.040 300.858 +92000000 (returns) 311.621 353.120 355.680 383.595 446.328 397.147 301.722 328.562 413.335 313.034 342.064 354.981 355.474 370.818 365.662 486.354 363.886 324.010 409.825 416.917 338.477 392.102 372.589 327.627 393.275 420.873 493.863 438.444 537.745 320.056 321.558 434.907 +92500000 (returns) 312.454 350.282 0.000 390.449 517.277 297.540 379.997 399.790 272.791 292.184 22.501 340.494 349.631 269.605 274.410 371.526 156.272 309.225 206.074 363.500 372.399 427.493 391.281 357.889 393.489 300.942 322.406 336.575 374.341 417.584 416.782 347.138 +93000000 (returns) 254.938 304.875 449.063 328.893 344.551 329.215 302.705 400.336 358.133 396.998 344.445 275.139 277.358 350.920 8.825 322.135 414.139 318.524 7.534 425.084 489.077 302.250 343.179 336.104 378.557 405.244 330.948 421.436 441.882 373.447 422.511 349.338 +93500000 (returns) 284.153 341.652 339.361 318.819 276.261 339.253 321.878 396.628 407.654 401.126 396.071 294.880 406.946 401.240 370.328 448.393 475.684 337.031 338.507 334.008 390.029 299.858 328.794 272.801 326.132 367.437 357.626 409.744 314.740 321.823 330.229 377.409 +94000000 (returns) 317.398 361.518 363.030 289.200 354.030 362.920 388.977 324.770 239.577 338.874 350.689 325.146 395.033 397.725 424.481 396.373 238.982 385.495 428.764 488.374 283.188 352.670 327.391 342.861 329.176 313.950 359.371 342.578 267.554 379.967 396.991 409.929 +94500000 (returns) 362.896 0.040 359.126 295.247 288.395 337.756 327.806 391.342 57.017 289.967 378.692 296.826 274.576 422.132 350.820 301.660 321.850 380.469 351.097 360.034 303.240 329.817 323.773 427.027 263.599 409.095 335.608 393.044 379.968 455.482 308.400 308.980 +95000000 (returns) 294.816 419.589 364.699 350.030 381.575 433.510 460.305 377.525 1.962 389.893 351.451 372.689 350.556 425.487 296.389 303.567 430.919 2.386 370.293 235.043 322.335 300.115 334.950 369.281 428.333 379.904 297.231 0.059 270.507 343.184 372.211 343.656 +95500000 (returns) 279.345 275.931 337.765 372.823 242.404 266.322 343.654 266.095 358.260 333.132 442.488 307.663 322.462 342.006 361.922 284.422 404.859 0.510 402.213 327.608 272.785 367.563 309.572 305.171 380.771 374.756 260.600 325.534 295.403 388.922 299.914 375.039 +96000000 (returns) 319.716 375.318 256.492 324.170 329.485 343.778 389.497 294.993 337.832 351.257 310.680 387.089 390.509 419.229 421.546 313.439 411.266 369.119 383.654 296.754 345.708 361.737 408.030 468.801 291.975 358.883 360.885 354.450 314.988 435.461 448.069 337.609 +96500000 (returns) 419.536 373.268 368.930 443.237 361.243 325.502 455.839 408.818 295.596 396.416 400.872 412.281 419.718 452.419 307.744 373.733 354.968 334.201 391.372 316.644 464.865 414.324 0.000 369.802 313.616 393.813 327.390 340.662 399.198 356.379 345.931 327.747 +97000000 (returns) 289.826 354.440 375.648 373.101 354.905 329.100 352.451 321.994 368.524 277.209 265.742 322.607 286.425 293.602 335.645 280.860 422.781 351.023 370.421 311.474 317.276 324.854 365.904 153.643 327.751 374.825 288.998 465.891 363.958 313.732 367.796 272.880 +97500000 (returns) 304.040 338.965 262.580 0.166 276.100 408.888 412.864 311.016 356.193 333.214 414.770 350.008 282.594 393.477 367.583 346.380 350.204 292.701 334.786 311.194 246.815 376.426 334.861 375.264 365.818 306.592 315.921 337.132 337.523 279.843 350.956 402.556 +98000000 (returns) 348.431 373.568 367.736 331.635 427.152 292.196 0.507 240.259 386.737 274.383 228.183 390.064 433.907 369.493 407.116 0.887 371.559 384.429 410.532 393.647 351.174 381.196 288.546 334.728 353.727 417.758 390.329 342.923 318.973 456.727 338.523 252.004 +98500000 (returns) 320.857 313.162 296.172 313.868 362.729 324.299 386.290 409.279 475.384 347.835 414.840 312.874 332.143 379.771 395.926 349.830 268.550 419.897 291.476 262.774 359.739 357.436 299.179 153.032 20.354 272.810 396.063 310.340 404.018 287.400 336.874 428.625 +99000000 (returns) 315.599 370.999 350.125 445.574 409.840 259.701 417.813 477.854 310.320 288.162 362.564 294.517 404.124 309.795 349.008 386.205 350.364 354.862 419.695 342.191 385.755 322.887 402.651 271.928 318.989 472.678 384.714 474.091 319.109 345.959 333.324 330.613 +99500000 (returns) 218.540 385.932 371.267 399.236 430.557 307.469 402.495 463.678 397.934 357.621 357.207 354.778 388.950 415.558 355.127 327.331 478.165 372.474 383.865 431.402 352.713 359.218 338.466 378.936 367.482 336.194 408.275 463.676 349.446 384.247 393.192 397.283 +100000000 (returns) 348.750 318.277 355.962 258.081 340.721 453.547 399.778 282.991 408.637 306.403 429.906 375.666 443.555 431.590 341.577 367.470 384.313 381.152 399.835 371.293 7.475 336.251 333.387 353.519 397.618 385.557 349.270 328.560 352.523 447.519 357.194 338.081 +100500000 (returns) 242.747 349.127 389.138 316.289 327.680 301.930 135.282 393.762 493.610 367.944 399.262 383.997 369.693 339.418 389.145 380.514 466.906 357.352 276.744 426.252 304.155 405.874 396.256 333.418 309.046 386.309 307.202 294.803 479.122 8.336 358.200 345.591 +101000000 (returns) 404.750 29.403 486.418 329.779 369.061 366.318 336.336 291.184 405.966 326.510 381.708 442.198 373.848 360.699 286.599 342.747 468.313 438.784 436.383 417.172 376.544 393.644 420.107 450.038 346.311 274.963 272.621 399.876 355.995 323.373 432.446 359.619 +101500000 (returns) 299.267 301.235 268.548 357.701 251.912 302.862 311.603 348.140 276.480 279.481 384.540 299.789 312.878 224.244 295.653 288.505 329.969 339.648 287.827 438.333 304.984 399.143 321.615 278.370 218.120 332.892 264.590 335.770 355.350 479.310 262.399 357.752 +102000000 (returns) 335.862 254.111 330.848 444.174 391.294 393.632 370.204 335.278 345.576 339.263 389.601 420.565 395.114 350.755 422.815 440.671 401.314 332.733 394.134 345.337 346.336 449.151 346.070 351.332 402.078 443.075 342.840 334.660 417.934 445.668 346.847 363.966 +102500000 (returns) 306.800 369.305 356.517 287.595 345.217 402.110 434.164 434.173 283.028 304.854 339.795 340.960 293.985 416.385 296.105 379.133 414.916 296.795 304.020 427.947 331.400 378.260 287.410 367.236 387.473 12.921 359.126 288.817 473.411 358.324 408.189 332.925 +103000000 (returns) 367.087 293.020 425.565 249.859 367.225 407.765 456.666 244.730 326.268 395.355 399.111 268.103 393.478 376.440 325.205 369.291 355.325 226.056 337.604 512.953 312.705 476.444 391.121 312.136 376.505 248.691 317.554 326.285 527.525 335.660 392.328 354.373 +103500000 (returns) 342.970 315.885 380.447 507.363 403.895 395.402 404.217 390.044 216.970 384.277 431.291 389.041 21.035 294.631 310.125 304.672 414.389 379.106 422.518 364.745 343.311 424.442 345.342 263.065 391.169 209.491 440.073 449.377 486.375 311.227 459.823 376.822 +104000000 (returns) 426.160 418.176 399.486 307.875 383.451 423.719 384.866 295.272 342.380 385.184 393.279 474.614 423.611 420.125 365.547 356.512 348.961 395.391 352.918 305.096 447.791 288.067 332.695 0.856 423.967 308.157 372.272 441.318 364.775 438.631 261.611 355.837 +104500000 (returns) 352.584 313.078 320.699 483.403 392.463 360.116 365.349 245.977 336.731 412.698 405.667 256.964 357.872 351.632 343.563 442.473 438.265 475.760 477.900 407.092 392.399 379.056 306.182 427.736 269.798 285.654 404.236 312.904 490.605 413.159 390.825 316.398 +105000000 (returns) 335.843 407.496 323.146 399.859 360.560 474.310 378.745 375.026 480.057 384.886 374.300 374.929 434.705 342.409 352.269 426.090 338.215 443.851 529.972 272.296 437.922 423.134 387.742 406.180 381.605 494.566 424.347 520.627 298.381 304.297 342.341 313.616 +105500000 (returns) 424.472 514.033 0.000 351.297 309.413 409.449 407.439 341.109 294.451 307.466 374.715 279.589 11.884 438.909 231.000 344.173 444.937 430.754 278.737 419.661 413.259 370.084 322.630 370.618 423.039 359.737 374.681 445.626 353.401 361.796 367.263 385.838 +106000000 (returns) 345.209 366.126 303.463 451.145 435.935 300.105 362.015 462.434 299.151 285.492 366.190 348.715 448.630 388.242 417.737 319.023 354.330 383.395 291.165 316.181 332.159 360.367 432.491 318.192 382.191 408.120 353.339 375.039 373.365 445.929 495.105 309.990 +106500000 (returns) 405.321 422.973 528.204 481.298 375.387 375.120 382.549 330.309 474.481 363.897 369.289 436.509 332.461 323.240 337.910 347.193 384.658 367.649 443.830 356.374 344.860 356.998 413.123 292.457 311.745 391.960 401.483 320.107 0.224 423.744 442.670 406.318 +107000000 (returns) 351.991 381.717 419.605 392.127 366.801 298.650 368.619 469.867 278.632 418.789 323.719 416.973 291.189 396.382 404.745 377.324 352.557 375.356 423.794 326.772 374.345 427.413 371.912 281.528 375.728 12.158 386.425 375.180 332.401 381.109 295.464 388.862 +107500000 (returns) 361.316 454.939 348.631 371.380 333.935 466.709 408.218 456.489 375.377 7.850 364.989 367.315 343.435 460.306 426.399 302.523 412.145 429.126 394.368 5.335 374.538 311.312 332.473 247.595 431.396 349.192 422.814 335.319 393.931 396.690 376.892 487.963 +108000000 (returns) 398.589 405.917 473.210 400.774 395.300 380.004 390.352 361.108 319.692 2.825 418.049 323.752 417.394 257.940 420.175 289.874 409.745 412.537 419.568 360.171 28.884 322.189 393.252 305.033 402.236 352.617 49.321 454.559 484.410 427.926 394.145 363.935 +108500000 (returns) 371.468 394.982 278.957 367.580 348.096 510.540 366.236 441.218 394.912 302.158 459.723 446.706 400.061 428.971 460.000 381.985 496.110 442.098 229.836 409.288 351.648 491.686 397.758 391.389 337.957 374.506 208.973 496.426 429.334 251.984 408.331 390.434 +109000000 (returns) 421.727 454.826 396.428 344.240 475.838 420.329 360.832 360.578 336.885 435.401 406.510 394.225 416.092 355.707 444.283 6.800 416.100 398.963 348.779 378.666 433.591 354.641 318.179 377.145 311.094 404.582 335.544 323.770 361.651 452.813 330.525 485.664 +109500000 (returns) 298.786 341.348 331.740 388.089 7.605 38.008 344.336 358.295 475.426 446.668 399.011 332.656 1.212 371.908 400.264 380.133 313.568 398.373 411.095 311.806 385.869 369.965 332.876 332.249 411.344 365.002 375.924 426.827 412.686 460.707 436.733 449.626 +110000000 (returns) 316.239 424.017 329.834 333.414 389.866 481.670 351.085 353.709 377.014 399.837 399.243 352.108 361.022 335.558 417.104 333.662 455.542 390.138 253.780 297.233 352.415 293.680 380.658 323.551 340.653 373.980 347.050 369.357 435.064 474.654 341.223 381.812 +110500000 (returns) 419.191 363.683 392.530 329.101 378.466 433.320 385.190 385.255 349.221 354.796 380.453 419.996 365.950 371.408 461.173 420.908 359.754 401.821 519.787 364.415 344.681 414.783 462.063 333.719 437.219 276.662 361.315 425.757 435.763 454.598 351.644 288.275 +111000000 (returns) 492.262 377.165 295.247 289.375 364.669 406.823 398.091 292.468 295.125 371.044 432.939 371.521 377.938 455.939 340.741 374.754 386.026 383.129 498.453 431.626 327.300 452.945 399.258 17.379 363.614 334.783 433.423 413.149 483.961 319.586 427.750 449.372 +111500000 (returns) 325.402 356.054 350.542 401.230 405.676 222.116 322.203 444.573 434.392 375.911 334.524 354.589 371.600 417.396 458.385 308.048 377.964 307.878 333.929 390.185 349.767 400.464 242.818 326.091 343.525 357.571 479.530 335.498 356.922 486.581 409.417 366.458 +112000000 (returns) 369.174 393.623 385.383 218.791 292.235 395.046 320.733 337.250 373.344 324.487 398.316 444.465 412.175 367.158 413.512 407.465 298.590 388.791 382.851 351.642 341.585 365.822 352.899 353.161 371.885 287.859 340.415 463.684 390.037 368.270 310.545 380.928 +112500000 (returns) 345.811 391.308 364.175 409.601 293.874 388.610 244.566 344.469 326.326 232.254 380.229 382.033 408.488 351.730 367.028 371.383 344.162 322.160 372.885 385.126 353.407 292.242 319.143 349.825 319.583 356.519 329.108 310.701 374.721 366.882 240.888 353.401 +113000000 (returns) 409.223 5.200 454.152 433.892 406.394 435.243 405.004 422.078 433.353 386.707 364.102 310.149 346.492 419.481 412.761 442.482 369.570 437.298 290.788 341.441 341.551 217.730 306.233 404.040 389.494 390.018 430.992 389.126 354.668 380.021 276.595 334.104 +113500000 (returns) 352.686 266.241 378.225 329.748 359.964 391.970 357.809 450.257 395.586 407.654 399.313 430.272 337.816 318.771 354.653 372.931 405.739 399.869 434.045 377.896 387.024 429.681 411.279 12.400 390.199 515.721 320.323 520.929 374.036 390.467 371.679 430.835 +114000000 (returns) 318.254 378.778 389.645 301.881 314.425 414.647 366.830 384.060 93.251 362.194 295.286 302.183 312.805 317.837 423.875 8.873 443.233 414.267 359.685 329.215 298.007 361.818 439.258 263.769 257.121 291.439 313.705 324.972 319.995 285.701 254.299 409.962 +114500000 (returns) 365.228 416.408 345.229 347.274 403.024 463.806 401.506 356.699 228.855 379.270 347.686 302.734 329.403 344.876 366.258 350.694 397.748 293.003 418.217 328.512 422.017 350.612 319.566 372.375 4.890 363.971 439.647 413.072 338.635 453.960 434.871 333.442 +115000000 (returns) 336.662 379.029 329.824 373.024 387.104 403.271 283.697 381.330 382.914 310.936 311.059 361.720 489.338 387.187 373.363 296.134 286.344 394.431 305.142 292.378 378.809 366.874 314.597 362.513 339.727 337.297 357.592 393.239 345.138 359.334 326.333 391.735 +115500000 (returns) 343.847 424.846 402.287 443.289 357.780 342.325 208.145 458.936 287.489 9.200 431.764 322.059 330.447 333.870 0.049 351.409 351.290 433.850 385.567 351.706 370.028 356.554 1.558 383.578 367.856 406.275 335.127 358.909 472.935 458.938 338.352 392.036 +116000000 (returns) 441.947 280.238 347.836 7.830 290.847 338.394 416.101 390.412 424.900 330.745 282.522 385.516 0.757 409.263 369.432 358.281 439.673 285.778 373.795 339.285 454.613 341.644 310.346 392.865 267.546 297.067 236.282 348.830 432.196 413.372 323.071 457.864 +116500000 (returns) 375.918 357.963 385.349 378.138 450.973 380.737 290.384 408.281 418.729 446.508 378.131 480.747 395.327 429.656 441.652 407.342 476.726 315.811 469.274 269.065 450.665 364.460 411.302 385.044 444.087 415.863 310.685 426.967 395.127 472.800 432.490 410.206 +117000000 (returns) 218.892 382.323 324.911 320.665 400.557 360.921 349.681 351.354 377.022 387.119 349.414 332.164 302.596 335.471 392.426 349.118 400.636 306.913 390.179 342.591 467.529 359.794 403.793 257.359 319.151 318.746 483.695 456.194 250.327 442.852 459.467 431.858 +117500000 (returns) 357.521 350.977 367.580 332.130 363.787 419.600 356.916 386.240 424.730 557.020 378.187 322.497 351.295 305.062 379.061 437.035 340.177 294.190 333.586 406.845 347.182 357.513 387.274 362.296 403.394 431.889 374.173 368.722 398.141 406.659 383.985 376.297 +118000000 (returns) 390.617 433.355 344.713 307.264 397.138 3.271 435.630 422.435 392.818 371.238 398.898 355.650 430.714 346.503 431.645 331.570 401.770 335.276 280.667 293.855 431.237 439.753 228.484 380.004 371.072 366.937 426.948 460.941 377.296 346.057 325.714 449.688 +118500000 (returns) 406.746 447.041 440.531 388.912 390.764 368.713 325.747 340.827 327.102 363.047 299.760 503.157 451.254 478.110 280.331 382.401 402.054 514.307 379.746 370.349 468.807 400.246 371.421 378.366 368.376 192.214 420.296 417.778 401.290 336.529 433.076 330.577 +119000000 (returns) 505.003 483.018 346.144 334.982 437.434 419.863 385.442 381.758 399.626 422.647 444.991 363.695 407.787 332.086 400.803 357.160 0.001 485.775 402.919 456.729 377.250 412.316 422.811 479.521 477.190 404.074 244.378 418.209 298.456 371.022 362.518 365.686 +119500000 (returns) 299.133 400.589 338.112 385.118 260.263 395.875 414.851 395.452 284.320 475.610 321.298 318.549 316.121 447.833 394.382 310.562 8.300 313.410 383.690 355.420 145.434 328.086 304.569 390.608 264.089 369.774 339.884 409.218 335.652 334.581 305.321 0.000 +120000000 (returns) 281.255 429.847 431.826 432.022 371.719 340.615 410.608 505.898 317.263 401.176 423.742 334.974 315.034 286.911 320.030 408.499 426.085 361.830 333.135 442.661 415.767 379.499 419.667 386.289 287.167 363.387 355.202 362.982 388.774 418.851 313.615 442.038 +120500000 (returns) 384.356 347.263 345.729 366.601 390.640 357.678 358.521 433.766 499.853 391.053 356.095 350.120 439.208 412.587 378.745 474.652 402.347 402.906 307.135 308.682 357.880 446.765 383.024 364.998 438.830 484.686 307.307 324.275 384.808 358.668 394.967 326.732 +121000000 (returns) 248.197 327.041 359.180 368.352 408.895 357.641 421.158 320.379 383.167 357.807 313.304 460.473 344.764 364.903 457.848 314.475 407.687 285.154 366.069 339.364 414.485 464.407 397.102 326.290 410.801 488.946 310.697 440.977 444.552 292.530 429.617 472.129 +121500000 (returns) 342.620 296.948 306.082 341.916 366.749 372.644 394.525 453.949 323.539 384.314 435.361 419.819 285.062 313.564 463.806 337.288 437.015 349.610 454.554 344.430 341.792 434.868 380.181 351.975 344.478 445.507 435.033 482.822 415.775 416.635 301.874 372.560 +122000000 (returns) 370.803 351.862 271.282 361.822 413.850 457.163 327.524 304.086 369.078 413.760 330.117 409.773 333.781 287.108 409.467 291.480 400.422 397.926 429.303 312.251 396.220 338.075 438.797 338.257 301.587 335.481 310.009 339.388 501.183 394.497 389.020 383.105 +122500000 (returns) 367.003 440.159 407.386 388.349 307.505 392.251 375.287 389.628 422.409 449.597 380.930 337.341 473.400 414.583 379.016 344.280 306.731 269.273 455.187 427.583 454.701 376.813 390.094 377.378 401.441 387.526 307.166 443.553 421.309 501.208 392.224 380.314 +123000000 (returns) 339.050 283.892 342.265 465.615 305.419 469.865 488.238 342.185 356.031 299.205 391.820 403.607 390.594 357.448 462.143 407.944 395.630 364.056 376.237 408.389 405.044 334.962 484.862 348.205 424.313 445.632 397.798 398.260 512.510 343.334 315.097 378.745 +123500000 (returns) 398.309 429.745 318.194 385.195 339.304 254.002 351.530 336.950 288.091 342.172 359.617 477.566 398.867 415.747 330.048 392.646 362.533 343.943 461.826 306.565 405.669 401.289 418.261 412.487 367.244 487.038 339.919 421.497 343.887 460.794 283.534 329.497 +124000000 (returns) 438.176 320.556 358.316 427.822 502.862 389.911 353.615 306.563 392.868 358.005 385.956 364.176 314.183 355.881 397.720 365.235 336.791 374.189 335.658 365.620 350.989 490.111 319.788 267.962 396.049 443.972 400.060 397.379 411.952 436.570 475.204 453.594 +124500000 (returns) 313.876 323.875 445.763 460.051 296.068 372.720 474.998 397.316 443.367 6.731 346.714 327.775 267.810 455.091 349.305 451.612 385.278 373.952 324.354 316.886 367.824 473.227 311.742 329.820 338.793 307.325 332.052 338.485 298.510 426.422 278.769 353.323 +125000000 (returns) 328.773 343.325 344.940 360.802 373.690 369.887 330.857 368.629 223.753 6.182 362.695 329.939 369.237 442.339 371.279 375.955 328.421 290.050 421.494 454.549 373.110 346.639 286.693 497.137 469.587 409.422 353.475 312.255 468.572 306.693 391.692 323.576 +125500000 (returns) 411.639 407.142 368.435 375.943 399.600 319.774 346.061 321.210 322.212 286.621 367.813 400.069 269.969 284.983 373.681 270.729 372.066 315.397 404.100 294.671 368.329 452.267 420.822 419.346 291.942 325.369 365.029 359.245 405.567 415.538 327.731 341.162 +126000000 (returns) 344.111 485.370 339.871 408.459 415.483 426.454 420.888 365.174 351.063 376.798 404.069 435.567 385.818 316.744 430.766 366.352 443.320 321.561 308.367 367.155 464.449 466.628 400.902 359.609 392.593 353.710 387.533 393.544 448.180 348.285 354.989 401.745 +126500000 (returns) 397.122 362.536 375.785 343.905 306.021 405.197 400.663 428.953 387.097 410.206 347.641 390.790 437.285 352.137 391.544 377.068 372.623 345.072 0.000 458.018 376.957 307.323 443.867 494.235 399.038 358.270 411.838 368.886 386.897 439.103 387.025 394.089 +127000000 (returns) 444.437 421.782 432.301 322.347 428.039 380.387 382.370 369.059 367.084 466.502 346.477 511.845 448.236 439.054 412.876 370.146 368.357 313.063 421.583 395.336 468.404 360.001 431.565 327.745 433.757 348.514 346.289 533.978 353.751 480.321 356.979 277.163 +127500000 (returns) 366.452 349.690 350.287 349.968 402.052 381.925 383.334 319.796 282.808 423.798 278.810 382.017 370.205 409.560 296.523 342.095 340.511 358.482 395.980 350.109 361.699 317.747 454.894 353.194 389.180 351.135 388.017 420.500 348.441 359.231 365.157 385.357 +128000000 (returns) 445.718 396.720 369.457 303.992 369.230 373.954 277.430 362.536 294.410 320.634 344.272 347.973 313.606 430.812 297.362 300.779 347.181 333.457 368.915 362.270 289.182 330.384 325.474 309.448 326.791 354.819 320.671 341.850 281.141 359.865 294.231 331.683 +128500000 (returns) 347.408 409.655 327.042 348.773 372.918 332.369 500.425 249.935 428.458 373.753 411.650 371.260 346.931 381.589 387.018 342.731 496.776 387.303 559.341 454.932 456.314 435.461 338.378 471.178 336.847 418.207 479.070 392.767 358.806 425.549 37.734 386.949 +129000000 (returns) 389.121 378.466 391.730 349.777 390.249 361.142 267.694 427.228 352.839 386.238 400.829 304.488 443.006 373.350 366.539 352.601 388.534 344.184 414.093 17.439 380.819 380.259 380.417 318.470 399.683 345.799 417.794 416.408 421.932 335.032 388.834 333.646 +129500000 (returns) 345.935 247.874 433.747 340.096 404.474 377.345 450.109 362.096 345.784 424.990 409.622 378.645 324.357 359.433 366.754 376.597 443.725 352.376 329.565 313.452 388.705 403.406 344.618 355.300 347.524 416.758 391.324 407.327 397.401 241.812 345.149 366.378 +130000000 (returns) 275.758 195.528 508.528 366.851 400.203 363.421 375.797 346.808 393.882 453.610 365.044 468.126 462.545 386.543 302.185 413.648 385.367 468.929 339.549 373.715 332.865 422.601 470.734 358.230 326.185 446.450 405.285 359.823 385.838 391.371 413.379 449.621 +130500000 (returns) 386.420 397.933 450.071 371.477 342.832 345.902 400.478 361.571 426.531 364.737 405.525 426.478 325.636 273.575 381.200 363.051 304.715 390.104 386.178 439.908 320.477 381.336 339.234 300.729 505.316 375.780 332.206 409.095 316.756 368.405 361.975 296.554 +131000000 (returns) 377.062 438.917 402.058 417.686 524.326 352.801 396.901 407.144 343.515 420.478 407.725 397.539 431.988 392.050 442.181 386.402 351.120 367.078 341.478 390.104 269.879 334.468 363.977 402.134 393.710 373.271 310.430 351.612 348.599 357.346 328.525 420.691 +131500000 (returns) 421.788 323.588 356.523 0.000 353.751 394.059 424.103 446.386 385.251 478.733 382.211 360.904 360.915 408.864 324.006 357.239 383.130 360.930 358.454 387.572 432.091 365.512 417.035 390.561 449.082 345.109 472.843 366.801 333.159 357.865 365.053 440.290 +132000000 (returns) 228.499 483.849 474.505 336.518 349.515 382.305 361.932 315.857 465.183 282.761 295.097 382.443 273.352 343.623 303.229 439.663 386.487 366.327 396.107 370.774 343.918 371.605 372.741 415.371 417.568 327.580 410.979 377.654 293.055 254.481 438.955 362.166 +132500000 (returns) 368.938 345.204 295.561 405.963 334.410 356.508 325.478 409.414 0.734 400.309 515.150 350.512 424.137 420.125 430.617 402.004 358.369 347.968 227.432 417.823 443.344 299.815 400.609 365.634 354.274 391.570 391.401 419.827 394.135 397.999 356.246 357.837 +133000000 (returns) 370.457 385.005 336.333 313.478 360.003 430.048 379.833 422.681 393.209 429.137 460.928 378.016 407.359 331.378 453.023 434.583 368.848 406.652 315.151 442.532 276.446 370.637 322.377 458.036 305.494 380.761 409.209 329.977 262.962 297.411 434.887 423.750 +133500000 (returns) 371.961 342.802 411.212 387.838 434.857 395.023 380.981 378.515 361.494 304.906 337.451 417.556 331.454 363.058 416.402 360.175 443.276 335.242 342.220 440.198 367.813 454.529 371.323 328.378 326.249 396.764 385.095 419.939 399.432 433.576 389.872 362.287 +134000000 (returns) 407.632 308.308 341.950 346.493 397.005 447.018 391.572 463.621 292.304 327.298 406.031 270.454 402.153 441.849 379.998 363.887 450.919 302.636 408.404 388.097 385.145 336.725 381.207 383.939 439.427 343.802 331.296 450.238 362.156 345.481 413.942 444.818 +134500000 (returns) 462.814 380.096 367.601 420.675 438.460 331.828 393.153 335.281 334.286 359.783 381.408 437.857 419.815 396.830 418.367 494.941 375.073 442.884 349.713 508.548 368.435 537.818 320.207 411.350 337.029 431.251 519.932 482.240 360.438 387.030 298.525 458.027 +135000000 (returns) 422.558 374.677 415.587 265.223 396.061 342.530 393.473 437.634 492.863 426.594 442.242 258.310 383.698 411.284 373.588 372.342 423.048 459.319 314.661 246.191 405.581 403.106 297.400 406.558 337.393 397.196 291.714 306.982 380.313 436.450 491.473 479.751 +135500000 (returns) 352.462 265.453 374.787 475.745 387.602 304.435 554.477 353.078 483.965 292.736 443.540 362.125 400.612 434.461 315.250 410.406 367.694 395.076 486.527 345.030 322.291 356.547 314.731 348.440 463.110 453.017 328.331 393.586 479.239 331.604 393.520 290.930 +136000000 (returns) 400.819 228.330 294.287 339.043 450.314 480.062 429.309 405.730 418.536 429.218 346.500 430.563 309.763 458.180 347.156 428.269 359.638 330.359 462.911 265.273 408.378 3.791 342.062 416.625 381.086 445.803 321.248 436.511 445.712 403.685 399.324 352.027 +136500000 (returns) 335.762 476.181 386.257 224.157 418.910 344.573 314.550 401.559 375.205 425.981 359.827 452.805 346.063 438.006 362.515 385.420 362.301 288.827 314.516 429.236 321.036 363.854 428.140 342.748 395.974 395.314 298.712 329.551 389.791 473.247 335.234 345.919 +137000000 (returns) 457.819 353.441 327.225 302.000 417.728 415.893 380.190 347.002 328.203 429.296 312.406 570.605 494.028 29.812 393.676 411.563 257.649 320.067 460.628 278.347 422.954 349.428 345.014 398.921 404.570 315.878 429.112 382.527 365.242 368.303 408.996 384.395 +137500000 (returns) 419.766 349.209 453.301 500.267 36.446 452.969 311.490 365.530 379.198 422.648 383.640 342.476 435.592 287.698 310.784 354.397 508.842 348.144 460.383 471.715 374.918 372.114 384.772 394.448 419.440 394.007 325.265 365.419 402.432 445.798 315.007 362.132 +138000000 (returns) 398.488 312.284 386.698 387.788 442.021 300.507 408.560 4.842 350.487 40.663 350.594 380.059 323.176 331.523 355.848 434.376 350.114 385.771 286.501 395.341 357.766 323.046 444.387 316.424 371.870 409.213 208.522 315.004 324.721 343.649 548.573 407.438 +138500000 (returns) 427.837 354.642 358.758 344.483 345.464 335.108 390.329 394.986 337.027 266.924 366.277 450.409 326.333 325.105 426.381 416.808 281.080 358.608 419.409 370.085 309.058 347.930 360.351 404.690 392.425 477.647 441.770 365.275 376.180 417.235 282.273 440.343 +139000000 (returns) 415.252 373.606 256.769 429.261 358.797 396.274 485.267 388.970 396.487 367.723 380.248 390.793 324.358 365.549 398.293 308.220 466.077 413.995 396.370 348.714 309.727 404.036 314.614 342.176 495.618 506.731 396.590 440.643 343.444 288.612 334.772 410.816 +139500000 (returns) 400.418 417.644 296.124 414.004 330.889 323.436 365.454 381.098 8.308 375.755 367.109 455.894 284.894 367.967 360.761 326.635 385.108 381.810 359.662 405.945 327.296 318.460 382.346 307.201 252.009 416.598 5.757 331.675 366.573 369.959 304.564 394.564 +140000000 (returns) 312.891 365.763 323.112 394.146 433.433 412.561 413.205 466.648 309.332 360.291 378.255 337.446 411.260 446.746 448.543 427.745 494.489 330.621 409.075 463.035 158.306 380.813 432.044 394.618 354.886 358.602 362.891 435.495 376.132 409.316 375.858 347.159 +140500000 (returns) 209.685 432.937 428.753 396.600 191.239 409.277 350.920 359.590 491.311 376.840 393.544 390.352 9.999 359.835 169.292 458.925 364.834 366.363 357.691 406.794 303.456 276.714 441.517 395.757 359.951 368.755 361.025 417.542 387.912 447.250 316.790 367.585 +141000000 (returns) 447.054 419.156 452.535 347.330 462.176 351.930 446.993 390.819 0.220 371.102 457.797 388.448 474.740 425.897 391.287 477.118 352.336 436.599 333.359 354.313 411.911 393.782 357.018 396.021 345.140 425.319 509.033 361.117 362.943 396.111 358.284 398.146 +141500000 (returns) 397.850 480.936 459.689 469.112 319.853 370.070 510.316 479.331 415.183 445.909 407.411 375.377 462.689 367.984 328.205 443.097 372.718 386.012 461.527 461.894 440.156 462.201 345.828 392.898 354.341 372.881 310.007 380.859 331.546 407.587 316.384 433.898 +142000000 (returns) 445.598 376.428 362.162 246.166 385.048 434.615 416.047 323.510 339.412 467.800 403.410 295.660 388.903 350.787 350.872 340.999 410.789 430.299 440.381 468.589 392.895 306.520 355.488 403.744 434.410 337.455 376.594 440.591 417.145 456.891 290.145 407.522 +142500000 (returns) 418.692 405.569 366.476 468.921 378.452 517.305 328.698 387.435 452.972 410.796 330.509 413.414 517.417 252.866 273.619 425.887 357.304 314.972 447.283 284.518 441.726 293.888 487.317 374.207 355.540 377.613 451.585 428.113 381.073 394.418 488.251 351.953 +143000000 (returns) 325.654 315.019 423.188 321.385 356.645 406.900 378.863 468.596 477.278 440.411 343.195 485.723 364.922 387.905 355.750 518.678 345.894 419.406 340.136 461.245 377.839 393.860 338.673 455.520 392.104 333.895 351.378 361.719 340.289 295.381 368.291 428.365 +143500000 (returns) 461.122 376.750 417.963 341.761 453.002 471.003 457.622 9.031 456.689 317.480 416.931 423.567 399.398 300.977 496.873 380.750 341.872 24.040 428.361 339.322 377.928 409.640 342.505 405.464 394.225 422.450 382.463 423.654 460.751 483.452 379.881 454.850 +144000000 (returns) 474.081 407.158 397.488 367.041 526.839 411.795 458.134 485.592 384.998 325.445 370.537 345.878 312.042 391.399 382.782 392.049 466.087 389.212 418.281 404.446 359.699 356.029 428.579 348.106 416.083 447.060 341.841 419.087 458.675 368.749 335.839 369.492 +144500000 (returns) 433.810 381.704 349.690 295.748 340.218 315.268 0.000 420.428 467.144 421.809 370.848 390.374 470.487 353.938 305.224 410.662 424.991 399.890 379.700 409.594 273.155 372.273 446.831 379.832 429.073 390.699 453.584 360.071 389.393 262.174 431.085 440.479 +145000000 (returns) 278.530 409.486 437.411 389.930 409.268 382.963 390.190 384.470 402.214 369.394 409.725 306.710 427.500 393.064 428.457 309.964 339.964 469.494 445.566 442.039 491.351 454.487 423.112 470.206 408.577 388.834 320.394 393.991 0.000 361.703 315.476 411.106 +145500000 (returns) 303.454 337.219 392.324 432.454 420.307 485.837 440.461 291.467 348.586 505.933 391.350 450.740 280.933 364.945 431.666 319.649 351.873 412.208 397.060 410.344 446.702 377.429 457.086 354.813 461.011 355.409 330.121 382.871 409.887 350.159 360.392 368.742 +146000000 (returns) 258.918 406.615 305.559 401.842 402.954 390.869 406.144 354.663 449.010 371.772 363.339 502.365 336.137 378.808 397.216 408.470 321.950 301.598 327.359 409.683 350.059 350.694 439.086 434.673 322.528 408.852 381.919 366.054 318.501 368.557 356.221 442.710 +146500000 (returns) 439.953 369.347 400.049 352.730 373.283 513.841 448.684 0.000 409.143 296.984 337.027 383.659 389.071 449.569 389.898 330.386 304.614 327.339 281.451 419.520 453.296 345.794 404.295 455.098 371.576 376.233 372.034 564.068 342.010 382.148 384.481 399.089 +147000000 (returns) 365.309 377.167 347.374 342.323 420.186 364.680 345.129 385.773 357.473 400.902 411.049 415.698 348.356 369.429 367.728 352.753 345.466 341.304 390.949 412.035 437.365 344.848 384.152 420.063 314.413 424.004 333.693 357.483 406.343 384.846 371.746 311.857 +147500000 (returns) 260.638 373.299 425.911 368.650 441.491 379.512 431.332 337.448 428.731 548.392 314.278 384.932 347.973 295.086 434.842 403.270 359.994 387.795 440.767 475.676 398.769 54.401 430.161 380.772 138.822 358.076 330.308 478.613 421.349 469.731 377.953 328.774 +148000000 (returns) 386.231 317.640 468.361 465.482 387.703 429.842 452.367 269.386 325.689 445.643 375.847 386.923 325.108 293.312 322.739 390.528 441.509 427.189 398.678 485.638 451.839 396.340 364.782 336.331 431.382 233.001 257.087 397.035 395.214 436.991 404.684 365.327 +148500000 (returns) 419.606 249.699 337.741 429.090 367.613 336.874 355.962 378.936 341.588 414.899 422.804 388.209 377.218 299.617 380.253 313.948 303.676 367.558 353.614 344.113 327.463 309.893 389.375 343.472 285.088 333.504 457.278 364.243 345.308 397.989 373.398 450.036 +149000000 (returns) 326.679 398.248 301.752 382.691 373.832 0.000 418.231 431.604 339.783 341.885 382.691 383.688 423.666 298.495 393.878 413.189 499.048 313.481 433.520 429.336 435.340 376.284 379.640 321.272 421.967 441.729 373.707 329.060 316.241 414.475 397.800 417.282 +149500000 (returns) 359.604 396.730 323.491 285.289 345.985 335.486 316.061 322.603 322.409 409.143 344.640 391.645 395.608 349.043 398.847 482.256 343.513 302.616 450.296 429.431 297.239 393.876 489.671 331.424 374.581 343.154 299.921 319.382 403.504 353.401 447.054 369.793 +150000000 (returns) 304.118 478.961 414.025 340.187 348.002 312.472 326.632 389.368 438.720 388.190 320.603 337.236 410.251 384.205 410.847 388.914 411.199 388.367 423.291 361.569 325.357 335.901 362.592 332.562 334.320 310.367 405.956 326.060 329.332 380.623 377.831 379.227 +150500000 (returns) 372.679 392.454 404.620 392.083 364.063 376.743 396.608 386.052 443.803 365.576 357.518 386.921 234.093 329.186 233.633 304.519 305.952 381.238 416.308 335.099 386.228 436.799 382.238 288.947 335.304 355.816 359.733 336.364 332.443 396.858 384.107 259.316 +151000000 (returns) 416.151 316.660 334.356 373.663 357.217 407.844 401.384 404.923 455.477 335.634 373.569 369.782 300.790 412.322 333.106 277.696 397.487 406.702 308.962 416.246 370.802 448.261 327.144 419.893 330.132 308.980 416.347 388.501 291.106 360.355 380.215 384.428 +151500000 (returns) 410.198 320.938 372.983 415.464 375.076 382.307 421.652 376.268 334.154 405.432 367.094 380.642 422.225 457.601 448.393 322.298 387.062 404.688 367.615 445.647 382.135 309.100 339.592 279.973 490.244 275.340 363.806 396.382 373.928 363.712 410.398 314.668 +152000000 (returns) 421.062 497.765 475.403 2.054 368.884 390.416 411.975 276.426 438.659 335.957 417.210 447.719 293.300 350.877 456.871 396.952 313.166 407.342 466.083 349.381 368.537 393.062 373.936 363.763 213.681 370.316 358.152 434.177 376.153 451.203 362.767 173.837 +152500000 (returns) 315.127 403.746 350.041 380.314 400.161 423.783 263.242 338.728 310.681 352.348 362.071 431.863 349.133 440.585 285.767 341.919 402.434 305.354 355.114 361.977 275.866 424.800 302.906 357.568 257.158 295.806 280.363 415.729 390.076 260.100 344.342 371.057 +153000000 (returns) 466.724 361.172 392.312 395.835 312.295 334.624 295.249 355.633 423.247 354.098 316.338 378.767 429.818 329.466 413.964 340.262 267.415 415.677 455.325 498.310 339.330 370.437 304.609 312.482 288.113 442.500 262.664 374.622 334.961 226.910 368.607 363.206 +153500000 (returns) 290.315 322.527 350.293 402.732 345.766 344.459 299.587 408.211 412.984 388.187 368.217 480.096 458.640 308.935 446.585 362.669 431.450 376.131 352.270 400.103 385.518 324.794 416.102 324.220 515.899 425.366 419.371 377.689 447.337 304.064 435.280 413.296 +154000000 (returns) 328.682 444.102 325.000 329.189 323.924 378.683 401.416 132.412 353.381 412.403 388.330 434.540 428.809 464.166 382.147 345.564 394.261 275.895 375.534 380.587 393.912 376.882 400.834 383.920 281.210 391.994 315.837 282.837 420.935 469.941 288.538 395.779 +154500000 (returns) 346.854 444.082 297.280 288.208 402.519 471.305 410.558 353.424 407.061 423.388 369.553 374.844 405.399 352.442 369.596 406.283 351.975 386.880 334.041 448.024 385.103 334.750 395.280 416.318 361.684 392.650 402.136 377.022 407.272 454.238 419.854 439.198 +155000000 (returns) 369.364 399.992 16.013 358.649 338.362 350.553 290.684 346.250 325.778 339.352 408.937 316.903 137.842 344.843 356.485 427.297 401.796 270.032 432.860 406.336 399.432 454.387 340.823 294.097 329.059 384.810 385.851 351.727 413.994 377.374 328.756 465.180 +155500000 (returns) 561.355 379.354 347.056 372.772 349.527 301.132 334.876 473.427 254.334 438.941 394.601 375.189 353.772 320.154 425.934 400.757 440.881 408.157 383.663 445.511 449.985 382.921 382.914 346.807 398.999 424.170 447.866 415.228 417.674 340.558 377.636 357.995 +156000000 (returns) 419.962 338.092 323.527 305.139 314.619 296.298 478.550 397.717 401.769 323.909 439.231 346.502 398.487 478.361 384.751 370.710 331.840 386.962 322.751 438.018 291.406 444.378 428.215 341.401 297.059 343.640 410.163 326.067 394.383 298.000 363.455 331.128 +156500000 (returns) 286.818 342.346 287.483 349.400 328.969 439.024 311.199 409.620 431.327 473.963 325.141 327.200 364.139 421.993 423.232 364.973 414.267 409.907 380.031 489.352 381.105 383.107 513.318 469.849 327.656 465.385 386.639 15.200 426.076 376.430 353.565 425.715 +157000000 (returns) 459.245 375.792 488.232 383.619 288.450 423.210 327.898 460.566 356.836 350.324 281.024 461.690 422.155 466.866 0.050 313.465 413.673 436.763 340.855 394.781 485.106 350.792 404.424 344.896 442.885 397.406 392.076 371.156 456.964 325.857 404.373 395.672 +157500000 (returns) 442.754 376.045 438.930 359.268 312.175 331.185 424.800 378.472 365.309 396.845 359.273 357.516 433.141 389.396 456.695 442.346 326.867 339.474 325.722 397.034 521.365 430.012 476.016 431.129 434.445 457.068 427.850 366.484 371.478 423.203 405.531 414.814 +158000000 (returns) 439.705 418.945 379.060 385.969 522.127 359.283 0.000 389.735 376.332 383.241 458.340 409.182 310.734 392.661 409.660 392.794 329.947 399.443 388.216 468.184 375.565 425.796 313.321 392.714 379.863 385.247 421.775 388.426 438.301 439.047 359.595 391.824 +158500000 (returns) 370.431 404.046 372.464 403.621 399.493 414.026 481.528 367.601 403.032 396.645 413.109 419.988 318.928 400.791 335.750 387.611 418.371 30.738 418.153 405.193 337.878 405.282 379.966 362.895 408.119 412.254 331.623 377.353 330.707 363.458 390.920 384.764 +159000000 (returns) 313.854 392.675 440.588 453.369 374.940 415.897 9.073 400.264 355.574 442.957 405.624 401.767 405.433 417.868 361.854 394.095 317.345 361.525 418.494 401.754 420.491 407.564 360.819 463.789 417.952 412.701 295.560 348.311 409.866 422.001 341.383 489.579 +159500000 (returns) 355.730 378.620 410.249 326.941 358.443 339.964 379.243 140.122 466.307 136.597 453.107 313.698 434.701 356.980 330.984 348.816 461.836 391.482 156.759 418.241 365.057 362.990 391.002 391.591 330.289 338.138 291.222 370.395 403.805 397.468 401.275 374.751 +160000000 (returns) 412.434 503.724 349.082 362.628 337.760 356.231 342.686 507.478 395.172 324.802 381.430 385.825 388.774 370.094 398.523 378.491 300.090 394.015 352.812 360.988 341.162 368.643 358.594 414.885 346.795 388.724 377.704 415.368 392.603 343.170 373.079 386.089 +160500000 (returns) 342.919 326.501 383.907 377.638 344.719 377.500 386.493 399.750 316.410 436.045 356.827 368.240 402.023 447.444 348.165 327.692 360.538 401.533 338.907 342.093 334.333 344.325 324.244 326.326 314.487 347.490 0.000 367.945 320.536 375.099 332.086 368.828 +161000000 (returns) 443.381 439.428 433.441 435.110 391.322 370.944 253.585 484.244 429.489 514.768 380.122 410.163 386.302 469.314 303.489 449.782 320.668 307.017 304.035 338.138 513.942 413.715 388.327 461.055 501.164 399.494 260.182 396.395 431.952 399.120 432.419 392.149 +161500000 (returns) 0.000 443.132 353.746 435.429 360.928 422.234 358.550 386.912 373.887 390.219 365.708 318.938 455.590 343.412 425.995 432.389 375.059 451.057 426.720 392.231 492.101 311.064 447.025 472.332 251.272 367.702 453.026 257.218 333.808 381.917 357.877 398.947 +162000000 (returns) 378.496 446.694 325.897 378.186 506.980 434.281 375.295 337.784 425.782 366.663 327.685 361.856 373.657 364.139 364.611 410.285 360.345 336.220 414.783 397.634 359.236 475.699 350.394 421.739 420.872 358.216 432.518 14.961 408.102 464.544 421.926 381.303 +162500000 (returns) 417.999 369.815 426.759 472.255 461.120 350.016 396.820 383.818 365.547 357.341 356.333 342.641 365.063 358.586 381.752 382.067 377.409 353.620 349.731 358.396 354.207 329.833 23.245 482.956 380.617 376.761 375.713 444.235 445.500 6.681 410.112 432.279 +163000000 (returns) 404.012 429.333 310.309 358.382 332.286 361.938 401.596 334.926 355.026 360.394 448.111 301.841 329.257 403.966 408.412 400.068 423.820 369.402 325.982 390.004 279.408 365.703 349.440 402.412 387.801 474.474 324.104 393.031 403.732 418.108 349.442 282.651 +163500000 (returns) 456.334 438.908 358.901 394.306 378.228 409.261 410.250 395.432 382.237 342.447 417.719 402.988 361.161 376.921 348.784 379.778 315.599 442.459 367.855 439.630 375.155 377.567 424.555 320.440 449.957 420.827 386.487 384.009 501.156 305.331 399.867 342.300 +164000000 (returns) 312.665 330.630 463.440 366.939 458.228 416.362 425.269 457.470 352.753 405.640 374.958 356.130 475.845 329.688 328.549 500.009 408.420 376.496 367.584 395.312 453.237 394.307 372.060 433.060 369.517 289.495 444.437 376.589 365.544 471.383 405.639 283.096 +164500000 (returns) 348.908 363.974 290.729 383.180 462.292 475.110 357.464 462.339 340.743 401.659 406.576 446.351 333.438 502.663 463.163 427.481 393.130 432.390 497.869 432.685 414.060 425.587 464.253 498.330 366.266 374.291 319.870 310.686 383.540 429.121 490.120 0.879 +165000000 (returns) 378.837 307.534 405.578 343.106 377.189 384.084 406.949 442.582 388.822 331.298 452.706 399.075 392.270 436.938 443.327 373.853 430.874 357.111 390.815 494.237 450.426 302.041 407.414 310.826 428.103 384.245 357.231 277.328 340.759 445.257 466.030 370.920 +165500000 (returns) 425.278 409.479 437.146 430.452 489.216 362.434 413.106 402.125 331.977 314.503 7.127 386.391 402.121 383.291 135.337 416.076 414.702 453.551 404.035 441.245 446.354 515.628 349.721 391.002 252.426 415.130 384.541 453.850 330.370 431.798 399.555 443.757 +166000000 (returns) 372.084 378.291 400.944 277.427 342.443 208.631 406.670 368.042 321.839 363.884 394.418 353.214 49.899 393.081 506.322 306.592 270.488 401.935 406.247 379.256 385.324 277.839 184.580 391.620 166.099 342.355 379.021 373.893 289.330 420.753 385.488 299.195 +166500000 (returns) 407.567 376.950 378.607 330.476 303.012 433.029 421.808 416.569 418.049 393.588 372.968 334.494 431.281 417.620 399.840 418.318 411.974 358.150 342.373 406.045 407.496 377.172 7.127 467.341 435.367 449.418 427.472 416.124 387.094 430.608 388.330 318.226 +167000000 (returns) 420.709 416.718 358.350 420.898 384.810 320.984 293.840 406.646 456.599 393.063 330.423 329.275 432.244 385.936 382.774 396.576 366.151 402.917 443.748 415.183 371.790 398.820 323.352 327.430 455.605 344.903 364.739 331.039 308.201 338.710 310.846 310.778 +167500000 (returns) 335.575 389.045 391.771 366.226 356.925 355.242 444.630 443.271 270.185 371.069 307.755 425.778 416.760 408.750 364.248 345.072 36.246 282.386 414.810 404.274 368.326 373.615 275.505 373.657 328.620 412.886 371.905 358.876 391.336 423.290 441.141 441.341 +168000000 (returns) 388.171 320.460 392.566 372.885 427.751 413.066 367.715 377.472 395.052 415.443 412.431 358.134 465.844 351.609 434.621 356.933 306.531 384.145 454.894 398.822 437.827 330.259 392.872 472.275 307.144 388.323 386.095 334.494 15.227 310.778 394.053 393.852 +168500000 (returns) 358.553 327.031 323.678 519.550 405.513 360.806 334.334 5.128 365.980 362.956 378.912 458.066 398.599 358.526 338.091 419.191 416.177 422.954 440.607 414.490 338.066 397.208 399.715 363.345 323.194 420.391 368.764 400.259 477.462 329.979 419.032 452.104 +169000000 (returns) 340.030 395.423 414.537 338.573 368.716 326.080 346.548 357.029 406.449 406.700 358.136 316.114 378.078 375.528 450.121 448.047 393.058 386.712 495.946 306.879 360.666 491.864 554.377 378.883 345.183 252.269 372.947 414.754 375.660 351.608 482.034 0.000 +169500000 (returns) 426.326 406.073 395.771 388.473 395.298 361.912 463.193 380.852 329.314 404.214 441.854 349.052 339.083 402.992 360.101 363.826 470.044 376.564 419.182 394.003 346.789 250.102 294.270 336.394 397.151 371.457 464.720 318.526 416.865 375.104 434.319 420.677 +170000000 (returns) 341.000 328.255 372.419 401.822 349.729 388.148 312.960 396.339 482.199 337.869 452.208 460.885 446.041 329.864 423.871 381.617 415.374 393.531 335.073 317.086 328.681 315.621 456.822 373.352 333.801 461.877 375.981 311.151 327.527 441.176 415.079 359.726 +170500000 (returns) 378.328 395.394 522.816 386.885 323.539 447.885 423.417 371.998 395.240 431.402 414.790 394.139 456.699 462.394 321.131 308.755 440.768 346.330 435.716 380.397 437.668 344.716 295.411 399.873 381.293 391.871 315.748 353.147 425.478 342.647 359.878 364.531 +171000000 (returns) 374.789 382.739 380.032 444.754 385.900 408.704 319.360 370.494 355.268 453.513 452.060 459.592 441.168 341.411 461.990 454.199 368.302 329.417 306.328 339.188 461.484 386.433 349.306 415.132 406.509 367.838 346.514 327.504 369.610 289.918 446.690 248.761 +171500000 (returns) 396.195 400.706 352.964 390.064 490.982 372.591 389.657 424.223 433.213 355.756 363.871 335.509 452.409 462.917 462.842 540.234 343.254 405.574 314.491 407.935 378.217 296.101 307.346 353.309 361.693 457.163 454.466 382.169 334.712 402.069 356.924 412.272 +172000000 (returns) 351.640 322.572 435.726 368.289 343.724 335.352 414.314 332.973 380.451 402.769 346.923 364.828 345.832 436.952 429.468 406.719 371.989 330.697 337.572 303.127 363.944 393.028 347.069 335.731 482.197 389.039 395.122 401.949 374.744 329.729 398.694 390.321 +172500000 (returns) 425.536 330.265 375.499 408.646 482.845 436.063 304.172 351.184 315.973 432.699 410.557 310.077 412.756 324.119 342.034 305.877 368.468 273.942 359.968 417.077 449.043 364.972 351.355 396.601 388.885 278.057 504.443 332.147 397.208 362.961 379.490 387.212 +173000000 (returns) 401.765 371.407 367.900 354.258 345.164 414.923 388.192 372.850 406.790 396.679 382.977 326.156 387.256 303.166 314.448 406.200 363.739 391.670 303.724 456.313 327.307 368.493 382.096 324.263 393.236 389.179 467.273 300.087 319.780 421.795 339.047 473.430 +173500000 (returns) 322.222 359.638 356.275 375.409 321.210 399.323 377.582 364.216 364.376 338.746 372.945 331.007 396.150 338.661 5.003 399.329 336.466 217.860 174.653 355.021 395.945 403.813 405.633 309.474 407.849 328.388 277.287 405.603 363.732 415.374 431.128 300.853 +174000000 (returns) 418.004 325.309 392.444 436.273 456.312 309.808 370.016 406.354 379.911 440.011 421.546 479.461 338.867 374.163 391.386 481.259 389.560 489.982 382.312 395.331 357.879 314.450 411.767 418.796 407.073 396.658 387.726 475.105 368.506 321.789 425.193 432.699 +174500000 (returns) 418.856 300.977 418.531 530.211 444.143 419.411 482.592 404.084 436.269 325.264 441.283 333.034 392.491 454.608 424.799 404.181 363.968 384.702 358.646 372.868 408.792 433.336 375.093 322.766 409.257 422.433 360.252 300.658 442.390 453.629 307.216 344.373 +175000000 (returns) 369.961 384.080 385.135 407.992 344.095 370.179 413.028 353.739 384.401 331.556 378.273 378.181 285.257 257.850 419.184 439.031 504.906 362.451 340.176 394.232 485.517 434.032 314.662 290.614 399.331 343.717 400.585 421.455 441.618 406.008 395.786 329.905 +175500000 (returns) 445.722 372.445 366.360 400.143 338.268 364.781 366.254 341.236 408.563 381.965 396.200 393.649 427.150 366.734 34.975 312.055 377.020 371.607 370.587 377.079 317.065 374.613 432.920 360.783 334.546 477.932 271.293 401.597 437.652 315.774 460.872 331.114 +176000000 (returns) 410.438 323.858 413.170 407.485 392.760 279.617 421.353 444.037 396.100 452.423 359.370 431.823 284.648 474.079 371.833 339.538 471.801 318.039 329.859 258.751 309.490 363.580 397.650 421.525 410.776 348.063 309.067 435.346 0.000 373.307 466.188 368.774 +176500000 (returns) 329.185 356.464 347.890 348.483 436.350 318.273 386.854 362.462 83.120 440.886 373.366 374.478 400.254 497.449 358.762 355.519 479.197 459.955 421.639 290.175 335.872 423.128 5.527 372.688 357.865 423.347 452.781 456.289 446.587 421.230 256.530 413.524 +177000000 (returns) 355.209 347.980 379.400 407.427 430.689 385.950 379.155 370.386 370.241 371.557 351.687 363.573 436.788 358.577 395.700 425.466 336.773 436.894 352.623 411.428 460.203 342.413 498.526 471.688 422.959 357.279 371.132 397.920 382.437 328.829 413.669 445.932 +177500000 (returns) 345.268 343.382 451.860 431.933 381.458 384.076 420.003 357.759 412.882 306.119 351.451 429.811 432.220 469.571 402.253 332.724 396.644 384.724 407.346 389.650 459.088 317.959 378.880 404.958 344.951 352.037 451.922 399.465 356.616 453.595 374.484 296.928 +178000000 (returns) 378.520 309.727 354.939 396.838 368.973 343.469 351.112 311.612 391.825 439.770 423.440 428.479 359.375 417.713 447.167 376.600 360.488 312.319 382.592 333.892 384.325 375.924 358.128 377.458 352.674 394.678 448.286 289.885 344.598 393.431 452.403 398.297 +178500000 (returns) 356.125 483.912 379.069 355.982 434.716 394.438 411.096 419.507 401.044 421.862 403.473 450.533 277.116 352.905 485.869 402.813 444.934 355.354 7.213 356.196 422.483 392.824 421.700 436.369 501.860 476.291 376.254 441.103 427.841 382.665 354.550 390.818 +179000000 (returns) 457.454 373.659 459.747 378.152 213.049 371.926 401.677 426.873 316.409 405.638 284.622 392.487 405.758 376.595 487.273 385.964 377.642 423.398 327.922 398.463 371.523 379.618 372.473 488.997 417.758 327.451 354.930 451.981 432.154 426.951 494.952 356.847 +179500000 (returns) 315.361 470.650 4.673 371.385 386.082 355.083 363.141 386.316 434.733 292.329 384.393 362.777 425.811 197.984 486.708 385.657 395.196 336.182 8.713 427.962 434.684 424.700 359.070 349.840 359.343 382.947 460.545 335.474 402.011 303.907 371.863 380.314 +180000000 (returns) 316.701 412.577 438.144 445.683 333.217 352.467 445.658 416.776 370.652 359.246 412.737 452.834 428.618 339.235 409.627 332.698 506.887 416.907 439.195 0.015 377.826 438.388 459.159 381.996 400.512 397.305 474.802 460.954 359.742 453.109 382.570 366.973 +180500000 (returns) 425.947 379.343 344.325 394.642 395.015 358.756 442.697 368.811 457.054 462.974 397.040 395.413 438.958 468.425 329.329 403.761 426.319 459.913 348.506 395.886 322.174 440.658 341.012 323.916 403.139 383.195 426.988 452.197 396.801 394.089 389.879 331.917 +181000000 (returns) 484.480 395.778 389.231 409.566 472.098 362.572 412.796 412.544 338.836 429.558 365.035 357.825 403.281 416.462 451.171 392.598 369.569 371.677 443.824 469.768 491.934 432.267 499.734 305.966 413.499 347.405 240.913 392.149 335.454 429.942 362.162 506.371 +181500000 (returns) 296.565 426.101 362.594 354.321 284.737 298.264 381.576 440.651 326.620 344.043 352.012 297.845 357.723 0.703 322.915 323.190 4.245 364.856 299.894 373.113 374.007 479.992 355.176 339.795 445.209 385.183 309.448 445.480 378.367 473.699 433.214 328.945 +182000000 (returns) 411.177 325.267 439.111 356.427 428.368 454.064 357.977 402.426 396.171 463.951 435.478 372.762 354.572 296.324 330.630 385.968 368.139 385.110 397.723 332.940 509.519 380.445 481.325 493.825 435.398 417.129 334.898 325.128 403.527 419.125 358.788 453.976 +182500000 (returns) 346.723 337.708 389.528 371.180 398.033 436.049 388.652 436.988 373.938 346.649 413.531 467.892 339.009 448.382 351.519 383.499 476.607 438.283 386.385 336.044 392.819 370.722 343.351 308.857 312.621 359.146 404.012 373.279 388.288 469.864 417.987 374.168 +183000000 (returns) 386.548 373.659 406.739 413.985 358.794 509.544 450.354 424.546 459.358 381.496 327.277 443.503 421.841 400.292 431.392 408.493 471.980 483.393 436.077 441.788 380.174 419.330 428.375 474.428 440.449 382.562 371.270 392.574 505.880 322.005 424.300 433.811 +183500000 (returns) 352.980 335.508 415.613 356.080 382.668 426.060 344.047 420.682 364.504 360.565 389.359 407.711 393.784 346.671 368.523 442.085 427.033 386.124 365.012 405.578 428.264 304.977 395.578 410.015 355.113 445.229 398.326 450.843 402.474 397.270 243.052 341.736 +184000000 (returns) 456.274 366.964 479.482 427.262 382.305 346.570 449.215 392.079 506.508 392.247 398.665 361.706 463.197 383.275 386.442 19.549 352.368 392.785 324.283 396.723 417.786 373.743 264.344 379.918 376.704 366.417 378.197 319.471 446.105 358.829 423.307 401.814 +184500000 (returns) 458.976 354.263 139.914 424.702 354.447 382.893 310.343 416.462 403.960 372.018 429.544 470.273 452.676 353.846 365.318 161.251 366.976 313.457 345.554 330.902 363.279 389.822 326.251 350.070 351.533 4.786 300.192 364.653 407.013 409.395 356.735 390.420 +185000000 (returns) 452.006 443.989 360.738 484.917 285.652 404.999 372.725 362.278 358.596 329.835 14.781 362.710 401.741 447.689 400.042 439.605 387.504 407.365 345.722 402.868 380.104 371.111 414.608 419.358 27.968 294.433 372.478 428.752 337.996 331.205 394.359 469.789 +185500000 (returns) 348.938 367.725 321.668 117.920 362.523 230.174 398.408 375.767 336.598 474.082 388.765 312.586 408.458 208.493 393.018 393.350 356.008 402.032 412.693 318.117 373.207 419.880 444.806 375.064 8.692 134.891 446.429 190.901 493.896 411.024 378.863 335.276 +186000000 (returns) 473.878 286.593 387.758 442.002 380.755 420.922 377.307 364.697 393.641 0.737 418.826 404.825 385.606 263.060 396.982 376.931 460.616 421.398 140.914 338.396 305.357 303.496 421.038 390.469 332.098 465.653 337.411 419.446 289.674 358.408 358.385 426.687 +186500000 (returns) 430.238 384.719 378.238 341.242 434.815 402.105 405.801 378.805 430.098 30.121 401.279 392.695 323.959 304.691 331.600 446.553 426.054 371.539 383.844 388.058 370.685 467.203 365.583 413.018 368.447 405.366 462.498 358.281 351.077 59.682 368.267 447.350 +187000000 (returns) 347.419 382.117 335.939 355.165 376.729 392.582 390.227 415.091 358.042 416.533 365.790 330.351 253.346 397.879 388.744 320.996 368.789 389.220 441.605 345.965 354.005 338.864 347.629 439.627 340.135 8.936 321.451 296.699 291.916 336.052 361.714 308.102 +187500000 (returns) 438.098 415.921 363.409 370.414 417.814 360.660 388.134 327.279 250.282 405.435 507.248 407.096 369.681 504.791 358.318 315.429 387.987 318.338 392.356 423.143 373.570 416.355 371.510 334.809 336.496 340.138 466.127 380.175 376.426 385.296 346.493 432.228 +188000000 (returns) 391.471 428.975 371.259 347.672 479.184 299.788 368.865 495.793 436.420 424.642 479.075 393.777 372.264 364.358 349.228 470.257 353.353 364.819 4.433 349.699 305.755 402.031 481.423 390.701 430.642 377.130 339.514 409.963 329.888 388.084 230.194 321.984 +188500000 (returns) 405.353 364.381 383.845 405.805 391.428 366.381 316.430 498.720 415.766 309.110 396.624 379.368 418.426 416.805 300.216 393.267 342.366 349.973 402.708 388.131 403.121 400.144 336.301 393.232 374.824 395.478 365.785 401.589 438.806 313.511 429.375 349.640 +189000000 (returns) 386.333 369.720 349.432 328.418 412.340 358.689 403.707 380.954 440.651 400.891 427.122 376.540 470.078 466.414 389.152 373.526 438.009 441.943 417.195 317.471 412.732 358.879 428.721 348.340 298.476 443.396 429.354 416.629 402.094 401.873 511.451 353.025 +189500000 (returns) 413.176 311.876 400.241 390.866 333.412 416.828 440.545 482.448 362.750 414.475 249.622 439.896 412.913 466.777 364.436 362.757 514.520 357.235 422.321 466.426 388.417 395.979 374.709 366.676 334.925 445.187 452.303 373.453 372.851 389.664 350.364 443.041 +190000000 (returns) 338.856 412.302 378.557 375.108 327.426 367.544 331.475 346.667 359.049 465.995 374.246 442.141 370.194 385.612 353.606 410.277 468.621 356.058 410.914 361.149 302.223 365.647 315.067 461.164 414.922 349.802 401.783 424.432 369.724 428.171 407.511 373.986 +190500000 (returns) 345.749 419.604 309.164 434.449 460.677 431.581 416.363 451.109 360.164 434.227 384.646 382.939 462.885 352.087 382.211 367.535 378.716 410.092 299.149 425.251 392.533 452.264 363.018 364.603 413.466 331.705 368.958 347.878 317.751 501.249 398.524 425.660 +191000000 (returns) 409.863 352.555 420.895 363.232 359.842 364.193 338.219 329.899 443.302 377.289 471.398 340.430 411.025 338.200 428.188 360.234 353.888 395.961 391.225 404.158 391.538 414.330 321.970 335.074 308.562 422.287 149.087 360.776 400.198 451.119 416.647 369.654 +191500000 (returns) 452.495 428.773 411.035 295.477 481.015 340.239 397.104 347.682 388.796 451.526 439.638 396.047 423.327 462.680 290.553 398.527 333.576 313.977 363.057 402.606 434.751 334.411 358.364 349.684 320.299 405.803 373.273 362.229 399.857 377.016 409.402 393.250 +192000000 (returns) 366.366 397.559 435.385 358.968 351.966 444.513 334.079 345.719 424.367 372.190 347.809 389.314 340.844 390.191 431.369 334.390 371.704 514.933 348.605 360.532 447.762 354.093 407.827 401.729 405.749 366.611 440.775 441.778 361.255 360.352 330.638 382.849 +192500000 (returns) 335.005 343.942 387.441 388.188 249.922 464.491 454.387 386.653 302.123 295.374 400.008 377.977 421.752 368.673 428.814 321.610 346.921 356.429 364.201 215.770 298.363 456.777 317.375 348.876 296.712 320.440 368.928 445.609 347.701 366.646 387.431 370.147 +193000000 (returns) 374.746 385.627 429.373 440.539 320.183 413.715 428.574 411.561 418.232 401.191 470.115 382.425 41.116 369.110 446.194 392.832 394.005 453.484 359.597 265.401 313.855 313.485 399.812 361.034 338.394 433.483 342.645 484.504 400.315 381.282 350.534 409.636 +193500000 (returns) 416.260 433.325 389.729 404.518 411.543 369.902 370.436 354.104 349.848 425.517 345.458 379.867 489.349 371.204 414.452 387.393 324.453 411.251 391.455 402.978 410.189 408.030 442.786 140.748 418.329 396.364 459.317 414.040 407.316 477.899 427.368 351.523 +194000000 (returns) 417.547 362.563 396.769 350.197 391.075 372.653 458.143 388.567 377.923 270.716 346.176 332.411 380.028 419.069 363.061 386.235 401.998 342.070 350.110 365.374 327.413 347.464 384.569 334.826 327.150 463.601 458.358 318.105 259.792 458.438 461.192 368.404 +194500000 (returns) 334.856 413.492 361.195 329.634 288.361 341.668 364.678 320.211 410.717 470.386 469.831 434.900 415.666 460.588 429.016 440.953 400.016 502.709 486.303 375.795 364.538 418.828 378.087 385.349 335.065 341.828 301.065 327.219 331.280 358.157 396.200 432.542 +195000000 (returns) 386.284 369.856 368.160 516.591 351.235 425.001 332.255 403.733 357.414 421.360 319.919 368.029 347.492 356.291 317.784 340.756 377.727 384.475 403.965 361.834 303.040 370.084 410.272 360.606 433.817 278.634 408.070 351.440 397.686 469.729 427.917 388.278 +195500000 (returns) 410.646 395.801 355.929 461.711 360.811 401.547 357.135 462.136 451.332 474.242 382.564 391.131 404.475 299.981 408.651 431.667 411.587 383.746 445.013 486.180 457.147 349.290 463.933 332.818 466.998 415.255 422.613 395.807 343.907 390.200 349.684 309.134 +196000000 (returns) 394.869 495.690 441.352 423.025 329.787 357.923 457.017 359.011 482.634 428.686 421.066 330.913 343.774 432.995 391.997 472.393 350.170 415.638 51.599 346.006 308.384 367.966 422.744 382.323 386.582 381.749 395.841 370.101 411.605 364.583 434.699 426.484 +196500000 (returns) 319.230 455.764 292.377 412.564 294.646 355.486 302.552 386.581 339.680 365.334 331.263 4.800 388.943 353.527 396.106 367.104 301.996 371.432 305.274 391.132 488.895 379.534 6.515 399.849 470.919 265.088 364.664 409.622 324.954 322.586 297.292 334.732 +197000000 (returns) 376.475 351.890 357.065 429.100 375.326 369.610 391.396 402.447 381.473 400.350 368.141 445.662 359.847 403.430 330.869 429.661 451.615 376.591 425.163 548.184 309.038 430.257 428.041 406.789 394.883 298.763 329.158 359.886 390.595 380.890 388.795 391.871 +197500000 (returns) 416.837 469.159 414.290 406.754 344.968 58.836 430.875 395.335 299.871 323.473 343.633 336.373 397.607 447.698 396.680 375.058 433.157 342.285 306.487 419.604 407.190 342.306 402.433 318.019 340.116 429.794 415.617 382.268 335.843 428.298 371.652 268.956 +198000000 (returns) 418.106 401.055 408.518 410.254 371.975 335.675 389.634 451.472 406.177 427.098 415.905 417.686 365.269 451.838 403.898 395.977 426.365 414.334 410.224 379.510 422.510 422.235 307.414 440.229 304.881 470.886 415.298 356.709 422.814 548.263 354.819 364.097 +198500000 (returns) 437.012 378.567 449.507 386.059 475.083 386.062 404.866 318.941 377.290 378.708 470.591 406.609 336.874 411.777 344.588 417.961 411.704 360.722 362.816 391.055 361.961 408.588 359.090 312.592 302.104 357.950 346.003 468.390 429.511 381.967 462.401 451.947 +199000000 (returns) 406.540 443.202 316.950 309.613 425.864 344.028 358.311 369.040 433.402 355.771 346.289 411.639 352.620 390.944 332.884 385.457 501.477 327.739 492.418 313.733 385.711 417.725 10.000 403.621 440.008 335.759 400.342 371.418 443.416 421.006 320.829 365.864 +199500000 (returns) 385.514 457.344 460.417 322.055 408.813 372.890 426.055 370.294 467.483 463.125 363.302 305.376 413.503 371.571 343.387 386.673 395.843 402.653 382.339 344.028 448.817 434.510 392.847 366.006 380.905 392.281 379.692 465.227 370.137 364.374 419.172 415.492 +200000000 (returns) 342.358 401.588 411.774 421.936 303.565 354.217 394.068 340.417 259.660 530.892 335.893 463.133 395.596 492.461 491.531 422.222 355.844 416.274 333.729 390.656 356.127 355.386 331.922 480.495 429.924 322.359 464.913 361.551 330.436 382.038 376.042 435.507 diff --git a/reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/seed-1/evaluation_result_scalar.tsv b/reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/seed-1/evaluation_result_scalar.tsv new file mode 100644 index 00000000..62f482ba --- /dev/null +++ b/reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/seed-1/evaluation_result_scalar.tsv @@ -0,0 +1,401 @@ +iteration mean std_dev min max median +500000 3.815 5.928 0.000 24.021 0.217 +1000000 4.025 4.608 0.000 15.618 2.064 +1500000 4.124 5.200 0.000 21.511 1.496 +2000000 6.807 7.842 0.000 29.836 4.513 +2500000 6.197 6.044 0.000 24.180 5.839 +3000000 8.724 9.420 0.000 32.732 6.546 +3500000 5.599 6.619 0.000 32.406 4.093 +4000000 6.604 8.003 0.000 31.663 3.429 +4500000 5.020 8.463 0.000 36.808 1.284 +5000000 6.614 8.565 0.000 36.828 4.081 +5500000 4.297 5.398 0.000 21.545 1.998 +6000000 7.678 9.623 0.000 43.010 5.736 +6500000 7.713 10.257 0.000 39.411 4.531 +7000000 4.875 5.718 0.000 27.686 3.870 +7500000 6.559 7.908 0.000 31.723 3.600 +8000000 7.380 6.796 0.000 26.297 6.533 +8500000 5.716 7.023 0.000 32.183 3.452 +9000000 6.808 7.677 0.000 25.421 4.413 +9500000 5.180 8.221 0.000 45.134 2.797 +10000000 4.666 4.119 0.000 12.512 3.926 +10500000 6.603 9.148 0.000 39.223 5.261 +11000000 4.259 5.645 0.000 25.752 1.614 +11500000 7.099 9.898 0.000 46.451 4.784 +12000000 4.452 6.012 0.000 22.825 0.890 +12500000 6.979 11.266 0.000 57.134 2.958 +13000000 4.416 5.613 0.000 20.253 1.414 +13500000 8.792 10.125 0.000 43.578 5.092 +14000000 3.935 6.187 0.000 26.326 0.298 +14500000 6.183 6.540 0.000 31.433 6.071 +15000000 6.955 8.989 0.000 40.053 4.879 +15500000 8.522 13.415 0.000 63.447 3.489 +16000000 6.490 7.772 0.000 32.748 3.167 +16500000 6.122 6.395 0.000 20.878 3.458 +17000000 8.664 12.586 0.000 53.395 3.585 +17500000 4.836 4.749 0.000 17.504 3.639 +18000000 8.895 9.996 0.001 42.629 7.428 +18500000 10.858 17.088 0.000 65.523 4.688 +19000000 7.115 6.019 0.000 19.382 6.566 +19500000 12.323 17.686 0.000 87.577 6.122 +20000000 16.585 30.421 0.000 156.337 7.514 +20500000 19.510 27.828 0.000 106.072 9.679 +21000000 13.435 14.090 0.016 56.696 8.726 +21500000 33.852 50.961 0.000 199.151 10.656 +22000000 21.665 21.022 0.055 91.852 18.421 +22500000 24.509 26.556 0.146 118.642 18.364 +23000000 56.525 52.351 0.217 210.160 40.188 +23500000 53.374 42.729 0.001 161.289 40.864 +24000000 52.519 46.050 0.008 215.786 39.302 +24500000 48.146 59.427 0.000 262.751 28.014 +25000000 67.067 70.267 0.015 356.088 44.975 +25500000 60.368 48.529 1.987 240.234 46.175 +26000000 99.066 65.721 0.000 252.632 99.716 +26500000 90.458 64.015 0.028 276.745 62.259 +27000000 87.903 67.923 0.386 260.749 68.853 +27500000 82.994 62.299 0.018 223.733 66.727 +28000000 92.353 55.187 15.628 260.354 73.964 +28500000 93.246 54.009 4.430 219.866 73.120 +29000000 92.614 53.972 14.918 264.449 71.853 +29500000 78.199 39.595 0.025 168.215 63.237 +30000000 100.850 63.437 2.225 315.520 92.698 +30500000 85.712 49.476 0.168 203.382 71.438 +31000000 123.265 61.101 21.595 252.575 92.269 +31500000 125.106 79.398 1.208 380.102 114.713 +32000000 151.739 71.112 6.815 279.846 160.186 +32500000 156.154 72.926 0.000 299.485 156.626 +33000000 156.570 85.344 1.811 330.603 144.939 +33500000 198.300 66.202 0.150 303.057 206.525 +34000000 188.398 106.178 0.000 412.120 190.402 +34500000 236.503 99.285 0.151 381.905 251.239 +35000000 207.033 79.167 0.026 351.282 200.750 +35500000 241.465 58.840 140.720 349.427 236.865 +36000000 266.715 111.387 1.362 456.174 266.131 +36500000 224.509 75.958 7.105 354.443 228.039 +37000000 271.432 67.965 123.496 381.790 276.556 +37500000 307.673 86.230 8.265 473.499 322.550 +38000000 291.008 101.578 3.200 458.183 321.478 +38500000 254.566 87.639 1.661 394.248 258.759 +39000000 267.223 96.971 7.988 454.104 263.891 +39500000 280.701 44.254 203.117 357.997 286.041 +40000000 314.798 81.819 0.797 455.467 324.122 +40500000 270.205 120.384 0.000 462.370 300.363 +41000000 276.371 76.135 0.026 388.725 279.390 +41500000 292.655 90.205 10.555 470.124 296.796 +42000000 313.750 107.436 0.000 492.979 326.261 +42500000 296.083 60.855 187.201 430.111 289.341 +43000000 307.951 95.118 6.294 465.499 331.626 +43500000 301.054 60.626 156.719 440.463 299.372 +44000000 305.968 88.420 7.600 457.772 306.746 +44500000 285.568 96.370 0.000 513.423 277.916 +45000000 291.904 122.230 0.000 448.179 314.823 +45500000 262.052 103.681 0.428 447.822 266.328 +46000000 260.913 89.698 1.052 387.703 268.799 +46500000 292.782 86.381 0.000 435.635 298.515 +47000000 275.834 80.899 9.716 418.504 271.328 +47500000 325.148 73.365 168.574 480.099 326.915 +48000000 310.715 61.388 192.513 425.636 303.402 +48500000 281.930 107.604 0.683 458.858 304.167 +49000000 292.717 112.570 0.033 444.426 312.169 +49500000 259.947 87.257 3.370 431.677 271.757 +50000000 299.691 95.526 4.298 489.139 298.651 +50500000 243.646 100.063 0.000 415.875 250.143 +51000000 342.724 71.090 200.895 515.103 343.568 +51500000 256.427 104.528 4.409 380.962 274.002 +52000000 346.710 66.810 245.893 472.709 336.619 +52500000 295.754 84.305 9.907 437.069 310.819 +53000000 305.191 73.106 173.536 478.358 313.553 +53500000 301.990 73.880 145.931 475.471 306.349 +54000000 315.131 75.378 40.110 427.528 323.791 +54500000 310.593 96.770 0.000 456.093 327.109 +55000000 285.162 75.432 7.569 378.047 293.848 +55500000 292.793 92.507 0.000 423.627 306.831 +56000000 310.103 61.892 182.063 455.286 302.864 +56500000 339.244 75.940 218.629 520.646 328.547 +57000000 280.143 83.325 2.532 424.253 287.233 +57500000 265.403 85.956 0.038 503.469 276.773 +58000000 313.095 37.624 226.614 398.991 312.644 +58500000 275.540 85.637 5.089 425.377 273.416 +59000000 292.566 101.131 5.111 447.125 302.331 +59500000 313.585 66.807 13.179 405.196 314.700 +60000000 276.538 68.909 129.323 406.714 273.885 +60500000 315.459 89.589 15.724 497.549 323.919 +61000000 293.192 79.473 5.021 420.495 308.400 +61500000 320.187 79.099 148.694 456.452 313.316 +62000000 296.113 66.020 126.303 429.533 295.395 +62500000 280.163 97.515 5.081 419.063 284.015 +63000000 312.999 81.987 98.273 494.985 314.689 +63500000 336.491 80.605 131.408 484.363 340.573 +64000000 316.427 100.502 4.402 548.100 321.110 +64500000 304.439 87.029 6.213 486.174 312.914 +65000000 331.549 74.451 117.974 496.767 349.114 +65500000 324.116 72.399 189.691 456.625 322.980 +66000000 320.693 82.479 0.533 455.459 336.653 +66500000 321.264 95.398 0.000 463.043 332.824 +67000000 335.596 84.738 30.496 453.091 340.408 +67500000 330.962 57.332 230.770 451.767 322.028 +68000000 321.087 76.596 123.850 437.867 339.434 +68500000 283.689 72.355 66.829 420.682 279.823 +69000000 337.040 100.423 15.153 486.791 346.270 +69500000 324.083 95.923 27.743 501.235 339.145 +70000000 326.271 84.091 6.400 481.535 324.406 +70500000 310.279 59.160 177.439 454.392 312.870 +71000000 340.322 60.199 189.768 475.838 334.957 +71500000 348.953 97.728 6.638 478.904 341.601 +72000000 325.493 47.000 204.753 414.151 328.557 +72500000 351.488 59.445 202.155 453.186 351.887 +73000000 312.283 118.660 1.833 512.219 339.184 +73500000 320.303 58.558 188.936 476.778 323.163 +74000000 343.332 76.324 173.123 474.467 336.021 +74500000 332.721 57.820 221.936 433.414 345.841 +75000000 349.726 74.770 220.143 502.497 361.766 +75500000 333.727 67.729 187.026 460.509 335.807 +76000000 285.299 114.377 0.059 465.932 302.529 +76500000 320.471 95.917 1.575 474.065 325.789 +77000000 307.787 66.977 132.297 458.445 310.275 +77500000 334.230 80.703 7.258 462.239 344.271 +78000000 288.814 98.826 9.716 447.510 295.919 +78500000 353.666 58.751 226.067 463.695 350.349 +79000000 351.775 66.502 231.191 516.394 351.230 +79500000 334.152 77.833 113.680 488.204 345.928 +80000000 354.765 84.017 32.945 533.670 366.862 +80500000 283.669 84.047 20.197 402.275 271.311 +81000000 350.030 75.676 139.868 489.917 354.275 +81500000 370.311 45.727 282.403 459.284 364.749 +82000000 335.613 63.658 197.571 478.591 331.222 +82500000 262.667 92.217 2.511 384.859 269.717 +83000000 363.026 48.176 267.071 444.663 353.870 +83500000 341.083 66.431 150.843 469.712 347.489 +84000000 327.136 95.039 4.400 507.447 344.024 +84500000 329.303 93.728 76.977 473.087 345.320 +85000000 346.368 57.576 214.793 434.119 371.632 +85500000 300.950 68.528 109.449 463.881 295.790 +86000000 293.711 85.238 16.652 516.728 304.807 +86500000 364.095 61.636 197.603 458.707 365.448 +87000000 334.552 66.534 138.312 449.769 345.541 +87500000 374.224 62.851 238.779 494.729 380.526 +88000000 336.534 57.458 118.032 424.975 337.873 +88500000 311.043 88.575 12.589 531.930 307.473 +89000000 366.039 71.864 146.104 502.431 372.302 +89500000 311.145 98.468 6.281 465.087 316.193 +90000000 377.668 45.078 312.127 491.913 363.865 +90500000 348.604 61.411 199.873 447.900 357.585 +91000000 336.560 103.037 11.937 488.251 336.157 +91500000 308.628 86.621 2.832 553.979 300.420 +92000000 380.802 56.668 301.722 537.745 368.240 +92500000 322.948 104.397 0.000 517.277 348.384 +93000000 337.743 100.870 7.534 489.077 344.498 +93500000 353.953 48.454 272.801 475.684 339.307 +94000000 352.406 53.472 238.982 488.374 353.350 +94500000 324.556 89.611 0.040 455.482 332.712 +95000000 324.202 115.340 0.059 460.305 351.003 +95500000 319.622 74.858 0.510 442.488 326.571 +96000000 359.763 48.905 256.492 468.801 356.667 +96500000 364.564 79.539 0.000 464.865 371.535 +97000000 330.478 54.007 153.643 465.891 328.425 +97500000 327.420 72.920 0.166 414.770 337.328 +98000000 333.095 101.888 0.507 456.727 360.732 +98500000 331.370 83.136 20.354 475.384 334.508 +99000000 361.938 56.853 259.701 477.854 350.244 +99500000 379.022 48.449 218.540 478.165 381.401 +100000000 355.827 77.245 7.475 453.547 356.578 +100500000 344.847 91.096 8.336 493.610 357.776 +101000000 365.616 81.463 29.403 486.418 371.454 +101500000 315.903 55.341 218.120 479.310 303.923 +102000000 375.726 44.834 254.111 449.151 367.085 +102500000 344.353 78.759 12.921 473.411 350.867 +103000000 358.388 72.273 226.056 527.525 361.206 +103500000 361.673 91.844 21.035 507.363 382.362 +104000000 363.706 82.992 0.856 474.614 377.862 +104500000 372.789 65.231 245.977 490.605 372.202 +105000000 391.991 63.094 272.296 529.972 383.245 +105500000 348.796 105.817 0.000 514.033 368.673 +106000000 369.718 55.364 285.492 495.105 364.070 +106500000 373.261 85.064 0.224 528.204 375.254 +107000000 357.442 76.803 12.158 469.867 375.268 +107500000 360.966 105.280 5.335 487.963 374.957 +108000000 351.109 115.488 2.825 484.410 393.698 +108500000 389.417 73.933 208.973 510.540 394.947 +109000000 376.950 81.204 6.800 485.664 386.445 +109500000 347.192 115.596 1.212 475.426 373.916 +110000000 367.693 50.462 253.780 481.670 357.365 +110500000 388.841 50.915 276.662 519.787 382.822 +111000000 376.808 86.358 17.379 498.453 380.533 +111500000 367.101 58.169 222.116 486.581 357.246 +112000000 362.566 47.892 218.791 463.684 368.722 +112500000 343.520 44.401 232.254 409.601 352.565 +113000000 366.887 84.601 5.200 454.152 389.310 +113500000 377.376 82.812 12.400 520.929 388.612 +114000000 323.477 88.225 8.873 443.233 319.124 +114500000 357.296 80.409 4.890 463.806 360.335 +115000000 354.315 42.556 283.697 489.338 360.527 +115500000 337.884 119.775 0.049 472.935 357.167 +116000000 337.164 103.897 0.757 457.864 348.333 +116500000 402.388 52.020 269.065 480.747 409.244 +117000000 363.304 62.053 218.892 483.695 355.574 +117500000 376.936 46.931 294.190 557.020 371.447 +118000000 365.911 84.232 3.271 460.941 378.650 +118500000 386.871 64.841 192.214 514.307 385.656 +119000000 387.540 89.292 0.001 505.003 401.861 +119500000 323.316 102.764 0.000 475.610 335.117 +120000000 378.386 53.817 281.255 505.898 382.894 +120500000 383.777 49.492 307.135 499.853 380.885 +121000000 378.075 60.639 248.197 488.946 367.210 +121500000 379.603 54.610 285.062 482.822 372.602 +122000000 365.890 53.333 271.282 501.183 365.450 +122500000 392.551 50.744 269.273 501.208 389.861 +123000000 388.700 57.554 283.892 512.510 391.207 +123500000 373.874 56.379 254.002 487.038 364.888 +124000000 383.992 54.142 267.962 502.862 380.072 +124500000 352.807 85.952 6.731 474.998 342.753 +125000000 354.239 84.855 6.182 497.137 361.748 +125500000 356.390 48.931 269.969 452.267 366.421 +126000000 390.174 44.782 308.367 485.370 390.063 +126500000 376.787 78.419 0.000 494.235 387.061 +127000000 398.742 58.470 277.163 533.978 388.853 +127500000 363.405 38.402 278.810 454.894 360.465 +128000000 338.320 39.438 277.430 445.718 332.570 +128500000 386.485 87.953 37.734 559.341 386.984 +129000000 363.082 72.287 17.439 443.006 380.338 +129500000 368.521 47.059 241.812 450.109 366.566 +130000000 387.763 62.736 195.528 508.528 386.191 +130500000 370.381 48.936 273.575 505.316 369.941 +131000000 382.600 46.024 269.879 524.326 388.253 +131500000 375.119 78.657 0.000 478.733 374.506 +132000000 363.253 61.877 228.499 483.849 368.551 +132500000 365.917 83.032 0.734 515.150 380.170 +133000000 377.831 54.519 262.962 460.928 380.297 +133500000 380.996 38.408 304.906 454.529 379.748 +134000000 379.869 50.285 270.454 463.621 384.542 +134500000 405.053 60.616 298.525 537.818 394.991 +135000000 383.931 65.065 246.191 492.863 396.628 +135500000 383.775 68.082 265.453 554.477 371.241 +136000000 374.079 89.526 3.791 480.062 402.252 +136500000 370.693 55.158 224.157 476.181 363.184 +137000000 370.716 87.965 29.812 570.605 381.358 +137500000 379.695 82.550 36.446 508.842 381.419 +138000000 343.633 101.607 4.842 548.573 353.221 +138500000 372.226 50.835 266.924 477.647 365.776 +139000000 382.775 57.813 256.769 506.731 389.882 +139500000 337.060 95.629 5.757 455.894 366.014 +140000000 385.147 61.547 158.306 494.489 387.480 +140500000 355.282 94.623 9.999 491.311 368.170 +141000000 390.501 83.381 0.220 509.033 394.901 +141500000 405.117 54.772 310.007 510.316 402.630 +142000000 384.277 54.789 246.166 468.589 390.899 +142500000 393.087 67.669 252.866 517.417 390.927 +143000000 386.691 55.641 295.381 518.678 373.065 +143500000 382.868 106.309 9.031 496.873 407.552 +144000000 398.766 49.642 312.042 526.839 391.724 +144500000 374.068 85.575 0.000 470.487 389.883 +145000000 383.299 85.139 0.000 491.351 398.102 +145500000 388.232 55.087 280.933 505.933 387.110 +146000000 376.098 50.042 258.918 502.365 375.290 +146500000 377.083 89.635 0.000 564.068 382.903 +147000000 373.497 32.570 311.857 437.365 368.578 +147500000 375.242 92.924 54.401 548.392 382.852 +148000000 383.307 63.489 233.001 485.638 392.871 +148500000 361.252 46.918 249.699 457.278 360.102 +149000000 372.203 81.862 0.000 499.048 383.190 +149500000 366.490 52.611 285.289 489.671 351.222 +150000000 368.040 42.170 304.118 478.961 370.211 +150500000 357.291 51.010 233.633 443.803 369.127 +151000000 369.567 46.053 277.696 455.477 373.616 +151500000 378.657 49.079 275.340 490.244 378.455 +152000000 367.409 95.776 2.054 497.765 375.045 +152500000 348.442 53.187 257.158 440.585 351.194 +153000000 360.155 61.768 226.910 498.310 358.403 +153500000 385.597 54.942 290.315 515.899 386.853 +154000000 365.676 66.074 132.412 469.941 381.367 +154500000 388.413 42.274 288.208 471.305 393.965 +155000000 348.869 85.076 16.013 465.180 354.106 +155500000 390.755 56.180 254.334 561.355 383.292 +156000000 367.703 54.032 291.406 478.550 354.979 +156500000 378.263 86.698 15.200 513.318 382.106 +157000000 381.784 87.925 0.050 488.232 395.227 +157500000 400.395 48.365 312.175 521.365 401.283 +158000000 385.157 80.844 0.000 522.127 390.779 +158500000 376.461 70.232 30.738 481.528 393.783 +159000000 383.593 79.765 9.073 489.579 403.600 +159500000 355.525 79.163 136.597 466.307 367.726 +160000000 378.433 41.980 300.090 507.478 375.391 +160500000 348.158 70.562 0.000 447.444 347.827 +161000000 401.708 66.945 253.585 514.768 404.828 +161500000 376.138 88.064 0.000 492.101 384.414 +162000000 381.149 78.836 14.961 506.980 378.341 +162500000 365.288 98.593 6.681 482.956 376.237 +163000000 371.230 46.303 279.408 474.474 367.552 +163500000 390.839 42.906 305.331 501.156 385.248 +164000000 392.523 54.792 283.096 500.009 385.448 +164500000 396.848 91.443 0.879 502.663 410.318 +165000000 389.930 51.188 277.328 494.237 389.818 +165500000 383.554 96.313 7.127 515.628 406.757 +166000000 337.413 87.549 49.899 506.322 370.063 +166500000 383.890 77.698 7.127 467.341 406.771 +167000000 373.252 46.054 293.840 456.599 377.282 +167500000 365.329 75.476 36.246 444.630 372.760 +168000000 373.679 77.536 15.227 472.275 388.247 +168500000 378.083 81.961 5.128 519.550 388.060 +169000000 374.655 90.273 0.000 554.377 375.594 +169500000 384.203 48.494 250.102 470.044 391.238 +170000000 380.221 51.575 311.151 482.199 374.666 +170500000 389.071 50.758 295.411 522.816 389.378 +171000000 382.653 55.028 248.761 461.990 377.410 +171500000 393.495 54.913 296.101 540.234 389.860 +172000000 373.859 39.597 303.127 482.197 370.139 +172500000 374.379 54.955 273.942 504.443 371.983 +173000000 373.799 45.286 300.087 473.430 377.473 +173500000 342.224 81.507 5.003 431.128 361.685 +174000000 399.874 47.492 309.808 489.982 395.995 +174500000 396.597 53.962 300.658 530.211 406.487 +175000000 380.217 53.167 257.850 504.906 384.241 +175500000 366.530 74.542 34.975 477.932 372.026 +176000000 368.273 87.440 0.000 474.079 383.034 +176500000 368.317 100.222 5.527 497.449 373.922 +177000000 392.515 41.580 328.829 498.526 380.918 +177500000 388.188 45.421 296.928 469.571 387.187 +178000000 376.842 41.530 289.885 452.403 377.029 +178500000 394.341 83.673 7.213 501.860 403.143 +179000000 391.886 58.705 213.049 494.952 389.226 +179500000 354.870 105.423 4.673 486.708 376.089 +180000000 393.225 84.232 0.015 506.887 411.102 +180500000 396.846 43.065 322.174 468.425 395.649 +181000000 403.327 57.940 240.913 506.371 406.424 +181500000 342.515 102.311 0.703 479.992 354.748 +182000000 397.115 52.503 296.324 509.519 396.947 +182500000 386.928 44.042 308.857 476.607 384.942 +183000000 418.944 44.438 322.005 509.544 423.071 +183500000 383.233 43.132 243.052 450.843 391.571 +184000000 380.767 80.638 19.549 506.508 384.859 +184500000 350.685 92.526 4.786 470.273 363.966 +185000000 365.873 100.196 14.781 484.917 383.804 +185500000 341.883 106.305 8.692 493.896 374.135 +186000000 360.749 92.913 0.737 473.878 383.181 +186500000 369.497 92.404 30.121 467.203 384.281 +187000000 347.427 73.432 8.936 441.605 354.585 +187500000 383.796 52.467 250.282 507.248 378.301 +188000000 373.520 88.299 4.433 495.793 374.697 +188500000 382.716 41.016 300.216 498.720 392.330 +189000000 398.548 45.980 298.476 511.451 401.983 +189500000 397.222 53.223 249.622 514.520 393.423 +190000000 382.820 42.190 302.223 468.621 374.116 +190500000 393.319 47.689 299.149 501.249 388.590 +191000000 374.851 56.696 149.087 471.398 373.472 +191500000 385.515 48.012 290.553 481.015 394.648 +192000000 386.319 42.629 330.638 514.933 371.947 +192500000 360.459 57.218 215.770 464.491 365.423 +193000000 378.969 77.361 41.116 484.504 393.419 +193500000 393.655 58.194 140.748 489.349 405.917 +194000000 374.437 50.453 259.792 463.601 370.528 +194500000 388.160 55.509 288.361 502.709 381.718 +195000000 378.429 47.205 278.634 516.591 369.970 +195500000 402.283 48.783 299.981 486.180 403.011 +196000000 386.863 75.405 51.599 495.690 393.433 +196500000 337.514 100.303 4.800 488.895 354.507 +197000000 390.102 46.144 298.763 548.184 389.695 +197500000 368.796 73.350 58.836 469.159 388.801 +198000000 404.098 45.942 304.881 548.263 410.239 +198500000 392.166 46.489 302.104 475.083 386.060 +199000000 372.926 81.699 10.000 501.477 378.437 +199500000 396.004 41.234 305.376 467.483 389.477 +200000000 390.141 61.113 259.660 530.892 386.347 diff --git a/reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/seed-1/result.png b/reproductions/algorithms/pybullet/amp/reproduction_results/target_humanoid3d_locomotion_results/seed-1/result.png new file mode 100644 index 0000000000000000000000000000000000000000..2e64a9410b7f0cfcc0d77209363c7e0f6f761e58 GIT binary patch literal 36439 zcmbTdbx>SQ^es9e3^Eg3gS&fh*We!9EkJO0x8M@of&>Tz26qcOxCaRiK@!|auzUFK z@4i>{>iu=A7?_$m({%UQz4qE`?Gvr0B8vtgf`C9EG67Uj7K>|KW31Qj> z{s_3s=(=kHb`xZ0clduU zU~_V{WJYb(Yg}1A$(tJilH9dBstKK=J+Z(h~2ybB{WGat*ceZk}50SUbI} z55Cl6)`3uI5JQ72nJ8Lf6GR^|xAt-7Tu26d0{I```{%BYg>7#uy??uxg|)|5B=r_K z)#W8Eg91nbH6;lXL0(F5^|wmdO;uBS-a7eSzT0G{$G5h&8H1FI>z!El)e1k=)rx1H3l^9Jbg+UW@& z*Li}V#k&jiNfbY4Y@(^1k%M?3*@J}{%9NY?WVaOxB_> z)TD!KCRZcP?RWD$yu6W;g&ZZZ<3tY+57Js%Tm0xjhck-ov>3vtpz?3usGA&cBvHwewtd4vEW5%I;9O(Yv2UcY^7zf=bn@;XKY313c0+1S}V?^%t_bWsZY zIU2aU#wwstP}feDd9`fni_oRHksS>~fN8o|Hnb*XUwTfbbtKchzS6 zFV2<7|KEd=10LhaaLb?UiWe+o2o?g4vmgdm^h-*g}o^Evh>23}H=2zkD0UU7x4 zU6%4~cAf;Vb7j2(Z444S^?NKBMKQx#5ZJr#xj-8ZPJYCqcT1C7k;IPQmHAe=ZF#ev zV;a|53)3hZGxV%O^ZZtKEz(?@E%zYBcWH5?zaNpz?~qgYV(iWBRFr5qwQNE`cQ-lt z{RVQa{Sw#xmB|xNll@X?(8EH|0AKfCW&i8?&jT1iw^DO+bEY@PtGDMF-Ens(-Q=ME zVj}42CMZ$tzE79hTM-^2$m(1{-5VY8lH)76hJ{%F1(-p=85 z2(74ij+MWApA)62LYkU*U!kL$TUsJ|t$GlE1lf1m4q#HeIRj;)SBwqK&3zt5G}x$t zFh#ajL{N?S00g*NW!WzYh=+3Ld8VYcFA2cl62sfY7R5GSoib(&EI7FUMRjuUf~!Ovgt zZ+rKh(ET*|16E>y|FPTWK0F=65cZ(Iqb+BH#I?4wrFwc%z&0yI)N6-~(JdHxk;2-K z1wr2{w7#A07bl)uRCk<1KpSOZ54O_>*N01*my6Vi!l98!A6`dm{|7p}Tu{aTUqBqt zD-oZF6jisD>ShN*P>lau=zc{-FUPCrW&fO5z3A`}P^(yJ(-rdSKEEw?0 z%gZAqB4WDhFl38*$Hb%fts-}LegH`Uz{X)Ew|Pd)S?*c@yX0kmJ_7eJH-lAjq)IWN zAx(~^eps(eoG=aL=U;v`NM`pziX4qKfonSxur>b|(EWdn{q-<$?JE5U;9Of=?2a#X z_`D(W-gp7}o=h$4ypyJ5zS`!o*yh2EP9{8LqIsP8jKI5*0=44LR~;@lV*m)>hb(#u zd?U|mE&6D=c^k+AEqBN5wGPX?kN2+s8B4D#GqGO6qmv;Uq=^STXB{!*x z{-x2b)P1qsbha1txYx3sAatq|bfq)vdQ2+hX$pY({Yi2%*5S{_ZxwDk7k?{Eggy;< zXifMV;!rH`X#Hv{9jt`Kj!}w;h)_KUT;J?WAUDsum}&`AOV#27Bj@uztxYrUVSfHHp?Hnp@2e|iA01B1ZC zpA(-|Kb+N|$#icb4-_0l=8NLs;GkRoUitqdr1w7}JkEc~ulOERIU5m#V^$h>5g&Qe|BF_i{hJ3_262kpG9JoNjKS~=-pvzA^?c9 zK*GV5$vUu-Qwi}&9%N3In-H~M$eBG5a`S(9^Wr((59gYW7lP=+$667DaQ-6*W2j)i zW5kvNtd{VxrK?HY|02n)*HE7VCcEK_D9x0t`5$rMqSu89Suc3{gSl26Sth9qpYne{ zGmTuZ?!*e}fyP)Xbd-A55sY_#ms`KL{*aIQJko@7hbCs~Y*u+HL3qW1kMpi`#xXVq z8)Z%IZ*7W8|820J{-lseGQd;>`f3d^9MgJz1&xG@1!A9;sozB_(Q8Iq^B<4tQuwSR z4CCh7ik$e%04(O$E4U~vm@7cLSB`Blt(|NWU+$f}7O@yVXLf9Wu$_R+$N=rT5Zuz9 zMtXhQLw}s-M3B;2>Li@_u-aGVjy{^D2mPWEB1WZ4!GiPx^b!aB#OYi0A-ru5t3#9@ zOAx~XATxH-)#Q7<*&p7|>x!zy`G~>Za7IJz+N!EspZCL(>{BBN3Gs+2i?y4Ch}H{h zKe7&{S*;@oqS1V5`_XWC(Jh%SDH0`Oz_yPs>-tYdf?&3*HHU@m_DA(i!9#sgsn@?) zqN=CQ?g{1MLM;!<5tpx$Y7y*;H(F|p65)~xRRO|5?{yiTr+z`WyDK1?G7!!Ar-+f? zSdLJ+RPFsw1hZb}IWP72y(6`buQfZ;3J7LqU5dP^OMfZre1S)TAux&u+m1+RC3_Gv zFqsHC(NxyXWaq>OA}7TMLKzNCKTc+8i>wEIEx>z|Nw++%57Y7Z;Xw-tZ?(&et*~$| zl0$9j!b`0uwPcAhpa5>8fj}kOms|u!yvz5J{wz+#8{UO14DSQ-2uEFd$k2-3G-vH$ zy;Azc?8#{bK_}U4^;sT}?up#?ITh{|BbG!tZ;DmwiP-TLUKCAYRQi{{O*n#27c|2{ z0Z>}5M9iw_jw9C>`Cf)>zgQN~^l-zn#4~Zt5tENp#v^!A8BJ;I{#NJRd+5dL<5~FR zKosE6l0$?L4>N%|$y1b&ZEPjn+$qlMu5D)#_J(B)QtHdbVgX`c3N4r!m|$VeFWeuG zdt5uzvM+SkkX|Sl(<= zw;PXT^8IhqKyHO`d!&a#qKLte_w-w%$eCbl6d4!3k^8fv9S(r!oh7pbb>h_HBqEJF zn5e1Xe&z63Aq4k&{UaL;cyZv1h?Cw|J-~uRr&PS)VyK~kRd>UeU9awJ7zbq|JL9G# zNGE@3_F7NeR7Oj`IHl3hk=BB_h3k)F7D@ ztNEw*8e1LuHZR7Tc%T*-7A|lKMRIg&>a!pbXb(ql3CrWBMC@ClSTk)WV}b8*qKvw5 z<~Ejo5r?Rl)=Jl>8cs61QVWpv$j$fauI>JA^`T!wVB}|mBt%v2e5Va(#!>w!%V9?3 zl{buw;$}9z7)~Ha_qco}EQYk@x`~bmvE*7H-3%4GjT1J(;yhrrYrPj;>>6b`X&G8# z1Mc`*Ey)u}RuLoEqZ@3O&A=~nV@<<%ryc#@R82WF#n(y^;Md^noi<8|U5Ml=UU>Rf zOJPYcfg(S&)2sj7MiA{&<@>FLvqsR#e)aGzpe@Xxca9;t~9jAmVdyIsS#2>IYo z4t#1#N||qGeX^z!`%oD%`DhlmaZ!%KWKKwNj>R!mv01CXs*z1D@88UZ)`vo4nT?(T zELo8SmUmpR;niK_qsv43Y$^$RU}$*P!lpf?HtHe_z8c-%oSWH8dhv-MvVOj@Sq;E8 z*S8$x_dS}F*&Y@GWJq+7p=B~HimqUkzb7)#{-9iK_gF}{DTBdAZzO8HhQwuyY3+{p z%26NFV3t}l341CRRBdxSymNbIF>*hp)(E2-V~Qv~R0>a~bR(F8#ocHf+sv`XhKa?) zY@i!iy|8XEd7L%Ln|3Vpnx#}4WwXaiol!OxK`83Y{lktu-~7yruR@&G0^Sa$D?zH4 z0r5KyzXE8-jYkoKPIN`*|6#ouEK+#*<&6%U1Dmzo*ADeSy_oVQwDs`YyBJpm)}PG7 zt|D>2SbjMWBq(|f6n%pf^d=vP{)H`g9n{#hlJ%$!GGTMM3M3ss06Y_B7+>KE zVUC3C)~Y3CqdZ-k`k8HhX5=?iM`Wu!RmsvbVxwHCh^ZIfGSsDBs)-nQ99Z{LdPQT` z-jPMEIj8q+@f<-!_D!M!ff6L?1n}9v}Ge`osyPX(Rh^HLWadxP{P|DjbBV z?d`^q+IT-6W#DdNO#~c5Ys3qew%qNsd_EvMFkr%UC=#H{US2h;T`0@ZF+#`tLC9|+ zsKD6PA(zU(VhxomhbfmEa7@HwTu|ZEgyYDPS`DTByuX!fqub3#3pulG;%JzT7 zL|~%6?5LjO*CbyfqTevYN-q{>&!8#(B)z6XF$3hw((t`xs+%5rH3b3Z9*t7uv=%7% zs~XX`IsxK0)tc3^A^*==w~EbHVH+I)8l!LX}O%qAxu5r_KnQso(N*#8Hs!;$58)hSU-Q zNn$}z5r}z9KNk&1_qplep)FtBJyjS>Khz?!6**gRg1U9~eoh)pSx7%0$>GE=5 z&`{m@mq-lc%ZB&<>*0uFD%~?p3O!d(1iWm3;2u2n#DWhSum4dDY_&$qTHLSCu08cj~#FozDxigy_2SWlU@H; zP&IDH+5ThcP2D8xzs_vi|JL+ziO%u0gc0QZqw3Dz=>sk^fs}g5_Bj$A3P}z@?0tN% z7~?q8;j~lhHwWQI3QKpMs1j?}lD(0Se3dr7Z|e>B7ul5Y@DJoFzk(%0$Cz^rD8d)G zq`}P$_N)ssC*H84CgKnOTZtO=ks9;smrJzwn!5$oy|S@Db@`pY!|{ zXTj9P0}H!q&3D&y&1)fk^_mBMIc`ph7PfDjwT1)$(|F7?t2RqV^)tZ%Ba0-X_y4#S z{`Q=`%V@V?>F=kMj;@*xLJH0aYROw$`rh}t^4moSj=Msor#3l>@blihJxM$ z=Le?aQ`o}QHtyj`5#h%@Gv}gU>VWMI^A%SckzTb(SRNzvtYeJHOi!AHt?!?{4Blr# z&03Od2U_is462jQv3ZH$JekeOKQf?-26_muU?dmqUfyY_H0Q_TlgqxFhL+kb)6(E= zYP~>=e)UEPaUp)VlMvEKo4Q`I)ujL%s-d->F``0JEy>}@>p`1|t$8{{Km8FGUB~k$CM`Og4>=pV~9EKxN6~SIZ582Ffn>&(1@h8CAJj2+{9@R&md4G!@ z)5~f=wT6WZEkedS9pHQkzbIg0!nhP$T0>r-=HTYh_O8Dp@-WlGV*c(bOykbea2*|r zBd>LB%J4ycfxh#mWS!j2PsZ#sF^G(LWNEJA57C6ACN7JE+{=QSdDl+0vYf?X<7ngVVm1j(o!2q)C9GPQgW=}f z9;uC(7)(`tq5*K){m&@(f5vp!m@q=kgGB4abt8P{J#UG)(lv1#@D@byg8bK9dgFQ|Gk0b+6{S%T*mK>GG&d?FgBD_a;A%p z9e-Oi${O_EKgdMLI(oP23e+P4tkHwwq1j>LD5>@AnNT~Lw?omz>RC06r>RO}7emy6 zyJ|I>^fZE95oLk?{c zy0?A#r{45Fy?11)&F?+GI2p)S7q98F;bYCz zVb7~=A7Tq1;ykIPlu1VGkXKfa{ZrXvm8+j6l>>i+frL+`@Yl!slTBjjbS_@D-4SX) ztZq%V)hq|4u0l|au{<~CVdRXA8!z6ac^W5<@u3s%84R-=*BTOU1?GhIyNKZ0V+3rQ zy*R|eJ&L3cJ8BRyDVH(QO+!y$@>r!n>NzeXe@Qt2BM&Xdkj#E{Mi#S207WiKiD)>v zb+*|vRv1z(?T16%F|`}O@p1w(r{DVM&sO(@M%bGWUFNs^C73Yfv3Bk|>Lq$S&z6f{ z7Q)+PT`A3uk|{EW{GZ0COgT~Lu!~$0GW=w1G4s?ym?06BJE!Jsp2zk!(u@uZ$`+8# z`Q1v7=p&>@zfw7t1u3|iH!{)Hq)zDVVdc?jI<-KM=TNzB;#k^CL^hU0L=Wux7ww|$ zPh&fLW?+dYe&`omnTSlSwa+${))kib6CFP|2#oNVfZ|jhYv3V+>8|JPtR}sX6C(?s zjnVj!{^oRHIOcIAD(*)(a~UaLCh-KcfrP+9fLMfD&ytnNzf(?)#|~VJ4)Wg{KYnra z(#k^kBwX-IoySMU4i;#vmYVFU)!dPGr}L1WV=~xPA<&hI2@_wM{&1@DyQtTDtD1bX zu-Ev=nZ(e)?_MqljOKaTIfw#P(wC3>7!5O|FrgG%0RY zy~uH8dY(mAkT{?Mt^J#CHb45=xY*)Co$r4x|F{CkM6;?5#9w#3tzOQ&nq>a0NG{^U zsN0h&H}C3gLLYoAEyGN?_`BXrLZSp1uu`0vUv}yR9;hwy4dL~&FD@cD1qZQF(FQ+p zaX4+$8?modJmmDecj10nIONr-xEt5W$z}DO(5w3w3jH1fPJYN2frDMl;89fhzeIkFV0fb>eYhw)^_Q*~yHgart-~mX_HcqLJV{Q> zsFR`M8%oO%lq>}aEAM+l7vBfXdT|?rPa7wi9%fkBY!sDqkKVsZj$>9nby^4+&dUIeiIs}RPSIC?Pw2o@%m|}T}56wYTlare$SrXE>IjAZN zI)dgbp^doK^XiK+lq*FAdssq8NVRdfNB{QNjJv-k`NCaStS8?#r+b+Bl+c5<5i}cK z?Q${mvt4_lX$2Su>v`Y_Pg1ws@Ez@wOepT7IP{-dX@2 zL5%~kVmixaVwHX)1khcr66H(DCkeba3;9ZNew>lhMX!^-hio2Ky5PbML&dL$&xEVj z5_tdNtSYb=r8jn)ws&q;%G7^FAsxbL68}0H)i{W`UPNse+gh__s9w}7%!!W+5Z@}v z_ag|=5X}XQ`R*B^$ROYIIYfmL9$KYVS!Bxr7gu4il0TRHBPAlsuqb2`er=jBPwTQ6 z8#j4nrE0IkF*~Ms-X&ArPMjoc!I9fue0Ope5P6*-=GR)rKzsXlqDNEIiD&G?n}G~t zUsMc{%c-~lj^~8}isfmy?Ay0Bb_=kIiL}YRXLE>)_yAzp^u`*643|!D>M7iar*UW0 z01^-+LO6fvf!Ui(qJ3&?>I?{Ou0v|Ha#)J72D#EnL_wz?z^PX}-K_4Z#!ya`5>R5LK47H*&; zT{bj;_Z$pet9{TED(r?y^`Qs)bbyN6$<}C&i>Bk&)#?s-yp4Shwtfwx#=UoFA!V0T z$G!hTjiLNvt%*x-x{a>bx_4kg#G<9pkr3_usR%Lo=kKNq2d7ixwuu!^1C#rLjM3})L!v?$21RIMKH1} zsDS#q)eH9P z+SaPqpuCW&Hz|E>16QD6K&x!A(bJr6^n<&8RV9+kxjeW%Ja`}+!mTMP!G}k3y>szF z^gw-?@wpyUfp943jsS9g_*=E;W{=s38iu|yylhjYYSv*|d{eSl0P8>jIqzf-c<<0u zJ(>P)*lXr3>I@?Bfe+-c>&67YqgwH53wWbPC-s5}+9Icpny-xK4g0KZIk>f=8>v1h zk-i@7iP9Dvf1jZv^bsB`0ZG4!~0>}PIk$FQ&(oF7if*Ev@);sTEUxa+r zN@nQ$qtTmJBN2zz&GprHct`4bi36?Ul&f^9CRV1G{+Lz#+CH?=}}4OtsAfC&F%%gNcG1z=`T-70{tc7 zRV~j>hJip_NsCH-5eUE#~ujoPE1Ff_R9FHRs zuNEzO8_R`)s_R}w`NB`59G3Jx8P)&k{nt+~8iGTwQczs{l9ZIR<^Fv1Y}_dj=kskp z{psUPH~ISQARh?icYP?~<;4fC|XxWJG+q994X{&S{> ziYUQ~M7`IZ5bXS!Hj-aIt?>zj&^%?sCOj2&ZNY>KPVgDvGjVb`uoqFcep z?_(7K;iCT8cfr!;qd@vy+z-yztLehtqFZ^G10-3eD7rN{1JyB0opjt@{h^`_Zy zlW@Ic=;#U3{q_T#GrgWOi7~b6FrUfZVoD4Pc3Z|e)i+So?cYei?vAGQOS0pswYbCN zwOjKwgg7)gH=kZ!V?@`HjraS*{Df2)VZ2(q%A`X&UFUeuKBsQGCu@_#a%7&6S1(7L ze4>2C_M#dReFVA0i7t9Sd!WTg-<3_33^$Z{A1)pC=}@*;Q>W9}g;)sxp%zKT&(Vef zQ&VjkA3b5ujKMAfk;TqPGVGQN!&5fsYr~OTi%JA|ddWwcPjf~1s64L6s`^~cwh+s! z>*iru^LE$iCv%sIA&vx{?zt7NI9v_s^FuYk?G(*mZQ-lPI(*kA1NA1H0}>&<_V`?7 zp}%w<2=Gd{Nz(d^I(Wt++!MzQNq>{d$k>YnW{C zg5qVF`64Xp$+s3-jW)Hn^e94#?`!{XRm^U-Jh6U`HW>8yNSJ_T<@}=+Dh2)+Z(DCq zH!ofqe33D?J&=!ezXt^rexJ!&iTkx?Z9Uf6V6jVu8>9X)G=CeL>$ae?dm_eM#=Y`G_R*oND?VBgR5Axox^{z$QUWu(WIDUzEi0yW z@E)G^RopJi9F4oE_3{}C_ayWO)kl6Z}v1hlP}2HFT8byN;Tb{z;B zQS%H?8>3BU2YeMDET3Hb&$B)5&%_=dFF;@Ylp4eVb zbM0~a>h&t|uVnF@fHZhUD7`PL>p@99n|?XDIl~#yh+oFs0t~1Jj>RNW9HFX6t7&oL@!Yku~tiHFHuVpavS5noi~A z+=qS`ZwBQDc9Jtn0jg6dLIH1Kl;~4xVOrH&av=8eU2XJ?BfEY|Og+=`R(%6GRGlvMS!iks{b=Oh{0Sm^n`35h~ffRP9$@Oy_Md@?Esw3#6M%3;pWn$v#P_Xj z&laFmvC;E3ThiDSa$1S2;~K8ahf8%@+y?AX1U|Z|?h`$oOk!+gE!_QGr|t@EFv2K> z6_wESc>UY5TK9M+}vWmt;3(N zE#D#j802@&BYdsEZhTBS@LgK;7oDLYxh1R|QZw|_PASk13n&+#&?rJMdPkH`fbwp% z@Wqf#r^Mii{;2D+EuPy(F9HI=g0~XMfQyLZngI-ML6O$LM*w!3+M;T4G=v2hCbGey z%reu?X1}{W=~3W-%NX7$eldJu&`^_dq^7AOb|lkz^I?!RH_K`>jjcgUE) zTn9jd{;eA!`yzi?2|ge)bPM`p`?W{@WkE-ZO^)AXiQ91ycKL$wIba_g*x^SLTV{OF zm%gLi61ZwE>`#$9c&9Om(sXps3aBW)@N>D>M2|aR8JpzmUW{GNvq<*(^F!NOrKRVj zSMa9`0sj%Nk^#>AGHsVcXR)^zy#EF-7TfB;d3~?%SF4SC*iDXPdb$ZjiuHsa^vU14 z;u8f#bbJv7D{Gx*hy|fOozGzfK1PSe1CP zEb% z_3*>OcCTgSC!=E#x}>gIrI;G8t08eZZ=Jbp3`M}&wW#MAw89uTS{%6O$D2sA+w853 zur@w{cZ=Np{9^aM`tRgAIdmK!%S@6zxa&gf zb03bZin*;+44iwWG@%klog$E<&5j0|I0d?kt|bAs@D!zIT_g|%h|1Uljh3Czl6}IF z?^h^+x8?+0w?ly>XR8(h%LCsLwJ5ISU-F=mW>o73cl#47OI0cE>;BLP%g6eczvb8p z*jQAi^ZnkUgf>^BI=*JDWH5tzl&eQJ;X*t9ImK=4CdJe4ARiO}rQ!nx1^raQ*xmI? zH)6YF8Y)_mOj>MTuC?2?7JL-R%nk+fpkD5UMkemD7nc7SCDNn-rL-Z{_ki_dEl$Y9Z97-)Lo({qQtd=nb zrBk0|LKMmkynQ9CDPEGzV9%arrhb(c^Qq+v6!d&Ti5s~DxCTo`lR5@7B|FNyyOF`O zju95j>P3WTUimnUkI_{hg(Na?4TxP_a6q@s)<0bio^EhK>%J8=e6u!dgI=Fc#Dntn z6xjYn#1(GJk+UKBC5jZg!>hhQs+C^^V+7psd8>R>t?@hS+!H$W-=iSXYja5*0A^^T*dvtj8vF2CPOu@NKEtlGdQ$(9#H|o*+-2C zC#{mGwhm*E%@6K^tWTNE)t*lif%LB+xoS;YlJRc3)zrwCuxt=A4zs zaVUkr7e)t39lT0|cTow2uke3N3s&;Mj6XIz=t4ASTd0&@69uWF4W9<&0LF{JC}von zSu<{kVlQV>==M3q8ywi{QB*WD?6CdHnH-8t`1p#cg^v)fv~@a~omytS5kFh`*PX`w zBJ=i(VGa9j3kr1tZQYPpfAf6m)5AVPj_J#hWA?Zfi{n;3M zrrs@A#an1$W)#{Duar{DnL5*PYDXF8q4UCsKKuCZONbP`?6g4cKr8fvEoDKGxF#Ne zEdzEhaqibH6EtH(9e9g|U&PUR$gk9N;pHr6pL%usfq2Gf1VeS}abn04@mzkd|2qSis`5p2T22Rmp{0=@IIO?c1GiouFVrGy3&Ru4$3% zz9*k^4nP#;;K7SMNZB6+U(t@{d~lu=;x+Tp{25fu6!#H~0OCphE(qdYn3^p5;j4y47p3Z&#J(wCDyPWO3r)8Hsr3I7Iq|>6Pken3DkpsJ?_oPM=xF}*F;>#6? zcN8sH-A{bp4h8ob>bhuy8r4u78ZlkXI7_6!UK8YmTJoa@Hve2Mf4cNX-#T|!ZymDE zXWi^?Aa>o{S=^t6lR5s-unj;t_|3D+oOBjC9>I(`)-fc+_ISTZa2EA+X7K1`Bq=*z z#8y7;pv*5Q7a{n~M^}v)QLFesPwi7d{JpqWpW=P6or5HNoPcFuWS8jY;UuLTF%fSg z52cmOio+~$6A;8sJ3XwR2^iMXA}KrV4ue+AIju!J+z|^hH8+IH=%C=IJJ!AJiEr~; zDR|?zz464(XXkYOn}cYC<4d_&Bs5RJ6H&fIt%_Gr`KEM6E^g z`%I#NSNaWenKmcn>~-Rc7i2!=#PU*o-GTdPwWZb> z>8Ox%yKT3yS>Z-7@lE5Cp3uXHsLv~@#(uw!i0HuOBE`R zV{z>>45)S>WCZhcx3CN*%%2Lyyk;9{-|$T@>fS!LPSB%ll)Z{?cL2I3YJrgeS;0y7 zN9gf1Nth=b33_w5$726`NN<<_Y)Q4nm_!9)DzWuTJ z>DCC@0sHnJDE_5;yd|f0FM=M0rPmLX1)x$=R7L>o&nijg#-eOg5`XAIkO}V%; z^x=K%^=dsQipC3I(6640m4`?}9qecoLzYrym zz1C)C?ze~Dp_zppwOIOTqQi$`iG!=a^(OwzQ(hiC`KQkNhia3an9>c=nw!j-#w4hs zCSHC#k9y7Ktvs60jk_t(Q+FX#ez9(?Nki8^-`T+#uc*_IYIvdarYvngWl7ea6`P6X za@NVAhZHaG#^LUF)8=#?rmR;X^jH|Os@p2zJ-YT;hS{c`TH zioZPzacr0`b2ev*irY~G*HMH3v=w0eg?3DAj&_4i#wU9U#)jRu0+luj#Z{bW%d~3Z z%wuTE1HjGqhZ|V@;eT(HG%H5|QbsF&DdF*#SiAB26hil-cRp`S9JSS-l|MErIV*U& zr$K^=C#(| zZiDvO-x=fa>UDN$PP38mEW#93k1PJrUQh={&_!&<-}SI81R@QjL3^SDffc^v&+wk0 z&cz6;cw4g1HV$%B4j=YEGu*PVWZz5*QmwlOG6#CJWWX7Fi#>jK6a1h%RSl|1YxjI* zw9|e`da~MUBw(vq%*K*IaRjYvD2!mitX-AW{Mnzgz{>U$XhJNS(xRR3)IS@w|51}AEH8UFuY6LpD7^B(O{3#!|6PTqYErk98 zEGy{mcPqmscz5-8gcrd#FqOzuWPs|+5fO1~ZKg-T7^hmnTLnP>Xt5+YOyhCNBQg60s0|FKo34kI!>#KA z7j>MpVdC@b74XRUx4_XTVCGI*O)Z7=&uPukg#sJ)^^ zcMMUYYS4@vJP9de;_$$0a|)^9i6bC!%zDAF-OE+LB(A930Uc#I%bLKS0Z5%`Z{mPJ zopuuGP79e1$Fxz`&WyM#<;?sSY_F7C|J_(?#*aV7n)BHR@WnMPLMWsva*5;h=viXv zGz(tay5vO)-LIBpCS*5~0Q2K8k5~wLa+5u4LQ||QDo2tx;pd@?SJPQach?Q6$qoe? z34sz0sO!87^NtpnY6PKDLkKa{4u6E>GprPTpbmIXd-qvpiH^l<=1jE~yi}V}#(|f? zjG`2^xurDm8h(5L;`fyzRFa6(`AUCzc06BhMU7TEmXYmE}qgIFP1Tuvkn^!Fj4 zcT1UF2dX++f$Xwwyhv}r+-1sS)X~Lsh1;LSYSIkyaMY2-zsJ5e890}K@LYuJNyxMn~M&1^`}uZ2(v8LFkRIia=+Zam9BN|vazKOHl_cW#PuKhB!1ZSwf9VQ4QO2C&UbPlNI^_c> zyX-%>Svw8QuOhr@^_kMh!pew@ND{~2bF`TVD2c0C^nFjOe1{95 z&C~yO6h2xIp^1nqWAKn?`f6~XX$9^YPMi8=X94+=O7;GWG`L6uT=Y$02x0h^xH)Z{ z=hIq7NwOsvpcl&Pth_qUYnG60fn;e1Mq*)FzDzS`p?ll2%7^zMDLPat4WF2fCw^X< z_I?;6AO4b^q>r9_G3;4G6ps9^Z=MSDvgk9ln~Wj6u&Frkd%ThtejsvS7+UdETEaBZ z``liD{<`e;Ju9sE425n8fE)u< zbgpB~;JqAa1qyvtrGRKh!YFlNq)UVg3i?-i;nR5iuGKXfKM~4|-BWF-70! z-hEZ*fPSO2+B#Wl2giQEu>wENu_TSGymeY{c}38~3#1gs7q$Fy`p(-wGKl~dU7=Cg z(`Gv$)Q((-F3nZ^aY+YeBEyD%l}4=+qVxmd_4raD<=Y>+6eYKdLHFs+NR;6P79F~; zNl3>w#ID^z1^5fzJs}l{jQKcLbiZWQg9cr1@2nr<0~F!Ub4) zI4lA^Dya-FyegCgYBoIL%V*&c-+Al`nhWNC-2|ByftD`{p!Hp7JcfywC5@sHlg2@0 zUEa2=1WjWRT2-+$R)2(%Ql_*FJ34&yS6Jh1aU24#Q;Hbm_KC3HIvcC|!>$hKMi`^| zaal064Y;ztcRL=LAG^NcUPqY5J?<^aa=xsuR3$3B_(4l|VpW1-$H|SCU38kM+6d{^ z2Wq%jioi39S)58E`4YB5*Lr#;ElMzaV6&@sYQ1cPFK9MF>|qnSpTpp+^A3>dgZ_7l?z=ODQ^XOZ&s74X6a$RH1 zN7=`#8xx|6TGQWk88G`ECNm<7Pu*cw=>zAb+yE#ol1XSRrrA{>Xl3aSCJ;(jBTXY< zMbx(}YvYxCy*RbB585VL*=k<`ZIC;5(#%OQRfw&yyWiDk$4dah$qAyq8r`0T$QBvOdJzrWX zsr3>{Gm*#l2|xt=&A;=qHeIbdDzU`26nlk!+_3;2MRSGhGn8q_lgR=-J!1zCi?i|u zrmrj^h1*Svx5q!{$}u_zC&!V$ruA%57M;uI=nq9S*0mz7QtRbwth~wYt4JrZgrHZG zIVsR5)f-|;3N_UkZOzLddG&!d(l+DTux?sUn9{tt4bhSCXd+E3Q{w|?2$M5(oLOaJOFdVLp6e;dT@TMWKyU+FUQ4Sj)qxt z>3_h!@1%GCK>Ds?Xr8q~*1$rUp;1o@mn;!`8W)_w;xq`T4z-n>19tu(Qx_wyxlhmn z{Evm@y3Jqn$zwHXP(^CQH3EC6+B3@jP~|c`9~AE|Ey(yBB5A7$QHxDPagS%hkAL=% zRsIU9_qP&)jQVs%35{td;P2l|E#0az*z4yG8tDQL@T|2-SN1z8X*xa~#JT~jN zSX%|z*h{RGa022DD(hjdIS;YoedKJN{yc&=O3SL0F zS=+!YaI4Uaj8y88SSw^>*3?OETup*PQHbufip7iCt?)TiUkkzvl^=dji&wK<)|zuK z;6elGg8yJ6JucIJ8{s8T`opco#}+(hgNYkg!B9w1UBRSAePYGrLZnWix^q=ZzOkSM zhT477W$jNZnxk`PDOZiC1uiq!S<1HvyA4=y z-mit591VPabY^#L8U+hieeseKtLwmFNaDE?^fDtoChiM56o7y_*5A#$ntp|(w8g~j z6p2~^)d&ACX2DuIOZfn;VfkB%eJ|=U$V;BiIV+ z*zpIwD~PdE!~3&~6|D&=nbK+;LL<;hae*<;Vtk-?*WY|xI9YsmnfnDsS#D=jE^lh) z5Ze5`>_A)6K`#?KPT!qHKA6>vi!aODPzTR=n^JUezM2v8xNDR%Z77BJvGg_?8<4P- z_$q@m4KYbG^G6&r5aY47%_;OoBX;;4bK`0|;sIYDAi!k)A?U8=OIm=>8RZ)!yDXM0 zJLtNf>+r?~OWj#GcUB`7ZCubx8Q3tmQ=-PV|AfsRMeSbd4bu0}1gMc#O$%Fe#)H65 zmaFUMT0xifvH`&+u~Eex zHvhwf{dQ_g`hr-Kw?z4iQoI=K4#uoC@SEVJfXf!*^TXeu;BEdImT&h^8aIR-Efu+` zP(w=~`N9Yo68K{yQMZR<@Iu5x?(a=8Jdb||A7EW3YATvLEpU*>`7sL|LGFOAq=;hzAK>A+>h)g}++zU4 z0fC_7Q4M#k{XKCo&Uhi}jt1g*gn&2+#)kB+3??awR`z>}neSvDm%F*Y9HMOP<&JNC zCY}-&1IaHdsy{={rlRCVf+|_tJV;0(}X7dMF0srY78JR$ar8$lo=B3d!Q zbi|48q%n-e{C%O83--WrwRnSs#T?NBr&HNckED5lS_{*}yVLfR)5h#|%+b8apwLtp z0kc<~VF;)oLGFtcHUbU31NDi%-@vP5K&fTf?isBGk==PJt{f6eeQVmOnb*WK+a?Di z`i3HsEp&biN_q&fn*l)>D<7jZt{ia^mAh3_Q1hRU^(37AHgH=K?PZ*pd$8dfsaP-C z=)T*1QK;Qw$jkM3@Uz>9O*O^k)Mq_MM(#@Gv)5GmG%8MF4uX}&A@(_u85w6R@?Y}0 zV{~}$gbSEilB`Mf1j*qi8^+G|>e5K)RUi`jLNeKG{e^7YMxIGA8t z-Hcb@uGya!_Ip@e>%>=Wr5ZF0dBaI*Z8}V8a(dxd7#uWQQdwvvpQ(Ek161jYOKENC zis4x-!uL07eobrkpKv&mM!c14FLnJ~d;HMw+M21mSk{+poc=t?CzLQ^bf+5yAwjfW z%ud?AGKGtO3B~^J;BtgFXjFp*F3ZO|%)z#T=LL7X7R}8NuyT-PyUeQOS1F(8g5&UJ zWj!Cg^xfxBkSeS>bBLb1E0&U0jVE6=YYtJD=c+Ba+;MYc_x)Sh!VY;Yxj$Z;Qlchg zCf{r!Ik?k8aEn*hdd@!7ffnkf`cDTdoE0BG!%+=vh@T(nZr3^o{W!D>t0q=5GkdC0 zAodYOE>ZG9I43vvowHTSzHE!c=7ChT6~kvfmAp6RY}nW=`R7*_cb$!0J&7M)84wr2 z8DdQYIpobg_jk&BBanmO_zOUWhFz79h4K^?U-ACqCuHDQ&(_*EMjT1ReB<;h4&_Or zKEas=PsoWuqwJs7w~pu{%BT-|;Oy3MMubr{CsB3kf5{M@XrAjh%Bry775J^X|Wk{#EPnDYa%g?ev(+La2n51 z5s$`{SSr6ssi0yH@qiXia6soMpy>=nH8Ia zbBALp_!|m^0Z;ph0rxPd)NRbv@OXpbF4&Jrt|iXx={r3Ct}0cm4_ZH?7QyCyl0(;y zHh7X9cRGmNFQjthT!B;f;^%C74e2Jf5OG&XaQ~pv-gzjT7tPv{jqRH~uWG2d?2!F* z>7W{H*0^xf)9Qdgq0&-kF-|7G5x6ukvNplJ183 z_rKe@Ourg@DinO8sAGS!DWmJ4z)n2S#<2lkBDub7Pp7`g5Bw-w^BJBG#V>Q3XCdsZ zz2+XM=NHd&v>f zGZasrynE%4vOmZujT2rZoc0~ zm|YoUfV0?n5ud)ePr749kD} zsC)ln>2;0rUT~p9Ic7}ANNAS4YXbo=gEjH|8G2-jm44CRTDcV)Ctrf>g_J>>K z*VkATdtY^6H`UTUWs~D;`K6CSKb`rsZqf3avUW{m$I#wMhJ>BGE^bLpUs^<-)h`IR!4Qs<;7Bzvl z0?#E4NMxL(y;7V0Fc^Ez-R9_=6jiFm^k^!m)8&mmc@x+TQV12s`j49ebd$GVVDgO$ z8l`08v$Ie^*VQ=ohHiq^R%!0+f42?)*zP)?xOU_B^z>-Kh`qhNua_5lBV)OH$q)>e zr@lWzLPC)E`T5tsuRRC~IxRsUfLy^ec7>rAAq6v{Eq;4f_&f&B$w>LNfYD=)u`opp zg^T(3*C!WGmpV((a+h;tb_r~-fa=7Xn80LN9_Zo_fDt(oirzB+YNW&?j};{45T-iT zhj-26{tVg`M~>Thy6r^jAUnqE5)zKREQdWjs~2!%mfO(^68Y5@7tA0RhNjWeZi+T3 z9IHwDdF0|T*u$SclKuh^H(wlGk8+=cii${Ui3CK@Lh16n}}4RQ(v4*);O z6O66pYpd}U8+^Aq($QEFrK$syk2)q=%hVykfN(jC%NkQIsQtG;u zvZ`o3V>VZ;{r%E;YDB;ht1g~Kj%aUv(VB!}-Gs(A&E}d4Jr^sq(RyLtje^_TDk5<# zKegj>b9R1n8u>_5R`-<{oQor=ns^*>KcAnp+k9$xeKvsJ(RKJ%@}3p}h6bWA_`a*J zm=W{>gbEkBr;Sn{4EeODWwEJa#{P zWK%GOW`#Q9hZhpA2;>CziyAXd`E&DFrSi6xK)Q>o z0-;%FexZiq=4_*%(7Fg}LkhU3ky-15plh*9^f4W-dT7P-`ZSFt;9m~Tm*gygQY%D6 zZ`;2tz~&-|^`~1gpJp7+!P(fvPzOAj`iUbJKDuEKYnpL&GUMyDw&Mnx9)+@JEBWZ{ zt6Y8_wD<$+vh`IpY+^EfneXzEkwS|cTbf_64jX>l+hYMG;QysHB=&pB=6|$?3UBA% z&91H{+}_@%j4jj}=^p=@VKbcxJ7m@3XKOIhHd}C&pZ@7XN|`w(C?;b=5Am~+`kfcP zMnX^D-eFoi_O)LQ36z@ zbTN9tidg4N^u;ww*`i$LtCa7hLPa)=p(sFQg7Z?W$uaxpa=&lHT9`h~RB8tQ{%NK< zAu-M*H?{K^S7$MQ#DX6~_z}HNU=zTiUgnWa6!!$>QRDqEhAu$cjM==c zn!FodQ-8&D-1fIZ9OTNSzNk)U%EmTHq1qn!jl=}DRo=!hYvlEFe)tjUB^nRDKJ@)P z7Ixp1lW*wx`}=!Sz>UZKh{ZkHN#DOfFK_SS)>h)q>6licTEiyf|Dk2E4aHB&*roq) zk|Kcr%Jl8ldPG9VVBP=2Lp+PZ`R!CKKnR0vx{%OOY*|1x z)?c3AnnX#0dndQgse4OU{IX&UX;MLadZ1{!di1=Zs;2vCXJuNJj@1kxco>v)IozI( zcyAy{&#iZ|G?JBAT83&%pGU!%vc73Z6vH35ME$5Hd~~FOn4O}Cx(v!qw_A3E`{m5| z#YHGkqCKl1dgKZ=G?P2J+k*tACekM45e-i)1!zY880{8fwk{YZa`GtXWImJ0Hdm9D zJMG(B#$rZG)2F#tVt6(~O+uv$II8X|kpis&Pkwun&J#1LH8$_%5a=*9tA8aK2Lb-S zG!h)2xghIL)~+8R7JuQx<-640-)sN=t|39zZl- z)oyt%7JAOZc8%Woe53p>`Dxkl+(rJ|XS{h4Rmk3vq5rNTjqksmj`9RtLP-QZH>d=T zM`Dr+3=hfu0f!v2>+LOiCB;qLKjylLBQB(l-k}LwEB5-38RSv)y;gtC%gBN?OSbVP z)Sj@RrL0eb&jm^D%n9iAvdLx5&JyxD{*9VFVWKP(BLx(%XDectdANW|_3T{;@8{Th zgUG!%6i!04b;3Gp9N8n>HN<#D94ys?_mIk{Ivm!vJ zLKi7WvVrOyNs20lR4}Q9?pX@=5r(~!2GW)FWw#tNYi~VUqZ!^C?i%p3%N%y&yGoB* zuvKgUYdnOd_w`xyl>G7$?=siDS$19=TJ`Z4Uvy>iFVh{+-soAXN1vg;ww;lFaE16) z?^-&ADNS6RUE}-XjAC>qBm4# z_S?5;Vs`za-rnBrCKiO0-$~~o*MqN#$rG2({fg?K1UJP>yKJPs*~CO`9i4peEpPXp%M8&#dy(@JxqzgLQ!2E z`P*&8IJZlrVqmNjg9H5It6T@Xs+?VSj?<0JwwHiz@`4CWidw^884_Zvo2wz+Y?Mw)4Hf@1C-+w3cf~48}7doh6LFMR35JVMt*u`^+?-PDR zIw0X5ivT`W=M4lKwl2BdE}-at{TlAU{S)HZ%;O&mG+WR}|nJ_tbZMQm6Z zf@N+246*7Hx$a(Wp^Lqyv&&JL8gXY=Kx|$bCpa&n$z(=^vMM6{!IHlBO6jy!bOjG+$pQF!h*}dniR{dqAFXUX5 ze%^4Iu-VOsdp%N2h&US8sNiV&U+z#XDOzycx?IJ*umZ&lLG*@+?_7vm4qxPYEdJ*z z#2wVPHvx!e9p4gwxzyC<|JXlnJG27mAC5~KlmDP#Vd3=y=QC@74Fbw>377GR4uuzv zh9yju^WQX{9k$71Z2FL`%U>h@i5 z^GAfYux8ZA@pFlA0RK#%YW1tKL#?}F?Ok1MGTrk;+d~~}sUn?n;eLDg>iXLN)ekSL zCm@7YRF4x;&NEyZrJKRJ8Zl`1j&XgGL8_TL?N3HdF0H8vNGytyxA?}!#z3f)?*C7~ z^b=L8UgVa)8|Fqmo1jUU`r*V)BB>K;sR;H57xM&7Q}qZZn@{V`s_!$x0Dw)&zNPsP zaJl>y_7n1ttGGXi6ZO&KLHXLJ(S)n>7}H9ltHcB_wSA zJq?od=%55g$-xNh^Rpp5S#6>pK<#y@&H2em$1W96&)w?1JK1Vr_f_K+Nsz<~N1w_@ zK7V)BMB~4TSMoui;*}$~wZjOsFd%c-!_~IBW~hhIR1dUm4zBlAR}kOD@UIMBPG;nW zk7}DXz~lt146;8qK;G>MXne~WVH?z$N5L031_9Y(B>CaIWYmX_wfHeZ44Kx;tej88 zIx<-ixTs&3IrQ;Y+#fE`+vuD>&%Lv5?W98uA4x998XRP(m&upJACXBnvw)$jwJF+n zJ=Ugis7BVs+=PI{5O7Fxpe-*^(W1(m8?WzTUWqvjYf{!mYtwLGm}kyvyLD^b%fgiQ zdfqQZROkSOu^4)LR_fmRY7%x^5?z30n6@B@TeEE`p!7Q1EuBsz~xXR zDE-gE@jA5;YT4W9E&^ z=jFI`c7x51-OZZ3#RiK+yTUgxtV2+V;I$UUAOLl~N(Y z_lBPz_@(f9q6+36?tY~e)9%j5YVJwv4%=Jy(%M>EIj1D_?vN`x?v1e<<8StDA#YfF z^L7c9xZyJ|SM@?BpS!SJFta(ObVdR+dQk5(Au2 zKKZAaqfhLL-yh0bDMNG_tG6|3UdDh7P#DNEcYGe-@z^^!82q&}@y^*jWq;rtLvsbK z60eKZ*~3D-M)Z{GV+mI=J?*{Q-5a6B_oMtl1%@V2##@yA-+wQr9=1i@pMpmF(i-0& z8rq>V@h+8>+@X}5BjE_vFevw*uDwTQ&vDc$@blrc^R`PNuBDNQa5Q8a{TMNvQ@YQWJ@#7 zdNsVR#=)59y&sIdOYPbBqXoa{IbU?2zB#Sgx=2LSfMi82^xdI( zu_+6c{(3-hlf3&t-05p0WQpN>J7 zShqg=g>0T;nOIc$L2CX&S%u`H)zOJ!Pc}dMl_sX^(r8D(GWo3qABDWvhw8;QAIe8B z6zP33#Yu|MX+^U(B1!pJgm220E>o!_(CTHmp*kg9AI1AX$;kfG=6(96sZ3lrKELUU z#aI*BjynRz>PEvqX87lK_^=;MMusqBf(z*oJ?D^s+b@Nq2#IDOQ#}L;20ZW0pof`% zBF@;UYIr_s(SFnJb9$+v^=yDSCbekKIrLDFtOdyjp!MWdQz{hlKi~5jTv$&YnVg_c zO;3dz1JFJzA2bh_m2j=|_!n#6SXuE%C-bHj9sEV9i33#74F)(h;YlIoHCRqU_M6Q5 z6pCRhki8%A#cF#zEM80iH1z6XFs;}fJ0}0Ft#Nv62xNmwJI3!R5=_g>UF`$MCP@^9 zivyib{F)@iYxX{?ViJt+iy0nP>he&Jc4E-#LwC zTeHDH z+KOTKP2E9N)=X#YHJ9-;b)t2KJ8L7|dt!A5%JFzQ2m9-xiJ6fDG;dgsko%kPq@-Xq za*Fpns@h-O`cp8Wt3CRd>`)36%m>a#cl27kq$wf$;R`BIJ~(u zD>s5Tdp}u?MjkVqM3?{Q>-;gjF->Uex`i>$?W0yCz4mgPshMA&8yf}5F+`=GMV+d` zCWPc(uvWQi;xCfi`L`O*=3_}e(l5ez7gmYPYIm++_2o_`5hlFBBdj=#tZXm83pV-N z?1;oz{Yij~JGB>wX~5AufEF{5rQfuZydz)zd*Zt_o=kteffw{Y7wj&58M;Ng)1?mB zzW^1qX>l!F1HdEz!##@SQ#sB}aU^)PX&Qi^vBIm*BF_7PvbM+f{PuEI<7v^C+s#0W zn7$`J-LWNum2FrC{0ziXfXXH3bh+g>!Of0qJ+Xfx)*B|Xg8Am$#k#Sy`*>qm1*F|f z%hTOylSQ92Syi6cs*%VQp2Sh<7mbOYYh)s`R-oFyiP=mq}WA*VOR)9Vbe z`7~>dZOv{z!5{SUt5z%aL|YZq@7G7>^Mwz+#F18K2^}dnVfLVNO4@*{c9wC(Dl5CI z^{DQNZu>?zb=oBdyz)UP4(}av_Z?o?Zq1<HBirxl{><27EpSrOW{9e1kv6XSNlkhvA-Aa2Qkj&WdDC4=g7Lh83>`U!6Y73k zeuVl{f>2kfbZp`qS-b;E&li@YP>t@%!CZ1Hp>$!XDx&2oj7{NKW|zjyta4Iu@z~~c zRnq!!ov*)|mA|qh#G+h!Z(fSspAGqa$z2V15`3P2n4(5lg8b_I`dRP8a19s?ydMOR zx+`Ud%c26B7*-q^f)#yh>Ei0y5U)8yD&kXPwXEm=IUT*=sz$m40ws&exs!X2oOTCUocd6_7}F}81RX1XsE>J0 z15J0Q<#9>S-S@T8(nN_E^;|*Pe2vnst|t~iA^shr%_ucFNWndu+%$hmh0(}(Ri(p? z4lT3w4<{l{D#yu5aD4ulzplGT3-TlAj@Zz&P;QkgVM;Bs3NBC19VvPD9g18wK@s+c zaK(%b>+b+K65-fk-@l#S6xwvcYI_;T1>0yPIdXj&f_jo8^$qo~LV(fQIk^52Y)Kob zOg=5~u#0vA6UVr;BqPpS?dM>QONloPpKXZR7?;?xMGa*-hO_%pM(8FP;1KOEZRmD0 zU(i0%X+>6MO7;8GwKnz7yv>OmWXpn2;VEkL8Bf|@k75gAC8#pD--s9Mp#=muiGZR6 zSz_O^$#$DcuBh6|kkV-JVE1GqkL>|XQB!KSb9#U|tC~8lx&&&!;)k4^(Yk07T4Isg zE!)9XTHB)64AASsULSEpo1o8P4u|S?xzWv%i$22vHN5MRcj<*phO;cnjbrl8z*;H| z5w7}DhMM%zpCD1(zR zva%}uKdpS;#0uMrLpgiVBvB*;w<93d|DBmcLxUWWE|zjtT~L?fZ~4T$wBp&I(I?1! zFSU2^jqX0KhyaJYO*@3hsU7G&6D&t8%+4B1c3cf84VQg4cb`UXnP)0u?ccm5B3T?Q z)I_T5eN^##gj6@6lRmMOv>TVpZa2jvE42!#;q^_A z;>Nl8uO&1rb!%ETac(rV{3Xv7e&^bH;}vHRV!XFQrVcza*7qW7l_Cl^iIiLHZ*G@S zDfg;X>XyV5SK8uSEd971^K3Ojo_PBRlXA{hklN?dPSyz|sQrud{p&=yq$Dsj8Msd@ z5tzI}X5fq63Adq%3$KrOB&i-zR$si{9^glaEy2#x!>*EREdSgg7|V3*0!W~!KG}=X z-IO$^lzX?ULQc`pN$UG=GyQXg`TUXw%M=C-8hehbpjAsMHbx(=xkA|R^wS_g1@bS? zbo}ZPi1kz3{jD9qR7%u8Ki7dB@uAfyBUR`h36ZLGp_N4T@wt=b_3;n>XQ0=-f3{Q4|(P4$foo1SrZq9-;1iT5&@{kb4;H2 zGAb@XoN|-fe_v41imDvji9Zmys7|LTkEdvd?LPX$3_VFNQsjX8RC|O9SDLUsl`B-o zE=w`H4zTKEzL8h_Gg@2|6BnZNQ%Juo{-a!hF->Lvz6v5d}9b)oV8zsTxTe>D58BO zc=ySOrlgA{XP+p-m?k7i1Dg;W4L^yB-Z&?uf{DtVz4hy{I7r@OqxK>f#__{r3 zX5u`EaeN@3nRZPk#hKL9ZPxPqMG)JMP#GoZsCPE|mD2rUerEh{42W_nw7ktRwb^5O z+Varo+RUpeNEf_31x;w^%F`rNUl&Gu&M*NERM^MmgfrJ_wH)|l%#-%?Hl{%{b;8KV zR@_IfR|C+9S1i{Y?eCUstQ)gNq_RAe?pAz=8S`!p3HPPTSVp*7ij>Rr%b;2E0|jFo zmF*5;18ewbTc_8hMuv0N{Z(F+34`V)E@KpqJvxKP*;8aues$lvPXbEy-piRPZ0L!6 zCHv$>Lp)9n)?fPQMShsy`yRY%WPXPD7|x{jjzuZMvltc(NvfPt13HZ&>;(+CiroPl z_cBUliDkyycDU-;q(&m#4EcIXo&NB#uR88euc#QV7a=U}RlV83#at^175IkP3cTlsJ`E(`00<7k{yQIdGlr$S|IE}z#8P_s0T!;e~?#~ zr0LO=2+$6~>F#aR_vMb@!+J(-*nIpEc6xxzPg4n36Q9Q?EgHCJ|F%D8M((*=c8~wQ zm@JCz(Og)ygJ2=8W5_d7ec`BjBJU&HQ}r@hTavm~ovaZclWfo&X_XNNa$76SPl;@&Ts0yw{CV5*l zU%i1D?4&P>UBXvf31>S-Ziv~geHBVSFr~-q9e`w$ui^N z^*0%@(7oTxKjewORkfWYymqCtzUW=*_>Nfo5X47#hCS>d4$vHqA$yL=XeDeTC;0Be zj%mV@&jG|`W$Xa0)pQTV3On40HHQY^ba2ZL6~36u+m_V;zAvNATMK#LeW!5F+zI@I zkf@08fhG#+%{;X{K%;jKs-T*ycUczyXTE4WV zys7WO&DG~E#k5xT^14{1&pl;JRU)UpMZHu>cT5=5Nahs)dJX7`_Ke)4Qk8|hOUOK^ zLP=bcKOw;tdh3t*_=y2qM({fe8w)WipK46lo;1p+{Y!EwGlxxCwQtdcJ6@7WT*ltk z6u+EGAx%iHfdDRF2%xF6ydiw`;JTm%!hXw+q8x1{{y=q&S3P=e4k?VLoZ^BT|7HXx1il*C#ejZ3{NYMeoBkR{G`IkXo)OD6O8YQj^K=C$WiU#{#wcH-k9)BWYMT z+qn`BgK;xKt8@v8Qp-Y^gre+#k8G=evTSZMPBu6xuYR~m`o$`8ktBV|N96uEim|qs!#QGrPtvQ$s%_}Uz5YKYU+ z$Z1^eWRJD>arCMtha=u#Qi;IM3U$9Lu(Rs4!ci$li9$N3u7m~Dx`lnMoR99vghZg??KB%NK2amgKz0 zlbvYq-`x3h-yYQXosW>7*ZcNhQ{OF(K_G?y?swg9b}|ts*!I)jyR%}vHyCZsn*M4! zYUWN`C-{D-2(hKSu3%%73X*z-L}Q|lO4@lCp5p085yThZU`zTvvQe$RGFam4d5JA& z5}9gjUwybqbxu|&j-l!_$xB!WL#px*j|t9ubRY0Wr9dqaa<(3Zx4A|APZ(l(xKL-< z>BZ`Ex+=cUqs+5O34IwKu>I?+;hfsoERz@KXHLPT5auhIucRz(QU|FDECQhV+OR2S z*F3A2jP`NlhKA1FVMv#j>k)zDH!cYSPFIA1&#y@boNelV=hXjQ>i;bWJBBc@nx3A1 zKgMt#uIpFD8{M{Cl)g!%j`M?H(qh0ESi^W%L zB#1YfO88f!2!JJ*uFdo>+*8ms0TyUm=VR20T$#BUo+nF9D9?S4)`Jq`;w(Ye5SGtg zIAid4IlC;y+vu_SmN(`=&mFIxrSDUSF1u_@sM#@_=@=Tunc9a(iBRawkg7O^Il;6% z#7{=6_pm*tAhUAaHgT62ZMezJ>y&RVM-Is_A$BaWPwt7>X!{_@PEH37%0;9t(RMCg z9o=!pXZDoM%8cqnMjqmK^Qy8ozPs>+a{(hlisnu(Ui5&g8VkluQx8mXDypA}$6CtOY`kqihT!ju-?am}omYy^1B|oFv90w^*VI$2bR<11eSS?=SZs zm&AJ0?C6BsA{EH-dLz8I?yuedGnxbLhVB6Fivj@>%7I`#Z?Ie3U`gC>;Mo9;>SyYN zz-=+yYL;jQh*VpNC7yNS@jOut$DAmdQZk%X0EAb7TS~4^Ue&5sOqzw6M@SfPh>kqp zBEd65))0@Pf}zF`3=4e{AWB+r#H zj2+53ii{sNrJaQwJ>ljd-9F2mKFSU*A@4)G#C)!5_kx!UF(|W{-2Om#*=39J{@KQn zRoj?)PKBdBKyB8{bxB#llGPP8v&&K}WjLke{?24Xl4|mM7S79%VOBhM^)C^I=sJ(H zBN&s_p58Qz3_-W3fCTKX3W^_If$%*MwXStLHLk;V*~3zHoG`lyz}HBXAAb%R$y%4A-Z9S1(o3g&S3( z*TzMT0*p`+@|64{HwXqIY`cm_1C?dv2i!aQHKRzPj714qts2RcuCGC@l{bU%y)~0f zn_Yx~W5_rMNA!yWCG2gSA!4k; zJTLVkSMsDUP<@D`Wdp)g5uDJ{C1m_9(sCk<=ZdB=bsJ;aM3XbZGUfVn0j6DYylX%h z24{%T3R_N(W-`T6=Ig9p?QgsAG)G(H;2Cz!C+Ck2^{i={)yt({i44htK?U*E$`4@K z0lSYRitL&BsvLNBGeF}4V)Mn#Pwk(cI0(N)UXhh2e2KMEN_>&P&ou6tOpUV z7WYDx1^PW6b#6tAwzz_=c-{=ZT+Y{Yw4_t+qs`?NNLiJp1p!|Xm;B>5x1LQS>JsD| z00IS?M~bn}H1u_e$&9P2;qjX(}!myGXzWwkuAg zk|J)DL4SX%1L7o#WIY?!0fE1=fo{w96TRfGKL|d4142gcXzLYYHfahJExS+?6dOOl zF*x^81zQBe3rbnBNER4XjcL+JRz`}Yl0kF_5*)q&9l&h8`}|Jj;BoYJt!x{w$O^RcxPWq|*tI*jZImA<`#3Fz9pbAIIn9sG zJK2AlG{V#g0yhS@h~|w_?olBjc{_Y%#+42cu2d(QiOb|-0ydEON~8-8ID86}iENL* zU#$~VNDaP5F=7N}oE1;1q%`=V_J)2H#|(uXr=)Ok7?slguiw*Su4OQ#DFTK9fXWnQ=`45Dr6C^B(w&kq#|0|(O!KzVBjkcMl-5*XH>Wmk~m8N z9hDov^qz(h7m08p9DcLS!N|k|3oUB_40~cxn-a^?X#<*^YAIb9zcL#5`wH^x(bp8o zt$8V9S+6I2#J8U&zB{L=#*#;(C`UMBs_}utY5e$dDti(DS!fZT(TE=QvcnOsfnM~S z;H^!g$uJ;PQvWjFC9KP4)^Fx}?+3*`|Dyt)PzCtR4&gigQqg*=-LmP!O4EZQ&g%E> zvbr1Te(_+s=3#w~@TRcpGFQe9?`Zth_9REf-u|54i4jawJ+MOfOY)G+?4ELZ@5H%2Y#v5isR{Y$0RW`%AyO@671kx=^i2yR+wKqZlx2r$b#Frmu zA(qv;d1o0dhq4F3EtxRd0j9`Iz!ceIN?@_5u8#B4@c-z0dE{it;fexLxL9DADdVcO zMl1P5Cj({`{bVeel7RuKv586XA^&S7?f)BFnUAYRMCnJB?`fVey@3P1Lx>wr)$;9Z(+AT=BC{c*yyhYwg+&pI zlg#n|hgqjnJ>0y#@&9b9X@^3E1jLW-Pi+O}+s?jed$~V>9d$ z1h`G8cs;fS)GRz8I6YF*$soxE3UozUosD3vsnIY_h(%n-l#V02W8}cq5NZ~bi3kNh zF5~5>MAP0J$xI`fNH)orU@rZgjOE}^=1EYrv{#wqNbFY4Wn2aN%11y@XtR@nWKDG{V`j2olEBtG3U!%k^M} zpp_wKzlF+Jb}?-CQcOQ0#GL4Ohoc_BmCLNckYXe?D)p0=iq=gWkBXKi9H{();tk-t zZZCx_zco8 zrI%<9A(OIVGU-aAB~{%)|7r}}=H4stm#af|>`LFgI6!SRSweaVOAYHGHvbNf}vDqW`-exC=K2 zr}1CJEuxPC(Z1j<|GkgKKq4_EG7_PCXan=)e70cz`zo^H?7R&z6o7=!o7f22gjbqC z)FTuE)F@@+slT)z{E&x0Tx;(|)YN55LiL%!b3Lj-6cnR#ecfo9h!=W5J)X!ZD(@cV!Vdsp# zugsAIR3{tDBqHK=*2@d<_x>|)HIh-ueI>VAkue5pb$#NZ!L>Uy&KVzoW+h{BHP%7O zqk6+0H^B^6U?dCygJ-bq>=<(Y(_XT-?GE;WGZTGIo*+=j+zeJW0piLexz6n*eHL~N z@Is9a4Fkm6GHZ^cg zhF5N1VA7IJd;?s@2oN-QGEk)MOmJ-#&IAC+ zOKaD4oqD){!s265XJq&mWMdErB1=!X8FVO>I_bX9a9ZnqiU?GAfoCXA-`jA3Aw_o6 zA-)VkU*P`yPvMx`f(!tkIIrE{E>nB~66L_M)?O{!@4DP2?x(YT4A@Gp*BRN*Q&Gkc zFlXT8DmM^P0?F7yXi@^ zua&a1+l^yM`q>ga<6JNO_tOP}P7B2LxGP6m;d?KnWGV&DBv(C_OE%I#XuuvEXQQ-EZtzo1?SvGu$g2k*va3#`YNKo<6|3nUl7 zA_kTZx3)%ZZEgM1+TtKvU*qv}D+kh1Uq!blAfRDu_V@2!UH@JgjO;&{5^vtT0S@7~ zk&%)A08X>Y+zP-5C`akpCe|H6WE4;c|Vnb8!ORSW+M$GTAOyJ+S+wcJ_}YHG0a zzh{3Mv1A~{2Fs87ojl?U3aqK|Ks_I9Bs#>1ZJHpuj13e=!GDxtc`&SPME&vCC-x?n z6;Y>^PGX=Vk@xF@O?=F&9+c3wR!#$jK%MF>fIxuCsf*O>*RS_PYV_*{LGsk}>f$A! z4wK`Fo%P4nSEU?I5BF4WcY~r|fOxKu>u9I8a?D|R26owE7g|Nibe7C~wr1&rBBbzNe7*x)f;Cu%=x9H;Ll`DQHr z{KybH9a3+S;ml@7*wLctAkj{K7(t?Ayn%mY@6U zUOrY+3*g$}z*q3btq+W|z_(p`GebV5@~3Ym#9f&>kq!K(|6e6V9xsm6kCrc9g#Y`C z;Hm>&=6PI0)empG>absW(|7$Sc$T1^FMQg4!DjqF7hm-(7mOab?nOOtcMUpb-tsW7 zHR$R{z9Vnw{)N>6e1blLgU&}#ik10&x;B&e=CYKUQS#wDk@<~zhYeqA{b|7Nb5w{? zkH5gT76(GacgNBDiEB^u*T(|y!EE=~h#*agey}ms(;Lv0ZtH+1wgqSuQ1c7`GleRef90hPJlA8vnmL-9y-@Y{|ty3d^YEte5 z48Vt$ocMMd2spp#e*=F0x?{{`1?P3JPNykIGZ0I-g7p8if`OYRSjs8YNm&0abr>ze zbUoh7%L~C{8#U#YrDIj)${a!v1>p@nB-A(Kiq#T{2$ybtI^w8pul1%esv($xS;R`0 z@6a=xZm`N=`HF1N=rR>RS&%pj!CMc-=ITetq-@0t{nt7$e{%&xEPKSwLYkG9aDDy# zd!zTEzNy!o{Pnw_Tjs#W^4e#+K@Yp_*PF43edQi8pFeu4GJF{k+06@6V?u#sWo1dp z%F4oa=a_?Hq3(@WvL>59rZgfD&f{e)0vRakW zjxl67aNO=2kOU1{14kGhoK&B`=Ea>!#`32(6?}Pd@j`N|6C?2Asz2|)15##UC-|K`=o(w2WH@1lh*eSvfF)Nl(8z|;1<(4V0_*t`06iE z3BD@j>#M63z^NVZ!omGN&*pC^eC)=<&)+`JnZvQT*cddf^1mKv<0fMz5!aO1{kQXW^D-2?Ub}tK z>ebwD-@g4|!+-YdS%!vZ&z=RaKU@jCw-OjG$NS~mfxAC}ZtUFu_x65PMHXFMT?tv) zr{^R0*V(>${krge?e~wzZ{5D_tfyJF1~>%;y2fqYzF)6y6qlElp1n7F@)>SW*!_OL zU;cg7_1zn)zvqF@_SgZOF)IXaxb**Zt0wuChrlf|hk>`cwb%as2C9lyWYrq6 z0UHk|8=2WZq}P8-S7Z+=E@O*Bu63-3Z!SdsK7&=9Mcs`)$A7(46nSt$4b}GXd8?0~?!|B993!Mg|5A zv-5Uwn%}EXmaBNc2r3c|0bL*dWe>;(&{iwpVSr!1CIS0^SYKYaeY<1fPN2D9@@jvr& WwxDfiIcqgVGjePr+2yQ-e&sX7sg3X<#AqN82t!&*Tp0v{iw8c!C`iDO!~ptj z;ETsaLeoXX-ps`v=41+zhq*Y|*t^(R8d18LIyqa~+p$Brpqz}97A`Ih&b-Xbw*T`4 zsJ)Xp^I3Mb7H|_(2PrLQ5C~o2srT*+yfP z^bt;?E?Brp3dsgHtA^E@nUI7>*U;U^XW{mE&}&1!tDU*R;Qo8H`%Ncgy*&lNnpwYI z!SG#8szr@74y`}DRC)r3Nc!ST>970YQs=*_u4%By`Z9zcnA37@+e~<9nk^1*Vo7-db)m!h6t7?Rl&O`o zaBv{1scp4E381>+<~cqDt-8?bMc@xJt3NNpMq$k-7|F2jifC&3u?3(q#tP{+dIpP_Yiu z8IAP5Y#&uv+t{Ed%a|&2Ww6Fl2pxZ~JJe1Y)Ncnyvx-dNJ^9nDzREJa>Y%M^oBR0T z?qcon{-*u$@v(OJz0ujPL5%9FDMH?O^wGNgPg5ZnhPe_2kE5t=6YX})7by^ z{oUX1@mjwiw^?bz06Cm)ijeYqV5RDRru$&C=#Nb90Ro*)ioMD!FNc(?SBjdOn;-s{ zZOMUa;r;KA+h66}{V;d9S#uXlFP(+zp_g6+`!iiQ>FR@|L5+o?APMZOA0O7%)<(?g zE$r>9i7bdoNFW8o6Zlq@fQivDF~7C9>$Kb=!uK{fYtvy3I~u0HUtU?!(sm%NV-!$!02@(-5SS1L7e$+Ne#33VGJ!=m&d=Xm&e-x_J3gWm}TLA9D~L6 z|8)ctB#-k^nzQwrE<&yiZ}yk<=fB+yx;+gOiU#%&q0rsvCx_cp*s4Q6hR03&MogUd z&O2H>G?2e_RV$K)z9%)b>(=OSsU8`0+I7?U%HXz-(BW!MV|&@UI*TPk4sfrcs2Te3 z@$EL~xhcc-t>#j2!2)w;y>z3Qjj6XcX`I0I>uj%Mo>iwYrp0bQAz;hI#`!&LzpTmA zZ~G@Ck`FdLLXR^-TNxV<@4HSzm^X)oo>AVF7j|}pd@LCV5_Io_I zy(|`rDbD_kcH(p5b@03iY;hKe%qBD{gQm#`8llX(gBahdn|N8v+Tn#t9b~PPskyn3 z`f*-JggCsOp5ALx(t(i?l;gGoD9A+rd$NXpgi&qygwL@vx5FmLX657C1jB{4(>@3s z2=Jo8&CSguAEXyALNBg_AAPSD4cy!)E-p6a8_xoN>A_rJv%;-kdsWoS6a20;{6d_^ zd5}SLZr-=2LCs*Yd->uWX?2NRJCa{;7^}k0-?n=Co zKa(_nUG{H)?fM(3SPe@r#nd7_w70hxb)}UrmYoJ!W=@;Xb`S9B{Q(AGwX_k6(dWA{Kt$6YEB|n+PX(>_WJnYc?C-Jc7 z+@ZfXNp?0lqizdUnG6z@OyYo9>H_ckm*lo&JS4d+_;@*^+2%qgH#3m)xRkTiv|`t9 z@O)+PX|%D~W+{+Kr>Q1K^5e%E+m)u!Dm7>-iSLQa+j%u1XGeMe|0mkAw?W+rc-#)Z zuFTHvT;JTZFWJm<%Fnp!Ex3{nX9@Xrwfj9krT=%#KKj4KYUq4`i2IqrwGBiK5ol`ve5KCPy%iZQkl}j|S@O|L1|#toyL`NMY8$N=e%>3n`whHx^1Ok@O_Mutri>j`^>r z*JS;D9Zr_7_*V%ng~q~s1wQR>Md@ceDUp{aJCqsDy}7h$=7p47h_@R7=a`ONk7tp& zW15yR<$kUryjd+G0Y)4+6aS}*sbqK;4_`dac~G??0&KEGMF#!B`-?v1sHbE*JqEFu zX4|ejEF!7cl8-iRzG61&Wq6sQv-KCqMfxLWi?J#iHt)WN;9CdG)~?t65!YvrJd0FY z@C2?rP;&c{mjW4c)WySqq->ANT&Dqp@1+y(GMaD1%^J@ww_KnZ$f6}oA?mF9$Ckjz z?K+>b!|?tuEA$+n{rpP1Z@DImt`W(K?$eB$p(bW+$%_jXg|)6?8qwF&R*IzK0e4?s-?$Y0coaXgbx0s`EzQD<#<;oaL+Tz1OLAEg2YP?d%; z2yoigCmv!m(Efg2Wyc>29c-PDTZwq=j7#wbCsu3L5@?Oqlp}iN8Rg+^TOoww6yH?h zTN5)5=&&AY$LgpMWyG2XcvMx?)MeNK7Rw~~;byfbx7Bjyh)BK;Pxnb|GBvf;(T-{z zzy^e-GoiaJBdPMgm5CWL9Q6JYlrxdaPh^ROl)!irQp}eclxl4h?I%12#p&LA7_j+( zMe&bXU>}k0|8(9S*0oGvg8C(lMN@H=D9?rgV`OJ=1~jsf0h@%I>8tGA=$9obpEgo>xHUX*~l=iPP#z^b*aN1dIk?k>J*;AFfZ2Ba8VhH6k zhT!-iRPRZm+Zw-um75efDo6IzIUY1e*8^BV!g)rLZ6M3c(71rvNKQ4zumK}0Z)jA# z@MlTcL)|v@emBJ?(iDD50JpPX%sRn1fAyu6ennd&%Fs27J80uv6UA*kKwlxOgPF2n z$8HY|L1?#Lhr^JW;OG$%&;}fpIBdA9q5{0r)YMa%NH&9wD;F_pg>A+|@Lj@^hsK@?15CrqTarm4IQ+so-K0EZPr$OZ!2d(3WqrKu9(4 zQ%s*Zq%K%W_l>V@!^fbmLYt)oA_d3xUx6@e5elb+(}juDpZ@T9fnP=4cbm2$9%GL1 zkr6|V--|F7?sf6UBIL1Z$i6ke6G+jP@N1SB7MK`*)uzl|vFR{^wV333wP3aUZfPbj zTh%>D#~*`P6OW{(;g}Gh?4`e}V&ifUkQuCF)#b3#rt8r8JK#aY7mL2VZ;>E?+~2fx z&!p2*gBWO;m(o*BBawu5INCuITf==Aa`)5f6>sm5Gvlu;E{2J9B zLJS7wfLM)hdJK1Uqso#2e{V+vwzu~uQhS--kVerur1^%Wu#{@m2Q z+tVyrJoH|vpZpQO%MMJT!K99?d;4F2jTOe(+@H(zrUNz!{SRbKM2>of8$GX)&Q0Cy zKkHeco*s9I1&M$qy1$r?#WvFZ;VDWj)2X$=!^jX2o4Ky!mVFuhpEu*XJ8j3oM1rx~ zMpQ|d%NA4Ws*?@sKS3Dtys>`d)xt7nEI}iV*6jyU{C$KR67Tk7^S)OYY9<`V*Vdu- zJ1L$8>n}>M?^H%jaIklvzjzrZlTA_wSI7iYoGg_Dcxj`syrarsmLJP28Gq z|4RBzCT_Sr9#5VO*Ir0uxB3FckkLo}@<0=+JG3zuQi98BO@+C7G{28sC z$xImnUMp|PY*$Y!ssHf`3^zzuMr~^$OG?TdYE5~iGSRRVHrp(BCHFC4^}i>9qp^TR zP`15zW_l-?0#A(cdt=l3zptF@(q!@IT^1j82_66SJ3f>-83jy6Q!Avk*flDm(_yXO z=+_?hjCcRi!hLEbxc6(J{aHi$yX#vO3q1$M7-m7oIXTe`D$;eSbp)D(pj|IJi$3Oq zF2|z>22*Z+bkf6T>=nnU9A?iOr>T?HuYDQ*B~3J!=@R`$qHAaHdzY=j2W$@>!4%>r z*jpLieT)BaLuFR0md^0-s>N^h8eu$e&mFy} zP77DY0!q+|NJ0m$j^_)$BcqZ{XnY7h&b6xJ-O)mp6nI03K$WrsY_!<*Yr7KrbB>Sx z$7D;seKH2MR<99ar7NO8JRQQ#WE<0wWx~Z1sfe{?DNY^5?nzhR?Mg}I6P$;~VD?(T zAB>K~wJ5XUQMnWw4wq5!W&#u`169b&KU&8)e795$sl~U#+~%b27m>8e;76;^rrwWO+Y%4_nv znua2Kf!M2QGtDU-E#Pi)z%+0d+z_fvs4kigCHD6*cQVfa)0JMuJRBZ}QOCE8SlR}? zbo?tKddR*R~Tj?M(|B0sV=y7&XdJ15K!F`VXXX4zu`GtZxX{(QVfXq zd%m7TjZXfV3-6fOqp;p^VEugT5SXbccBT$Dc$FI;4v0-(%-`0p)kVa|()VmL#kXWR zv`8S1xTT?HbO|#0Emn~qg(NSM!adN+8#wyyPURwwGzz zTf9A;LSza}>9rz~`_)9Bffikw_94&J_LdE166sW;e- zsag4JiSxIzmAeM5$X&Tr`n78#EtoZaNo=F0+hu5IlVcvV8*Q&IvM##+NJAV;&taJr z-*!IVEhL~Nh^Bxcr60ZwkF7o6A;XM7NwZd$R#Vy6L_0-(@$)S@LX5?yS6};6EdKf)oSb1A>11jL zVkl$&Z4+q`>Cr9l}B#WI^0^cK)tIQgrC18HVM-`+T*gx zuw*D3D9JEwvB(W&Sy-<8RKSLGVY zd{H5Rxs9`zIq{FHVP8qI>vDWG6pfD>wWO5ROG{)4BywJOa$*09Od&xt6MicPTY!c%>@}BM5oPHvjHe62U=twjW9MHm z601?+?-gr*?ru_`dDQ0=$ockCyFE5WRiN2OJWHM_{AvrLRVM6v`+aM%OIc|n;j=O2 z)enUT6*S>SuxQ|h657Cci+)G08XGer@%XkW}8@u37g|&h>34qk!SNDPy#8IaH#CC`wqI;LH;6(4z)PZttg@ zWnp0DGrk{!jomq@bq+%~kB3k9a@VbY*omRUbDYR|6ZmehkTrGCB%#dD!kk)iE<8V` zGAsZz+K|2K@IZ;{p3=E-{q|Sb0!H^NP%7Cv_x%zwto_S~(pdjh?dP097lq^sLRUaP z=I)Hpp!@)0I@Q)~52H2hH!qp&F>B$%0i}c>ddSf9!EfoPfVy->-AHNcx{=viukjoH zYSCrX*bGB9kwbh$)fV@dKUXpMF%d;pvs3Hl^qH`e7+SGY|1#uXuA%qOb4k@29c4 zfuyvJajNAISECM`a4^1wJiLxM3tv>9xmj|DU5gq9rE? zZ~bOTUqx6;Md6gYIeZ%~mA>6gA2#xuk-HEZbm+ zEKB*oBlZ9tSf6&PVYLKK5`QKqr*~Ripgee7esPBDuikLGxy93!M>J#%RWG%#y=I8v zePrn1Dh|iY2ukZmi#K^kE!=|oRZi?v6Qk{wHpd$vN4TjbnqFZy2OrfpAMwW|z?QN_ z_y^Cgnla;?U=mthD!m?qWjOQ3`s@;F31u5tVws8Dyvh|zPS2Z$aABgOuNyzY2k)ha zt^82gzpuLMN%7bz43LO?)h0mQ+Y&sSENUdOE-|Nay&wE~jAg559p zxCC~3Q7v|tVKO@dg|H{Z2RQ;EVXI}T-9+8gA!<@6=loS&9cj}_5!$Fb3=HP6513p; z_F+1?l0dtiXG(vPsq(aG7^osaUq(K`PY#vk8=JR6A8nR;)h+bBkwcqpDZQ^n?M5Yd9l9`tL&=sD$-HGOxJpIY3v7C8-y`0*0No}*-fO>y(G7N|*j$=&CJsdw#<6fr3 zh~Q&u^-x^GRqf1@w$2v>K+*M~a6WNPtovKpPqb3W73z*5gf0*WIXc5{tJw zG*l5GeCm0#;^=6!nj^17hJZ@1KuLRP8CR&?uHhFNY+xc4u_6){#(1VW$SpemNwrUu z6yOtQP7{j2R7xo8bKo?dj|HIQ>PNVx0< zzDY!#&Z>Np_mFdN!X-r5in{rhjsmY=ejJ`HuNvNRxR*QjewDXBWX$Z-X{8tl5$)9< zpUn8gyg~QNtEowGL4TCal1)b06^zzWkG{S%`gjK~tiL!>@9fekSXzI_yC`_%8mJ~g z7%tnH=4nS5GCo+33SuiA|EzU#9lRHp`@Py#i<2$L0_v$|C8kHNlzwV6xV_PEaBv_M zTAm6*HsJa30U2~hPDVrr4`OT6X3wBE_;6P0=hU?*}cBSnSSqZ$bb`=xKaC7)DXfY7WdQv$1@#kNMRYQ`yvZif?Q*Qk0 zEyl8vhS{D@E82)rL=&N|E3Vu53ww1fO109mJnMO7L(`d|5_5?TS0hsU%Q&^Hi){_B z)54tNaBm@lAa=3`n>{7(qlN1J1~O6#X0c>ybam3pnB>!HW(qXT*IQf0Omv+xA{3;g z$e@Ruy^Vq4t}B~EAFq#*EVhJV67QO<`;MqIqlmu=JxV*#9hrl_&IhEj<&NB%#mdZTKKRPHKFdET7&$tQAcEPbQd(d+v7%TY=!t#Ki(mifQ+Ok6@M;dZ%Hn!R7L#-DZKYn+=+$BK*52ToPg<+EQ z0p(CQkdKegi@trf%j`!~R`#vBI!=rD<?Z<6VkE=kj#k#t) zDX-CPrKxi3MuDbyxlR9sWKau|Uas$FWIzGcosQL&>5n*L(^ls7ZQXkf)trw7x8i{| zD{(!O)#AAVPEJG2}0H!kQ$*?Pr--Nwp!ou#bM^aXg)L0@xZ zVV2g!%%tSvDx!mG)&!d#UC|rlX#a{g9EbQDxTq)jwEJY&g1Frs8B&@|9V{G3B_$(m z0`*AET};mABlr*dt3~wP1igGLb&&ccf{wnWHgeUH{f*1^#^lm##jLa>qY)Jgt3!>^ z65Mlbgxx3nGeU9X&T}2Szzb!7;+R*MPjD8}S;!yMirhq$bhIHD57Fu`w1J{?>5_Z& zeNdlnvKJixwAaU{X2t!8J?gpD+#$X|zJcEln&WtNUWboSnMbf25Cm#FTh&BMS00!K zU$9t2=aw1^I^43XR$b(JkmODE2Z7x3xLQ$q1Pk~GMD?4{bGn}CbSLK`nY&NCFUfd7 zo3!m+t^1@@4S(@=j63b&XpO>_A~h5)b192i<~d$1WHw?U+_81t^oii@QaL|sK_*0< zc6y>m!vPKcv6tcj?z5Md4s0;Ad9ndy)D$oy) z>35FSPT~AE|MGeyb&5~@z3oZohUX9iPPEhRWS40J>Ms(X`~=6WoGv%Sd!!-FA&pKg zMGoH?c3p92Wl0TLVgWFTWfqE0R|uLbY?>R{o@e^R(t{l<^-iMtY)oL-;X2UlkZfd| zB6}Tq#?8T{Ae<2M)i(=Gn+rAq6&pUiA8EYt)!w@d9>=YFFHqp6a{N-t;E>Na{c3p3 zGG%i{YlI(;8y#>Pm<3sNViJyx#v3hBtO|)ZNF;rzIjz)Gp!5}{PYmk4DB<_<8~W&Q zq{O8BEgbSTY#Z78MtAvw?k_8mD=pTFV;ZLlGs3p1%PS4OJYV;H#HUMhzQqY|bv5ou zgICNq=vx@o1jRe3_r~w28SSL==<@2iwEFSSmrCI2#QBF4Vfnz3z0(c9HiTCl4lEAi z4pTisLeKA?eoyJ${=>D;HCnp;(ft5bw2?+-C=G<=@e~522Yaa?l%1E2JE?i;W*?Eu zH+4w35c>$i`=2N+i4UYkqw$9Lx3C+P*6j1^`uhl^R0TdV{c>xEZOJkW$gh}| zb}2=sXhd&C(|iX+WbZpdz5{KF_U>K8p`G&uVn(d35<2Bgcad#j4w8~=L%Ruw1n{_} z(bPZdfrd?zM)hp?#RGV5eHlAqE{r|l>ZQ!Ceo0x5Ku`w1;t=pb7` zWN1j3Tl`MuE1wI?2czZ_BYNTw1izIXbaMflMPI+a#2;-CqqI;`1WzBV36e}Y4R zvg;V2phSQCt1nC5(xrWHo*GcH?wK?3dQX&T^qXgM?t_U77*!3GmdQ%u=nu(YZ!dgo zOv+{(^s~`lDf*NcKo&>sNR(a`8U7fV4L@3AJPV&UVOpX{W=)^=!KpMCo(R*lzjKux zMGM}!zth75%b)r56=v+V7c;5JM!a((s<@@Jd&Cc-Rvx zdMvvpvvoFHbmOffAd#ZFEBsr3u;J`713_~+eQ3z^$YLViDXeOq1GE{bc5w#af<9;D zI1K@0fJQn;j=DT#S}YJz?|gHczl=*jGh4V)QTL3Zepr91Wy?q+>>_woO15<%tY{h# zEne_z-U-%8R>l->xXgM4Q;TZhjOY3FB`WSKHc$c3Bjr}mg{1`}sil-9J$noeJi&c4 zxyFcwecGUX8td*1o>Fe?5&EDV2*F`?=oB=7IMI<(R8v-#YyLu&?Wu0gouH=I$}`a% zq2`=snf6lm)&my#?DNKJs2*!vOjsdWg0_eWya|hIM%!3qQH%s&Na~1tZ(o^@aeGC- zwnZ*CE{U|=9Q;**T}X>H0iTv53)cNKJR~z|g8DoWL%2CUrk>AJ`lgb>;$pnpW|!Ya zcR6<9zDy-61fY3z-`svFwFt{ov~0H|beVNYpoBcZNor9(P#AG@uXCxNBi-LtXN4IRm@#}&!Of@}Jgm`zFy%@O`xR=7FNT44 z(0dxmemB9X&8Ea=%Q!-vAYY=0-)d#7>X)^LAy}4Ov%nwvkNrs$xECCP;9%y1-+Bp^cu+bHeM%EHxb9mg>O1^0MKUT?p7>}7 ziyHqu%cG>b&P7-x}1z`{-u&#p5tWkbhmJ zQz-)q2obZvXv3)Wd~fmKCJX^FI5GbE6qZ_456Oj~41QfQn(3wk+UJ*_r0c5jTO z8Krn=8kfy8N1ih&DU z@ooPgI;T!CR@*2WLn|siQn~AVl$@$L`yJtU_=lvQiI7RMPlr$omk23Ex@6x%Cf6vT ziM^8O{El!ZaYRFE`@5g-lYGalKrnc{K0Kdi7kSe%dIw<-I<(R8?Covn$#!h35)0`3 z>55yL6VR3vcp@lqZJPMjO)X|q_U6t#J=k1Ua#;0!2FCAst$xKd$QZ_L7abEFnb3-7 zaAVZoA2J5mEMH`=-xTW!Z0?bW8=Y7ELk-X+=W+45SvVYlI@R+agYmTmrYe^IG9bJwbsrN0@Y%j(4dsYNZHO+teq?TE7k<~ z2%OuhD1UI@f^D=0&hYe{5(TQq2ohFePl_U-^Bp;USC<0@DKyRSRzoJ=hlDANz(yOw7E(L5DE(3 zZb)<2Ho8S5;*8tb$LH6})4XY}Mm#`%NT;vYyMD02vD6z>VqWaHSVRF5S8pAeg^c0@ zhgWR~I+q$tVd+Q)l;mkHaT)KjD{XiTqRGAgL8a<_akCNeJ82xz-aG}x z0#yWJA|Z(z8Vnmrx{e3{7h*|wiBTZ-7xo#pqiB$k? zUGV#fnEAva0x7g@eB2-~f<|RpTuRcA5vQXfp*pbBwKYzE#sQVth@VtIPlT1|ustz$ z49HV=fG{x`kaKDJf|;<`lk{~sI?^cC5Ben#?mG|DXnRS>*AcL|R(&Rp;|$slG_?Ho z-0k5&ZDD8u-*}#ULv8EHI1SR|*}JCOzI!iA^!Fj3_@Mz3wc)1?i%svpeUU02vsSs0 z?w>aHgE?uy{jrCu#HIoK7r#MWcNqwv@W#DB6Uiw(pV1meqmIA}f<_Q%3?9CRF@E8G z_{EE@@k&eCa3X)eFSXGdOIxR#GT8b&$v>=p@q#U4s%rIhQs{;ylTqmlAFx}va)Ams z(hASu#UswHI8;ZAIKjkR@@)811c;!$zPEjD`X3^2L(ra%M>_!(Gji^t&Ox^>biQGH zHGqLPJvR)G+!fYn?lJ*iyLg4GuaiYEQK?>X`<*&V@R7;27*Uh|}plqU)X1aSyZG-cNvVAnTn7cwww|9!fA z?CHYgJ8_WveONixYi^`y8_@~^+Dup*J{{=ty>udwZBcj=z2TZlJIMU#f}Fj$5qHw< zf%4pyU;Nkmn*&p{Bp%#HElQy7+U}VSc5x{f5S(dR@Tz_GARk+18+kwL5C4WBJZRzm zqvO*r0&ZxnCWlsN(Z~<9X*{ARooVh5%6-CJ(LrKhbV7_n-Vg9<36A4^1glO{PA{w` zM4K{`Ma~Kh@(n?pGF6Ubg7kGyF~u#Db#3-Ep2aGMs6Oi1DJvF8b3H|5wBfA06CkDa z1Unr!-F)|cqMhg$9bZgL<@mKFhLJ}Lc4XvHA06XEHrVDzpAlhs8?2 zi9j`eCNqI`?ez>LD#)4j5Em+--8Epd1zNHEF7}~^M-)MC;Q$G)Zez>-RaOrG*k0y; zevMARdEZEs{&pMCQy+~@&GLZS%7C!y2E23$+H$96Uvst}E+Lbxn4}8)J8IlALiEL! z3bNB#@LfJporS0Bsry^S7~Q;s1F1bv>r1wm9%wVaCwUt4gz&}u1#4sZLiz; zeUl^SRp*S3x{b6=4{2=nL!Y4FSHfp$B2}irQD?0r$IEVQLvM$&(`6 zUwR4TqeJf4Mi)Kv?eYAsqOxwcuI*0hJ!}WwF<}A!$881O2!(8PxB~KL%r}!o+Vl@@ z~t@`YK) z=7tOJ@93<6Zck+F`)Cch{j%tag-cAzGt6|?MoK1Q5okyOy`-6=k_RMMJ%A7$Vr&W- z{uss0h9mbrH!|owg(9Ao=wMy#M7?U)`7QawP0sNt@mU(umN=8b4OJZxW7+oN?19$mNwr| z1RCKfFO42OOz1O}ZRl<4oo57VFzIQ~BfVbrXiyLE9Y2dClKN;NZCRq}8}gyDgnT3w zVWLs`OPUj+e_^HN3r@iHi23%tAeZ^5aCQ1K`dYm(sOGu3Hib<3`twvxUI3< z64g;{vlM`4CrI7x{^J$fO>FYl=Wg?_h+!ITCekrM-&F6mAV`)5j@##mJEjb0LXvJU zN(%dc*G&kh;%BkR@&FBHwbOjfkTHo*gsc#4>?j*aw-yK!NeO?O7s;GD%OaG~2MPNm ztkLl!w;^=B7RR|-$tisR5g=rKqK>R+lr zXTF+DShnN=x7sr+#j^X0nwxff?O`h z_orUmOcxLl7=IKx@EZhdCuTXGSfJ`LSw^QwC74asOeIL?8fr48T&#W4kG^ZA(*Hwb zhD%WDiho>~H0J|OoJvmbi*7>9v!lSpkVP4Fz1{VUe2 zTH0L5X$lGj|B;Q%FLS=QUl&53QH565$wsj1I|@RgtKuWVOmQI@DnM7+olkls5|DB#y`mKcZi}!z~E21RnH|Wi@IPNHcb@5kg5?mB{oQ~795TW zDeny`iQ1bPdxIU>+lWH;mmuI7qdl&NYhL6WtUwNNNcD8})iaf?bP1FV{is!)_t_x1O z4^9)T^T`cZ%S&-7asUW2HVx9Ew4+55b>9Q`msz3OFJdaEZvRE$%wd8{9~u>!`X;3(ah~JY&rJwdZtDXF&^=U(=#R2ZGOmT#b8|F|{|n9}^$7WU z&>5zDLf#0D32K1eV|>>`}R)*D=i= zynV+;&lyU+R7GMjL7oDcJ#yy9i+;Mc-{?E&SKlP{M?WE=BPvLi8Z}8ls%$~F@CknA z=|dZ6AOo2D`>(?c1dw>E)nl)@4o3Cyu_1b_g*I*aZCR;oy3a=#p{Py+V1)=B~LL%;0qr`zx13VoQfAn-zf>_b@V&d}l(PCa98dIw7 z>(>-8oq8$I`R0@xX5eo4yq8rrbjD77``{Kh+pzvF?|Z<8J^kC?qLqQ92U^J}np$OV z*-c3_N){8R;d}pqTUC>t=J20e0h{c;yilU>&Zc^qm@;72dr5TAspFbb-KO33+Ww?v z7wpPZb-wBZydg*0TxM940x7dtOo&15ei+kR^fmbkp0X^reTv)3$@aqS_Ka#E=lP&* zA`^;sZ49nv@*WiRdJm`d)-HT1F(6T78unP~*aay!xnsr3U53xI9UN|L&}xGw-#rFB z*~w^rrBNd?*0uefcHzt@z@5(k&>DXjA0WdM$a*f6jSJW4Xqdd#?=Ex^g%N=DHr6z9 zf-0Ns`U)9-*WN3_7E`1V8RH8ya^kC$!iN_=7qs~E*gNjaD2|+$;A&E~y{+%kq?7MW ztE5k9#?|%OF7-vh}%SEUX%|S7)C2d^e!;T zWzP_oQJGAfW>tPmAk|x=g+A<(S@s&`F^Kd!5&f34xyTi-qbTIA&OTsYi6ETD(4>@? zJ4+S+gAqPxTyOEmQ)da!&x%xlXL+f>kFBsR))d5m+h^L))((7S+k2HoWRi_lL?yi5 z2eelUW)v1E6V4~jyX3lZt1&8xCd4_{OpKyB>RZg%RM7JIXBP(>QL5&RB;uh=`x(ij z9kffm$D;@@>f_0yk1x#iVpk6c#xvGMQqd_|uB4L1QAzTKnHE4~iy}2)3;8F-!=+Er z+6Uib869Ds8|A-~fH(<=b`09ny!YhTyVC0$Nt0#`$$XS}BbE|_bz1zr4SEwN6Q){& z4a8@0_uv3Poq%6W*=7@YO&*U|EM&3CyE-1!*7{KfsU5lUS8QbMOMk&b1;L!FMb9M=G> zArjc^OH8;_R_yN!)!-;&tc6yjR(%bNt1#$8l*mYRy>#a?*eQ(p$BLzw3|n-|-Ddct zS%Xl3zzBL+U|2wkJSNytzJ2;F`*w}Zyn)NJQih5EL29tAW@O@F6~issdHXacOORdq zy#41nK^Ws*6{A1D25Oh7Vh$MRK^GRH;C?NwR@&B#S0`A~7x`UNg&z|1cEw;CZ_fbm1ZYpD!R*WP8(!fOSaUvCt7c2 zF$PW|>7?ahr8zK|nEUBPI!?>Mnz>Q-g82bJj9Od<`Q6BP-(`yGnOW+Ih$;cEfT4ww zEzR@E1TfkutCe8eyZlnm%Yn&3(z(fnOoLlc5bG{xol@a1Raovy z4#AFg46_Nv5nELl*81tyRGI4+h{MIt*Zl-inF_|x{CJk)zH|jv7hN1Yd-(&}j5!QU z6=GDXXDfRO!JGb6#S%@;)x^*$5KyXti9ko)o?8osjL$0zqv!dV^5qGcjK9ZPLA*FJrZ9uq2G*S`mH)Y^UiyDoC zi$7qrgwV$~HN<+#qjFF;&=V4XI-EWEaMxkIm{>Q9&v&0rqW?95!WDw%@Ri4ejVQao zq9nBETB-n~O;t=Y9THpUFFq@)8}KcHucymH8c(1`-EyNLlSg$i!CAMmdh``hZKGyGsj<>0h)P$%X2mix>A}Oab?^SaplA91UDWJCPD@xztd-0pkO9eAc?WoQb0J}I;;kYRuE^pUwuwe>KdapQz`Qig}A&z z`CpDpIbIvENXZ$&w0p+{`ZeRZM-@OpC9;%KA7@C>!jbV{u`1Raq8M@_)R#WM6i?iA}NZ-xWlHN_Y#R! zwT!<1Y!(jWyKAWWmGeCF{)6azO(5>s(=aE%jGFD>vE(dwA!OESEEi}yeblycB>+rG zKSUn+QWp68e=v5IVNo|>+h1a(kp{_?l2}qelv=vGI|OOz5(JhKP*Ol?N$GA-x6Dg6c!v9Uo^S7m_c;6}u)DJ}^S@@U^ZcERg+w!gOhv`K8YYtMhi@;G7$b`=whP=F zOKn9e@Usy?^t%U6-!Y3ftk9Z$-n^dN!~vDea)}%fQ3|g1*-IS10Y`fJW~CK76VUDI z{}BJSett%@1;sHVeu6Zag=HjE8Y*gBOk$7&SB#s}2J<@ENQ_<0#&9YMq}l7BC+gXvp!6USpMvF}doK_KxctQ>f6LzC(!!@-zw>iB8@azs-(ey4 zrz4vTJy~*}y}VNr+T!gUOY>EvAmb?PPE8N$-G|z*3x_)@KE>&R+P;zVS~q78$*vG7Aywb6?C4gY*kYJ@6seDv`w*& z<*_F>;snWw30Evdmibw$LXr}qpT0;bGSd6|^HrHNPTuougN&ZfmJubvY_T7EP#ez| zeUAp%%fHknTFRCf*5ki>NS9F+ibV;GwN}q9U8xUTt7uj{v3o@vKGkH*Q?6YX=VOha-yOk zBFqa|(+XB1!Z~%2K2kF1KqE_meqG!2t4B9Z_Q#9hH7ljUMr*?(q93qaPSW zauMEH?1L!F4`Y8P(qGzt?GX5ru|g$y{Fl(r=dwdRQ)qlkjXQW0Mz~a3!lcSM*X@Vsz z*noE?_1x=!qW)H7BA@X2G$=G>ld6k+DiSqyU>F_Up+=gmHSGgpPUJObB!xF4=f*W?p?iJ=DfpmsTtDNRI=&Ikc}tkYw?WuAJwd;m(S|F%FGha+?B!UQEkjDG9CM}zUkmFGIpqX?frNhAJq7D;V zd1O7*BSLYGU((o_^)j;CbBFI&ox{AGt!1BTGS#zYFwMa2H}WcQIUcDb(e1NGdAoEx zr9H9=BrzBpVuz@8!^G3dSoGY)KRwEgMCdq77O;x>ZGkrz~3V<9E5NEEKtsK%=)7 zV~o20*6-o%PS{BciOgM0Jg){X8aC4q-X`2)7!4VVGw9~ht$kXT?*Ww9FR5nKQGS7@ zaljDo0@Fw9Tz2eK48r}=uAH!tfXN5qx>mp~SA=L@+spUyp(>+@33?E4X%JpP=MNfY zne#RAjeXPZ8(;c}=AU9Eed{&Eg}9hoePpW^E>L`rZA6aWEEcNU@%OYMc9JBy`D=O0 zg`m{ZNx#2{{6*u0604|l87psfPu^&L;G*hk0`qVMcJtSZgkMTQ{+@T##&KvoWS*Ir z#b9mO3^KM{yt@-h-Tu*n_a6>tK_J6>1xpxUdjKTjp2cKfV36T#_j&b;`~@bICA~gc zJ*xlhFO-s+>hkY&W;KlJHNn8k=%t1!DDo!c`xl(SdP-W~oQHSU$^RH-EM%LL0+$G~ zv$s{Rs?)bF6vrxfOzL7M`$9w)DVH~$M*}8qm6fsZY>lOnRQ?I$q(9%D&Ori+LtV|z z`@A@YKMl(d>n(*UjSuqKjpw|ia2M3j`+U+o1x`&tKOA_?L`LC{m>UwzBs&@|sgU^9 zE}ZagRg{f5#(w(~LJb(9L>TZ<+h%E*vt^x!crEe~vlX&_mx#TwpST;bSKxi7rtlDZ z%z5fJOFgj7B6gqU!-k;ZYRE<(shC z{W`lE)QBoXM-+tBU4#CggBC^iUU;(WQb-Q91_e0Coi${q`%h3hBDR}78PPKxwQxiD ziPnmmR>!?_GLlysE3_I7Dh4x%aINLKS-trun`E#{22F8V>)NiL*XuBx2OI?AK!M!5ftWrS1@YTYo2~Xl z&3^NJ=BrxzG6)uJ`0GW86NiP{p5ny|g2B}F_GfY*C|#)b4W-MrJC5P80p50|OK(Zv z*E~|SRcOnG1cio7^7Cu(=^4h>s93<5%AaXRTKy{!G$}xTv3Q&~il}vJCQG5O{%d0J zJMJWMwPSQBo15>I1Y59rEmf{q^<%l8Z&Ha2EV~8XW*#&}xR|TsFp_+Qm60CNZkU$TqKotI4BBDAwQ@}Snn4k7L$B5!-GaKS?mQYMSlghJThAF0`+&RQJ_mo_kD z923XNCB!IGd?(?Oq~&03{sRj2jzlD)_1df}L@1Q!##p#O4qcT#_K0?!Ksxd^_f#ojQ?MTdnq{A_X~Q+q%bq) zN{}9!A9d~kYNatQ85?E^TXPU-_U6kIz+06;3Po+nW78D-JZ{9dw}HL^tpy z({qzEx{t7slYR47V6gqZ%x7{XY7j#hR`0wmqP+j@@A(h*4nZ8Lm)L=946iMnKCp9L z-0qw!Kj?23twzraa|{aeHpE6h3@$%?5OAT_zqQ2zijuZAh{>C6CgHQ$myp2J*G*WN z*FQI%m)cO)TpMR!0!);h`{h@7wC<#?fFqe6{?{WwWXXK9RDaPU%VjBK2e2Sje-KI9 z35sk3p^03nOCG~EbLe{qcHSZ>L}@to_o|Cya-pMbW%k*(TSHOH+3hQjY=4A8FBlZ7 zvG9OFps1*N#AJ2|-6a7>QP(nornx9d;shRi_hu>?5*WHj^4vI%!JcdW=@eRE0k={C zb~T~^($CEQ1NA7lUdyZt`Um+1$G%G3of2*NrJ3KK(04jEnn=DlF%dY4k7C3_QH+tt zy$h*C4VOWAeM~k4>EHx;zLrQ4@K!&*!Cy^dN~F&^-1B;j5__IqX*mJ*&rDnlsOA<(H-z@fPYmP&3g5Gz&S>M?eBj^W-R*f!eSLk|x&QIU%&vGQ z#ly{j+s%6{+PnXQMD5g@-}9iFnw#xuiM1qyw_5VdLP;?9V2ZzFRQC_8r)85yuyUXacq+mpQ9X%h$i}L?KJxulGCm z>VHSyv(kva1Kiy|PRNqb?@Ro9PUFp~>77T;AZCTtAeqBlRp>uqUS7bas^fPrb#454 z===3!#I)5sesp{d?wQp}@6ZO*mu87u5zoIIdi#Wa|HNdRWmLoqSH1+CzaJ{{bM5P> zH|bk#%75H4|1^@_AX0C1+lxwYX?TRff7MFwC#Toimbli7N}xJRBtZtdR%3|Y&qp|89k+NVh@rayxBuK!FtUG@I0I^*Hu@M&n8U$d&%96CNRL99k*dNuy3!vEiuyz%NiWG&rm zF`}%D^Y7VNM-?2vHfKD>e*KEdQ~X5#X|S6X$8E;gYq_j>-$KmG!($mB5*@crzzq7& z2S;4Go0#z!G)u=*f}}IvTlM0<0Le=I^Rwm`i*!tLS3Q8Q^E;Pej;D$a8F6eswS z=DqTe69)=cOJLU76pI0u1-zN!xGL1!EvGodikgO% zJ}dr`qSbc;>rBY+wsaMKOWfVfE_AdrW)4IGC8pzHpM1lLevAz=2X4liRFU!Onzy=| zkXduu^vI31J$1s@`W9oodW_!!?zsEP79m)88!3cCeB#4(%hB`T-I;Va4g?9ir@aQ=&K5O`|stf5O7M7&E0I&_6dcK*b-d#BPQ?sn+Ouv? zCiO!GC6J-ByKOVOH5gnP4eDOnXJsDUl-2cZ0tTNz$@fE|lC8du8XDnS8Ll#scQvhX zR#^XDG7XL79o`uBJ{}~R_T13p7q)7#$Y#x29$xi<+o?$79~Vh~cd%%&cx);#SDh(8 zH&uZHprLJT+xxWSsxZ@|>Nh`X3Y5)Ys=!R}u{AW(DeL}b3Z11<>8A+SM&Zj&XPf0kClO`6SQ-kZ~4B&9;JDQny6Ot7I;{xnv^GV zgYjZ=;kZn_N~uYex^zFi3Dyyq0|mbcPE4!3e*R*Fsk*$tn6h>l*_NOh7a)Cz(R zetzaeOY47O4%F?}2d#AXC7{Up&tN0Yccq5)Rp(PLKn2*qI912A&K~7Vkj@s-ZV|fI zWBbN&u4ayoBI+IWS<_B*(l)L$ac}QnA5*`#Uatq5xVwMv>v=|-Of4(8lT(K)m(5+L zF8*p`y-I~(8&Fs(4k}eSuqQ%iE++@T^`oHt1oL@RrZU+hv}G~u%*4Eq1j5Ypx`O9|#{y09O$LN)RYMkv@gyW` zH+MN=Zl?#ZoZ`4vdr^_+*d{0;BgeoiNDXJZl}XGdQfoWyAQE^b=&fR_hxA(^&TI?A zqdM#&1~`T97u{SdX>LCXFEgwLla@otO~QriJogNQ?`}>$iZWwLaNIi}S%QiR_}?GXnUDzDWi9@E#kBm0m(@H5FWc6udhv^7u~nGL(7b6J9JWy+IDn=eI2|% zg7Jjlm@Is~0gm&2vqhQ%68L!JE?_F<(tDmtFcBAPjl_-JN2v7651cRTt|jb&BOO4N z%?Vk+^1o&D;$nkc8jJm^JYnrAIo3N0)iY};+N_HlKuwhsSMQcIvRHeu+iY;uvD{wd z#>DzLq8m;iFVVBRsPOb~c2k@5gKo)Et^`9t!%8e;89t+g{NZa(QK7zrx7u(26~O7Q z6ei!;Km`(q;ZyZVs90F8+RVSa7U;*TpHv|(;N=Ch#(}@-ij(*aRb@;_)|z=vIFx4p zQN3N26}uX1G9ey8h)7wPr4Q_O{?@lBv4Q^j zZL4>}=t1k7ZyIZ@D2wAM4c&c~*JkRL2VUAvC9jLX!l4L5TJrY$tK?}EXsuMsqd!Ia z#rn}gV&3D~);=Q;b_CH=t0t$?M>!60SveEH%-%eeOS)V6cn-b7DcS z>vTA>D&gjOrV8N)I$2~A4I4K3;FFJHyDEt2>jiCRwOOgCCm%F)rBt-=)IlO_ful-# zuI66a3nlV2znqR-Z?HL9c?_DDuaKZc@*zPfL1{c+WaL+Xi6&9f>H}XBeHBZ?*h4yA zO<0`ON3XOJ~%eMr~`GX2>vwh&Dgj=-L3Ob*g<=O8tIU|0(x1wkFoXT z`RK-bErJ<(0yNNyj~pVQNdG-N&GcA@QMMal*H}@+HnV;)z3bBDsMN<}8^jp0Gm9Tu zADOS%rda)_!%pzQ@#RPWEwI<~h#p0N{gT#u3FT(p^maXgLy17ud$Cuovg1~6`_Q0w zw`QY&lNPdmlVC0)Jxg6HfVLX3UDmR-#Z+L-TOj*-FIJ>Izm6DULoeP6Tx9JLw5Nw=haF7^*jtdf0B%PIr&vIl$2d(DNdHQ z9b6}T|F`F~S~bX-I#7#c0n8Z{CshvQz-N>`$7qA$*=xV6V(ker3-%vK8s;tCvWN7) z!LC768Z&>`_6TcX{y=ohLP7Q-g?9+G(beP0VznpAqHtWVO@Ei13yC#HUwcJblV_+B zvOpY4RDqB{9d|Ki)C&FgxO^*oKWQO;I%|N}sQf8UC8DoYUI$-22#6tOUXL0wYcW+A zIw}-cPTFt9eB#qwGnQX_v;2py&1()+{5|YCry;`nL7eO*(%5fhSe4CbLWoUZX(b{J z6Ho5WjZG%AU5#d_ei`g_Xb3a$$H`@Lioym^vDipnyw50mtdcQZA`+peu4iLS%%<=v z3jQ9`&Hxr^G!d$8&ygUL!l-iZcD|||Ccz7++AV9w2Rx%r)0=KnvxPdxhSO=oBl3VF za?M5oaa`?}Hpb-Na+o0P6ybY$e>DnR3qIp3>Qi&-%+fgmi-10Cc@9Ss$}qaqGDqxJ zgnlFT>~&jHcWED!M;b->lA_oGGGmz@ccHLY-ALjnm1Q8!Oxfj^x{vv%WrG|vDQ;tc zrHCmh|AFpsiruJ(8=@(5GjDSQ%Y5G5RKv#0*KI1PtN4Q8#(D-*9|lRkBRmMQRj|q6 zXQ=i$Y(c2_=BUi!5|(Sw9va&$)4#a=$Et!nJYnm5y8hE7J|vfU#ws)f=K?hXEi3af zuAw#?+eJbzNDTGUlM?4D`6!R;Qu3r<Y;M#y8U;3v`Tm9%{Idv-j0p;rizAKR`z|ab^JMHEyDYK&~3BjoZK!OiGGLk zn57GFHCnlR%%0(t(6+oUDpu}p+g?E0)W#6ZSr2&gj!B6l|KJR7B!mSA=c?*}&Mx}c zljROOg#xALV2|2}$2=e*Ui@QsC2GCX$Qx(vR5oDGX0p=mduM>*}3 z3~h_9eqOj7`{`=o6IYJKbG_-skc|YL#FarwsDsRt_8q_OF4>uDk&zA|4*jH9WjiAb z9oL@~GyvMb@Uzyi#kYC!H!op^<=4{wTR&I%<8oq^)u_m^f=KFFV>B&9m}sh3D|d_Z zWWp%G{&KAgAYW!^%l|kb#WNNQZTfa`ww*#mZB<+>u83q&Q$>dSe0AgAVG!~w-hhR+ z&Ga!_)U!xAFsAjF;n>+D_C;lz1)=o)m6e|&#=X((BN}_$M_4nOuU4vV3m3K-rUI1GlP|N;Vk84rNLOLqeXGN7@}|`dM1+YZ+0VY$&i77P^!Fkcq!KrCf%?*}6KUV)t?C9-(LVV;5A(u4 zT{@2iS~ZWZEpZB%^2DjF2jbX+W9`?==Kae##s@fzg1=Xdx$< zk3yyWj-VXj7s@=CyDq1Yqrmkd6^^Uzpfy?;xu#F3ZqIP1juT>u2`$$zheTsvXxcTl zWnal09pErzHT}c1Vl#SHM16p&Vec2c<7VB9nygHz1M9aWdba4zaP0%~OF(Xg%MBH} z=7T6FwdXP~cf!^y45)iOP~Pd$1H-onZz}L9lKPr<2FDxja|DRw?}SxZyL=(uWay zj7AX!xiqV#>`7(13CIVnzxbLPJQJbI*1{g6Dz&sMw8zYEvCe|GA8ViYYUYK`?rWDM zLMn?goO%h?3j9RU~Nlx$B(|!j?`w|0>Z4oesdGo|1 zkclZIu3)s~pe+|EZRnM!eX;@o5qib%hM`_rhwZxZ^d6*G%18OrgzO>H^06cIm9&b0 zBoqOUWtq`5N=Nxe?Y97oS5Kq8bVGluiisge((Q+Qg(kCzHfg5tOP(dTyvdi-QZsqaMliAm2 zSIh0F0_n>Sw;z>%?sNT@0LEW}C2tR?QjhM*t?E zG&%v{ZDr5fJT6T36ChRNpe9M?gDSb&erqw)u?+Yjs0~pcP2QY5SLPtU@+x~nI`0Qd zH`O&N=kQPeh@AX{{yT?VVeM_U=h=-PULZ?@V0$mdSTd@u^E)HOqsbRKgQ27mBmv(F z72=|bHR*rnT$K@8cVhyM%vWcW!{ipea1$QK&(ZIZN4x|1!z4gBTv5dEzWjF$N|n?r zcT3`wnL1R<@r7(MJ|?-x%QkZ%=;H^GBPGl4_?bk+-fGedN<|!hn#p{(J7UteD7#>* zmL>C&7L+7Ak#tw0si)s9}_PdK-=^8%qkEs){n6nKdMz$F${W2)=&V~JMgp|)sWkhczmJ(?X+cM>`a973#(u&qzirN#&Tcbb!o0`z5Sa1GyduB{GJ{ z{*s+Mm1Q5H%F^*d8qAb@)%N=w5l@i+zF+U**Q#PRd?1^bDB>VcMS4pI28Uwf4w^^i z0UuLo;;lG%=rd|TAN>fOOi<&|<6deo)BbTo$3pxU+cvq3RqFB2CYR^8mTxtuR21VG z`Iz`#A#EZ4a9*%(?J8Th4$8Wsxe{k4LS~KO(df)F=p_9Y*O(r zy;E-W-F@!i{+++CG*&fCqZMmW)w2eU$im^5rN_Ucee=`@r87bdF%L;pjAUl`aQ6CZ z9zRd4E?p7)CwjyRksmv)Ds6f5FtA3DhlV_VuValPHZqhsJ=*S+G`#Eq)reK2F{>jn zEoSyRV?8#PfSbiItG*rHY60&m6J@ly{*SxNTE9=bo7Fma2uy71^G^GCiiEY)QBE&= zm{jA&;PCH4R;5q2vPySGS0LO$4gQT21r8H!W$lN5MC6G4 z2u(b``E&EyFen6?l}xOR#cy^m;$q|v#o}H>HAgwbB-a)+{**>uWV%#TzFUjxDj!uV zXpSwlUdlNV#s3H=7fB&U^0AP6!`L&0{v&f>ocP~}O{*dFC+|x{Xc9Xt39#1~L)aoC z*I}kS$@~^`KM9_wAV(=MmoT0^ZHi3DugFr4XUyu?WCn)EKYokl#jM|<@rP_JmrFTt zG{;9G1UJLXg*fkTl)V1^rB0E+k+L+G{+Vj337oa-7Ntj7!ut6LM$liJQ5Bj{k%?8B zZWSZ#Fp3L$oz=h?R3K_x-M&z1g6@Vf*0RGGVgPLS673bAr`lu6Y8`s1oWKBSc!e_) zn`dZ|T7Jy63TGY!j1F5>TX1h&ebN~k0_i_~?q&Xz%2g^3VI)4xiihSiF2Qtf(Rv1} zsWLG_#}q)6L?WFJmJe2~&7ql!5{c&Cdj>nT6dEb0Gf>O!097roU)wc^{2=FXh!{ug zJ3ZLb#wweQ4oY+=05v8=iL**2m317y1Ck@C(LM7jEEa#TnDl5DvPd#8fr>d4WDV1i-tJ8B_u^# z4mEG!3@#n95AS=3Ou>xU`mg`XLfZZUjkDOgh9)DK!)xUyz)_LKdi&@7o!g+0%h4m6G$@ff1Cv(h zF!!dW5mT(0wIF9l(ALjqQJ$k#dtKT9^+@R$60}76D7}M>OyaK_za0v9H|d*zi>Fh* z>B+f^NmPDT{~UM?PuS5l-&cT<042a1NGDbEP7^1!91Eq6+2XrL8Up$26&D!4JnSMr zpwGy~erHDNVWlr}GXUJUyE(9ryb_WtsKb>5+zkACmlHrbptsnv$1)a&FzXwe4+fF* znxp){_%`?49aAf~dBLERg?Y6)lb>9N<~-d&;nZC`jS1!L<#C{b5YAeCWWnr( z=8o2g!?rr;4?KV<9qF#N7}`CO9lQQz$%;&_FI1X}^;ic7(zY-c=Cuo0B&DNhC?-Wi zyf2iqn6!8PQh(GWDlhr2||Ca%lx&0BX$OHD*Qk%-?2J0v6PD?~b* z54*4>m6L3hSkL6G+U>P9YIDLD#K&sTYH8hhO$7HeB@Sa!3}8ls9IBUnCS*x}pmxEW zoV>}LY~F?(+%|A2T@oE%LKBRC)`C{Li8&m2`mgEP8@&c*o3T9E& zB(+c3$*(sWM9C&2)L?FDk=h~?KSQZ7Gc=VJ#0?F4d%29l@mJlnPpivaZa(@yzbo+k`%8!gJ-DzKt^VsNWKjH}6XeM-95Ks$VH`;(`N0|{h zLO{l3$Z|=XD*9k)gKn1qMU6E(-%%NlH%4^^)B3{c;JJ`lH~Q1O0tx!N5ogkAbrh2w z13+p?XAi9k`3#V?w_qvq*cL@St9?&wr_fcMY(FVfZ*l)7kkXio0`%dcz01aONxIxy z^jl?D_b$oQ-;Jo8M$BE?oPN1BX7Y+D>BapwuQT5x<)%>owyT=<+@_CfH-v>oGq+}R zxf=yg(w>XHNe2L$9WCa857~}d9g#y$#k4gq<*Q+$!-so6K+$^WJVqc zP0Pf1<&hzhsu9fd&f~jsnENX7J)cQW%Iqvz{lA||Ot5KoUmZ9zU)9Ma?`Z?2pwyso{_>oFyR& z`8(Qh-;PP0H^L5B9Dq_$qD6BMku&W*9#K%sUdDfI!O0Dd$SIHMLK&wr$d0QKuzB5}kXhBz} zSQ2xc`74I};X_o|)CR;EG~6J5=Y(`Z@}WPKmQ6HEtbCM;I1rJT{I6dNnqH<&2AMJ> zx0MIW^E*TN>p5ck)kZ2xw`CeCRPbJDAsIi)-$xq`Nml|E_C4Sfa@a|COW?KW^8|9Q zd(*42Ap}8#g;+6QbfVD)-B98vFtJLgOq|o3iVCi?iP$*NgUIB9QsXt5(yvg|bw3-s_ zvgg@%I&hOII-OFo6*z*N~gJ6b=o~e;j>75>fDh);3h=~xY zcG4_S!PH8xv7IX3Bq z;`cKO4e_xdH?8yqGWOJ$ym`_b-|Z0Z_~4d5eh}3x`t5sMZ_ODz(q#RO-H{z1mt!vgNybm(I?Qy3F*#Cj>QsEQ zrZ_NZhWNgby_YrIym6uffK70f0gU9%M*}LrW>W!F3m6!^aa@M8?lKqvZ3c({_bw`? z&W?|FN5yR?SHr1j-o3~8KsUJch|^-V>a0oh1W;`S-Na84gj@S>@om2iyFVrWZm2%A z)`U&UK3e#NY{f@8I@xIE1IE~W&L7>)5{CE9QSaFJc!x>r;Anuh@W5R>1Oe9B zBP zstO(Ef-~W%pUIkzWAXLdW92INeL)`pyuAN-dj0Deg1hRlGL_Dd_ z!>V6b)K5LD$eAa$=tskMi$W%Jn?S9&^)|U*5u+Q3#2T}!=ZQOZD%M@5yVNF)yh!3jgREAp zNOYrG4#=w9k<^2^eTcMrSzrV5ym}sFI`&F;yQ&?&%HGYQ2&PQI6R)n(F!AehX@oTa zLfZw$n2$6`2GiKqpCf~zP*G(NLMnRyPLMj@x^N6|aK;WJeO^Zf)7Q&k8gCN%G>NLO zCofPYV1rcip83cq4{uZUy3O4&icUkL&5#tO=`gvEGJWz;0y#toSj86ef;=Y3)g~6% zzqP1xxIoyAh-0eBKSj{U8R()W>mVAE=~3r2K>!A~KxaC{2DgGF{MlVFy9&lh)>j|T^k zZ_|72zU&&#vlH%J_mPwR!Jx(riL~l;F(Si>2o_6|FX&^cMW{XoKoe{{m!cF5B0}q> z>e3WVN=r`3_uq8!>%I_72Z5ke22fsrCRH0jfuKVf-#xQ(+|mq73gmc-cXV0G*&R%n1Uou6|N8{?;sG3%|=s|B7{Fp%k@hw3Qa%VuNXK{3c`Ie zz|7C6zZdpITB63hD82vWAdy*1A z3Ut&-jG&cV6`;vXj2T0D#AW~%9crW+?5WaNjasDx02PsUQ9kA@*>MBcLY6So$_kh) zNs#%%mYw`de*rA*I1#Hj7+Lrq-6ZR86j-LKkCo{`oD~2QfVb07@#?b#2(pWdt07r% zS(dUPC_;q2fAE5rdH$(oPor(~g(=-!+eX5~SWOXJSD#9KK;kWx0>XWe6nvMJ>1pQJ zVStflHVZKC55_tZ1fje-m9feXc13L#JYRW)kjUs|DM8g=bKJ-Gf(un#3q1i~#m#lZ zn&FGxkvU#h!d+rM!0ws)qcN~(dD$u1Q4f`%b#XFf`C@l#A%Qk)xHufGkDs%^Jem`bQHdEVzEIj4i1V_k#;xdv0oP=ZC5GLkE|ZuCqlF7>3i_b#`tRqPhG1Ii zvsnqoln*N%FaW;m`iJp{JJ)VX$kf!*i*u?RY2>6MDL;#X-hDD{6T!IEgJpZMpmJiU z#I^ByJf#4qJqDub^mr@M)V3@PI6(-=K%V_)&Jg!x@ekoXbb;l1AYcvL*C@x0#gC)J z4sm3JfWJDYOYAW-mAK=t0}_?FNx|a672ik)CbOP_S6`-Axyr>J4lX=Jy0y0O;P~F| zAPCJ%EyR~Q?sLTfspn~z^B5-jpbzd~&xjYTxT1or+kh^NoYS%RMSZb+`wHm^w+8)F z2@vlC((K73nuZ7fyFMwDbVDjDDB#V$a?7HajoZ!PkriGE;9W zUA50hLj{zD1q@1dyhuaQ1FF98isMSTkAOKh5gN<+G|*P4Pj_f`)v8?LABgO6w0+yL z8`rpLvffCYCaC98ww1vSGN>aS>B8sa z84c}EEp$$6tx>ouR2oj8{NXbgh3c-f+3#n6|C%j#gsN%BYs2Ma`v0@K=T2JfI4X$^eo1EX z+)}~O(cy*oM(EUK@bQIIDV2}Hx?J; z%$WE(O4`rYIU05z;8g>LBXDCtAikco?GsO~oKLhjS1(Su%zUizLDGS_l`Qe?NnSCG z%cksYWk$N5?^qtlxJ|3Bc+~XbnL(n``bi4g#!3pLvaFwe`oFV*TgTnl+*|}6mB11b zgBAi2{yQqUwF83Rw2SY@dg&z$Fl<5d?e1_=6r>57>r>fk$1Bw^H(nw0@?7VP%M1vt-@^CC0Y$Zbi zZuAdai!_gRz&U7lX3jo^{xN{bPWP1u)+21#&$$8onFu0J#GwExi$9=1z*VbrXei4Z zU{^!{1dn`t?0CewI0rTsru$kRqjsqBlLRKL$bvht16O}ggH3#}5(2$Q{l}1s2BzT^ zYF1U&(a7UmkRrzxiwN2--9~rlJ=zs%fi$teNWiavDC-F&pt%;&Y6A>^G|24<6Fbmv z6XuEx0$+T{%3TQ?FX;N#tpX5~WRl-A3J>!L`Cza_>IktdQ&>~)$(ik~jt4RzvjyYF z?mZQjc?4B{*92FJf$TvPAc=YaT^DGH0F;!?MY2)V7VRaUobylD zT$~nb;%R0`9u@tu)>iKx%>W#^*-=vHTy9U8jC?FikpNV92=3i*$3J{8pK~ghOmsN} z>Cr6n)BydBZOag9KjRmlVIs{GqR(1#Ve%2C>0oa)4k1Z-1up#hi_vTqq^SJ<`%!>* znBbQNEL#u~hQ*~r?<4LGqUt|8f@=L0yw?hw@wJhofo_~u@SGmxGb$DXNH2zc#sT{- zcwJ&cn5p-9vfiZ9M&Kbfg9>so1<45p{vL`32EG|U?-^kPy+uJ?JAI_)IbYyI(;~J}i$H2^UXdoQ)oY z6AV`)+@-_Ve(Hkvz$giZWNlUts|XGv7)%B|p`fv%p$RHp)Zds-5l~cE)&Rg*fL4sWws<5vTxoY@=Kha}O09WDf=^T# zKt=Wl215CQ04+&6=}R%MyY#Ed7{-}-Mw$s5b?~DbykH5S0EGWcC1HaJdptm@Q?OD> zfy{6=Ky>iiB8XOCRgu* zz_KJhE&WIuRj{|AKVk3i(g5%)oK9(m!+D@YE_h;A_9pGFs9b9>O1A8~ zqE{MH8|kLDaMSo4KCxvbb9 zZ{ImZ;2byyFD(o_hwLz*e+}cReeypWEo|Of2nSRh z@B4`-8QX2ZOD@uQyh5Ss=iRdWg>N1`a!#E+Ln@*!1#+K(hmGoj^s_js%pb)%L-E^2 zlk50k0{G%ZmT^y!4d{8%<#pRVIXU@0k-y{DuL9`+$M_R=SmFufPF{i=czZ!jxD^zj zy46#FvbPnaUw~=al{m?y{J!O}gY`uSl07YUeM^9o~`-MLz;s%XI6>umf~ug1)$nR#&^;y@K%IT>Pgvn%Ctuy?^69ke!j`u8QOwNu5E~}*OmK6 z*xBj*ZowSFovN-5Y59oA!Gu?NzTdHjSD8$~{bamAsVgzS2ghG)0EY*O50>&&6FhFF zP5rT#qP~=@(ja{4zLVxjZw!!FQ}niEK_wafnqIq>*bVc^op@EloT%z;01Zp58K>;B zm@-=)63+u9D}z=tA6Q2hyUq6cMf>=0&LB76N%p%EZe&UDO&o$_bI2?`Ys>JTUn5UN zDRk7n%VhGp!Ws0)e7d-vE^wYye4H5uaVdm+s0sNwJANA7N|Vs6TBY~f>j_&37aAl# zxRifWnIg=KsK=?MbF6}9_W6p3?3Ba#okOHzx!fU7-2FjH*g`1kd?S4pUqr>xu~=SZ zPX~adiej43F1`ye;y5)=FH0TsFfU71UZpA4bz>zisX{wi-Vc5cYZ%49%J;At$KTX* zT&1Sz85z?mDU;gj;Nt|%9RKN^isGG{r+{CBGD^FW5-yO(4*_%AS#%v~>YBDRNk>db zO0@J6^zzd2hmsbXnVHp2RKE%jb7jQyl0O2-HzE}fzhPA87H-JQiM7okSC14kLt>e< zKta@?t(8H^X&o`d!^=_tS5x2C*5*)|1Yoe5($dIp`j;p2>PB0iie{qy{I1G@g9ND( zmX3xceBafJ_8W#Mh;+zKsmvdfLLj4Ocas^JQ0Qb9d`jFT%-wi!D$QJh$-$|dfo?;M zt$kJvkY)oMoQ$PMWGy!OPM&{!II(`)1|MO)o}0`9WJNRVI4%tOpS{mtYWGoDb{#tI zoeo3LH?Q;!e=DD@?&WyFVs7L|4?TPm+>~7P>3df;&8^1H<#AFwl<$0~+xVaq=8e=h z&lE~(Fqdz&y5~Nt-0(f!f%Ab>kLN6>T_$dPDj;FBtix z7RWABE$YrQopyVzSE8Ax9aMQd8)aZ*zT>O!+mA`B-p;h{=kUu z+tQZ>JP7mhkgkLP$a4#{yd7YB**NInqclA?E$^PP?m-xc1j$HN4pkvQt)flco6q0O zBo(j1j526SYs_ItOpuU)6%diRKhZoFTNcV*owY;wUUSB=h8^O8hN|L1TG7GVZYM2Y{Yu%1hZn znBri`4m=*;m!kQ90tutexXH`(^z^G{Sf&O0@80l znzeb`wx`{J4G9}h)|o=u_30rj93U;0o;hZa4duAZEVW@O-ajTtKYZxqW*BxZL06N6 zEJ=|)&u}|aax+;Q38A{edror6(qY5qn*QajXyz8q!S-wTL+2s(G75R#=wsxypTRnP z++B#BE}_ns09#M)QNAHfrh(1`AON>I!)E<0v|U><9)W9X)5BfFsRXzVgsF-jsLsmH z)=gcI^CFPnqD+i}h>O7Ds3s*U-DlTr*|yY=&&miis_G*{7P*+wj?$LEVx&Go+s8^8 z4S@}Ts;aIW92&a7UXwB&6|(DLoRL79Xf#Bz7f-$*OUP1 z*Kuy0A*xlp=+bxPyVfLWfU4@Tn3!FTH`*aEgt=th0*oU^h{Q|nui>0&{PG~}FRSt? zHV3`|Y6!q9N!JI10T;`@_$OuvbuRw#2Q1)R&ybvFatQ}8@Z;sVXD5Bf;nRNr)$M8g9Q%|2oAx5Yj6#L!QI{6-GUQ5xCP1J?(P=cLU6a>5?t=#`>w2Y z-+O=F4;I6jGd-uft9I?$RZWC~oD@0=5ef(dLYMw5t^@+X!~s9T$cVs|gh2W&;1{op zgocZPX+-8`>f~%`Z^!%nIsK>7%y4NoD~BNj9q-F%bsSflreAASe>q`lh#htR=6*5OY#8;?it zfJVc%L{0sl1T)EW-{ba%%ST05xvY|kzXx_>SECwxPhJN<4=RpTTyO5OPd{RbBE!Q5 z3X>IKc~&5iVIso^g+ySI{pSiQx$x^-3U5UNUhnzwF&Kmeyb#evhM{=9u>})W{Ph#A zB}4$e6%Ln6n}O_WI{|FFFhozP^~^I>_s&&SJd?LwiCmo}Uwf^QB@pf2Qd5ti3#~!GY{LpWKdC+uupW zzVFX+Uyaahb*na}x5WXTt$Ue_vxdn2V@hw0>B!{#d{}Za{`K?ZBqo>5pMdIW)}j&= zQRHMM?NHhrA8aNjruZe`jme^1RA7E&!eX3p^LpOsBqStFhZU_3!_+D3e@iO|C}a79 zR#){HwHwe%N?<`$(mf@rrIRx=%8nVY)856XkAKS!!6}r>>bcv?iS2x7?d%PNLvncf zH@`(IbT|Ah(|;mc;7_gj8}F61wb+=Ln3iz~B8e)nfSKDSVYSsi3e{%bV zhJhhzml1=6b@jKa*A0z^ zYaPCz032Gm^}Yz4ri)(;)y{iz%kFEyMI=%m%$1duKUIcs_{@65&HvpEDKUr!=xnai z50CWacF=Jz%Uv|tblG`AK%?3S;iP%*{n27Qs{4xTTP-cED)&=8H`$-I|BRNnhB(gQ zl1;Pzxte_~a+FSh*TgRt0BnhsLnok2yAh-Faff+ib*;^lJ=^d8U=rBIQas)HshJtL zUKaY3MvEy5VgWA~$qL>?S?-UJnJTL}`aYv-#F#H+n3++)7^9p50sf4spG6f1cD zp`!JKZ`o;tiRb0<^1KV~&ARWYH)(_IQs}Aw%L9+=U)^ZK#x?Asg{E!cpsOJy3Tqvd-;4xg4s z*z8+kAsneH#LG=P8`+U$!xa@q>PH|i@DEq;apTR_pK4=*_wNV71h2@;G^%0!9~%9m zvOc+Q9_qjFbzIk1Zq(*HF?QUvpORwGcy%0R=okhtP% za6TyX%sPF*k?pYw=D*+1za8m(92wd|fDJVG$YYKWP9=@UiI``N*Em6?e?Oga2FxsM z^ya*I!WSb&-;ejCKPoU{*V|E{hK zY;4Ll{X#@xhD~Zj@=LN01|;5n0Rwhu<2(+I(_jomf5#=eG=2TH^R~Z@5lhKZC+}yu zFqs9_UM474g?(y#FjT4Qkt9W!jHeNEMD_n2mH&?+|Nn&b|E~conn0ShX6Rh@tKUdI zxfu+`ka(;IB7s1_i(Wi+oj^zi*T%FAbAPT_*dNxU24G%+26m}9=-Yuv@4LFcA~~L| zi};*9h@})$Q2mL4A?tHT*Oi>ZMkNhK5%8zxerVQl4pM6AnwZjT`pQyY^<=%ih;V-Pr=(e-0xez(-4sl@-o- zQT;8kS&+V_5_7>AFy>YX9&5#-#eUNevD5A-;q>gRI3f~~w6iliE815~(Qw-(li>vF zZNO3S8X<#`cnp8vFNwVoP`RnDjUZ6}H#*3QMKPetV5C#;$hB4CI&M=0W=I(^G%^Zm z?|6BBaGa8OYk0od|EJlR_N4Vx5Y+YcjbQl6iJi@#s@zSk|9}$-I;SBz2FB)YhJC21 zCRwn-N{j35E_Wvw)U=oFU1dH0aoKfV*TT}Wd$rwr!SO$9-|aI{WBcKvEnGd_k%(US zce!>L91=#b-O~RA<@Cl^!}Fo3)V7doV?`KxcUkeeVcBu>W6ke-%KjVtM==GAn`>^I z{%aBjd~(q{1{w{g?Liy2K5OCsB@FDrmP;&fuzhvNU!Ww8;_DuzEl<0s|M^5WnxPgv z^mv|&QB;AWtR!YWAcR8{*h+E9RITU@M?=zNU%3Y6utNjS zyjW3Mo+0NbE^cNWWF*w`q0)8%o>tOX6>>IbL6%I?Az!aGE=%#sQNm3ON*rNLpmkZY zQ$_R_mNaTdo+}x3OiPF`zhpJI$O*>reIG&%mkLH#c9#({7jhl)ie5}j`ljGCq;E24}b7vK;S6b8nO`VQv0FSA)X z&yuATmK}+?N)%t2uz7uY1?o%Q_d4`60K_ImB)QjZ;2!cc!;-;W}Z-Xza3BP_%_(K^D3ZLxK z$4^|Jr|N_iI^K|rr&hrS-Hqz-(3S4ksGWAJvT`0Ph)jQquhjC8!@Wu;`6JQ0;1A`9 zE6xiP4F`dfaUDhNo{X~?_wmN`+tQ*jJF9-|D{dsDE z?W@Y1V6V&=)yJ05yOGtnA|$FX*0msm70DXC{yS19J*L?Mg)HNlH~m;2BTq_2k&O&B z4Z}a$N*hwI3^b8}+8d$Y3xg&)NTFG08o}az_-()0211Z#_VTse_TjZg>V~qDyoIhf z$>9-Jt}M0N*4DWTB^TBt#q-{;gD1Zob|U`^JcA9s<;3m1_?7-04K?{Vi?Y%iRxZ|~ z1EJSwLTqn9CPX103s(Fr)Bs9crO2}zvj`t<$0u}DRISQxCW@Q^Z#gcK+Me-NsR2^L zWw^j4GF9huBS|Z*XP`95vQn9Vh|LLeIrweIl}i)9`S3jGTT|&Ji?il;1?b{;2(mYZ zL~oGgCj|7nHvEw+56H+h;} z5oblFVzKL*cqg9sDB`(dGVv9K(Mv8j5Xf{4)N@HPZIwx98cMOr9{*;%$Enw<94O4o z;L7kQhW-e%AcG#4Rk^AYs2s*Y4T~Nx8PeqL9CO|Tr*FY7N;~A$+bH3O^i}lxA|mwm zFnmp{TH#X+j$=coD$Mw>uU3SZ0LF?FF)Y{Sa%zc)w~0t2lXBi6`kXpJbG!PvA~@)T zr_0ls1`jj88Jh+*J3xqyW5?!=6yZ~&j=9ow1n<7avgN49u>TQe&j4uN>Y`U@k8P7Mra6r z;VW|3sPAi-jxVzm#RmBMwH#!A?S#eqmJJ^9B)O_rxd=Q<%(K(-@TD5b?BXbxbAvzv zwx~X);|pgFJM*7fzVSii@n$AdxoC+9GBl!64?d7v-nvVW|HMMUF|sazW*!xDy%9P( zJ&|Qa=7TXJE+X|}(%mk9(%fQ3<7Kzv#PKnT=V2Rt;yXbyu7=B)da$K{o`=KmzbH;V zb!lYG?jUo%!DEYxZPfWPgceb5O8OE+O1F!a9d4#nJRdSFq9H17EI!!Ytg~f2i$5g` zH1J|+*k7PK&R@d1W5eWHG*=9;M7+WmqAkfX$yk|MM^z+4JX3`WiNeQx^<0#oQ0fty zQCtp9mOllaUU>oRCk02}T781hQIdiTb1nW5OdO7`nJmhkAdO{xNK@O_xZ7vEA1%ts z9l9fDQeM@h$f0+xL_{&oeM?m&#!CE~Vdf&BRrDR4mkV`Xq$S&!_ z)VG<0bW-Xtfz@5+h<^scL(rQO4l;=ENZsQS2<_H#w)66C!Q(aHi_n9`))6rYsTzsz zvJM-DO9Ag1KPu(!2kye}sBZ@5PB!N$Yx2ulwPNv%-*s{Xpo^1eqWca4aW~n{)Vh@+2mse4a zLo4!^^{jL#gL@OfR?bWk|&RhGQygfUY50#6PrC|74 z5NQmUN9ei^Rz=Y<0ER))WMmLl;~H~07;bctS3QRTRKNP!VOn*>fiFNs(h zMaC#CDk822j)p>QUdVHi17ovcz9~_7tFJ*xIQ1B~PvzA4$3&$6`xsEQFA;LqEo4Lz zY7x*CL7$)KI$ZZF`(RzAn(=F~}?fyQknMO9(yKmblGs4hFMC|mQnm@&9BkTAmD!o=NFRlPM;PXRw-jJX#)_slV zpHs2=ITG7`vjW6;OkPRVusSw5sJ}%7wgBX9o@x zBHupw-9Gc6f{9>BJVkUWWwun!a4Vs!wuWO1ei2e+A@JpmrB*QSZxT}F)Hi*eZYu24 zx=2lUMZ6Ne*oLlcc^vYI53367_}+2_K5bWoGp9^B>ae$*al@kjHkQ}}G0B2FhaI5d z9p{f%pMuh>9%<-5ou%jWSYwe%%orsp9W;NSo-y-$Q>fe8z6C`5I2}4ZUPeZv;ywx8 zDd))-+s!f-c8Pr1v&nNj^e73UsSgFRQ)wPjH8F6!_8Req9WML}O3n7Yj%40g;?(M& zHnX0u^dK3x7djrD;quybkBVwO$kp9-AoF*DTZ!~U*=cr+`ayQQL=p}?yR`od;8T^` zCezx!-h8Rdna_GccFf#0BtmYTC+Zo>0lXmvcfz8?yY)>KUuhUS5jQQ37ZM`6W#d;E{Lx-)Jh}1lHklZ+y+zV&U42P1o#$EX+Ogokai`9R2i1T>U4gxFFEv0EG?nKnZdhkt-W- z313$Db!YBN9ue}>)bygb%8#=tWy3qNHi0ZF?QUfH)!>~GE3*mJaOJ0}&U{V@B18KV9)k?q+SG){@E#||>W)iBH7e1~|J^vnIq~)jZMCc*(_OYbAHCWIKyXU&=zBwVN$-%;+DlEdi5NxUOtVG)_0sAy+$zDnZ@PZjF zKVK(!F7ni(DI4YJfvzwVQo;gJmdCpg&dPK@G`-=ZABduz+*fG`mzl`?%3C^=06kdk zuDt$Q;sv!>zY>4nzQv2yys*!UdMG zX`AbidybMw5J4*a_vo)?FY>r(ACdYlEXhn^`+m^0JD|tEb->5TtG6VZyCQkhYNpcN zqs58Yg@e)NhRU;+)(e-|;p<6C3^EhVd;{3N#fQ1?TI>GnB22;h$8XGKmX&S7q}qh}_J|kZwNz(0y9*(%?{qlVNAIH$ zwf`YK$pc6`*JPFU{oPyy^OsMh)E_9rA-@hIqLE~s%({-=US*6@Q^YGwDxi&AQ>TP< zKfuU@M$>%UiE_h5|n4yS}siDEHA6-L+{_P&9R;<#Jwq($H9?c#oJ<<&q)Zk z&Vj$FUN0gPc0}_RzN&k zYC^jTX-?U~z)99%!`5bk0CU*QQ|7`9kKJvH{c2^2-aT%VbmJgnkXdJolYlsQt(J}y zdsesyc^8#;ZKH*mHy;^Yd{QCrSHR`j^@@QCxKniEfCjY|f!Ovd*G{#LH~)y_?gb90 zNmVO~hczMOBy?%o7YT~eG4%c!Nr#2;qtejDo$xIyVpb*sx6s#s#j2-7=Jhg%Vnkt7 zn2U*S6xlWjd<0d~gX_3z#9|dkj~1%>D%h}qE!5nJ29x9z!!&08yT!9imw!^WyaVFnb}f3emN>uBqmNv%Z#$h4y(kWXp{J@GG%~= zxEsWaL*{*R5<(??`+U>+21Gza)U&kq>}IpvgtgRQ+q)GjG=5!P2dSz;Hj4<`u*doP z;)sCo1!}?;)|5zzdBTXnwUIkdM}+^S0z^1+kjv0IN#9oCyh^h(91s#GJ+1y61PZ%< zic#uv+vKbpt&yagq0==9#4!y_JH3hji`sYT|we=Ny5dabG zwvSdYu+nFTA$(Babl<(>lEmjCF$W%`1Jt!NI(&Em{kqz+5sZ&7qAeI=MZJ)K^+AJx z#SnppR1oSvI)+sxYSX7eBQcl#>p+h1x{A~}6_Jfa^(@Ua2p&PaTsb;%t?R8SV~)## zt2OV93#?JYm`q)}4d-YB%NAj#)2Q&Anh?QQavZmrWB`25orm5asqYQ1K2^GMU@DEB zSGtq75*&-Wq9#!DdQ}XQ)b%2wm^)J2x%v1|dReMm4wSA}(>bmGTR-|ytunI_qg4E? zd^Td&T(0jr!_X{3cNr*)Be88s=BJOy8HG?!T9}%xUL#=RO3dYXnVW35RC+9}7g5Ew z#y=g4Jq^bZ;13~MSY5x zgq`ibXrw~H*Jf<_TYPENXJeF}k1x!Yh#-D%p23D4ByYpQP=@zHdIb`Awpy?21oHNvqc%Nhc+20)tx{<8XLz*n5aXlj(Os zI5_Kizi-H>S3u4T)5k%?CB>ltv<%T;2blx`HYm92}hN z%eAtGhe5UEBFU%Rr0$TF0w`OvG8CGb~OIz4beyT%c%4 z$5xF#G*~0}sI!WpdHwQ3k53@xaPbr=|;%PB0)5_||CaMr4PV zF&(E~d48ahT~OU{}Ur z=(Kq;C8Wb1&PJhUv=UkM+|L#YhCDy}W%7Gs)5>S}y~0|h@3Hmm>ve6rW(57Gzv?ic z3BdAF){U(B-sz$9TeZSyaYHBzVvJjGUp7e7V0y2=WwT}u)PuRs6rC*ySrLIkNcVq z&d;0`@~D2Z=CkX1o$lw}<0S7j;B*_6<3%)VQ4tIWldB&wgX7uAl@@Z^J{iTHh;X!T zCuPp}-l~UBK(i}WPjJld4M6cYBt)~>4bjaa%dXI0RvjC&i9q}wKi45m!n|HwnB6lF{jU18C;$|G zCpl~vZG#rNDcsU*JNX`}aG)9UW0R4M94JwzQX4!Sw%>MEXoLb2NCIeuOB^p2?M~tS zyneD3PoEp|k_aDToGplQ+xk4I50=s+&9GP`w$6?oI)B6#w&?loB_pnO%L#1?=nRd)G{Y zu{;J6F(qZ#jo*E5M}^-C;2@BUXe$q8=n>qQbe~zeagpEp`}+~NKd*yg&>`gNY*XAD z0u$Y`)n#8PLj2~xQbWE3)?5TAZ>(R`>$2DetwsG)B|_I;mb#pWyfrh{~cFf2~|eIz@=V3hbaq} zRDdh|u#u5r$(}=9RJPdP*R#nV+qRe>xsi{{kFQx09G7HEM@%}*wnkW9$FIo}(3M{x zL5w~lsiQoZ?$D7hg;>gN{SSh>{L&6?XD5+TQuYzOIo}fV_}hoPTGxUTKq`_#|2I&{gWX2u9_bvQ3@Vf6q#<)^V8Pj2KxhRGbk9z1;7O_qn zC0u28Z-!7VDCsKdeV=$aBRlcCjdO3$D-GNSQVO&4o&(3_`cu;eU&q=l?ZX_GOV(xY zOqVG6=U89ntsQop6RsQHrZpKa=1xK0Ab+n-4GBnJoei29%Kqp6$zDqh5<01XD|vi} zp0V!zjG=sU{yj^w6IU8k#N-B^t+8f2v|C3|mqSJHPPueuXBl2)teK+^)mIXR#q(r{ z45qs2O`5m`88yy`Rsz9D3Q%s5ib1R5YQ$bgRc7ADS4t1sZ3@*H?n5mcoXW7wBm;87 zu66aJSu}VLp+8mN5M~*49#e*W_<8Q^HwUD)tz$`<*i=yMmxzDU4X`wfBXq8ITJ^Ne zci7-k7DJdFCbdG!eJP$LB@zHII5IwbRVXhfBInMYAK^QN={ny)d(Y>CsOc{1ZWWYt z=KXSSor9V4Vc#@Iw|p`J`z(P3H8i4g#T{A5-xb81nf;+u(amUhhOOGU;acF?oOsH~nWcM1(vUY_UhZnOY zup$hGvft*P3Lluoiu!Rw#Vv5OUny{L}@#i)dVOT^ZMLPQ4)+CPD0)dr*0mOS7g~}=F(Obf0}&&UoKiK~$iwCS9O#8d76|42$1@hxg~L+Dny|E+#C0@$C>Mc9 z&rv4)Q*ow&HGL*+y%<3cu6Q5ou|@yVpf$W)J`?ZirL0x(26=fF>J)zz`-T z&#wL<9w1 zrZgB0F-g^Q28sEyD2uBr6YC!Ecnw}^Or`g|v@Hxv%UJnEJzG@3uhgYMMG-DcM5L^h z#8%-?9=l<#Z9;3Qk4_0qC#nSSdKbrOfci!o8%zJFC&cc`aJ(Fs#H7T+;IKvwaBu#3 z_JImrHl_lOBvmiy1TUWQ6s~$a6XDPS{`BIN;WYbeFBV8{R;7x`X1Gq{LDtIsXU_(Z z<%gQGcOoC(*=jV%b51zdXMq}{OYKA&ZE#%*%^SwR=!;z6jTYgJ@30wk^_WMI*v7WC zZRt?Em^=t3dA^W`;98ScX2e6$`2v%mgvL;l8moR0wL0F!KVp@cjtJrEGK_~Paaii5 zc?>5jH!p}U|Gbe5G`M0M6(tlWFW6At_CSPQ0*hf8m#lwFkaPn2uC|gf>`#k7;dE>R zPSkBIMw@v_B!8M~-~gvg6O!Pz<@dJ21)|xw_TO8<^i6s_eu0g5^21eUg=<2fl{(ga zl<^oB;zHWX&x5LJ144vn42q=ia~3t3;8G^SuN1s%r(b=yG!_%OBBmIh@6DOF;wj+> zn0a8S@RX}tD5F;+_>=2-COUX4$e}}3;IkPqbB!$aO~jPU>>*=Yb0T2#q85K8%R+4@ zl>|I{gBW?!^^|qQ8cZk(Gd>ps6-A<ulHGOz|1L!E2qAUqah98s} zXS9ef!?t&BkDTh7qae5z2D$q$Qd+=u0~_Dlk2JjTNh@qBKvu|VA4v~ zDwu*1RxTmb#wb8#>++5%kLQ@L*b_$bG~&K*f7{21DvbGglclC50)V`4%{`?ST7TLK z2!U`aMI)QpScf2!j$;v7%5!98!MoD8_VkDeSfY*IG%Tpe!xU*;_P+inT;bsP-*w!9 z3u-huys84;2nmQI0lo;|t|iIU!(66fj{_kC^%zWz>`>Q-g}2V%@8`Yb9TwYYFyuTL^~@{rT5 z|8hjl@8^R|y7<80Qn2}_s)!H_=?>5~qE=@Uz`=JMRYzD6S8{f$Pv45c5zuFgS9`}@ zjtWE3r83o(HY}Qk2o&c=mVRuMw{LmkM}B&(=}4|igq@l4%W_9X@+mScO&K8*w|c0# z&w2=YaoJ!O`t~1&NP3J>jY{=_F-rnfYL(tl4qCzo7^B?vbv_dXdl2=zXiWzn;(+*> zHW!rhJvOeIDlZPP=doldW7!b9g&r?dA7^j|t2#=-p1pn6lrdtS64oeR(kWaWt#0G&_xVCSBkD~bM~!m8Jh5DNJS;B3~#F-et6~HMZU8 z@^`5~O%9&#R-0XUZQk7`o{|X5HKyX%x3`igOMJ}&JVQ)2zN$n39d>`*9*6zZj zBGEHqPBVGphxn;wDL#hoh}|->*do$>l_(&Q zD9sN{%|^U%dVvQr3Ni0r&9N>z6432B415|!5wYCT3xgRV`G>PF4uAk)TW$H^U(|Q0 z4}aY9q>NC={=?gEmyC&MDEV8BTB+jrMQsF1dW7I~ED7m_s`SrvkkH4!;`069TPn2I zgPGQ;646a%hHxPjbjmw>3T#;?ku}?Qtj~7`^JjZPepu!-sH6C6+1~&^-gmdXCHxp* zFfy%1fZx3}7`E(PuhIUK9manMpxc%FZtyn%yL=5w9_Lr^$qiIbayvnRfIaK0tWGDx z>yfww2U_9)5zUE)5f!XD@Y}Tf&oZ>ChKHn>0H?sGN<>DqH)XXGC#CXOln+|t4I7}o z{C*3Fc+bTY$@NrKL*+$ryYQcNlpSV5Rs=ULZ%&sYD*bO8tLk_owt6+WLh4f&v2`8xY-R31w!QMX-8;C8(fUr_4&yB)-Ts6 z5QwzJgY)_7{xZ!!-$e7X6^ae)-7QUEa(`ZsUaWaZKq$2gxjkU?Nmb!X!(w z3NS;efq4t`2heJf!B3*Be7F5_|M_=u&mju9CyN$nu~>TU2~;#IsN(-_Mb7ge8mRBJ z4anJ2u~qXbnD_AEmfclgr3%aKd0MISj!Gdt)mVEi#B6RuMX6hhj=s^58Hq?dbn`sv zeibglhL+N`DV+!j7|wpx0;B9SlbUUToJ*a=$==GVt(GyF_<1HYQ{v+vLIxCn2}d>n zJeE!5W!LOtQxCutbpTKVSjgj%CEwk~=%{pG7#t3lB(CMiQWU#p3r;&Bq5f;jT>w*& zXwCyk7|!nwC&HjZ0CWK!GNOeIsLMwDm0KxNNUY!K^4O2J?K6o+j3DMXd^3(i3Hj(} z1;+FbetrkOZw+0ghyc(7q6QFQBmU_^nr`w_*vCwy+&|g1{CGD8#`AYMHUl6q=#Y!K z|Gt8T(NQdsT3Xb-)%^{y?>!HVmBEbC9S^*m$;LV8^2)M+lyBa4*qVO6iyq~;vitL> zme{q|F9Z>gs$Go!JqWk`E`uI^zPWa?Cd^h*?Fd}r+x0M|aV6JLIfk?v6*5{w^89N8_PhqpcBJ$}C}cF2 z7J}6gX>xzDB{$OK4q@|6JLVw5dc<4-Pb6vQbC8NML!&Vlj|hTdximH4RU|L96qZ&eP6l>HzUWtsx9Kt|>C}gl|fBOs&yIr=uYXTmx;(KYwpFYq6dCfMjS`Jf|d2dH~S*^$v6S+tn>f zR}>i9mYLj1ER|Wb6leC!&ht^Q&r67)Tbbnokf3*LmvT#F$nCgBflcW_15SJ?pZ6bM zO6S9TWA4NBj|VBGkQ6zx=34UuZ)1lKX#nA6-cASLz_P7ShV=@vt&3jZ<7E}|K)drhPTI@Vo2YQWiC`4h07t6UQqF?M!;9FOZ^q_AfBE~F zC8&lX1@_7oo2iEQ%{9yyI{P3fuQldVX5YN zYGW40pj3*7QKQ;uOtL+mw&>NfJK@Y1OMITwrk^y7D06Z_9cbAx-|6XD7WG{w@o!yzliLBx6Z&+_J!v`{KLw-^t4p_a0W%dOJG9 zQqQFMDBEpgc3G3ra7YZ8ueJ1R2DUOR;+0FI?b-qz#LI2Qc(wDDC!Z4= z)$YF-<`>Lq_}Jt-T3Xmv>#oh9g{C4fkPVF%G_-L>BsWC@R`}bUv-U~w;Wty0*^|+A zx*jv0^2m6rr!?wyn?LPG*O7FKU!$_qV<%6K&v@?~_WtdKH3(ZcQI>tl1WiHSl^pq~ zn@AhMV6jiRHR12p;U^o|eb}eTK$d~diw_qDIz$8}Y;$M8zhllSN9@@PRN1tNB2vRa ze4LHIlEp{YnOzBNJDKCn%dG~hO1_xD^e*Hvi@lt6QI*n^YG)(XKq<#)X68fLWy#94 zvLvMFL(kh{I?nmCPe}%+lc}^4zmS8oe~E0L>jdHr`Md2=1Oam z{!6Iwv!#5$rb?pSVjT70`9!6{K|zP9G=m=xPe{cs!P4)vn2q+g72@=}Ja)z<-?+<9 z`cg=J@c@+yfLi|ZMHZkDlnh2=`lx*W;3cKv#9;5COQO_aVew<~UcxM{jrMA&xg0O- z2k0-2mF$7yYW|Cs5b@6o?tInOk?_3~7ShS6ap+O$j%GC=NPIOQ2!7O?8~znvc4%Yt zph${9o%?I(FlI8AO-NBiGp1r*9}eP(o=y>BrM)T`1Cq92yDU#?ny7AN3duenc&h{- zjOZjMngx|}YaSj|6eJBlPNH!XwdbX6*?Eh|!SS8>0>2=^4ZF;rQ(J{n7)8giEy%Fu zGX)1$v(~Ez%8SeVwsL74pRDOjQtFbyUBlB+6($3zEoj&T$(y@v8khoR}-+9;hBfpS!Doj#?4g zk6EdApG(Qy5YU5n<8D_=#eNXK8&{EC&4)JR0x}doA3+OHLQh>N?0SMEQVycFs7DRs zl>oHR|0Jq3(8pl#%j3yU>&fg$ksx+Un|-UEi@I;L`lM!1;`Cu3KvhtYm2ejA)zC91 z+#oq1V3UCJToEslC%28#gh||Di-^*>^PCRd~37ES0lxrTdJ;ca=g5Y_RmKlhW zHrP9~odDOW@|E}`x(YymiTMs(% zm9JMh5NGP5Wz^h^MiTISHZT6=Vo5V)g5s&a^LEpnHX9&--EF=p%-0UcIAbasJm?SCGuYM~sXsH<35FB|tBxNJJ-FD$s9%B8EL;vgm+XQ|aw z=Znd-%QfI3`n)E-YWZ1(LxT`QIzgjOuA2o*9S>juMvRrUf4ev~rO?wXie~uf705}H zHBb5g9?iqSGTh?@Baib#FcRu<1%G5oHr{d26d7#YV<~NQTREQ<+nCeIKT8@HQyNDt z1so2koAd>(>uRg71L{&wU1xn3r0KlPQ~{3=fa-+g3$+^X7@?RtA0WV>I5iL<|I4kT zs$=WKSXZTm>a-iOK5yIZ8QQAj%<$ue+zSV!Qfv)eCRY>ZNRs=I?GfZJ0NsJgX9_XW zAJUTTjhG4W0byPc614kO;TJ-9O1Or!eUXVM8?4;bh7DNXXB+R^p6lb;HMhF6wGHRv zf&W@8kTv)`(Z8VluCnpjcw1=zk!mR;4!2vp-9pL{6IJHHNmf5P59x3O77u9baw#wZ zbTB|onoM{36{O$MfXd}q_im*oS6dHvDhAIsj#)eGNx-1vf>w@ zLRRH5g{-LC3F~oBv1boXkuxW@m(m5UcCh~Gi)i5G%Iwa5@j*ySIMAk>nS0TY8wAv& zGGtjAl>iI!QhRz8D8*j~Kpep5{v^8lXj;Ax5br(OvD4bmyZ;;A(n3Im4{;34tnKpm*d zd^x!xTGRsA1HE&;j3hkpJq-;?=-MDw>TSNP#!QlSB`!I3nL)-pWDVZ2EpnR7Cn9>I ztdZ||-dx^*zp_>|wzmRv4)V_bsWt@=m?WL40hTl+l(r|UG5$g;ReSqy80&F-Ton{h zK~w17cMt)~AYa`vl2L^|AB^WrJN4THP2FDO+eC*e>MK@Aanqi=pRT}kv1S0G#uw$Y z6I+I}PoLEDc`G(=KZlkFwNA6*$BYCAP#BjO-1>kV=U6$Tx4+0?NQm~onPb!4ham-8-+k-8KwSnI0Gz&dd#gL*!?xYPm)e*w=A9O z=gHD3*wNJ-$1D=4#xztk%8_B5Vnk@e^A2vgF35*Hx9*hsGb0Qj^z_0|XC?JnVOY(x zwossva`~KeB23PXi=0t}SwpgI|GMmXVZ-mW&|<*D^$?$lBf^=$@QRZ))RlA!a_)5) zOXWmpJOcDURHq>W_-)of)4RHalZ)|5;00 z07|d+vd!7Yd6(}BraGObgwOknV?g(8D&yad4^+crHt&a%0G%B;;W^P^ii*2X9Xq%p zE#pd?VeozCVSb?cu*Nla>oKu0Yft8n_H;s5_so{Y@AN)X>$czq71{ok(pHfux=*b) zLXs(D;&-{bSPOrO!H3h!9BG!;^l=oY{gNrhBNrZrxy9Z^_*gyaBohJ8YU@97K_()i zP!4pd<(>(~84P376ZBjN>+!J%3f-SLd$>A8+7`ylb!5J!PNGXo9r^_OLD|LVucd^B zRFMY}YT#w&zH1g((-0?}QkZz@9>^N|^xF?%>!^(_fDpW5Ynm}P7MYud+X58v3gqU- zWVFb-M~Xl9t9+;lRwc2#`nG4FQNV~&OjiLE*{D=P%H=YQ=r>Cm|NdT%Z~~aMzR`Ah zhO)=rZ@krpjR;ARVh8QCS$`91$0g`bghb| zhW0b1zx=WEZ*a=pPwtp_XbLhQ2$jIEdtq zIDn3MDd9FX6nvK*F22N5Hu<*u1z_G8lhck#rplETkj*?hdy0Ia?Myp0JiJ7O5l&2c zVYNCwPjX$$LKY)>sAw`3qnk{8W0S<4$D&T5mrjzeSwd4uRrS=%T-TS(!s)*RXPIp) zRlPekY~$wYp;tCIfuCB;~7BX6v0j$>4U?KRP6)}K%J%pdn7045XdkxNcY z1<$-kzF(zid7CsCHm1`W}`J7 zK_y?l1bqraA^V|^&cHNUOL5XOw#| zNp96lzXMKw+Z*VSq>2vL33MVA+U~2lj7t&#@^GW?;lbo1npsaelvtV?J;dz;yeK^K ze9vqR`1x-kbG7flC7)WuCoJB&NTz=>`#QIdP>Y&$$ag>P+?rP@z9~%Mg#B)y;s9(O2&ZLM^0lfA0Qt;yH2o1y z22%UROsJfi_LHuH0!lxr(uqhRGiCO@0KbEx5U6qHQR1PF8HVRg|5`kMd%IS-ErxQ* zq+(5xNFCwJ^+?{`OYMPWEOJce@x~Ctz8}5ZtkM)5Nkv{vr+`PtfsM9ad)&*3>6K$h z!wA%$*n=z=7`vH9LVhY0Au2He$;`l|R}toq)2Yjq&KD}bm!*mC;EaRJeb3&J&UM;d z3U)(HAPYa!IVF&5CH%dGKytX;G1HbPP)zqhD?8$&GMmp69Y`K-;o)$8N=VfpW~IV~ z7-;m^Ecuok9ID7&LN`wBuNw56x;4i$rP{B)k)js!M0&b^jTKqXY+p0j_vK{!^iaNXP>=U+z&Nr(dTeaIWV%seY#bG;zSBKE^e>S z-)wyCxmx`J5G`u4$)28`Jb-2a7!cG_bUq))8$LS33ZX7)890?=_>t9;4}H5n{@Vm| z*CPtKUko6R6TNhaTYI-&zl8tv6UVqPMpPkMF)o$ zDy>9TsO=eWI;cG(>^ZpfBCyGHo=$PFV2ggb;!OeeaWR45(=KG+PUgW&qE9sh;w2r; zZ5SfYKb)%MT#VsY^CrEai14#&!K5miZr0^lM`Y6RE4Npp$$l#;vL;9HXj0zf`F^%| z>>7-P4e&try?)$gn>FBn2#`&GaYRs8auysc+KWR@y}vE<(3`vP5j+*C2zcNTttb^-o10p7pGSZ_F%n79|Wbt$f|pY(K65~l6$SBBMqHH zbnc0$S?_+V{~Wpn_7z(s^aok}W-y-!5rJKH&7^_|)YtJ$??$R@Yb4jw5BLLKOFP!F zm{}|IN)5#wg9QmyJ*V3(`)@`CKhhsqHC@x{S2$0LNf`y}EPb8_w3l?0W~CbnI8JUg zC`hEGg^4@KcGO!q?6@m*JzM9Rm0(Y+3Qm7;_tGm;Tyizkv7yLRT#}GXiA;Maztjr_ zUzMeKIIk-BQsF3#_AIXuea5+$*dqL|c;;C8B3??;k}SB1K$0Vz9dPgcwL$b^_;8_N z{YQxgzYtI79MK=)s113G+@_@Gx1{coupEpQIkD7``^(stVA@8Hg7=Gv$v-WX50zKl z{++Zq{R1T)(Cz@$SkQ~)#UH53teOutSp~z@jHR%ZH{yq|DRMLkaocn{*TYMKgA^x> zJu;s+;v}b6;f98!vI9|l9EYyXM)G=2ItD3S#lR!biTe4qF^!bWU@_jZD_A)O)VqI* zbg5d*jXYI`Z5qdvMJ&Tf>FLD%uiv+92mdZrB8lLvCcPFNHHuMrTNjU0BuFy~@3At_ z@DW{Pu}^wIbK4_70wYn1e_NYA%&^cFMKUMbR`_cZjL|z}2;u>1! zK%?*E6Evac=5~F!$s(l>xU2=H1(I>jtWW|9}H&lBlUt7o&HVnIE)?KE|&wngMiZlcHcZ^dje{7{Sy z_k_8_g#_LWd1feCg&Zh$5ntV&>rbo;#p_LHTaLvm#~Ar8k4B7XCI|WiT=MnTB-ru1 zb=?F#Kj$TNZW0|>rX0&7L#1xbZmo*d^|(Q1{paEDKAR4kll%bnh6jr^G^^^eK9K8`KV<03Tw9IFbqMly7b-NWw;?hpC$#X z_jbX*k2d%a6OTb^w}b-)0sK(%sb5smh>pH%HpFt@=YGTGSWS57_N)XW*wqfhEupBo z?>^v>wC_f=7rjw$z?}T`E2^_ol3AM8dxOZ`-CfZwF-J{v;RY2lsGZiJP5Bt&`ux*h*)}2dV`|Z%Yjsv=b@s55f7JxUzSs8+b-ns7og?o-2S7(g)Li8=~*jN{VD$ zSi0H=*XB^-!A&ko&qA{F`4_v5IQ~kLE>tCk8={ z1^l1gS4{O3oS}LLfEzKoKTYx4D=7kAY$SG~zP_H~adwVj;Slb2Zj60)ut~6ngp?nh zCfzuujAjnx`0fg5Ps$JNrGTDA>+{H$Pl4}F@;4R0D|$RWqS~JrY__q)SDp=63=AYa z1GScGg}c=+yfDiUGzG^;PS3agWPp;6&esPXG0cL!MSiNq|AKLwiiZyx_k=YD_(r(s zrk=NStA5_u5T_GU<6%da%+WzIW`Nf5 zR>TLD{&$9A>m>Uh?@8x{Dyy94PrOE}T1iZxmdq)Z!D7GmP}s!#MiwP##kbVNql&RU zwjtp7eUBi;-#c-OOR|$;n6m0H3smbZDxe7=!AaaL$NvqZ;XkS9{1Sr9oP)aqVxn&} z%p0aFFfsz`WJZz{`w=g3?MhdqWl)ZlOtTEkf3QwV;9@2Vu<-K0IzDpie&`*+@qMjv zyd3Zcb>Z@Go2w5roh>V2(r;p*ikemBN4Bo}FEIRvYib9Tt@-4W^Ld#-f94(MQOM!< z#d$5D7q+mN@6IXwP^?aYGyT&0V_JwU{qUcSg~xo70=;#7D0%3LQl*?GZ?*X^e);lV z>8UE}s}~zF%=aLEB=&bink$~CRb3IUYg&t@t2AOtDf#cFMuZ2CPWvE+e0c>D>o`xw z&ne)zz`it;VGn9aCbLl`xb9P@q^5~0IC%cg?%Us@JdsmyE<717^H5+7#SWkLMa_}L&5R3IqB|em!0I1=2a!2uC&pLW1H~* zm2JGHq|Qbvu9TZlCiQ&lIbBf%rXDfnQbQ}%Y`M`e^Cq0V_N>0h)FP&*Iy0z|J>Ps@ z@yQkFgh$Xuo=UAa6w_#>Um6qgCXU$ec`kO>e1Qgwk^$)SW7sI ztxsH4m1(p5c3+Zmaev|iSz;E};;MXQcjYSdd^o7f0K+>aF?F0ff9*9k%k$k6lR=!> zBFHl{+2V+Wxd~D_7wy1fsb@P>E+cM|C|%pl=&R(EfWAQBnfFoJN~9~6Fd)g`p5jdJ z;~1RDhjP%JxxBa+tpRYy%(6Zp(r5%TX$nJp}lsdoEGGI9CIAQtfhYSwQJ zVPn~bGHbqcE$#M_X;qMw`US^shlWM1GnZw+k4mlF@L9fj{O)i*gxt^zrD54$^xe@? zG(exNep|kKiu`}8Pkv+&c1Ng}PJP1LrS;^Su(jVG3Dz4LDmruw`yz|_=oLl@4mNZi z7O~*z{K^buQ21H%6(iPp0Ir~i$Q37qSWhxOAa8YWpKRRia%>StbU%^7tgh#$Nrxw? zk}7s}EVuah=$g_0?RHYO7DpitDeNyt@0D13!DT3!h7= zZ&;^bFY>3waO-P9y=#Zto|gR2AE;&Cu(a=R(i$#3V2r{U7$XQg1*obeD!x(h6B%3)gh z5hJC+IE%HGdG=O6xBFwzqi~=PaB31h--ns0~UYN)BCG_t*(=X1aiaN>z zF*$`h*t|!nsg!2)l`X0{+c@9I&Y>9X90-!7W%yAmkpLG4>GQvHq0&|*5f9S5TKnm* z1sTb@4us&QeQ(lxGyi>C(Ae=H_nQzW1Zv$+T%V>@Vr{g_2sr=vZR8IkZMfOI2mz_~S7 zu#}!6g=A6>buuf{ca{WC36u!t(&w@bf1G%!D*|CQOyUj2Sqg}N75vCR4~ zU6Sv)~tf1D=+Y=awaOxnm|S8mORFH|qYY;rV$8!MC~jKZv(Vn-oW# za%W0q-=v--nX{>~zdo&OTn}R9Oj7!}#Q0dOfP-abIWd2YQ!BPPFYV|yq3;x=+-i@p>v1K?~?f^-PCo#6lS-p;zpXur;Q|8dpq|6mDU@bU)v-CRt2d@-%o z0XQnT0++Ppkv(;3mzE-Q80u(L)RThdG9NjanQ2A~h}GYlcz6icdjj!>7t!3Uaj(iu zJ1ITMu*)>iv5dTkIHrh4Rm@Kq1DU5q#F^2`5JGErA5kE?@v{;UxCq?NjUOa4eYjOB z*Gl#-wGbGp?3jYZrq<^?jn6J6FIJ-(wwW{|xTp9qtV6?NCZ1f)!{lV|KAND(lAX!2 z2fCbw$clzo{7o;I5v9n7NmvfCA{z_TB|n8a z!>9N-Gb9jYE$$pD0%6Q@_q3#{Vc}B<6y4 zinVXdsS}tk?&CO36q7+?>EgVtrxZ;`D9B;%XMi3iCtB>kQ=&vgyqou#8_Lgx2#x>Q z6qRG61kv!2zVO|OJ8Su6cF|Os&!dEQqul!{B|5WP zcMUztLHhd=_^NhxZ(DxN(UOe049{;-&ZhNh6KL?i2V&4E<|=zCm21U$6$q?&0A%PUKj?{TYCi z$tZ0%9@Z}$52*MP1GwML(a}enbYN|R6aE2!y6I9Fz=(zaBHM@&{oO(1`K!~=)6;YP zJC#%U{{6+_f;Ms({b)3#8a3vu{20n}`sWXI_r-7YhvzCewQQIjukG|j%YAYB6-_K; zDAAIm%yGji7Gs1fG47Azi^gZ>;o&;O9Tbe|dhrgnuVik}i6fgK)RG#CD8{BklR~%W zPEJ^m+g*=t9nd_j;iP{YfT^HR8SLU>)1uo!cfxz!pAMkz$9bxur=cj9UWt~G@jOGI}deAsgT+iil1)HK8rXs~5 zAnY)t$?TfWNM5U6|4?NQW&`RG7t#c2G$7z8WE$yDRz%uNdYh#|L)Ao01NA20oVC7f z*Oq#Rs#|{6xB5#NP6l}c&}th}qynwe<5_#XV57%0f1;1(xrUCBT6`f4`du) z@C}A6((E{@R9~hvFjtqph$dH#U2os$A6Yl%p)G9lZ7D znm+kD^j}hNJ1VcVFjaURTp?S5P9C4;fMmF;kbgv~8$|{isnoZ7KB@C~r{2rmd9Xrt z1sxyMuLy=3T5-tBt+61$gA@+jz~y_gW;P0lx;wwE4Q$Xq@OhIsE5r9_FcGN^y4~2E zs>10E?dAH}(zCot40%%{E#_y6E^Ig+9q`)+RbySGeCb{vpeS_~SFNv*mYMpePTlc$ z?f;EroJhjpAe6Dr=R7=w^A#~xz`trWnrTwm{_pN6zqS?{NzVO!G)vTF+3yks^4RxS z(%sY3tUDARymrLixEY#s$phj4IuJ#VmO6D2302@krv-Uux#CVK z?-Xr#DpPMxry(#weW`hFIr1qC6QbR8CkW~L!4KnMP|`7JC4dx_<3Q{Ue?@sZa5&|V zY^)_64%_!8M3l(dOqgVoB-#D!wz5U@ZDp-&Z)8xgKPX9s=CQlH3Kn}&V+wna~xIJgYx zl|;IPpD1L@O>-y_zgG}{8KaS^{%#+Bt)z|jJ^Y>};FP6tCofWmVHI!-;oSZwk)*L{ znVCIY4Znh=av{3O)d1Lfd)4g1{|cO_Gqkuy!`PpXez-Q=(xHN$>^Ac5#uB{ zTyps9j+!Hb7bMxfeyP)8sF`uUKz|-cnNq&&^(a^|$FWg>QjTGU_Q*?K3_0rvstd{q zYt}phOniL9c|?yA`J0bR>h+v9y@MC-b2mUaYMx^*_b7s~bIU*K)}ZGGr$uh&T9RA| zk4-6LGd+~iOXznp{5vI2$*-PA8kz7a&0)54$<=OgivbsVa-}j(zKF_;vVLOw$SXrp zvt*O`JPhFB!0NE2)|s#9D9RCQ#dqV$Y@sT zbXw4_?)5LK*iyv>#&(u_;$Qk`duTl$UstIT(h{ra0T5uDLC2qBw`RK2mFY%>Jn-UT z!3!G+c=W#>GD3xjUp9>?Wn@&pKexR_QXCiSz0WMg?*2>(IzgW)rg)1dbF8-C9b-U% zVt_GOKor#+=0oWqhyTG*saW|Et2*8-=g45L^RKl)FAUTd`Iw+~8IxgCJo?&!ua(9% z&#G8v-%w2CcDg9e< zLMm=teIow^)~nP6-VhOK?<-kGUBvhtN#AaGi|FdL_V2`EXH7k#lo*z0?W!h4{Y$np zc9(kx2{9$9?3DI3?EC9P*aF4O#H__ZTNur~=mL>}s*}b;|i)utV=mnu{0YUIo(W zi}qWJ6US*)0BAywt%DO!h!1yapfvZkn;h|f$K18MQZ{(HlmqmXo6S!l9e<@qtX;aj^oc1sMykc* z#${|GY=HJR-e3S<+x@~xy#$9t9?j(fPd}VVfXTJ%YLJV3{ge2g!idE!FEJEiwaH+- z&Igm}Mx%!}MrU9HBVJ?iH?;OcTWCu8UJrp&0RMt;?f{rv zkan5-%OeBgYqUZ+J78!O=z|ry^pI{V(3Gv9p)e@wq!ZiJSjY6~lpNcR7f*@jy(6^? zpmYtW_)U;%$o_2g6cygEFl8zKHHMTF_s0ZP9s6ggT+VHYR!0ZO;IZZ*|cNhi` zbb5$$T)tTLqZ@>8ZluBAHW2epv)w*=fE`Xu*T&1iH?OYu84}MpR(X1HmK^dIZMzE& zR&}`)8;Q1gRp|Ufl`2uj0b{I+Lr;f3K?39Lageg9lPkOK9nc%I@L@OS{&<%Bbxo;E zlwMA~7@EHJXI|BKz9)sJU|>|9Z}4@Zv3T5Rcq`kNH)I^2p{8{O6T1Y0r2$yWN2tdc zqVtIKv6+J;OV6B_s(T~_FE3IVo)ofwsR}egE8$5iG}v}*!WnXFR>u#bB|jrSrVKj} z>oYFXSfYPiaOkxi;uBT$7G;zl-(P%KuCiYog<)v=oCt?m0~317Zc8VBZAC6r4|ME0 z?Zs&rwCEVc#Jn@bmqq*|6LM|8;IO%(S4RbcL}jeL8PHKTaVMY@e!Hk!?1DEP5bYMG-* zL4GbR#vD3&w(kO^3ZM((J&9&ht|(x&@@fgjbUpvu3tVy61gOW%wYCCrRf_v`njLJv z*r(mk#K2n{VP4%5YwYxpEPa3edbia!;^2?76;u6-e{u!QT5?K3Ht`XbOz$5WZB7Sv zr`;?0@!pCL!!cCC5?|DI@cI@CzCBFABV;L-j2|^ba~Uj3ZF88qme_GI89$18i6|2z zW*;sBjpD|(CjfUI)ZS8X zpq&TZEb=D-v0L(2!|g{OfwM#lR%o4PtrK5%tJk#2z!F|7l1slUWGBx`%wdY1xKLE` zhR||tk|d4kEk^Fkzw)Szqj^Rx13bg<-VE}Vd-6vf^oZkbcT)g1#UNk;r*LkE$SrNt%W&2^0`SFX7Dud!?R^tk*_?=A%7-)og0m9T%i*kw+?utAh^=1 z!l%@nSv7iUk{NMBaU$bn+a)Sm-1c!>rbYy2NLH3&4P##aGeI`ZOSy1Hgulp(6Lw^H z6|*TPF{ReePFEsuhIUC!o5ErD`zOV|U6fGNC4YB@bvLH2%$=5tH8HfgA|_S-6izwP z6l>lFYa?fd$THV7!gaju5MWp7v#rv|()g#~fiB(O!x~bq*ZO#QiIIjx4EK`y1F5Cm zw8W2&#^%Xz8v(-hLK3*Yc5qu*6{W74S(zt;;e?hWb4;0Xz`6YRErOMn0azhc+a6Nd z%*yVy{aRU}o1dRQ2GuJP;YD|742@{$5unlYiwH?#L>L@C@y{#VN@;O4d8Xf08bboQ zyLk&~NA_Xz#EQL{&Oh80O}MN+aIgWv!8Txjv~4N0vDam4b^fEpY~^l?^-LvzA5~Uh zYR$xS>swy9b~v4$ybn9u;&x)nbbaM2D1BNpQFIdYY?jqX@bs>yRGD&FzgX*l99-iyCC=9;I|B7Ithnpf#+E{S+? z#p|0C_#fZSATlp}O-PeIsPa1}#;_<%ELcW1V}zMJt8eb34WOQV>q#S^WCmWdwFKM} zS8tTP*(Dx8yLDOAs?6tkI9+F$%jJ{oEpQso{#G=a!>~w1UI$uluGW>LcKJW6p>{53 z_jkxau!RwP`m82xGU^-6kA^X#Y9i(YAn z2Q36WZtr~hdeKl*erH6LjJoBTv`XHza3&@7Z-=OAs-l0|eeBx~;7rGMQNE#mFNzgk z;gCnEndQLK&PN@^rc`RD>L^yi`CzcWE#Pu0!C)0?S*JPb0Elw4mh%cHX>p^b@OWd( zRhn&IbgfYb3;l7f%rs78rH|xl9`%&61?qbU#@rXAW^X5hIoON(f&(VkZ$i;o)cede z9#fEDlA?b7BP@uIG0|whZ%p89G&Ds>E1M~;>mp95%?g@R{28p%q7%D_9cEmA?K zw>RacRMKT1bx z_b=MmUs`(?U&uf`g?`_|LAf`SFiz3~3+U3}E0l`20FoOEsLePn(Rueu9sb|$Sl8gt z8;QYge{UnSy9_ds2U8Lo9gQ|`oCS5~1k7Gwla^~*pO|!aN`>9}n7o+2o+&ax0vp>$b+HXj^ z87vHSjZPS~X;MC=YVan_ZFLU|ij}U--DSO(TD^W4_);=P8BtE6AZww<`p~P58F` zc-6&LK53i!HBmvq=k@!VN2OHkij`EE8(v(TUeDXO?0>pFu%%o2sd|xivX0rsai+z8 zu9fjfkKpU7dYo~XcVa;4MA?;IJcAgG+NX7UzV=UvbcyP+%U1HEhwN8?oMHcV??(vL(9E~1~cZqS##@kw*1&D~;oF}dsC{YpWbSwi}no9Ps(|NPUs|~Hh$FwDf3XhM8 zOe{<~GqngUyCP(Kg-uHjIJ6&&0s3KAmjwsSORD0CsF*mHkI{lr-rN$5@boHxebkgr zyvB9TtAun^VFMn=3l>E6E{3c+UTnH)Wu0?7YCA3Myd2B3r9@IOaT<-LnbOghdlH3B zkflKp2J-~4m@f%ciCNDz$@;;PGmw3Jf*@%Zn6w1WmIWTEJ(f1`s7Xx`@Ud996S{E5XQW`D zyTTEpSoH$C_O&lY@W=W6eCnByRUZv3J25qD3$4IeiQ8G+><`zZBr4+tXmdXf#Gkn( zabD9@t0n1{6sqG-iOdVmK^ZmC!b5z?#PJz-j8=dKK7{m4ldqGl2L8KVvsfbii#^s0 ze<2(N#fs+a`IcFUQV#Md?5)cLVmN^J0Z8Qz#n}3Er`(1|LdBaBh#WdPb{)nUsVnK+ ziHrNUaMhTp4B&^}93KGGNHJb~c%&w-TT78C`~2I5_v2WIC~uep&Bw29QG+<7j}6gs zw=!0GMpLMB*Yo`;_nbFBspv4!3!1?An`G6`iJYdGmQFTzOG?6RU$vcGWe5GEZegn; z!~aYS8n+Hs8atkO?D*!%RvkR6+7-sBV-MZw=HY_m*eEp+99udl1`ELk;FR_6F+-`} z+Nhw(S>x)5Jhk(noB+;5B6Z#*rI;GVYvKc9@m#1$7w!fp#6QD_kI~Z{pfAebbw}D* ziQ9I`+bS=i3X-4bDgAO_0{GRlYYFNEa;n0cb}|MDYX?S3n+=ZioqP7;Zi8TQQmqlj zji@?3{LeK_LqoWib{~=y-{&%O&fWMh10goBvr64bOkH7xTpR{Xauv(Rmfb7Q4Ox*2XQj>9BlE(gtJi0XG(QA(o}BclKX#-dHw zhI=WR=+ocHL&^$<6CxwqXz{+IzR&fv{svzL^&9Fq0T9qETrRIJjd5pd*pAMm;I&s5 zU*~#hFqc6$_wvuAQ}vxvh9I5nG$-bq=rk!mC74)#8nJmD5BY2+zHj7b5#ZIrz~+{C zEb=@IOvFwvohZcLUB5rLJGa}B?*ne>YM6(*h6Fb7wgb9F9#d|v;A(0dz`zKdFe@~_ z|IAzt-}|$^bw?!jRrn2&VKMiSqRMv?0HQE99^57Pi5MSTJ1QZpVJvbFeJa|T3ml&F z^b*OfuH-m4*^pIVy7Ua$M&nHSE@S_#~4OPISI9# z&*&fpCmoqONush-Qu81I`s_y-DW}VC3w9q$aBJVOD2!6Hteab({z3h$K9E9Z@?ye! zFYQmTKaO-Vy~4Z2?Xsja*B^LYt0Q0CMs5w*u^FmyOzJ9;W`_nxJycloc>Jj%Whabd z1l1|V&Z2AzaF8xEhxtvKpo)s|6Uh-Seqw`yggE!*M$)eGAJ3*$v*KQbU(=>b{rzC) zc=2`ZjUgN2;Ee%Wc?0IkkL*d*7tpI7@$_&*OORVZXq%2Z09%bc$!l&ogXI$`rX*6B z7k0nt9=3`WSVkWz#A97Tc}E+ zkZ@-57u(_)LQc=eTWBtS-F-+UY}To}562$k!BNPSI5g36SDS@Sq$0Ayii~#&G2mAt z#x3u1+4$UtfLCut98n~9eEF!5w?~r#7;XR$dRTmV+Pl;NHEXx0?zq4ByV9N%TH4z! zl?Ta$ba)TvJ^i0)^Z+?9mxBI~BF`;uoRDQinR0A+@ebV{PoZBHo4X)Qy?o)#3DjLm zBlT0@%g`@@-CAAgYgc5Z5!&#$=M&fW)B?C1h3w^FPqKV%7|D-nSH`%5hIl;BB#Mo( z6>6f&aG{}fxNyC+-ME>wa(jJ(+PjufkJ5_T8SEaG){Y!lm2&iURh}T}^XqG0>U8aC z7=qD=*6p$X+GfH(65TiYeBTw-ZfAuCY*H6m{UFcQ9cSs0Eb&$}CIfmu z>IYl8*7fW0i?qP@MD)6&DLKJmER?HPXdeawK;PRm;4HxgM2}d$V?jGQ3-~DV&l-_k zDM}~!%0*4y1!h9u;2SRq(b;5XK267@s@>pLP!=WEijcKcnB=h%RNooZ-qHj7v8QJP zSPX48c-T_dXF;GmFH?WN(apMRuDtzYtLG1;Y*kerS>D9)_Ql|5(b>WnPs2Dh7GKS9 z9Np7~lmaPa0mk|FT@EJVRIt$XqDVV$wR6Q#Mf*c(G>4gTr2115%H1PEfyXwFy(N2u z9kR{b{9az6ceRC!mFbiA2(NyFa%44rsIX*1Y*hT>sQYqg8^J$C5;?AZ)wY(cku{dL z1-%beg_0c+T2acrZaOoz{&FOadNYJ*ZxH4;fmKbPja6~wv4l$SkOQo)svw54^|<Wn$GNU5jddWzm!bNNkBf2d)KJSBlkGV&*9gclKi$gCx*&V*B%`9aDYjUf{u! zE{%Z62~wabSB5?;=lf20g+kb?du981PVU=0#Wn3B^qQ;t?8s4rSOfoJo%ObveSAo?Jc|MWH5mJd;_tXuERNit@=iUxG$z~!Ts8Hv{|W>{{dl4pvJo_(4EkY`M7z4Y z?pM>ujq8pQhk7dX?XwIFJg9E=OUke-j1jkDOukiIz~CJusqQ(v2FB$U!kdmEMXAi$wRM8YS%_+D^UmrMsV6z=Cnja zFN0(AE;BNs5QLufA@kYR`(n``AbINeqM@CJO4zXn?B9;B)?;he*&XzE;%rL4ZQ(=V zgo@3ZLmrW!{aKrwg`;HR_mZ`RpwnhlpcRvt^pFIT)^P~>L&6J7cv+;1EKh(CQvS+_ zP%y^<5~TI@t9hhz9v&IpwmWa{;y2Ir{`ebD&c$=)rnvDx1Hk*d>U=(UCEB zHMB=ahGqhb3M!-xh&xt592z5J1sUdbx;b?6(=1l$n?o*tDq9|c7}!7DhXBr;*94!` z9;^_q27StRt-G3)Sr`;nwf?&2Wq#R4SIxl8YwpGVkl@UOLM-qE7AY{|-JNsEEr&fK zN3{AaI3$YIV(oO3JAeXN$l(2d7`pWiBk6)WySpWghtWXZu30S?Z!`C3G*KsHAvZX> zR|%*7MXtzsu3kdA8S@%n_3oa2@(|twOqZ{Td*931r#^8<=?!I~jsC2o>~`=r!aEY>4AgpGNfa5iZ7X&lHRW_P+fW55}9a&JZ>u zMfvJ+^jsy@`0?pYhS7>#-+yJvH{H-Q+$4+_4Wp z+N5{2Q&fwP7|ey5shbfk;kxvDc?Q{aZ`objWvRDe{+uand%K!5BQffD8ye!U04J34 zzo`A#-?>zsUMaHh|2l6zE)Lg)xu~)kk=j*-+7~_-EB7}?eL!*G_O-6A`qHUslg#(L z%m@P_c5_hs%v>fH7qTCEk5qWXX|zLVPl9xt4IR&f9zL^Q=uQPPH!GQcfZX~mgZG4R@%Q8?Aas4bc^?-e{Y73Uii!<;(rPYAhxn`Db>LP!eo(tG=#O zjHQn8og$uK%6`p>K^G1l8ImLc+dR9AAxJB_0?0fVqg0@;!>!R~_1c-9m(s@+d zLG?&|0=_vb@%v^(PQWI6`3dO+HLf!p&Ln$h-I6u=CKSC=1Ef2 z3Egx67GL05js4d)wU46CR$2mTQaEnY&-?Az-aXQi_Y-H>dka!wJ`&QoDOy02i-Lgd z6JQba=Uc+RAt=Jh^wEFGe}hF8FyosCU4gjS&I5YOAdygE6O8V6O3G*y14$r0=0+e~ zek<*Zd*)q*=IU!KTReONR!R`(miht?Niz$(A%Fnu*}``_IslAqo-{;Vbr*T)>mSA` zCm6D$)h%@blAD6(UJawVJ)lRgr*eSt-BN}TjY~BDVu%3SGXq%Z%%e=!^0addY$!6! zQS#I+&;h#j%fpv$^rjb=vfsKMKI;A;FbFJiX9aAY+Yazm{>|(X;UdgD3$xgu?#L*` zKFQp%VCDoTJW5vGKP>?Wg<4;e8{DG1aMoXB5P^7ENfA@MG&J{7U1e+(msYyoK%Akk z4oF2qveGzzw$+P{3@BxD`dTp=3$B9o1MsC-5}}$u99PP?et`|KEy1;=lkV<9vhBK_+sy(Zy}2lno9Wdt_!h>9(QQ5YW+Jg~X6CYy^VS zWkDX+T!9%II{^cr=0bZtXovTife1!J8pWq9=JJa~WZ1FsJsrC2hcwP-xlQQs>1K8cp{t8+mNzsq@4+UT?YFcZ zOWhvFF}Rve`zQbNi*uWRBM5T$d?~THY!D#Y$jor2sj#1cS{r1pQo$iMJYVDTl*I6R zs_eI3Zx2wBA$V2LCP;{4z#ZHokO~xdlL-o0>Bar?(P`|?-RjC z39wZrMXCuUJjrWGY)Qk0I1sV1woVLwjP>7-)2doR)x5jA!sE-G+JjAkAhNx1=rz^S;yxO8{n~j+l5z!1T^)WrT0u!JYPL?K|B{3p3ls6QP zSG8dMGCoeC3kMe&>|A}P*rkN{cm<S#U zQfoPpFM~`$HU%C>n1jA-Y9{7dY85tdDeBZa1f~OO)OMDhZWAIUr0pwH_{``328sWK zGm7ho;B3yfZwr@8|0_C<1=*#LzznB03ZPwh=6~ze>wt$(2_`8nk_QPkbb;FDE{yu< z5MXnxZsEcJfZqIXG!dNT(a2lM%WYZkf0C*9Qtkg=$oL~f z?+~%j&xJWnW<+Zxk3O%n@GvpacXou$1kpy>$y!rz&b6Q|G%r*)=i6xY2||baTt@nM zQ9y_)$Wo<>rk-u7ism$Ic_ixjy9acBu^?W@omj}&VvwM#`Kx}sDt!C3iZ$+oNQop1 z>(Z!!ydc3WrJu|E5jUSiLl!E3Vap-nRFiP6z^gU5DSs7p<6^-{1_1p3{{8E`9xco# z={)x0awXg6cW0qe#<6F>r6+PVE?PKQ9|BhiEan5V6@$XKIfVuW8aby^Z-*w4o#-S| zbv){y{y&3a(iuAQ;_?^t@BP+D#>t;4mDv^tdZHf^oWk)ug@b^W@w4VL#>*G(n1H|M zb%TQsCgov`tq`1jgCIhcFvefR%yLR5YFdEVOGPGV25O^_KyF{~*GQ(V(85I|?VJ^a@2N+Ywltg$qV_%|3yOAP3;Xw^7zTxpQZ(}O~#xJk`I zi_ZpbWK3Uh4qt%-8TCAvmavxs!KIv3g$_?hHC%el$gkdNdUyb@_Zs`@4+oJDKs0p zIYf}VVo;&1<74cgLe?->4{TcGLSzgZWl}X?vU6Ky~pzlRiLsfDr+DU*<43BJWxCP$tp9C@B)8Oqo1 zM$HQb)pZ~D4_*k6=$gXbBSWsmfeHnm5s+?UO4@E?stjVmeV*PYj}$}Rf=VLfad%?~ zfW4W_yI_!*U$UIr=M!h4Wa3_7gO*S{9^fU z?j$nlvZWJQBY#}^etE<>X*PRhv8LuNC1a|dvD=~7j|7eWU}@9ODije^pcK~~?_a&M49 z?!Gd^TKE7=^<>u;z;n8p(bdBsa(%rr;M&PByMBt}0U&sl1F=_ShpUA3g?DNJ`|k5O z4QWG58x+a2&{k$b`?Yr0R&WB44XAT>zGsMg($PzO7I+Ul8`A5?^K)hA+xhh%*{bsdPU>ql25hA{*3Oo$MhZh zPbdI$3?t(i5e%5r^MKbEPyiU`)p@@%n<6u7dYz1_Pys9ih@@Us{sGu4uVZ6w|6^0y zW?(g;8p~(OH37sMfj&W!2he0CI=PwhXe01^T4rE8k#KCkdxvy5f}HR!&-R7j{OwqcgP5Bu2~sGmID}k4Q;q3|vKUc)2ShVShusrhgO*aXkAGQCO0fJtWS@w+ zPkpa&(!*1V2f&VwS0Be#kQT>p+&U<7h#WRz65S6b;6VZFDZF$HdWru{As4$n?*5-w z`Txnh2hrRn-z$Zm!8!u`-s4tA{lf(yt(+&M-9S=)zh}kWS%cH|=RQlePZLRGTEBd% zPauaXe%?`g_0wYC8SwZBwMl0f_Z%{kjRC#3tg5VetIS^R8Cb%1c3Dbd$NfJq{|DNL z|6`r0Wso2PU>`qEYR|TPV)xJM2Y0~jh9iaTb3{eknu!zf;%GS>h-nT4E!Nk_mhE84 zbaKQ%u#_+2_r32aSoB1jf+O3`)mjl;9L#ka5&(UA%tbNqk#+@m<$s@xvh(t4EWBfq!cOyVXtJ=j#-f>BDxG= zr|(lLFBhx!7r_bx|C<)q|Nme4Z}tXrJ1t%p7IO9rz6Lv0@J!Ja;^Gl7g=Ag)ioSP*@z*z9 z`NM8nw$^T7hd)_s@9s*s&T<9*-gt~+#{rK&u=*=L=%#}cnl1?G)|lgnygSgDzJd9~ z%snC>s~r)M}U?3 z&n#P^=dw(Q^6oC;ukTh=?W7SIp%XfE26;zaPkPA{PEJlDw#D4G9@yC0+V-dBeG#Qq z)Jane6%Z7R*EaMnDCHeP$D4ys7awVJnME}J_VqFZU$WBWH8ymHQ{6#&S^j3^4Q$1B ztO+D?{R#jend`BDnEHC5<$8msAH&0OF8(4*Y0~6x1@_HK-52Lda}0*OX}wlZ?3deU z^y}?QZ2#xV>&E+!wClj-mXT3j-*5W3PkJ|c z$&Jhx#P3gH6KHQ&u%>=%+bq~e?^7*bVWLRPROrh9rH?Z5-_oB#;c7oapF_bKv%ZI} zofzbC4h!}1mo3{bHhRLLwa*Lx`@Es2P&Ta2>h`T-WcBuU}^62NBmlm9`#^=(p z#2&E_cc3*3 z{D3*k?#Ds?M}Iz_KMvgZRCt)z96T)ECu7+J%-RoZ-&X?nfJ{8U``%YQ&>eLR;aIHL}g|5JPca8pYnu$(>d z{PT`Cn@)d--v2dv$Cpdqj22E$4m2`X{QY{p@TBVW2dA{xA8BM}KXp!5pylJt^EGVt zz$t{nS64J;ED9K`%ibj12CW~wowu7;Sy>tAh@*SI-|Jo*y*&xIPp0Bgr+UG?%IAr| z@)@|^J~j5b7;r!?KpiwgqP>1kll_lo`vc7UHVnR(Pkpm2dcwgcYt_PE`@$Ji4zAnr zh%3cNQcZ&4f$;nvEDQ;Eca`pVHY*!6g#x@O`k=IY?DfJ&M>y|SFAd@ZUfY$j-u^=) z|AUk2^N+l`y83kA{=eUDZv>_n8QUt6@_Uu)z|GIB3_p&U?`!0*`_NqRbZYp8t5;i> z&#PLs?jt9olE9UdyGmad{P>W#=kMG6X z7`z%D-)sGTPw}l}?NY@*z`GiI_Evv?bSr!PQJ}91fpLA^)b1fO&<#(PPLDfO|2zLb zZ;QZ;Wu2e_?;Vf2v^SK#4g&?p>uYNd^Vk1y2JPNCCjbAV{A2ll59Jdg#dhu5^#QoD zcJ|!kn{;AIF1nt0TJ+<1{U7%=k(=4Rc^wX6oF-yIjw@wAbxm`v1lMe@piI zy<+qKJW>Dny#C+w^xAXZzLkM;P}w z>pltd0Gm9(U1Dd?o&{Fo77XfK1;9}r30c|HeLJ}Ib|f4-rVcA;W&r!8jYzEoP;>*w yEMtL%2B?LswK;Y@>=d#Wzp$PydG+q_} literal 0 HcmV?d00001 diff --git a/tests/algorithms/test_amp.py b/tests/algorithms/test_amp.py new file mode 100644 index 00000000..a20e94c6 --- /dev/null +++ b/tests/algorithms/test_amp.py @@ -0,0 +1,398 @@ +# Copyright 2024 Sony Group Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from unittest.mock import MagicMock + +import numpy as np +import pytest + +import nnabla as nn +import nnabla_rl.algorithms as A +import nnabla_rl.environments as E +from nnabla_rl.algorithms.amp import (_compute_v_target_and_advantage_with_clipping_and_overwriting, _concatenate_state, + _copy_np_array_to_mp_array, _EquallySampleBufferIterator, + _sample_experiences_from_buffers) +from nnabla_rl.environments.amp_env import TaskResult +from nnabla_rl.environments.wrappers.common import FlattenNestedTupleStateWrapper +from nnabla_rl.environments.wrappers.goal_conditioned import GoalConditionedTupleObservationEnv +from nnabla_rl.models import VFunction +from nnabla_rl.replay_buffer import ReplayBuffer +from nnabla_rl.utils.multiprocess import mp_array_from_np_array, mp_to_np_array + + +class DummyVFunction(VFunction): + def __init__(self): + super(DummyVFunction, self).__init__("test_v_function") + + def v(self, s): + with nn.parameter_scope(self.scope_name): + if isinstance(s, tuple): + h = s[0] * 2. + s[1] * 2. + else: + h = s * 2. + return h + + +class TestAMP(object): + def setup_method(self, method): + nn.clear_parameters() + + def test_algorithm_name(self): + dummy_env = E.DummyAMPEnv() + amp = A.AMP(dummy_env) + + assert amp.__name__ == 'AMP' + + def test_run_online_amp_env_training(self): + """Check that no error occurs when calling online training (amp env)""" + + dummy_env = E.DummyAMPEnv() + actor_timesteps = 10 + actor_num = 2 + config = A.AMPConfig(batch_size=5, actor_timesteps=actor_timesteps, actor_num=actor_num) + amp = A.AMP(dummy_env, config=config) + + amp.train_online(dummy_env, total_iterations=actor_timesteps*actor_num) + + def test_run_online_amp_goal_env_training(self): + """Check that no error occurs when calling online training (emp goal + env)""" + + dummy_env = E.DummyAMPGoalEnv() + dummy_env = GoalConditionedTupleObservationEnv(dummy_env) + dummy_env = FlattenNestedTupleStateWrapper(dummy_env) + actor_timesteps = 10 + actor_num = 2 + config = A.AMPConfig(batch_size=5, actor_timesteps=actor_timesteps, + actor_num=actor_num, use_reward_from_env=True) + amp = A.AMP(dummy_env, config=config) + + amp.train_online(dummy_env, total_iterations=actor_timesteps*actor_num) + + def test_run_online_with_invalid_env_trainig(self): + """Check that error occurs when calling online training (invalid env, + not AMPEnv or AMPGoalEnv)""" + + dummy_env = E.DummyContinuous() + config = A.AMPConfig(batch_size=5) + amp = A.AMP(dummy_env, config=config) + + with pytest.raises(ValueError): + amp.train_online(dummy_env) + + def test_run_offline_training(self): + """Check that no error occurs when calling offline training.""" + + dummy_env = E.DummyAMPEnv() + amp = A.AMP(dummy_env) + + with pytest.raises(ValueError): + amp.train_offline([], total_iterations=10) + + def test_parameter_range(self): + with pytest.raises(ValueError): + A.AMPConfig(gamma=1.1) + with pytest.raises(ValueError): + A.AMPConfig(gamma=-0.1) + with pytest.raises(ValueError): + A.AMPConfig(lmb=1.1) + with pytest.raises(ValueError): + A.AMPConfig(lmb=-0.1) + + with pytest.raises(ValueError): + A.AMPConfig(policy_learning_rate=-1.1) + with pytest.raises(ValueError): + A.AMPConfig(policy_momentum=-1.1) + with pytest.raises(ValueError): + A.AMPConfig(policy_weight_decay=-1.1) + with pytest.raises(ValueError): + A.AMPConfig(action_bound_loss_coefficient=-1.1) + with pytest.raises(ValueError): + A.AMPConfig(epsilon=-1.1) + + with pytest.raises(ValueError): + A.AMPConfig(v_function_learning_rate=-1.1) + with pytest.raises(ValueError): + A.AMPConfig(v_function_momentum=-1.1) + + with pytest.raises(ValueError): + A.AMPConfig(normalized_advantage_clip=(1.2, -1.1)) + with pytest.raises(ValueError): + A.AMPConfig(target_value_clip=(1.2, -1.1)) + + with pytest.raises(ValueError): + A.AMPConfig(epochs=-1) + with pytest.raises(ValueError): + A.AMPConfig(actor_num=-1) + with pytest.raises(ValueError): + A.AMPConfig(batch_size=-1) + with pytest.raises(ValueError): + A.AMPConfig(actor_timesteps=-1) + + with pytest.raises(ValueError): + A.AMPConfig(max_explore_steps=-1) + with pytest.raises(ValueError): + A.AMPConfig(final_explore_rate=-0.1) + with pytest.raises(ValueError): + A.AMPConfig(final_explore_rate=1.1) + with pytest.raises(ValueError): + A.AMPConfig(num_processor_samples=-1) + + with pytest.raises(ValueError): + A.AMPConfig(discriminator_learning_rate=-1.1) + with pytest.raises(ValueError): + A.AMPConfig(discriminator_momentum=-1.1) + with pytest.raises(ValueError): + A.AMPConfig(discriminator_weight_decay=-1.1) + with pytest.raises(ValueError): + A.AMPConfig(action_bound_loss_coefficient=-1.1) + with pytest.raises(ValueError): + A.AMPConfig(discriminator_extra_regularization_coefficient=-1.1) + with pytest.raises(ValueError): + A.AMPConfig(discriminator_gradient_penelty_coefficient=-1.1) + with pytest.raises(ValueError): + A.AMPConfig(discriminator_batch_size=-1) + with pytest.raises(ValueError): + A.AMPConfig(discriminator_epochs=-1) + with pytest.raises(ValueError): + A.AMPConfig(discriminator_reward_scale=-1) + with pytest.raises(ValueError): + A.AMPConfig(discriminator_agent_replay_buffer_size=-1) + with pytest.raises(ValueError): + A.AMPConfig(lerp_reward_coefficient=-1.1) + with pytest.raises(ValueError): + A.AMPConfig(lerp_reward_coefficient=1.1) + + def test_latest_iteration_state(self): + """Check that latest iteration state has the keys and values we + expected.""" + + dummy_env = E.DummyAMPEnv() + amp = A.AMP(dummy_env) + + amp._policy_trainer_state = {'pi_loss': 0.} + amp._v_function_trainer_state = {'v_loss': 1.} + amp._discriminator_trainer_state = {'reward_loss': 2.} + + latest_iteration_state = amp.latest_iteration_state + assert 'pi_loss' in latest_iteration_state['scalar'] + assert 'v_loss' in latest_iteration_state['scalar'] + assert 'reward_loss' in latest_iteration_state['scalar'] + assert latest_iteration_state['scalar']['pi_loss'] == 0. + assert latest_iteration_state['scalar']['v_loss'] == 1. + assert latest_iteration_state['scalar']['reward_loss'] == 2. + + def test_copy_np_array_to_mp_array(self): + shape = (10, 9, 8, 7) + mp_array_shape_type = (mp_array_from_np_array(np.random.uniform(size=shape)), shape, np.float64) + + test_array = np.random.uniform(size=shape) + before_copying = mp_to_np_array(mp_array_shape_type[0], shape, dtype=mp_array_shape_type[2]) + assert not np.allclose(before_copying, test_array) + + _copy_np_array_to_mp_array(test_array, mp_array_shape_type) + + after_copying = mp_to_np_array(mp_array_shape_type[0], shape, dtype=mp_array_shape_type[2]) + assert np.allclose(after_copying, test_array) + + def test_copy_tuple_np_array_to_tuple_mp_array_shape_type(self): + shape = ((10, 9, 8, 7), (6, 5, 4, 3)) + tuple_mp_array_shape_type = tuple( + [(mp_array_from_np_array(np.random.uniform(size=s)), shape, np.float64) for s in shape] + ) + tuple_test_array = tuple([np.random.uniform(size=s) for s in shape]) + + for mp_ary_shape_type, s, test_ary in zip(tuple_mp_array_shape_type, shape, tuple_test_array): + before_copying = mp_to_np_array(mp_ary_shape_type[0], s, dtype=mp_ary_shape_type[2]) + assert not np.allclose(before_copying, test_ary) + + _copy_np_array_to_mp_array(tuple_test_array, tuple_mp_array_shape_type) + + for mp_ary_shape_type, s, test_ary in zip(tuple_mp_array_shape_type, shape, tuple_test_array): + after_copying = mp_to_np_array(mp_ary_shape_type[0], s, dtype=mp_ary_shape_type[2]) + assert np.allclose(after_copying, test_ary) + + def test_copy_np_array_to_tuple_mp_array_shape_type(self): + shape = ((10, 9, 8, 7), (6, 5, 4, 3)) + tuple_mp_array_shape_type = tuple( + [(mp_array_from_np_array(np.random.uniform(size=s)), shape, np.float64) for s in shape] + ) + test_array = np.random.uniform(size=shape[0]) + + with pytest.raises(ValueError): + _copy_np_array_to_mp_array(test_array, tuple_mp_array_shape_type) + + def test_copy_tuple_np_array_to_mp_array_shape_type(self): + shape = ((10, 9, 8, 7), (6, 5, 4, 3)) + mp_array_shape_type = (mp_array_from_np_array(np.random.uniform(size=shape[0])), shape, np.float64) + tuple_test_array = tuple([np.random.uniform(size=s) for s in shape]) + + with pytest.raises(ValueError): + _copy_np_array_to_mp_array(tuple_test_array, mp_array_shape_type) + + def test_concatenate_state(self): + s = (np.random.rand(3), np.random.rand(3)) + a = (np.random.rand(4), np.random.rand(4)) + r = (np.random.rand(1), np.random.rand(1)) + non_terminal = (np.random.rand(1), np.random.rand(1)) + n_s = (np.random.rand(3), np.random.rand(3)) + log_prob = (np.random.rand(1), np.random.rand(1)) + non_greedy = (np.random.rand(1), np.random.rand(1)) + e_s = (np.random.rand(3), np.random.rand(3)) + e_a = (np.random.rand(4), np.random.rand(4)) + e_s_next = (np.random.rand(3), np.random.rand(3)) + v_target = (np.random.rand(1), np.random.rand(1)) + advantage = (np.random.rand(1), np.random.rand(1)) + dummy_experiences_per_agent = [[tuple(experience) for experience in + zip(s, a, r, non_terminal, n_s, log_prob, + non_greedy, e_s, e_a, e_s_next, v_target, advantage)]] + actual_concat_s, actual_concat_e_s = _concatenate_state(dummy_experiences_per_agent) + assert np.allclose(actual_concat_s, np.stack(s, axis=0)) + assert np.allclose(actual_concat_e_s, np.stack(e_s, axis=0)) + + def test_sample_experiences_from_buffers(self): + buffers = [ReplayBuffer() for _ in range(2)] + for buffer in buffers: + buffer.sample = MagicMock(return_value=(((1, ), (2, ), (3, )), {})) + + _sample_experiences_from_buffers(buffers=buffers, batch_size=6) + + # Check all buffer called ones with num samples 3 + for buffer in buffers: + buffer.sample.assert_called_once_with(num_samples=3) + + @pytest.mark.parametrize("gamma, lmb, value_at_task_fail, value_at_task_success," + "value_clip, expected_adv, expected_vtarg", + [[1., 0., 0., 1., None, np.array([[1.], [1.], [1.]]), np.array([[3.], [3.], [3.]])], + [1., 1., 0., 1., None, np.array([[3.], [2.], [1.]]), np.array([[5.], [4.], [3.]])], + [0.9, 0.7, 0., 1., None, np.array([[1.62152], [1.304], [0.8]]), + np.array([[3.62152], [3.304], [2.8]])], + [1., 1., 0., 1., (-1.2, 1.2), np.array([[3.], [2.], [1.]]), + np.array([[4.2], [3.2], [2.2]])] + ]) + def test_compute_v_target_and_advantage_with_clipping_and_overwriting_unknown_task_result( + self, gamma, lmb, value_at_task_fail, value_at_task_success, + value_clip, expected_adv, expected_vtarg): + dummy_v_function = DummyVFunction() + dummy_experience = self._collect_dummy_experience_unknown_task_result() + r = np.ones(3) + + actual_vtarg, actual_adv = _compute_v_target_and_advantage_with_clipping_and_overwriting( + dummy_v_function, dummy_experience, r, gamma, lmb, value_at_task_fail, value_at_task_success, value_clip) + + assert np.allclose(actual_adv, expected_adv) + assert np.allclose(actual_vtarg, expected_vtarg) + + @pytest.mark.parametrize("gamma, lmb, value_at_task_fail, value_at_task_success," + "value_clip, expected_adv, expected_vtarg", + [[1., 0., -1., 1., None, np.array([[1.], [1.], [-2.]]), np.array([[3.], [3.], [0.]])], + [1., 1., -1., 1., None, np.array([[0.], [-1.], [-2.]]), np.array([[2.], [1.], [0.]])], + [1., 1., -1., 1., (-1.2, 1.2), np.array([[0.8], [-0.2], [-1.2]]), + np.array([[2.], [1.], [0.]])] + ]) + def test_compute_v_target_and_advantage_with_clipping_and_overwriting_unknown_task_fail( + self, gamma, lmb, value_at_task_fail, value_at_task_success, + value_clip, expected_adv, expected_vtarg): + dummy_v_function = DummyVFunction() + dummy_experience = self._collect_dummy_experience_unknown_task_result( + task_result=TaskResult(TaskResult.FAIL.value)) + r = np.ones(3) + + actual_vtarg, actual_adv = _compute_v_target_and_advantage_with_clipping_and_overwriting( + dummy_v_function, dummy_experience, r, gamma, lmb, value_at_task_fail, value_at_task_success, value_clip) + + assert np.allclose(actual_adv, expected_adv, atol=1e-6) + assert np.allclose(actual_vtarg, expected_vtarg, atol=1e-6) + + @pytest.mark.parametrize("gamma, lmb, value_at_task_fail, value_at_task_success," + "value_clip, expected_adv, expected_vtarg", + [[1., 0., -1., 5., None, np.array([[1.], [1.], [4.]]), np.array([[3.], [3.], [6.]])], + [1., 1., -1., 5., None, np.array([[6.], [5.], [4.]]), np.array([[8.], [7.], [6.]])], + [1., 1., -1., 5., (-1.2, 1.2), np.array([[6.8], [5.8], [4.8]]), + np.array([[8.], [7.], [6.]])] + ]) + def test_compute_v_target_and_advantage_with_clipping_and_overwriting_unknown_task_success( + self, gamma, lmb, value_at_task_fail, value_at_task_success, + value_clip, expected_adv, expected_vtarg): + dummy_v_function = DummyVFunction() + dummy_experience = self._collect_dummy_experience_unknown_task_result( + task_result=TaskResult(TaskResult.SUCCESS.value)) + r = np.ones(3) + + actual_vtarg, actual_adv = _compute_v_target_and_advantage_with_clipping_and_overwriting( + dummy_v_function, dummy_experience, r, gamma, lmb, value_at_task_fail, value_at_task_success, value_clip) + + assert np.allclose(actual_adv, expected_adv, atol=1e-6) + assert np.allclose(actual_vtarg, expected_vtarg, atol=1e-6) + + def _collect_dummy_experience_unknown_task_result(self, + num_episodes=1, episode_length=3, + task_result=TaskResult(TaskResult.UNKNOWN.value)): + experience = [] + for _ in range(num_episodes): + for i in range(episode_length): + s_current = np.ones(1, ) + a = np.ones(1, ) + s_next = np.ones(1, ) + r = np.ones(1, ) + non_terminal = np.ones(1, ) + info = {"task_result": TaskResult(0)} + + if i == episode_length-1: + non_terminal = np.zeros(1, ) + info = {"task_result": task_result} + + experience.append((s_current, a, r, non_terminal, s_next, info)) + return experience + + +class TestEquallySampleBufferIterator(): + def test_equally_sample_buffer_iterator_iterates_correct_number_of_times(self): + buffer_size = 5 + buffers = [ReplayBuffer(buffer_size) for _ in range(2)] + + for i, buffer in enumerate(buffers): + buffer.append_all(np.arange(buffer_size) * (i+1)) + + batch_size = 6 + total_num_iterations = 10 + buffer_iterator = _EquallySampleBufferIterator(total_num_iterations, buffers, batch_size=batch_size) + + for _ in range(total_num_iterations): + batch = buffer_iterator.next() + assert len(batch) == batch_size + + with pytest.raises(StopIteration): + buffer_iterator.next() + + def test_equally_sample_buffer_iterator_iterates_correct_data(self): + buffer_size = 4 + buffers = [ReplayBuffer(buffer_size) for _ in range(2)] + + for i, buffer in enumerate(buffers): + dummy_experience = [((j+1)*(i+1), ) for j in range(buffer_size)] + buffer.append_all(dummy_experience) + + batch_size = 4 + total_num_iterations = 3 + buffer_iterator = _EquallySampleBufferIterator(total_num_iterations, buffers, batch_size=batch_size) + + expected = [[(1,), (2,), (2,), (4,)], [(3,), (4,), (6,), (8,)], [(1,), (2,), (2,), (4,)]] + for actual_batch, expected_batch in zip(buffer_iterator, expected): + assert len(actual_batch) == batch_size + assert tuple(actual_batch) == tuple(expected_batch) + + +if __name__ == "__main__": + pytest.main() diff --git a/tests/environment_explorers/test_epsilon_greedy.py b/tests/environment_explorers/test_epsilon_greedy.py index 40ef9112..14baea59 100644 --- a/tests/environment_explorers/test_epsilon_greedy.py +++ b/tests/environment_explorers/test_epsilon_greedy.py @@ -1,5 +1,5 @@ # Copyright 2020,2021 Sony Corporation. -# Copyright 2021 Sony Group Corporation. +# Copyright 2021,2022,2023,2024 Sony Group Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -94,6 +94,35 @@ def expected_epsilon(step): assert np.isclose(explorer._compute_epsilon(100), expected_epsilon(100)) assert explorer._compute_epsilon(200) == final_epsilon + def test_return_explorer_info(self, ): + initial_epsilon = 1.0 + final_epsilon = 0.0 + max_explore_steps = 100 + greedy_selector_mock = mock.MagicMock(return_value=(1, {})) + random_selector_mock = mock.MagicMock(return_value=(2, {})) + config = LinearDecayEpsilonGreedyExplorerConfig(initial_epsilon=initial_epsilon, + final_epsilon=final_epsilon, + max_explore_steps=max_explore_steps, + append_explorer_info=True) + explorer = LinearDecayEpsilonGreedyExplorer(greedy_selector_mock, + random_selector_mock, + env_info=None, + config=config) + + action, action_info = explorer.action(50, np.random.rand(5)) + + assert "greedy_action" in action_info + assert "explore_rate" in action_info + + if action == 1: + assert action_info["greedy_action"] + elif action == 2: + assert not action_info["greedy_action"] + else: + raise RuntimeError("Should not reach here") + + assert action_info["explore_rate"] == 0.5 + if __name__ == '__main__': pytest.main() diff --git a/tests/environments/test_amp_env.py b/tests/environments/test_amp_env.py new file mode 100644 index 00000000..e32dbdf0 --- /dev/null +++ b/tests/environments/test_amp_env.py @@ -0,0 +1,146 @@ +# Copyright 2024 Sony Group Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import numpy as np +import pytest + +from nnabla_rl.environments.amp_env import AMPEnv, AMPGoalEnv, TaskResult + + +class DummyAMPEnv(AMPEnv): + def __init__(self, dummy_transition, dummy_task_result, dummy_is_valid_episode, dummy_expert_experience) -> None: + super().__init__() + self._dummy_transition = dummy_transition + self._dummy_task_result = dummy_task_result + self._dummy_is_valid_episode = dummy_is_valid_episode + self._dummy_expert_experience = dummy_expert_experience + + def _step(self, action): + return self._dummy_transition + + def task_result(self, state, reward, done, info): + return self._dummy_task_result + + def is_valid_episode(self, state, reward, done, info): + return self._dummy_is_valid_episode + + def expert_experience(self, state, reward, done, info): + return self._dummy_expert_experience + + +class TestAMPEnv(): + def test_step(self): + state = np.array([1.1]) + reward = 5.0 + done = True + info = {} + dummy_transition = (state, reward, done, info) + dummy_task_result = TaskResult(1) + dummy_is_valid_episode = False + + expert_state = np.array([1.2]) + expert_action = np.array([1.5]) + expert_next_state = np.array([1.7]) + expert_reward = 0.5 + expert_non_terminal = 1.0 + expert_info = {} + dummy_expert_experience = (expert_state, expert_action, expert_reward, + expert_non_terminal, expert_next_state, expert_info) + + env = DummyAMPEnv(dummy_transition, dummy_task_result, dummy_is_valid_episode, dummy_expert_experience) + env.reset() + actual_state, actual_reward, actual_done, actual_info = env.step(np.random.rand(5)) + + # Check not overwrite original step + assert np.allclose(actual_state, state) + assert actual_reward == actual_reward + assert actual_done == done + + # Check correct info is included + assert "task_result" in actual_info and actual_info["task_result"] == dummy_task_result + + assert "valid_episode" in actual_info and actual_info["valid_episode"] == dummy_is_valid_episode + + assert "expert_experience" in actual_info + assert np.allclose(actual_info["expert_experience"][0], expert_state) + assert np.allclose(actual_info["expert_experience"][1], expert_action) + assert actual_info["expert_experience"][2] == expert_reward + assert np.allclose(actual_info["expert_experience"][3], expert_non_terminal) + assert np.allclose(actual_info["expert_experience"][4], expert_next_state) + + +class DummyAMPGoalEnv(AMPGoalEnv): + def __init__(self, dummy_transition, dummy_task_result, dummy_is_valid_episode, dummy_expert_experience) -> None: + super().__init__() + self._dummy_transition = dummy_transition + self._dummy_task_result = dummy_task_result + self._dummy_is_valid_episode = dummy_is_valid_episode + self._dummy_expert_experience = dummy_expert_experience + + def _step(self, action): + return self._dummy_transition + + def task_result(self, state, reward, done, info): + return self._dummy_task_result + + def is_valid_episode(self, state, reward, done, info): + return self._dummy_is_valid_episode + + def expert_experience(self, state, reward, done, info): + return self._dummy_expert_experience + + +class TestAMPGoalEnv(): + def test_step(self): + state = np.array([1.1]) + reward = 5.0 + done = True + info = {} + dummy_transition = (state, reward, done, info) + dummy_task_result = TaskResult(1) + dummy_is_valid_episode = False + + expert_state = np.array([1.2]) + expert_action = np.array([1.5]) + expert_next_state = np.array([1.7]) + expert_reward = 0.5 + expert_non_terminal = 1.0 + expert_info = {} + dummy_expert_experience = (expert_state, expert_action, expert_reward, + expert_non_terminal, expert_next_state, expert_info) + + env = DummyAMPEnv(dummy_transition, dummy_task_result, dummy_is_valid_episode, dummy_expert_experience) + env.reset() + actual_state, actual_reward, actual_done, actual_info = env.step(np.random.rand(5)) + + # Check not overwrite original step + assert np.allclose(actual_state, state) + assert actual_reward == actual_reward + assert actual_done == done + + # Check correct info is included + assert "task_result" in actual_info and actual_info["task_result"] == dummy_task_result + + assert "valid_episode" in actual_info and actual_info["valid_episode"] == dummy_is_valid_episode + + assert "expert_experience" in actual_info + assert np.allclose(actual_info["expert_experience"][0], expert_state) + assert np.allclose(actual_info["expert_experience"][1], expert_action) + assert actual_info["expert_experience"][2] == expert_reward + assert np.allclose(actual_info["expert_experience"][3], expert_non_terminal) + assert np.allclose(actual_info["expert_experience"][4], expert_next_state) + + +if __name__ == "__main__": + pytest.main() diff --git a/tests/environments/wrappers/test_common.py b/tests/environments/wrappers/test_common.py index 63757746..5cd0fc23 100644 --- a/tests/environments/wrappers/test_common.py +++ b/tests/environments/wrappers/test_common.py @@ -1,5 +1,5 @@ # Copyright 2020,2021 Sony Corporation. -# Copyright 2021,2022,2023 Sony Group Corporation. +# Copyright 2021,2022,2023,2024 Sony Group Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -13,11 +13,29 @@ # See the License for the specific language governing permissions and # limitations under the License. +import gym import numpy as np import pytest import nnabla_rl.environments as E -from nnabla_rl.environments.wrappers.common import NumpyFloat32Env, TimestepAsStateEnv +from nnabla_rl.environments.wrappers.common import FlattenNestedTupleStateWrapper, NumpyFloat32Env, TimestepAsStateEnv + + +class DummyNestedTupleStateEnv(gym.Env): + def __init__(self, observation_space) -> None: + super().__init__() + self.action_space = gym.spaces.Box(low=0.0, high=1.0, shape=(4, )) + self.observation_space = observation_space + + def reset(self): + return self.observation_space.sample() + + def step(self, a): + next_state = self.observation_space.sample() + reward = np.random.randn() + done = False + info = {} + return next_state, reward, done, info class TestCommon(object): @@ -113,6 +131,34 @@ def test_timestep_as_state_env_discrete(self): assert len(next_state) == 2 assert next_state[1] == 2 + def test_flatten_nested_tuple_state(self): + box_space_list = [gym.spaces.Box(low=0.0, high=1.0, shape=(i, )) for i in range(5)] + + observation_space = gym.spaces.Tuple( + [gym.spaces.Tuple(box_space_list[0:3]), + gym.spaces.Tuple(box_space_list[3:])]) + + env = DummyNestedTupleStateEnv(observation_space) + env = FlattenNestedTupleStateWrapper(env) + + # Check observation space is flattened + assert isinstance(env.observation_space, gym.spaces.Tuple) + for i, actual_space in enumerate(env.observation_space): + assert isinstance(actual_space, gym.spaces.Box) + assert actual_space.shape == box_space_list[i].shape + + # Check state shape + state = env.reset() + self._nested_shape_check(state, box_space_list) + + next_state, _, _, _ = env.step(np.array([1.0])) + self._nested_shape_check(state, box_space_list) + + def _nested_shape_check(self, state, box_space_list): + assert isinstance(state, tuple) + for s, space in zip(state, box_space_list): + assert s.shape == space.shape + if __name__ == "__main__": pytest.main() diff --git a/tests/preprocessors/test_running_mean_normalizer.py b/tests/preprocessors/test_running_mean_normalizer.py index 8aa226cd..53b322f8 100644 --- a/tests/preprocessors/test_running_mean_normalizer.py +++ b/tests/preprocessors/test_running_mean_normalizer.py @@ -1,5 +1,5 @@ # Copyright 2020,2021 Sony Corporation. -# Copyright 2021 Sony Group Corporation. +# Copyright 2021,2022,2023,2024 Sony Group Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ import pytest import nnabla as nn +import nnabla.initializer as NI from nnabla_rl.preprocessors.running_mean_normalizer import RunningMeanNormalizer @@ -69,3 +70,53 @@ def test_filter(self, mean, var, s_batch): def test_invalid_value_clip(self): with pytest.raises(ValueError): RunningMeanNormalizer("test", (1, 1), value_clip=[5., -5.]) + + def test_numpy_initializer(self): + shape = (6, ) + mean_initializer = np.random.rand(6) + var_initializer = np.random.rand(6) + normalizer = RunningMeanNormalizer(scope_name="test", shape=shape, epsilon=0.0, + mean_initializer=mean_initializer, var_initializer=var_initializer) + + # dummy process + output = normalizer.process(nn.Variable.from_numpy_array(np.random.rand(1, 6))) + output.forward() + + actual_params = normalizer.get_parameters() + assert np.allclose(actual_params["mean"].d, mean_initializer[np.newaxis, :]) + assert np.allclose(actual_params["var"].d, var_initializer[np.newaxis, :]) + # count should be default initial value + assert np.allclose(actual_params["count"].d, np.ones((1, 1)) * 1e-4) + + def test_nnabla_initializer(self): + shape = (6, ) + mean_initializer = NI.ConstantInitializer(5.0) + var_initializer = NI.ConstantInitializer(6.0) + normalizer = RunningMeanNormalizer(scope_name="test", shape=shape, epsilon=0.0, + mean_initializer=mean_initializer, var_initializer=var_initializer) + + # dummy process + output = normalizer.process(nn.Variable.from_numpy_array(np.random.rand(1, 6))) + output.forward() + + actual_params = normalizer.get_parameters() + assert np.allclose(actual_params["mean"].d, np.ones((1, 6)) * 5.0) + assert np.allclose(actual_params["var"].d, np.ones((1, 6)) * 6.0) + # count should be default initial value + assert np.allclose(actual_params["count"].d, np.ones((1, 1)) * 1e-4) + + def test_numpy_initializer_with_invalid_mean_initializer_shape(self): + shape = (6, ) + mean_initializer = np.random.rand(4) + var_initializer = np.random.rand(6) + with pytest.raises(AssertionError): + RunningMeanNormalizer(scope_name="test", shape=shape, epsilon=0.0, + mean_initializer=mean_initializer, var_initializer=var_initializer) + + def test_numpy_initializer_with_invalid_var_initializer_shape(self): + shape = (6, ) + mean_initializer = np.random.rand(6) + var_initializer = np.random.rand(4) + with pytest.raises(AssertionError): + RunningMeanNormalizer(scope_name="test", shape=shape, epsilon=0.0, + mean_initializer=mean_initializer, var_initializer=var_initializer) diff --git a/tests/test_functions.py b/tests/test_functions.py index ea9dfce7..bb8e3786 100644 --- a/tests/test_functions.py +++ b/tests/test_functions.py @@ -1,5 +1,5 @@ # Copyright 2020,2021 Sony Corporation. -# Copyright 2021,2022,2023 Sony Group Corporation. +# Copyright 2021,2022,2023,2024 Sony Group Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -513,6 +513,63 @@ def test_swapaxes(self, axis1, axis2): assert np.allclose(original.d, reswapped.d) + @pytest.mark.parametrize("x, mean, std, value_clip, expected", + [ + (np.array([2.0]), np.array([1.0]), np.array([0.2]), None, np.array([5.0])), + (np.array([2.0]), np.array([1.0]), np.array([0.2]), (-1.5, 1.5), np.array([1.5])), + (np.array([-2.0]), np.array([1.0]), np.array([0.2]), (-1.5, 1.5), np.array([-1.5])), + (np.array([[2.0], [1.0]]), np.array([[1.0]]), np.array([[0.2]]), None, + np.array([[5.0], [0.0]])), + ]) + def test_normalize(self, x, expected, mean, std, value_clip): + x_var = nn.Variable.from_numpy_array(x) + mean_var = nn.Variable.from_numpy_array(mean) + std_var = nn.Variable.from_numpy_array(std) + + actual_var = RF.normalize(x_var, mean_var, std_var, value_clip=value_clip) + actual_var.forward() + + assert np.allclose(actual_var.d, expected) + + @pytest.mark.parametrize("x, mean, std, value_clip, expected", + [ + (np.array([2.0]), np.array([1.0]), np.array([0.2]), None, np.array([1.4])), + (np.array([2.0]), np.array([1.0]), np.array([0.2]), (-1.0, 1.0), np.array([1.0])), + (np.array([-2.0]), np.array([-1.0]), np.array([0.2]), (-1.0, 1.0), np.array([-1.0])), + (np.array([[2.0], [1.0]]), np.array([[1.0]]), np.array([[0.2]]), None, + np.array([[1.4], [1.2]])), + ]) + def test_unnormalize(self, x, expected, mean, std, value_clip): + x_var = nn.Variable.from_numpy_array(x) + mean_var = nn.Variable.from_numpy_array(mean) + std_var = nn.Variable.from_numpy_array(std) + + actual_var = RF.unnormalize(x_var, mean_var, std_var, value_clip=value_clip) + actual_var.forward() + + assert np.allclose(actual_var.d, expected) + + @pytest.mark.parametrize("var, epsilon, mode_for_floating_point_error, expected", + [ + (np.array([3.0]), 1.0, "add", np.array([2.0])), + (np.array([4.0]), 0.01, "max", np.array([2.0])), + (np.array([0.4]), 1.0, "max", np.array([1.0])), + (np.array([[3.0], [8.0]]), 1.0, "add", np.array([[2.0], [3.0]])), + (np.array([[4.0], [9.0]]), 0.01, "max", np.array([[2.0], [3.0]])), + (np.array([[0.4], [0.9]]), 1.0, "max", np.array([[1.0], [1.0]])), + ]) + def test_compute_std(self, var, epsilon, mode_for_floating_point_error, expected): + variance_variable = nn.Variable.from_numpy_array(var) + actual_var = RF.compute_std(variance_variable, epsilon, mode_for_floating_point_error) + actual_var.forward() + + assert np.allclose(actual_var.d, expected) + + def test_compute_std_with_invalid_args(self): + variance_variable = nn.Variable.from_numpy_array(np.ones(1)) + with pytest.raises(ValueError): + RF.compute_std(variance_variable, 0.01, "dummy_add") + if __name__ == "__main__": pytest.main() diff --git a/tests/utils/test_data.py b/tests/utils/test_data.py index 820af35a..494bb19b 100644 --- a/tests/utils/test_data.py +++ b/tests/utils/test_data.py @@ -1,5 +1,5 @@ # Copyright 2020,2021 Sony Corporation. -# Copyright 2021,2022,2023 Sony Group Corporation. +# Copyright 2021,2022,2023,2024 Sony Group Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -19,8 +19,9 @@ import nnabla as nn import nnabla_rl.environments as E -from nnabla_rl.utils.data import (RingBuffer, add_batch_dimension, list_of_dict_to_dict_of_list, - marshal_dict_experiences, marshal_experiences, set_data_to_variable) +from nnabla_rl.utils.data import (RingBuffer, add_batch_dimension, compute_std_ndarray, list_of_dict_to_dict_of_list, + marshal_dict_experiences, marshal_experiences, normalize_ndarray, + set_data_to_variable, unnormalize_ndarray) class TestData(): @@ -183,6 +184,47 @@ def test_add_batch_dimension_tuple(self): assert actual_array[0].shape == (1, *array1.shape) assert actual_array[1].shape == (1, *array2.shape) + @pytest.mark.parametrize("x, mean, std, value_clip, expected", + [ + (np.array([2.0]), np.array([1.0]), np.array([0.2]), None, np.array([5.0])), + (np.array([2.0]), np.array([1.0]), np.array([0.2]), (-1.5, 1.5), np.array([1.5])), + (np.array([-2.0]), np.array([1.0]), np.array([0.2]), (-1.5, 1.5), np.array([-1.5])), + (np.array([[2.0], [1.0]]), np.array([[1.0]]), np.array([[0.2]]), None, + np.array([[5.0], [0.0]])), + ]) + def test_normalize_ndarray(self, x, expected, mean, std, value_clip): + actual_var = normalize_ndarray(x, mean, std, value_clip=value_clip) + assert np.allclose(actual_var, expected) + + @pytest.mark.parametrize("x, mean, std, value_clip, expected", + [ + (np.array([2.0]), np.array([1.0]), np.array([0.2]), None, np.array([1.4])), + (np.array([2.0]), np.array([1.0]), np.array([0.2]), (-1.0, 1.0), np.array([1.0])), + (np.array([-2.0]), np.array([-1.0]), np.array([0.2]), (-1.0, 1.0), np.array([-1.0])), + (np.array([[2.0], [1.0]]), np.array([[1.0]]), np.array([[0.2]]), None, + np.array([[1.4], [1.2]])), + ]) + def test_unnormalize_ndarray(self, x, expected, mean, std, value_clip): + actual_var = unnormalize_ndarray(x, mean, std, value_clip=value_clip) + assert np.allclose(actual_var, expected) + + @pytest.mark.parametrize("var, epsilon, mode_for_floating_point_error, expected", + [ + (np.array([3.0]), 1.0, "add", np.array([2.0])), + (np.array([4.0]), 0.01, "max", np.array([2.0])), + (np.array([0.4]), 1.0, "max", np.array([1.0])), + (np.array([[3.0], [8.0]]), 1.0, "add", np.array([[2.0], [3.0]])), + (np.array([[4.0], [9.0]]), 0.01, "max", np.array([[2.0], [3.0]])), + (np.array([[0.4], [0.9]]), 1.0, "max", np.array([[1.0], [1.0]])), + ]) + def test_compute_std_ndarray(self, var, epsilon, mode_for_floating_point_error, expected): + actual_var = compute_std_ndarray(var, epsilon, mode_for_floating_point_error) + assert np.allclose(actual_var, expected) + + def test_compute_std_ndarray_with_invalid_args(self): + with pytest.raises(ValueError): + compute_std_ndarray(np.ones(1), 0.01, "dummy_add") + class TestRingBuffer(object): def test_append(self):