From 29e69d49ddd36830ec337d2dccf3ac6e9b10deec Mon Sep 17 00:00:00 2001 From: Yu Ishihara Date: Thu, 7 Dec 2023 10:20:36 +0900 Subject: [PATCH] Add HyAR --- .github/workflows/build.yml | 3 + bin/evaluate_algorithm | 8 + bin/test_reproductions | 9 + docs/source/nnablarl_api/algorithms.rst | 10 + nnabla_rl/algorithms/README.md | 70 +- nnabla_rl/algorithms/__init__.py | 2 + nnabla_rl/algorithms/hyar.py | 699 ++++++++++++++++++ nnabla_rl/environments/__init__.py | 9 +- nnabla_rl/environments/dummy.py | 7 + nnabla_rl/environments/wrappers/__init__.py | 4 +- nnabla_rl/environments/wrappers/hybrid_env.py | 188 +++++ nnabla_rl/model_trainers/__init__.py | 4 +- nnabla_rl/model_trainers/encoder/__init__.py | 4 +- .../encoder/hyar_vae_trainer.py | 145 ++++ nnabla_rl/model_trainers/policy/__init__.py | 1 + .../policy/hyar_policy_trainer.py | 141 ++++ nnabla_rl/model_trainers/q_value/__init__.py | 4 +- .../model_trainers/q_value/hyar_q_trainer.py | 193 +++++ nnabla_rl/models/__init__.py | 4 + nnabla_rl/models/hybrid_env/__init__.py | 13 + nnabla_rl/models/hybrid_env/encoders.py | 174 +++++ nnabla_rl/models/hybrid_env/policies.py | 48 ++ nnabla_rl/models/hybrid_env/q_functions.py | 48 ++ .../algorithms/hybrid_env/hyar/.gitignore | 6 + .../algorithms/hybrid_env/hyar/README.md | 105 +++ .../hybrid_env/hyar/goal_env_wrapper.py | 73 ++ .../hybrid_env/hyar/hyar_reproduction.py | 165 +++++ .../evaluation_result_average_scalar.tsv | 61 ++ .../Goal-v0_results/result.png | Bin 0 -> 21541 bytes .../seed-1/best_score_scalar.tsv | 2 + .../seed-1/evaluation_result_histogram.tsv | 61 ++ .../seed-1/evaluation_result_scalar.tsv | 61 ++ .../Goal-v0_results/seed-1/result.png | Bin 0 -> 22791 bytes .../seed-10/best_score_scalar.tsv | 2 + .../seed-10/evaluation_result_histogram.tsv | 61 ++ .../seed-10/evaluation_result_scalar.tsv | 61 ++ .../Goal-v0_results/seed-10/result.png | Bin 0 -> 26900 bytes .../seed-100/best_score_scalar.tsv | 2 + .../seed-100/evaluation_result_histogram.tsv | 61 ++ .../seed-100/evaluation_result_scalar.tsv | 61 ++ .../Goal-v0_results/seed-100/result.png | Bin 0 -> 25004 bytes .../evaluation_result_average_scalar.tsv | 61 ++ .../Platform-v0_results/result.png | Bin 0 -> 26753 bytes .../seed-1/best_score_scalar.tsv | 2 + .../seed-1/evaluation_result_histogram.tsv | 61 ++ .../seed-1/evaluation_result_scalar.tsv | 61 ++ .../Platform-v0_results/seed-1/result.png | Bin 0 -> 24154 bytes .../seed-10/best_score_scalar.tsv | 2 + .../seed-10/evaluation_result_histogram.tsv | 61 ++ .../seed-10/evaluation_result_scalar.tsv | 61 ++ .../Platform-v0_results/seed-10/result.png | Bin 0 -> 27483 bytes .../seed-100/best_score_scalar.tsv | 2 + .../seed-100/evaluation_result_histogram.tsv | 61 ++ .../seed-100/evaluation_result_scalar.tsv | 61 ++ .../Platform-v0_results/seed-100/result.png | Bin 0 -> 24099 bytes tests/algorithms/test_hyar.py | 145 ++++ 56 files changed, 3108 insertions(+), 40 deletions(-) create mode 100644 nnabla_rl/algorithms/hyar.py create mode 100644 nnabla_rl/environments/wrappers/hybrid_env.py create mode 100644 nnabla_rl/model_trainers/encoder/hyar_vae_trainer.py create mode 100644 nnabla_rl/model_trainers/policy/hyar_policy_trainer.py create mode 100644 nnabla_rl/model_trainers/q_value/hyar_q_trainer.py create mode 100644 nnabla_rl/models/hybrid_env/__init__.py create mode 100644 nnabla_rl/models/hybrid_env/encoders.py create mode 100644 nnabla_rl/models/hybrid_env/policies.py create mode 100644 nnabla_rl/models/hybrid_env/q_functions.py create mode 100644 reproductions/algorithms/hybrid_env/hyar/.gitignore create mode 100644 reproductions/algorithms/hybrid_env/hyar/README.md create mode 100644 reproductions/algorithms/hybrid_env/hyar/goal_env_wrapper.py create mode 100644 reproductions/algorithms/hybrid_env/hyar/hyar_reproduction.py create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/evaluation_result_average_scalar.tsv create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/result.png create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/seed-1/best_score_scalar.tsv create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/seed-1/evaluation_result_histogram.tsv create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/seed-1/evaluation_result_scalar.tsv create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/seed-1/result.png create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/seed-10/best_score_scalar.tsv create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/seed-10/evaluation_result_histogram.tsv create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/seed-10/evaluation_result_scalar.tsv create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/seed-10/result.png create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/seed-100/best_score_scalar.tsv create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/seed-100/evaluation_result_histogram.tsv create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/seed-100/evaluation_result_scalar.tsv create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/seed-100/result.png create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/evaluation_result_average_scalar.tsv create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/result.png create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-1/best_score_scalar.tsv create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-1/evaluation_result_histogram.tsv create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-1/evaluation_result_scalar.tsv create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-1/result.png create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-10/best_score_scalar.tsv create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-10/evaluation_result_histogram.tsv create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-10/evaluation_result_scalar.tsv create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-10/result.png create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-100/best_score_scalar.tsv create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-100/evaluation_result_histogram.tsv create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-100/evaluation_result_scalar.tsv create mode 100644 reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-100/result.png create mode 100644 tests/algorithms/test_hyar.py diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 76a95af9..84327bf4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -139,6 +139,9 @@ jobs: run: | pip install pybullet ./bin/test_reproductions --gpu_id -1 --base_env pybullet + - name: HyAR reproductions test + run: | + ./bin/test_reproductions --gpu_id -1 --base_env hybrid_env --env FakeHybridNNablaRL-v1 copyright: runs-on: ubuntu-latest timeout-minutes: 3 diff --git a/bin/evaluate_algorithm b/bin/evaluate_algorithm index fa8b9679..8c485938 100755 --- a/bin/evaluate_algorithm +++ b/bin/evaluate_algorithm @@ -105,6 +105,11 @@ DELAYED_MUJOCO_ENV_LIST=( "DelayedWalker2d-v1" ) +HYBRID_ENV_LIST=( + "Goal-v0" + "Platform-v0" +) + GPU_ID=0 ALGO_NAME="dqn" BASE_ENV_NAME="atari" @@ -185,6 +190,9 @@ do if [ $BASE_ENV_NAME = "delayed_mujoco" ]; then ENV_NAME=${DELAYED_MUJOCO_ENV_LIST[$INDEX]} fi + if [ $BASE_ENV_NAME = "hybrid_env" ]; then + ENV_NAME=${HYBRID_ENV_LIST[$INDEX]} + fi echo "Start running training for: " ${ENV_NAME} if [ -n "$BATCH_SIZE" ]; then ${ROOT_DIR}/bin/train_with_seeds "${REPRODUCTION_CODE_DIR}/${ALGO_NAME}_reproduction.py" $GPU_ID $ENV_NAME $SAVE_DIR $NUM_SEEDS $BATCH_SIZE & diff --git a/bin/test_reproductions b/bin/test_reproductions index 490cf3d8..26bf43c0 100755 --- a/bin/test_reproductions +++ b/bin/test_reproductions @@ -116,6 +116,15 @@ do python ${SCRIPT} --gpu ${GPU_ID} --env ${ENV} --snapshot-dir ${SNAPSHOT_DIR} --showcase \ --showcase_runs ${SHOWCASE_RUNS} --dataset-path ${DATASET_PATH} fi + elif [ ${ALGORITHM} = "hyar" ]; then + echo "Test run of training for ${ALGORITHM}" + python ${SCRIPT} --gpu ${GPU_ID} --env ${ENV} --save-dir "${RESULT_BASE_DIR}/${ALGORITHM}" --seed ${SEED} \ + --total_iterations ${TOTAL_ITERATIONS} --save_timing ${TOTAL_ITERATIONS} \ + --vae-pretrain-episodes 1 --vae-pretrain-times 1 + SNAPSHOT_DIR="${RESULT_BASE_DIR}/${ALGORITHM}/${ENV}_results/seed-${SEED}/iteration-${TOTAL_ITERATIONS}" + echo "Test run of showcase for ${ALGORITHM}" + python ${SCRIPT} --gpu ${GPU_ID} --env ${ENV} --snapshot-dir ${SNAPSHOT_DIR} --showcase \ + --showcase_runs ${SHOWCASE_RUNS} else echo "Test run of training for ${ALGORITHM}" python ${SCRIPT} --gpu ${GPU_ID} --env ${ENV} --save-dir "${RESULT_BASE_DIR}/${ALGORITHM}" --seed ${SEED} \ diff --git a/docs/source/nnablarl_api/algorithms.rst b/docs/source/nnablarl_api/algorithms.rst index 7985aedc..acb3e5d6 100644 --- a/docs/source/nnablarl_api/algorithms.rst +++ b/docs/source/nnablarl_api/algorithms.rst @@ -160,6 +160,16 @@ HER :members: :show-inheritance: +HyAR +==== +.. autoclass:: nnabla_rl.algorithms.hyar.HyARConfig + :members: + :show-inheritance: + +.. autoclass:: nnabla_rl.algorithms.hyar.HyAR + :members: + :show-inheritance: + iLQR ==== .. autoclass:: nnabla_rl.algorithms.ilqr.iLQRConfig diff --git a/nnabla_rl/algorithms/README.md b/nnabla_rl/algorithms/README.md index 9efb66b8..4a033062 100644 --- a/nnabla_rl/algorithms/README.md +++ b/nnabla_rl/algorithms/README.md @@ -7,42 +7,44 @@ nnabla-rl offers various (deep) reinforcement learning and optimal control algor - Online training: Training which is performed by interacting with the environment. You'll need to prepare an environment which is compatible with the [OpenAI gym's environment interface](https://gym.openai.com/docs/#environments). - Offline(Batch) training: Training which is performed sorely from provided data. You'll need to prepare a dataset capsuled with the [ReplayBuffer](../replay_buffer.py). - Continuous/Discrete action: If you are familiar with the training of deep neural nets, the action type's difference is similar to the difference of regression and classification. Continuous action is an action which consists of real value(s) (e.g. robot's motor torque). In contrast, discrete action is an action which can be labeled (e.g. UP, DOWN, RIGHT, LEFT). The choice of action type depends on the environment (problem) and applicable algorithm changes depending on the its action type. +- Hybrid action: Hybrid action is an environment that requires both discrete and continuous action in pairs. - RNN layer support: Supports training of network models with recurrent layers. -|Algorithm|Online training|Offline(Batch) training|Continuous action|Discrete 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:| -|[ATRPO](https://arxiv.org/pdf/2106.07329)|:heavy_check_mark:|:x:|:heavy_check_mark:|(We will support discrete action in the future)|:x:| -|[BCQ](https://arxiv.org/abs/1812.02900)|:x:|:heavy_check_mark:|:heavy_check_mark:|:x:|:x:| -|[BEAR](https://arxiv.org/abs/1906.00949)|:x:|:heavy_check_mark:|:heavy_check_mark:|:x:|:x:| -|[Categorical DDQN](https://arxiv.org/abs/1710.02298)|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:|:heavy_check_mark:| -|[Categorical DQN](https://arxiv.org/abs/1707.06887)|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:|:heavy_check_mark:| -|[DDPG](https://arxiv.org/abs/1509.02971)|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:| -|[DDQN](https://arxiv.org/abs/1509.06461)|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:|:heavy_check_mark:| -|[DecisionTransformer](https://arxiv.org/abs/2106.01345)|:x:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:| -|[DEMME-SAC](https://arxiv.org/abs/2106.10517)|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:| -|[DQN](https://www.nature.com/articles/nature14236)|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:|:heavy_check_mark:| -|[DRQN](https://arxiv.org/abs/1507.06527)|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:|:heavy_check_mark:| -|[GAIL](https://arxiv.org/abs/1606.03476)|:heavy_check_mark:|:x:|:heavy_check_mark:|(We will support discrete action in the future)|:x:| -|[HER](https://arxiv.org/abs/1707.06347)|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:| -|[IQN](https://arxiv.org/abs/1806.06923)|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:|:heavy_check_mark:*| -|[MME-SAC](https://arxiv.org/abs/2106.10517)|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:| -|[M-DQN](https://proceedings.neurips.cc/paper/2020/file/2c6a0bae0f071cbbf0bb3d5b11d90a82-Paper.pdf)|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:|:heavy_check_mark:| -|[M-IQN](https://proceedings.neurips.cc/paper/2020/file/2c6a0bae0f071cbbf0bb3d5b11d90a82-Paper.pdf)|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:|:heavy_check_mark:| -|[PPO](https://arxiv.org/abs/1707.06347)|:heavy_check_mark:|:x:|:heavy_check_mark:|:heavy_check_mark:|:x:| -|[QRSAC](https://www.nature.com/articles/s41586-021-04357-7)|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:| -|[QRDQN](https://arxiv.org/abs/1710.10044)|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:|:x:|:heavy_check_mark:| -|[QtOpt (ICRA 2018 version)](https://arxiv.org/pdf/1802.10264)|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:| -|[Rainbow](https://arxiv.org/abs/1710.02298)|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:|:heavy_check_mark:| -|[REDQ](https://arxiv.org/abs/2101.05982)|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:| -|[REINFORCE](https://link.springer.com/content/pdf/10.1007/BF00992696.pdf)|:heavy_check_mark:|:x:|:heavy_check_mark:|:heavy_check_mark:|:x:| -|[SAC](https://arxiv.org/abs/1812.05905)|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:| -|[SAC (ICML 2018 version)](https://arxiv.org/abs/1801.01290)|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:| -|[SAC-D](https://arxiv.org/abs/2206.13901)|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:| -|[TD3](https://arxiv.org/abs/1802.09477)|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:| -|[TRPO](https://arxiv.org/abs/1502.05477)|:heavy_check_mark:|:x:|:heavy_check_mark:|(We will support discrete action in the future)|:x:| -|[TRPO (ICML 2015 version)](https://arxiv.org/abs/1502.05477)|:heavy_check_mark:|:x:|:heavy_check_mark:|:heavy_check_mark:|:x:| -|[XQL](https://arxiv.org/abs/2301.02328)|:x:|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:| +|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:| +|[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:| +|[Categorical DDQN](https://arxiv.org/abs/1710.02298)|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:|:x:|:heavy_check_mark:| +|[Categorical DQN](https://arxiv.org/abs/1707.06887)|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:|:x:|:heavy_check_mark:| +|[DDPG](https://arxiv.org/abs/1509.02971)|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:x:|:heavy_check_mark:| +|[DDQN](https://arxiv.org/abs/1509.06461)|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:|:x:|:heavy_check_mark:| +|[DecisionTransformer](https://arxiv.org/abs/2106.01345)|:x:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:x:| +|[DEMME-SAC](https://arxiv.org/abs/2106.10517)|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:x:|:heavy_check_mark:| +|[DQN](https://www.nature.com/articles/nature14236)|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:|:x:|:heavy_check_mark:| +|[DRQN](https://arxiv.org/abs/1507.06527)|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:|:x:|:heavy_check_mark:| +|[GAIL](https://arxiv.org/abs/1606.03476)|:heavy_check_mark:|:x:|:heavy_check_mark:|(We will support discrete action in the future)|:x:|:x:| +|[HER](https://arxiv.org/abs/1707.06347)|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:x:|:heavy_check_mark:| +|[HyAR](https://openreview.net/pdf?id=64trBbOhdGU)|:heavy_check_mark:|:x:|:x:|:x:|:heavy_check_mark:|:x:| +|[IQN](https://arxiv.org/abs/1806.06923)|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:|:x:|:heavy_check_mark:*| +|[MME-SAC](https://arxiv.org/abs/2106.10517)|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:x:|:heavy_check_mark:| +|[M-DQN](https://proceedings.neurips.cc/paper/2020/file/2c6a0bae0f071cbbf0bb3d5b11d90a82-Paper.pdf)|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:|:x:|:heavy_check_mark:| +|[M-IQN](https://proceedings.neurips.cc/paper/2020/file/2c6a0bae0f071cbbf0bb3d5b11d90a82-Paper.pdf)|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:|:x:|:heavy_check_mark:| +|[PPO](https://arxiv.org/abs/1707.06347)|:heavy_check_mark:|:x:|:heavy_check_mark:|:heavy_check_mark:|:x:|:x:| +|[QRSAC](https://www.nature.com/articles/s41586-021-04357-7)|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:x:|:heavy_check_mark:| +|[QRDQN](https://arxiv.org/abs/1710.10044)|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:|:x:|:x:|:heavy_check_mark:| +|[QtOpt (ICRA 2018 version)](https://arxiv.org/pdf/1802.10264)|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:x:|:heavy_check_mark:| +|[Rainbow](https://arxiv.org/abs/1710.02298)|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_check_mark:|:x:|:heavy_check_mark:| +|[REDQ](https://arxiv.org/abs/2101.05982)|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:x:|:heavy_check_mark:| +|[REINFORCE](https://link.springer.com/content/pdf/10.1007/BF00992696.pdf)|:heavy_check_mark:|:x:|:heavy_check_mark:|:heavy_check_mark:|:x:|:x:| +|[SAC](https://arxiv.org/abs/1812.05905)|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:x:|:heavy_check_mark:| +|[SAC (ICML 2018 version)](https://arxiv.org/abs/1801.01290)|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:x:|:heavy_check_mark:| +|[SAC-D](https://arxiv.org/abs/2206.13901)|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:x:|:heavy_check_mark:| +|[TD3](https://arxiv.org/abs/1802.09477)|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:x:|:heavy_check_mark:| +|[TRPO](https://arxiv.org/abs/1502.05477)|:heavy_check_mark:|:x:|:heavy_check_mark:|(We will support discrete action in the future)|:x:|:x:| +|[TRPO (ICML 2015 version)](https://arxiv.org/abs/1502.05477)|:heavy_check_mark:|:x:|:heavy_check_mark:|:heavy_check_mark:|:x:|:x:| +|[XQL](https://arxiv.org/abs/2301.02328)|:x:|:heavy_check_mark:|:heavy_check_mark:|:x:|:x:|:heavy_check_mark:| *May require special treatment to train with RNN layers. diff --git a/nnabla_rl/algorithms/__init__.py b/nnabla_rl/algorithms/__init__.py index 5d12f217..3c4dbe21 100644 --- a/nnabla_rl/algorithms/__init__.py +++ b/nnabla_rl/algorithms/__init__.py @@ -30,6 +30,7 @@ from nnabla_rl.algorithms.dummy import Dummy, DummyConfig from nnabla_rl.algorithms.gail import GAIL, GAILConfig from nnabla_rl.algorithms.her import HER, HERConfig +from nnabla_rl.algorithms.hyar import HyAR, HyARConfig from nnabla_rl.algorithms.icml2015_trpo import ICML2015TRPO, ICML2015TRPOConfig from nnabla_rl.algorithms.icml2018_sac import ICML2018SAC, ICML2018SACConfig from nnabla_rl.algorithms.icra2018_qtopt import ICRA2018QtOpt, ICRA2018QtOptConfig @@ -94,6 +95,7 @@ def get_class_of(name): register_algorithm(DRQN, DRQNConfig) register_algorithm(Dummy, DummyConfig) register_algorithm(HER, HERConfig) +register_algorithm(HyAR, HyARConfig) register_algorithm(ICML2018SAC, ICML2018SACConfig) register_algorithm(iLQR, iLQRConfig) register_algorithm(IQN, IQNConfig) diff --git a/nnabla_rl/algorithms/hyar.py b/nnabla_rl/algorithms/hyar.py new file mode 100644 index 00000000..52483279 --- /dev/null +++ b/nnabla_rl/algorithms/hyar.py @@ -0,0 +1,699 @@ +# Copyright 2023 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 + +import gym +import numpy as np + +import nnabla as nn +import nnabla.functions as NF +import nnabla.solvers as NS +import nnabla_rl.functions as RF +import nnabla_rl.model_trainers as MT +from nnabla_rl.algorithms.common_utils import _ActionSelector +from nnabla_rl.algorithms.td3 import TD3, DefaultSolverBuilder, TD3Config +from nnabla_rl.builders import ExplorerBuilder, ModelBuilder, ReplayBufferBuilder, SolverBuilder +from nnabla_rl.environment_explorer import EnvironmentExplorer, EnvironmentExplorerConfig +from nnabla_rl.environment_explorers import RawPolicyExplorer, RawPolicyExplorerConfig +from nnabla_rl.environments.environment_info import EnvironmentInfo +from nnabla_rl.model_trainers.model_trainer import TrainingBatch +from nnabla_rl.models import DeterministicPolicy, HyARPolicy, HyARQFunction, HyARVAE, QFunction +from nnabla_rl.replay_buffer import ReplayBuffer +from nnabla_rl.replay_buffers import ReplacementSamplingReplayBuffer +from nnabla_rl.utils import context +from nnabla_rl.utils.data import marshal_experiences, set_data_to_variable +from nnabla_rl.utils.misc import sync_model +from nnabla_rl.utils.solver_wrappers import AutoClipGradByNorm + + +@dataclass +class HyARConfig(TD3Config): + """HyARConfig List of configurations for HyAR algorithm. + + Args: + gamma (float): discount factor of rewards. Defaults to 0.99. + learning_rate (float): learning rate which is set to all solvers. \ + You can customize/override the learning rate for each solver by implementing the \ + (:py:class:`SolverBuilder `) by yourself. \ + Defaults to 0.003. + batch_size(int): training batch size. Defaults to 100. + tau (float): target network's parameter update coefficient. Defaults to 0.005. + start_timesteps (int): the timestep when training starts.\ + The algorithm will collect experiences from the environment by acting randomly until this timestep.\ + Defaults to 10000. + replay_buffer_size (int): capacity of the replay buffer. Defaults to 1000000. + d (int): Interval of the policy update. The policy will be updated every d q-function updates. Defaults to 2. + exploration_noise_sigma (float): Standard deviation of the gaussian exploration noise. Defaults to 0.1. + train_action_noise_sigma (float): Standard deviation of the gaussian action noise used in the training.\ + Defaults to 0.5. + train_action_noise_abs (float): Absolute limit value of action noise used in the training. Defaults to 0.5. + noisy_action_max (float): Maximum value of the training action after appending the noise. Defaults to 1.0. + noisy_action_min (float): Minimum value of the training action after appending the noise. Defaults to -1.0. + num_steps (int): number of steps for N-step Q targets. Defaults to 1. + actor_unroll_steps (int): Number of steps to unroll actor's tranining network.\ + The network will be unrolled even though the provided model doesn't have RNN layers.\ + Defaults to 1. + actor_burn_in_steps (int): Number of burn-in steps to initiaze actor's recurrent layer states during training.\ + This flag does not take effect if given model is not an RNN model.\ + Defaults to 0. + actor_reset_rnn_on_terminal (bool): Reset actor's recurrent internal states to zero during training\ + if episode ends. This flag does not take effect if given model is not an RNN model.\ + Defaults to False. + critic_unroll_steps (int): Number of steps to unroll critic's tranining network.\ + The network will be unrolled even though the provided model doesn't have RNN layers.\ + Defaults to 1. + critic_burn_in_steps (int): Number of burn-in steps to initiaze critic's recurrent layer states\ + during training. This flag does not take effect if given model is not an RNN model.\ + Defaults to 0. + critic_reset_rnn_on_terminal (bool): Reset critic's recurrent internal states to zero during training\ + if episode ends. This flag does not take effect if given model is not an RNN model.\ + Defaults to False. + latent_dim (int): Latent action's dimension. Defaults to 6.\ + embed_dim (int): Discrete action embedding's dimension. Defaults to 6.\ + T (int): VAE training interval. VAE is trained every T episodes. Defaults to 10.\ + vae_pretrain_episodes (float): Number of data collection episodes for vae pretraining.\ + Defaults to 20000.\ + vae_pretrain_batch_size (int): Batch size used in vae pretraining.\ + Defaults to 64.\ + vae_pretrain_times (int): VAE is updated for this number of iterations during the pretrain stage.\ + Defaults to 5000.\ + vae_training_batch_size (int): batch size used in vae training. Defaults to 64.\ + vae_training_times (int): VAE is updated for this number of iterations every T steps. Defaults to 1.\ + vae_learning_rate (float): VAE learning rate. Defaults to 1e-4.\ + vae_buffer_size (int): Replay buffer size for VAE model. Defaults to 200000.\ + latent_select_batch_size: (int): Batch size for computing latent space constraint (LSC). Defaults to 5000.\ + latent_select_range: (float): Percentage of the latent variables in central range. Default to 96.\ + + noise_decay_steps (int): Exploration noise decay steps. Noise decays for this number of experienced episodes.\ + Defaults to 1000.\ + initial_exploration_noise (float): Initial standard deviation of exploration noise. Defaults to 1.0. + final_exploration_noise (float): Final standard deviation of exploration noise. Defaults to 0.1. + """ + + train_action_noise_sigma: float = 0.1 + train_action_noise_abs: float = 0.5 + noisy_action_min: float = -1.0 + noisy_action_max: float = -1.0 + + latent_dim: int = 6 + embed_dim: int = 6 + T: int = 10 + vae_pretrain_episodes: int = 20000 + vae_pretrain_batch_size: int = 64 + vae_pretrain_times: int = 5000 + vae_training_batch_size: int = 64 + vae_training_times: int = 1 + vae_learning_rate: float = 1e-4 + vae_buffer_size: int = int(2e6) + + latent_select_batch_size: int = 5000 + latent_select_range: float = 96. + + noise_decay_steps: int = 1000 + initial_exploration_noise: float = 1.0 + final_exploration_noise: float = 0.1 + + def __post_init__(self): + self._assert_positive(self.latent_dim, 'latent_dim') + self._assert_positive(self.embed_dim, 'embed_dim') + self._assert_positive(self.T, 'T') + self._assert_positive_or_zero(self.vae_pretrain_episodes, 'vae_pretrain_episodes') + self._assert_positive(self.vae_pretrain_batch_size, 'vae_pretrain_batch_size') + self._assert_positive_or_zero(self.vae_pretrain_times, 'vae_pretrain_times') + self._assert_positive(self.vae_training_batch_size, 'vae_training_batch_size') + self._assert_positive_or_zero(self.vae_training_times, 'vae_training_times') + self._assert_positive_or_zero(self.vae_learning_rate, 'vae_learning_rate') + self._assert_positive(self.vae_buffer_size, 'vae_buffer_size') + self._assert_positive(self.latent_select_batch_size, 'latent_select_batch_size') + self._assert_between(self.latent_select_range, 0, 100, 'latent_select_range') + self._assert_positive(self.noise_decay_steps, 'noise_decay_steps') + self._assert_positive(self.initial_exploration_noise, 'initial_exploration_noise') + self._assert_positive(self.final_exploration_noise, 'final_exploration_noise') + return super().__post_init__() + + +class DefaultCriticBuilder(ModelBuilder[QFunction]): + def build_model(self, # type: ignore[override] + scope_name: str, + env_info: EnvironmentInfo, + algorithm_config: HyARConfig, + **kwargs) -> QFunction: + return HyARQFunction(scope_name) + + +class DefaultActorBuilder(ModelBuilder[DeterministicPolicy]): + def build_model(self, # type: ignore[override] + scope_name: str, + env_info: EnvironmentInfo, + algorithm_config: HyARConfig, + **kwargs) -> DeterministicPolicy: + max_action_value = 1.0 + action_dim = algorithm_config.latent_dim + algorithm_config.embed_dim + return HyARPolicy(scope_name, action_dim, max_action_value=max_action_value) + + +class DefaultVAEBuilder(ModelBuilder[HyARVAE]): + def build_model(self, # type: ignore[override] + scope_name: str, + env_info: EnvironmentInfo, + algorithm_config: HyARConfig, + **kwargs) -> HyARVAE: + return HyARVAE(scope_name, + state_dim=env_info.state_dim, + action_dim=env_info.action_dim, + encode_dim=algorithm_config.latent_dim, + embed_dim=algorithm_config.embed_dim) + + +class DefaultActorSolverBuilder(SolverBuilder): + def build_solver(self, # type: ignore[override] + env_info: EnvironmentInfo, + algorithm_config: HyARConfig, + **kwargs) -> nn.solver.Solver: + solver = NS.Adam(alpha=algorithm_config.learning_rate) + return AutoClipGradByNorm(solver, 10.0) + + +class DefaultVAESolverBuilder(SolverBuilder): + def build_solver(self, # type: ignore[override] + env_info: EnvironmentInfo, + algorithm_config: HyARConfig, + **kwargs) -> nn.solver.Solver: + return NS.Adam(alpha=algorithm_config.vae_learning_rate) + + +class DefaultExplorerBuilder(ExplorerBuilder): + def build_explorer(self, # type: ignore[override] + env_info: EnvironmentInfo, + algorithm_config: HyARConfig, + algorithm: "HyAR", + **kwargs) -> EnvironmentExplorer: + explorer_config = HyARPolicyExplorerConfig( + warmup_random_steps=0, + initial_step_num=algorithm.iteration_num, + timelimit_as_terminal=False + ) + explorer = HyARPolicyExplorer(policy_action_selector=algorithm._exploration_action_selector, + env_info=env_info, + config=explorer_config) + return explorer + + +class DefaultPretrainExplorerBuilder(ExplorerBuilder): + def build_explorer(self, # type: ignore[override] + env_info: EnvironmentInfo, + algorithm_config: HyARConfig, + algorithm: "HyAR", + **kwargs) -> EnvironmentExplorer: + explorer_config = HyARPretrainExplorerConfig( + warmup_random_steps=0, + initial_step_num=algorithm.iteration_num, + timelimit_as_terminal=False + ) + explorer = HyARPretrainExplorer(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: HyARConfig, + **kwargs) -> ReplayBuffer: + return ReplacementSamplingReplayBuffer(capacity=algorithm_config.replay_buffer_size) + + +class DefaultVAEBufferBuilder(ReplayBufferBuilder): + def build_replay_buffer(self, # type: ignore[override] + env_info: EnvironmentInfo, + algorithm_config: HyARConfig, + **kwargs) -> ReplayBuffer: + return ReplacementSamplingReplayBuffer(capacity=algorithm_config.vae_buffer_size) + + +class HyAR(TD3): + """HyAR algorithm. + + This class implements the Hybrid Action Representation (HyAR) algorithm + proposed by Boyan Li, et al. + in the paper: "HyAR: Addressing Discrete-Continuous Action Reinforcement Learning via Hybrid Action Representation" + For details see: https://openreview.net/pdf?id=64trBbOhdGU + + Args: + env_or_env_info\ + (gym.Env or :py:class:`EnvironmentInfo `): + the environment to train or environment info + config (:py:class:`DQNConfig `): + the parameter for DQN training + critic_func_builder (:py:class:`ModelBuilder `): builder of q function model + critic_solver_builder (:py:class:`SolverBuilder `): + builder of q function solver + actor_func_builder (:py:class:`ModelBuilder `): builder of policy model + actor_solver_builder (:py:class:`SolverBuilder `): builder of policy solver + vae_builder (:py:class:`ModelBuilder `): builder of vae model + vae_solver_builder (:py:class:`SolverBuilder `): builder of vae solver + replay_buffer_builder (:py:class:`ReplayBufferBuilder `): + builder of q-function and policy replay_buffer + vae_buffer_builder (:py:class:`ReplayBufferBuilder `): + builder of vae's replay_buffer + explorer_builder (:py:class:`ExplorerBuilder `): + builder of environment explorer for main training stage + pretrain_explorer_builder (:py:class:`ExplorerBuilder `): + builder of environment explorer for pretraining stage + """ + # 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: HyARConfig + _evaluation_actor: "_HyARPolicyActionSelector" # type: ignore + _exploration_actor: "_HyARPolicyActionSelector" # type: ignore + + def __init__(self, + env_or_env_info, + config: HyARConfig = HyARConfig(), + critic_builder=DefaultCriticBuilder(), + critic_solver_builder=DefaultSolverBuilder(), + actor_builder=DefaultActorBuilder(), + actor_solver_builder=DefaultActorSolverBuilder(), + vae_builder=DefaultVAEBuilder(), + vae_solver_buidler=DefaultVAESolverBuilder(), + replay_buffer_builder=DefaultReplayBufferBuilder(), + vae_buffer_builder=DefaultVAEBufferBuilder(), + explorer_builder=DefaultExplorerBuilder(), + pretrain_explorer_builder=DefaultPretrainExplorerBuilder()): + super().__init__(env_or_env_info, + config, + critic_builder, + critic_solver_builder, + actor_builder, + actor_solver_builder, + replay_buffer_builder, + explorer_builder) + + with nn.context_scope(context.get_nnabla_context(self._config.gpu_id)): + self._vae = vae_builder('vae', self._env_info, self._config) + self._vae_solver = vae_solver_buidler(self._env_info, self._config) + # We use different replay buffer for vae + self._vae_replay_buffer = vae_buffer_builder(env_info=self._env_info, algorithm_config=self._config) + self._pretrain_explorer_builder = pretrain_explorer_builder + + self._evaluation_actor = _HyARPolicyActionSelector( + self._env_info, + self._pi.shallowcopy(), + self._vae.shallowcopy(), + embed_dim=self._config.embed_dim, + latent_dim=self._config.latent_dim) + self._exploration_actor = _HyARPolicyActionSelector( + self._env_info, + self._pi.shallowcopy(), + self._vae.shallowcopy(), + embed_dim=self._config.embed_dim, + latent_dim=self._config.latent_dim, + append_noise=True, + sigma=self._config.exploration_noise_sigma, + action_clip_low=-1.0, + action_clip_high=1.0) + self._episode_number = 1 + self._experienced_episodes = 0 + + def _before_training_start(self, env_or_buffer): + super()._before_training_start(env_or_buffer) + self._vae_trainer = self._setup_vae_training(env_or_buffer) + self._pretrain_explorer = self._setup_pretrain_explorer(env_or_buffer) + if isinstance(env_or_buffer, gym.Env): + self._pretrain_vae(env_or_buffer) + + def _setup_q_function_training(self, env_or_buffer): + # training input/loss variables + q_function_trainer_config = MT.q_value_trainers.HyARQTrainerConfig( + reduction_method='mean', + q_loss_scalar=1.0, + grad_clip=None, + train_action_noise_sigma=self._config.train_action_noise_sigma, + train_action_noise_abs=self._config.train_action_noise_abs, + noisy_action_max=self._config.noisy_action_max, + noisy_action_min=self._config.noisy_action_min, + num_steps=self._config.num_steps, + unroll_steps=self._config.critic_unroll_steps, + burn_in_steps=self._config.critic_burn_in_steps, + reset_on_terminal=self._config.critic_reset_rnn_on_terminal, + embed_dim=self._config.embed_dim, + latent_dim=self._config.latent_dim) + q_function_trainer = MT.q_value_trainers.HyARQTrainer( + train_functions=self._train_q_functions, + solvers=self._train_q_solvers, + target_functions=self._target_q_functions, + target_policy=self._target_pi, + vae=self._vae, + env_info=self._env_info, + config=q_function_trainer_config) + for q, target_q in zip(self._train_q_functions, self._target_q_functions): + sync_model(q, target_q) + return q_function_trainer + + def _setup_policy_training(self, env_or_buffer): + # return super()._setup_policy_training(env_or_buffer) + action_dim = self._config.latent_dim+self._config.embed_dim + policy_trainer_config = MT.policy_trainers.HyARPolicyTrainerConfig( + unroll_steps=self._config.actor_unroll_steps, + burn_in_steps=self._config.actor_burn_in_steps, + reset_on_terminal=self._config.actor_reset_rnn_on_terminal, + p_max=np.ones(shape=(1, action_dim)), + p_min=-np.ones(shape=(1, action_dim))) + policy_trainer = MT.policy_trainers.HyARPolicyTrainer( + models=self._pi, + solvers={self._pi.scope_name: self._pi_solver}, + q_function=self._q1, + env_info=self._env_info, + config=policy_trainer_config) + sync_model(self._pi, self._target_pi, 1.0) + + return policy_trainer + + def _setup_vae_training(self, env_or_buffer): + vae_trainer_config = MT.encoder_trainers.HyARVAETrainerConfig( + unroll_steps=self._config.critic_unroll_steps, + burn_in_steps=self._config.critic_burn_in_steps, + reset_on_terminal=self._config.critic_reset_rnn_on_terminal) + return MT.encoder_trainers.HyARVAETrainer(self._vae, + {self._vae.scope_name: self._vae_solver}, + self._env_info, + vae_trainer_config) + + def _setup_pretrain_explorer(self, env_or_buffer): + return None if self._is_buffer(env_or_buffer) else self._pretrain_explorer_builder(self._env_info, + self._config, + self) + + def _pretrain_vae(self, env: gym.Env): + for _ in range(self._config.vae_pretrain_episodes): + experiences = self._pretrain_explorer.rollout(env) + self._vae_replay_buffer.append_all(experiences) + + for _ in range(self._config.vae_pretrain_times): + self._vae_training(self._vae_replay_buffer, self._config.vae_pretrain_batch_size) + c_rate, ds_rate = self._compute_reconstruction_rate(self._vae_replay_buffer) + self._c_rate = c_rate + self._ds_rate = ds_rate + self._exploration_actor.update_c_rate(c_rate) + self._evaluation_actor.update_c_rate(c_rate) + + def _run_online_training_iteration(self, env): + experiences = self._environment_explorer.step(env) + self._replay_buffer.append_all(experiences) + self._vae_replay_buffer.append_all(experiences) + + (_, _, _, non_terminal, *_) = experiences[-1] + end_of_episode = (non_terminal == 0.0) + if end_of_episode: + self._experienced_episodes += 1 + if (self._experienced_episodes < self._config.noise_decay_steps): + ratio = self._experienced_episodes / self._config.noise_decay_steps + new_sigma = self._config.initial_exploration_noise * (1.0 - ratio) \ + + self._config.final_exploration_noise * ratio + self._exploration_actor.update_sigma(sigma=new_sigma) + else: + self._exploration_actor.update_sigma(sigma=self._config.final_exploration_noise) + if self._config.start_timesteps < self.iteration_num: + self._hyar_training(self._replay_buffer, self._vae_replay_buffer, end_of_episode) + + def _run_offline_training_iteration(self, buffer): + raise NotImplementedError + + def _hyar_training(self, replay_buffer, vae_replay_buffer, end_of_episode=False): + self._rl_training(replay_buffer) + if (self._experienced_episodes % self._config.T) == 0 and self._iteration_num > 1000 and end_of_episode: + for _ in range(self._config.vae_training_times): + self._vae_training(vae_replay_buffer, self._config.vae_training_batch_size) + c_rate, ds_rate = self._compute_reconstruction_rate(self._vae_replay_buffer) + self._c_rate = c_rate + self._ds_rate = ds_rate + self._exploration_actor.update_c_rate(c_rate) + self._evaluation_actor.update_c_rate(c_rate) + + def _rl_training(self, replay_buffer): + actor_steps = self._config.actor_burn_in_steps + self._config.actor_unroll_steps + critic_steps = self._config.num_steps + self._config.critic_burn_in_steps + self._config.critic_unroll_steps - 1 + num_steps = max(actor_steps, critic_steps) + experiences_tuple, info = replay_buffer.sample(self._config.batch_size, num_steps=num_steps) + if num_steps == 1: + experiences_tuple = (experiences_tuple, ) + assert len(experiences_tuple) == num_steps + + batch = None + for experiences in reversed(experiences_tuple): + (s, a, r, non_terminal, s_next, extra, *_) = marshal_experiences(experiences) + rnn_states = extra['rnn_states'] if 'rnn_states' in extra else {} + extra.update({'c_rate': self._c_rate, 'ds_rate': self._ds_rate}) + batch = TrainingBatch(batch_size=self._config.batch_size, + s_current=s, + a_current=a, + gamma=self._config.gamma, + reward=r, + non_terminal=non_terminal, + s_next=s_next, + extra=extra, + weight=info['weights'], + next_step_batch=batch, + rnn_states=rnn_states) + + self._q_function_trainer_state = self._q_function_trainer.train(batch) + td_errors = self._q_function_trainer_state['td_errors'] + replay_buffer.update_priorities(td_errors) + + if self.iteration_num % self._config.d == 0: + # Optimize actor + self._policy_trainer_state = self._policy_trainer.train(batch) + + # parameter update + for q, target_q in zip(self._train_q_functions, self._target_q_functions): + sync_model(q, target_q, tau=self._config.tau) + sync_model(self._pi, self._target_pi, tau=self._config.tau) + + def _vae_training(self, replay_buffer, batch_size): + actor_steps = self._config.actor_burn_in_steps + self._config.actor_unroll_steps + critic_steps = self._config.num_steps + self._config.critic_burn_in_steps + self._config.critic_unroll_steps - 1 + num_steps = max(actor_steps, critic_steps) + experiences_tuple, info = replay_buffer.sample(batch_size, num_steps=num_steps) + if num_steps == 1: + experiences_tuple = (experiences_tuple, ) + assert len(experiences_tuple) == num_steps + + batch = None + for experiences in reversed(experiences_tuple): + (s, a, r, non_terminal, s_next, extra, *_) = marshal_experiences(experiences) + rnn_states = extra['rnn_states'] if 'rnn_states' in extra else {} + batch = TrainingBatch(batch_size=batch_size, + s_current=s, + a_current=a, + gamma=self._config.gamma, + reward=r, + non_terminal=non_terminal, + s_next=s_next, + extra=extra, + weight=info['weights'], + next_step_batch=batch, + rnn_states=rnn_states) + + self._vae_trainer_state = self._vae_trainer.train(batch) + + def _models(self): + models = super()._models() + models.update({self._vae.scope_name: self._vae}) + return models + + def _solvers(self): + solvers = super()._solvers() + solvers.update({self._vae.scope_name: self._vae_solver}) + return solvers + + def _compute_reconstruction_rate(self, replay_buffer): + range_rate = 100 - self._config.latent_select_range + batch_size = self._config.latent_select_batch_size + border = int(range_rate * (batch_size / 100)) + experiences, _ = replay_buffer.sample(num_samples=batch_size) + (s, a, _, _, s_next, *_) = marshal_experiences(experiences) + + if not hasattr(self, '_rate_state_var'): + from nnabla_rl.utils.misc import create_variable + self._rate_state_var = create_variable(batch_size, self._env_info.state_shape) + self._rate_action_var = create_variable(batch_size, self._env_info.action_shape) + self._rate_next_state_var = create_variable(batch_size, self._env_info.state_shape) + + action1, action2 = self._rate_action_var + x = action1 if isinstance(self._env_info.action_space[0], gym.spaces.Box) else action2 + latent_distribution, (_, predicted_ds) = self._vae.encode_and_decode( + x=x, state=self._rate_state_var, action=self._rate_action_var) + z = latent_distribution.sample() + # NOTE: ascending order + z_sorted = NF.sort(z, axis=0) + z_up = z_sorted[batch_size - border - 1, :] + z_down = z_sorted[border, :] + z_up.persistent = True + z_down.persistent = True + + ds = self._rate_next_state_var - self._rate_state_var + ds_rate = RF.mean_squared_error(ds, predicted_ds) + ds_rate.persistent = True + + self._ds_rate_var = ds_rate + self._z_up_var = z_up + self._z_down_var = z_down + + set_data_to_variable(self._rate_state_var, s) + set_data_to_variable(self._rate_action_var, a) + set_data_to_variable(self._rate_next_state_var, s_next) + + nn.forward_all((self._z_up_var, self._z_down_var, self._ds_rate_var), clear_no_need_grad=True) + return (self._z_up_var.d, self._z_down_var.d), self._ds_rate_var.d + + @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 env_info.is_tuple_action_env() and not env_info.is_tuple_state_env() + + @classmethod + def is_rnn_supported(self): + return False + + @property + def latest_iteration_state(self): + latest_iteration_state = super().latest_iteration_state + if hasattr(self, '_vae_trainer_state'): + latest_iteration_state['scalar'].update( + {'encoder_loss': float(self._vae_trainer_state['encoder_loss']), + 'kl_loss': float(self._vae_trainer_state['kl_loss']), + 'reconstruction_loss': float(self._vae_trainer_state['reconstruction_loss']), + 'dyn_loss': float(self._vae_trainer_state['dyn_loss'])}) + return latest_iteration_state + + +class _HyARPolicyActionSelector(_ActionSelector[DeterministicPolicy]): + _vae: HyARVAE + + def __init__(self, + env_info: EnvironmentInfo, + model: DeterministicPolicy, + vae: HyARVAE, + embed_dim: int, + latent_dim: int, + append_noise: bool = False, + action_clip_low: float = np.finfo(np.float32).min, # type: ignore + action_clip_high: float = np.finfo(np.float32).max, # type: ignore + sigma: float = 1.0): + super().__init__(env_info, model) + self._vae = vae + self._embed_dim = embed_dim + self._latent_dim = latent_dim + + self._e: nn.Variable = None + self._z: nn.Variable = None + + self._append_noise = append_noise + self._action_clip_low = action_clip_low + self._action_clip_high = action_clip_high + self._sigma = nn.Variable.from_numpy_array(sigma * np.ones(shape=(1, 1))) + + # This value is used in the author's code to modify the action + z_up = nn.Variable.from_numpy_array(np.ones(shape=(1, self._latent_dim))) + z_down = nn.Variable.from_numpy_array(-np.ones(shape=(1, self._latent_dim))) + self._c_rate = (z_up, z_down) + + def __call__(self, s, *, begin_of_episode=False, extra_info={}): + action, info = super().__call__(s, begin_of_episode=begin_of_episode, extra_info=extra_info) + # Use only the first item in the batch + # self._e.d[0] and self._z.d[0] + e = self._e.d[0] + z = self._z.d[0] + info.update({'e': e, 'z': z}) + (d_action, c_action) = action + return (d_action, c_action), info + + def update_sigma(self, sigma): + self._sigma.d = sigma + + def update_c_rate(self, c_rate): + self._c_rate[0].d = c_rate[0] + self._c_rate[1].d = c_rate[1] + + def _compute_action(self, state_var: nn.Variable) -> nn.Variable: + latent_action = self._model.pi(state_var) + if self._append_noise: + noise = NF.randn(shape=latent_action.shape) + latent_action = latent_action + noise * self._sigma + latent_action = NF.clip_by_value(latent_action, min=self._action_clip_low, max=self._action_clip_high) + self._e = latent_action[:, :self._embed_dim] + self._e.persistent = True + self._z = latent_action[:, self._embed_dim:] + self._z.persistent = True + assert latent_action.shape[-1] == self._embed_dim + self._latent_dim + + d_action = self._vae.decode_discrete_action(self._e) + c_action, _ = self._vae.decode(self._apply_c_rate(self._z), state=state_var, action=(d_action, None)) + + return d_action, c_action + + def _apply_c_rate(self, z): + median = 0.5 * (self._c_rate[0] - self._c_rate[1]) + offset = self._c_rate[0] - median + median = NF.reshape(median, shape=(1, -1)) + offset = NF.reshape(offset, shape=(1, -1)) + z = z * median + offset + return z + + +class HyARPolicyExplorerConfig(RawPolicyExplorerConfig): + pass + + +class HyARPolicyExplorer(RawPolicyExplorer): + def _warmup_action(self, env, *, begin_of_episode=False): + return self.action(self._steps, self._state, begin_of_episode=begin_of_episode) + + +class HyARPretrainExplorerConfig(EnvironmentExplorerConfig): + pass + + +class HyARPretrainExplorer(EnvironmentExplorer): + def __init__(self, + env_info: EnvironmentInfo, + config: HyARPretrainExplorerConfig = HyARPretrainExplorerConfig()): + super().__init__(env_info, config) + + def action(self, step: int, state, *, begin_of_episode: bool = False): + (d_action, c_action), action_info = self._sample_action(self._env_info) + return (d_action, c_action), action_info + + def _warmup_action(self, env, *, begin_of_episode=False): + (d_action, c_action), action_info = self._sample_action(self._env_info) + return (d_action, c_action), action_info + + def _sample_action(self, env_info): + action_info = {} + if env_info.is_tuple_action_env(): + action = [] + for a, action_space in zip(env_info.action_space.sample(), env_info.action_space): + if isinstance(action_space, gym.spaces.Discrete): + a = np.asarray(a).reshape((1, )) + action.append(a) + action = tuple(action) + else: + if env_info.is_discrete_action_env(): + action = env_info.action_space.sample() + action = np.asarray(action).reshape((1, )) + else: + action = env_info.action_space.sample() + return action, action_info diff --git a/nnabla_rl/environments/__init__.py b/nnabla_rl/environments/__init__.py index 3285682b..3088e9aa 100644 --- a/nnabla_rl/environments/__init__.py +++ b/nnabla_rl/environments/__init__.py @@ -20,7 +20,8 @@ DummyFactoredContinuous, DummyMujocoEnv, DummyTupleContinuous, DummyTupleDiscrete, DummyTupleMixed, DummyTupleStateContinuous, DummyTupleStateDiscrete, - DummyTupleActionContinuous, DummyTupleActionDiscrete) + DummyTupleActionContinuous, DummyTupleActionDiscrete, + DummyHybridEnv) register( id='FakeMujocoNNablaRL-v1', @@ -80,3 +81,9 @@ entry_point='nnabla_rl.environments.factored_envs:FactoredHumanoidV4', max_episode_steps=1000, ) + +register( + id='FakeHybridNNablaRL-v1', + entry_point='nnabla_rl.environments.dummy:DummyHybridEnv', + max_episode_steps=10 +) diff --git a/nnabla_rl/environments/dummy.py b/nnabla_rl/environments/dummy.py index f56bbe09..738a0c2f 100644 --- a/nnabla_rl/environments/dummy.py +++ b/nnabla_rl/environments/dummy.py @@ -302,3 +302,10 @@ def compute_reward(self, achieved_goal, desired_goal, info): return 1 else: return 0 + + +class DummyHybridEnv(AbstractDummyEnv): + def __init__(self, max_episode_steps=None): + super(DummyHybridEnv, self).__init__(max_episode_steps=max_episode_steps) + self.action_space = gym.spaces.Tuple((gym.spaces.Discrete(5), gym.spaces.Box(low=0.0, high=1.0, shape=(5, )))) + self.observation_space = gym.spaces.Box(low=0.0, high=1.0, shape=(5, )) diff --git a/nnabla_rl/environments/wrappers/__init__.py b/nnabla_rl/environments/wrappers/__init__.py index bde9b4bc..238a2625 100644 --- a/nnabla_rl/environments/wrappers/__init__.py +++ b/nnabla_rl/environments/wrappers/__init__.py @@ -1,5 +1,5 @@ # Copyright 2020,2021 Sony Corporation. -# Copyright 2021,2022 Sony Group Corporation. +# Copyright 2021,2022,2023 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. @@ -18,3 +18,5 @@ from nnabla_rl.environments.wrappers.mujoco import EndlessEnv # noqa from nnabla_rl.environments.wrappers.atari import make_atari, wrap_deepmind # noqa +from nnabla_rl.environments.wrappers.hybrid_env import (EmbedActionWrapper, FlattenActionWrapper, # noqa + RemoveStepWrapper, ScaleActionWrapper, ScaleStateWrapper) diff --git a/nnabla_rl/environments/wrappers/hybrid_env.py b/nnabla_rl/environments/wrappers/hybrid_env.py new file mode 100644 index 00000000..461dd68e --- /dev/null +++ b/nnabla_rl/environments/wrappers/hybrid_env.py @@ -0,0 +1,188 @@ +# Copyright 2023 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 cast + +import gym +import gym.spaces +import numpy as np +from gym.core import Env + + +class FlattenActionWrapper(gym.Wrapper): + """Flatten the action_space and fix action order for goal env.""" + + def __init__(self, env): + super().__init__(env) + original_action_space = env.action_space + num_actions = original_action_space.spaces[0].n + discrete_space = original_action_space.spaces[0] + continuous_space = [gym.spaces.Box(original_action_space.spaces[1].spaces[i].low, + original_action_space.spaces[1].spaces[i].high, + dtype=np.float32) for i in range(0, num_actions)] + self.action_space = gym.spaces.Tuple((discrete_space, *continuous_space)) + + def step(self, action): + action = (action[0], tuple(a for a in action[1:])) + return super().step(action) + + +class ScaleStateWrapper(gym.ObservationWrapper): + """Observation should be flatten in prior to merge.""" + + def __init__(self, env: Env): + super().__init__(env) + self._original_observation_space = env.observation_space + + if self._is_box(env.observation_space): + self.observation_space = gym.spaces.Box(low=-np.ones(shape=env.observation_space.shape), + high=np.ones(shape=env.observation_space.shape), + dtype=np.float32) + elif self._is_tuple(env.observation_space): + spaces = [gym.spaces.Box(low=-np.ones(shape=space.shape), + high=np.ones(shape=space.shape), + dtype=np.float32) + if self._is_box(space) else space for space in cast(gym.spaces.Tuple, env.observation_space)] + self.observation_space = gym.spaces.Tuple(spaces) # type: ignore + else: + raise NotImplementedError + + def observation(self, observation): + if self._is_tuple(self.observation_space): + return tuple(self._normalize(o, space) for (o, space) in zip(observation, self._original_observation_space)) + else: + return self._normalize(observation, self._original_observation_space) + + def _normalize(self, observation, space): + if not self._is_box(space): + return observation + range = space.high - space.low + return 2.0 * (observation - space.low) / range - 1 + + def _is_box(self, space): + return isinstance(space, gym.spaces.Box) + + def _is_tuple(self, space): + return isinstance(space, gym.spaces.Tuple) + + +class ScaleActionWrapper(gym.ActionWrapper): + """Action should be flatten in prior to merge.""" + + def __init__(self, env: Env): + super().__init__(env) + self._original_action_space = env.action_space + + if self._is_box(env.action_space): + self.action_space = gym.spaces.Box(low=-np.ones(shape=env.action_space.shape), + high=np.ones(shape=env.action_space.shape), + dtype=np.float32) + elif self._is_tuple(env.action_space): + spaces = [gym.spaces.Box(low=-np.ones(shape=space.shape), + high=np.ones(shape=space.shape), + dtype=np.float32) + if self._is_box(space) else space for space in cast(gym.spaces.Tuple, env.action_space)] + self.action_space = gym.spaces.Tuple(spaces) # type: ignore + else: + raise NotImplementedError + + def action(self, action): + if self._is_tuple(self.action_space): + return tuple(self._unnormalize(a, space) for (a, space) in zip(action, self._original_action_space)) + else: + return self._unnormalize(action, self._original_action_space) + + def reverse_action(self, action): + raise NotImplementedError + + def _unnormalize(self, action, space): + if not self._is_box(space): + return action + range = space.high - space.low + return 0.5 * (action + 1) * range + space.low + + def _is_box(self, space): + return isinstance(space, gym.spaces.Box) + + def _is_tuple(self, space): + return isinstance(space, gym.spaces.Tuple) + + +class MergeBoxActionWrapper(gym.ActionWrapper): + """Action should be flatten in prior to merge.""" + + def __init__(self, env: Env): + super().__init__(env) + original_action_space = cast(gym.spaces.Tuple, env.action_space) + self._original_action_size = [np.prod(space.shape) for space in original_action_space[1:]] + self._original_action_shape = [space.shape for space in original_action_space[1:]] + self._original_action_low = [space.low for space in original_action_space[1:]] + self._original_action_range = [space.high - space.low for space in original_action_space[1:]] + action_size = max(self._original_action_size) + d_action_space = original_action_space[0] + c_action_space = gym.spaces.Box(low=-np.ones(shape=(action_size, )), + high=np.ones(shape=(action_size, )), + dtype=np.float32) + self.action_space = gym.spaces.Tuple((d_action_space, c_action_space)) # type: ignore + + def action(self, action): + (d_action, c_action) = action + expanded_actions = [] + for i, size in enumerate(self._original_action_size): + shape = self._original_action_shape[i] + a = c_action[:size] + a = np.reshape(a, newshape=shape) + + low = self._original_action_low[i] + range = self._original_action_range[i] + a = (a + 1.0) / 2.0 * range + low if i == d_action else np.zeros(shape=shape) + expanded_actions.append(a) + return (d_action, *expanded_actions) + + +class EmbedActionWrapper(gym.ActionWrapper): + def __init__(self, env: Env): + super().__init__(env) + original_action_space = cast(gym.spaces.Tuple, env.action_space) + self.d_action_dim = original_action_space[0].n + self.c_action_dim = np.prod(original_action_space[1].shape) + self.action_space = self._create_action_space(env) + self.embed_map = np.random.normal(size=(self.d_action_dim, self.d_action_dim)) + + def action(self, action): + d_action = self._decode(action[:self.d_action_dim]) + c_action = action[self.d_action_dim:] + return (d_action, c_action) + + def reverse_action(self, action): + raise NotImplementedError + + def _decode(self, action): + return np.argmax((self.embed_map - action) ** 2, axis=0) + + def _create_action_space(self, env): + (d_space, c_space) = env.action_space + return gym.spaces.Box(-1, 1, shape=(d_space.n + np.prod(c_space.shape))) + + +class RemoveStepWrapper(gym.ObservationWrapper): + def __init__(self, env: Env): + super().__init__(env) + if not isinstance(env.observation_space, gym.spaces.Tuple): # type: ignore + raise ValueError('observation space is not a tuple!') + self.observation_space = cast(gym.spaces.Tuple, env.observation_space)[0] + + def observation(self, observation): + (state, _) = observation + return state diff --git a/nnabla_rl/model_trainers/__init__.py b/nnabla_rl/model_trainers/__init__.py index e1dbb969..fa1834a4 100644 --- a/nnabla_rl/model_trainers/__init__.py +++ b/nnabla_rl/model_trainers/__init__.py @@ -13,11 +13,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -from nnabla_rl.model_trainers import decision_transformer as dt_trainers # noqa +from nnabla_rl.model_trainers import decision_transformer as dt_trainers # noqa from nnabla_rl.model_trainers import dynamics as dynamics_trainers # noqa +from nnabla_rl.model_trainers import encoder as encoder_trainers # noqa from nnabla_rl.model_trainers import perturbator as perturbator_trainers # noqa from nnabla_rl.model_trainers import policy as policy_trainers # noqa from nnabla_rl.model_trainers import q_value as q_value_trainers # noqa from nnabla_rl.model_trainers import v_value as v_value_trainers # noqa -from nnabla_rl.model_trainers import encoder as encoder_trainers # noqa from nnabla_rl.model_trainers import reward as reward_trainiers # noqa diff --git a/nnabla_rl/model_trainers/encoder/__init__.py b/nnabla_rl/model_trainers/encoder/__init__.py index dd9adb39..c1b6af53 100644 --- a/nnabla_rl/model_trainers/encoder/__init__.py +++ b/nnabla_rl/model_trainers/encoder/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2021 Sony Group Corporation. +# Copyright 2021,2022,2023 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,5 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +from nnabla_rl.model_trainers.encoder.hyar_vae_trainer import ( # noqa + HyARVAETrainer, HyARVAETrainerConfig) from nnabla_rl.model_trainers.encoder.kld_variational_auto_encoder_trainer import ( # noqa KLDVariationalAutoEncoderTrainer, KLDVariationalAutoEncoderTrainerConfig) diff --git a/nnabla_rl/model_trainers/encoder/hyar_vae_trainer.py b/nnabla_rl/model_trainers/encoder/hyar_vae_trainer.py new file mode 100644 index 00000000..0062cb59 --- /dev/null +++ b/nnabla_rl/model_trainers/encoder/hyar_vae_trainer.py @@ -0,0 +1,145 @@ +# Copyright 2023 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, Sequence, Union, cast + +import gym +import numpy as np + +import nnabla as nn +import nnabla.functions as NF +import nnabla_rl.functions as RNF +from nnabla_rl.distributions import Gaussian +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 HyARVAE, Model +from nnabla_rl.utils.data import set_data_to_variable +from nnabla_rl.utils.misc import create_variable + + +@dataclass +class HyARVAETrainerConfig(TrainerConfig): + beta: float = 1.0 + + +class HyARVAETrainer(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: HyARVAETrainerConfig + _encoder_loss: nn.Variable # Training loss/output + + def __init__(self, + models: Union[HyARVAE, Sequence[HyARVAE]], + solvers: Dict[str, nn.solver.Solver], + env_info: EnvironmentInfo, + config: HyARVAETrainerConfig = HyARVAETrainerConfig()): + super().__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): + 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.s_next, b.s_next) + + # update model + for solver in solvers.values(): + solver.zero_grad() + self._encoder_loss.forward(clear_no_need_grad=True) + self._encoder_loss.backward(clear_buffer=True) + for solver in solvers.values(): + solver.update() + + trainer_state = {} + trainer_state['encoder_loss'] = self._encoder_loss.d.copy() + trainer_state['kl_loss'] = self._kl_loss.d.copy() + trainer_state['reconstruction_loss'] = self._reconstruction_loss.d.copy() + trainer_state['dyn_loss'] = self._dyn_loss.d.copy() + return trainer_state + + def _build_training_graph(self, models: Union[Model, Sequence[Model]], training_variables: TrainingVariables): + self._encoder_loss = 0 + models = cast(Sequence[HyARVAE], models) + 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): + batch_size = training_variables.batch_size + + models = cast(Sequence[HyARVAE], models) + for vae in models: + action1, action2 = training_variables.a_current + action_space = cast(gym.spaces.Tuple, self._env_info.action_space) + xk = action1 if isinstance(action_space[0], gym.spaces.Box) else action2 + latent_distribution, (xk_tilde, ds_tilde) = vae.encode_and_decode(x=xk, + state=training_variables.s_current, + action=training_variables.a_current) + + latent_shape = (batch_size, latent_distribution.ndim) + target_latent_distribution = Gaussian( + mean=nn.Variable.from_numpy_array(np.zeros(shape=latent_shape, dtype=np.float32)), + ln_var=nn.Variable.from_numpy_array(np.zeros(shape=latent_shape, dtype=np.float32)) + ) + + reconstruction_loss = RNF.mean_squared_error(xk, xk_tilde) + kl_divergence = latent_distribution.kl_divergence(target_latent_distribution) + latent_loss = NF.mean(kl_divergence) + + ds = cast(nn.Variable, training_variables.s_next) - cast(nn.Variable, training_variables.s_current) + prediction_loss = RNF.mean_squared_error(ds, ds_tilde) + assert reconstruction_loss.shape == latent_loss.shape + assert reconstruction_loss.shape == prediction_loss.shape + # dividing by ndim to match author's code + kl_loss = 0.5 * latent_loss / latent_distribution.ndim + reconstruction_loss = 2.0 * reconstruction_loss + dyn_loss = self._config.beta * prediction_loss + + self._kl_loss = kl_loss + self._reconstruction_loss = reconstruction_loss + self._dyn_loss = dyn_loss + self._kl_loss.persistent = True + self._reconstruction_loss.persistent = True + self._dyn_loss.persistent = True + + self._encoder_loss += 0.0 if ignore_loss else kl_loss + reconstruction_loss + dyn_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) + s_next_var = create_variable(batch_size, self._env_info.state_shape) + + return TrainingVariables(batch_size, s_current_var, a_current_var, s_next=s_next_var) + + @property + def loss_variables(self) -> Dict[str, nn.Variable]: + return {"encoder_loss": self._encoder_loss} + + def support_rnn(self) -> bool: + # TODO: support rnn model + return False diff --git a/nnabla_rl/model_trainers/policy/__init__.py b/nnabla_rl/model_trainers/policy/__init__.py index 8379f48e..e3967cbe 100644 --- a/nnabla_rl/model_trainers/policy/__init__.py +++ b/nnabla_rl/model_trainers/policy/__init__.py @@ -17,6 +17,7 @@ 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 from nnabla_rl.model_trainers.policy.her_policy_trainer import HERPolicyTrainer, HERPolicyTrainerConfig # noqa +from nnabla_rl.model_trainers.policy.hyar_policy_trainer import HyARPolicyTrainer, HyARPolicyTrainerConfig # noqa from nnabla_rl.model_trainers.policy.ppo_policy_trainer import PPOPolicyTrainer, PPOPolicyTrainerConfig # noqa from nnabla_rl.model_trainers.policy.soft_policy_trainer import SoftPolicyTrainer, SoftPolicyTrainerConfig # noqa from nnabla_rl.model_trainers.policy.reinforce_policy_trainer import REINFORCEPolicyTrainer, REINFORCEPolicyTrainerConfig # noqa diff --git a/nnabla_rl/model_trainers/policy/hyar_policy_trainer.py b/nnabla_rl/model_trainers/policy/hyar_policy_trainer.py new file mode 100644 index 00000000..10e14618 --- /dev/null +++ b/nnabla_rl/model_trainers/policy/hyar_policy_trainer.py @@ -0,0 +1,141 @@ +# Copyright 2023 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 Any, Dict, List, 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, TrainingBatch, TrainingVariables, rnn_support +from nnabla_rl.model_trainers.policy import DPGPolicyTrainer, DPGPolicyTrainerConfig +from nnabla_rl.models import DeterministicPolicy, Model, QFunction +from nnabla_rl.utils.data import set_data_to_variable + + +@dataclass +class HyARPolicyTrainerConfig(DPGPolicyTrainerConfig): + p_min: Union[np.ndarray, None] = None + p_max: Union[np.ndarray, None] = None + + +class HyARPolicyTrainer(DPGPolicyTrainer): + # 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 + _grads_sum: nn.Variable + _config: HyARPolicyTrainerConfig + _action_and_grads: Dict[str, List[Tuple[nn.Variable, nn.Variable]]] + + def __init__(self, + models: Union[DeterministicPolicy, Sequence[DeterministicPolicy]], + solvers: Dict[str, nn.solver.Solver], + q_function: QFunction, + env_info: EnvironmentInfo, + config: HyARPolicyTrainerConfig = HyARPolicyTrainerConfig()): + super().__init__(models, solvers, q_function, 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.non_terminal, b.non_terminal) + + for model in models: + if not model.is_recurrent(): + continue + # Check batch keys. Because it can be empty. + # If batch does not provide rnn states, train with zero initial state. + if model.scope_name not in batch.rnn_states.keys(): + continue + b_rnn_states = b.rnn_states[model.scope_name] + t_rnn_states = t.rnn_states[model.scope_name] + + for state_name in t_rnn_states.keys(): + set_data_to_variable(t_rnn_states[state_name], b_rnn_states[state_name]) + if self._q_function.is_recurrent() and self._q_function.scope_name in batch.rnn_states.keys(): + b_rnn_states = b.rnn_states[self._q_function.scope_name] + t_rnn_states = t.rnn_states[self._q_function.scope_name] + for state_name in t_rnn_states.keys(): + set_data_to_variable(t_rnn_states[state_name], b_rnn_states[state_name]) + + # update model + self._grads_sum.forward() + for solver in solvers.values(): + solver.zero_grad() + for action_grad_list in self._action_and_grads.values(): + for action, grad in action_grad_list: + action.backward(grad=-grad.d) + for solver in solvers.values(): + solver.update() + + trainer_state: Dict[str, Any] = {'pi_loss': 0} + return trainer_state + + def _build_training_graph(self, models: Sequence[Model], training_variables: TrainingVariables): + models = cast(Sequence[DeterministicPolicy], models) + self._action_and_grads = {policy.scope_name: [] for policy in models} + self._grads_sum = 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): + models = cast(Sequence[DeterministicPolicy], models) + train_rnn_states = training_variables.rnn_states + for policy in models: + prev_rnn_states = self._prev_policy_rnn_states + with rnn_support(policy, prev_rnn_states, train_rnn_states, training_variables, self._config): + action = policy.pi(training_variables.s_current) + + prev_rnn_states = self._prev_q_rnn_states[policy.scope_name] + with rnn_support(self._q_function, prev_rnn_states, train_rnn_states, training_variables, self._config): + action_grad = self._compute_q_grad_wrt_action(training_variables.s_current, action, self._q_function) + action_grad = self._invert_gradients(action, action_grad, self._p_min, self._p_max) + action_grad.persistent = True + self._prev_q_rnn_states[policy.scope_name] = prev_rnn_states + if not ignore_loss: + self._action_and_grads[policy.scope_name].append((action, action_grad)) + self._grads_sum += action_grad + + def _compute_q_grad_wrt_action(self, state: nn.Variable, action: nn.Variable, q_function: QFunction): + q = NF.mean(q_function.q(state, action)) + return nn.grad(outputs=[q], inputs=action)[0] + + def _invert_gradients(self, p: nn.Variable, grads: nn.Variable, p_min: nn.Variable, p_max: nn.Variable): + increasing = NF.greater_equal_scalar(grads, val=0) + decreasing = NF.less_scalar(grads, val=0) + p_range = (p_max - p_min) + return grads * increasing * (p_max - p) / p_range + grads * decreasing * (p - p_min) / p_range + + @property + def _p_min(self) -> nn.Variable: + return nn.Variable.from_numpy_array(self._config.p_min) + + @property + def _p_max(self) -> nn.Variable: + return nn.Variable.from_numpy_array(self._config.p_max) + + def support_rnn(self) -> bool: + # TODO: support rnn + return False diff --git a/nnabla_rl/model_trainers/q_value/__init__.py b/nnabla_rl/model_trainers/q_value/__init__.py index b6826eb9..a7a12c71 100644 --- a/nnabla_rl/model_trainers/q_value/__init__.py +++ b/nnabla_rl/model_trainers/q_value/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2021,2022 Sony Group Corporation. +# Copyright 2021,2022,2023 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. @@ -28,6 +28,8 @@ DQNQTrainer, DQNQTrainerConfig) from nnabla_rl.model_trainers.q_value.her_q_trainer import ( # noqa HERQTrainer, HERQTrainerConfig) +from nnabla_rl.model_trainers.q_value.hyar_q_trainer import ( # noqa + HyARQTrainer, HyARQTrainerConfig) from nnabla_rl.model_trainers.q_value.iqn_q_trainer import ( # noqa IQNQTrainer, IQNQTrainerConfig) from nnabla_rl.model_trainers.q_value.munchausen_rl_q_trainer import ( # noqa diff --git a/nnabla_rl/model_trainers/q_value/hyar_q_trainer.py b/nnabla_rl/model_trainers/q_value/hyar_q_trainer.py new file mode 100644 index 00000000..89726ae2 --- /dev/null +++ b/nnabla_rl/model_trainers/q_value/hyar_q_trainer.py @@ -0,0 +1,193 @@ +# Copyright 2023 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 Any, Dict, Sequence, Tuple, Union, cast + +import gym + +import nnabla as nn +import nnabla.functions as NF +import nnabla_rl.functions as RF +from nnabla_rl.environments.environment_info import EnvironmentInfo +from nnabla_rl.model_trainers.model_trainer import TrainingBatch, TrainingVariables +from nnabla_rl.model_trainers.q_value.td3_q_trainer import TD3QTrainer, TD3QTrainerConfig +from nnabla_rl.models import DeterministicPolicy, HyARVAE, Model, QFunction +from nnabla_rl.utils.data import set_data_to_variable +from nnabla_rl.utils.misc import create_variable + + +@dataclass +class HyARQTrainerConfig(TD3QTrainerConfig): + noisy_action_max: float = 1.0 + noisy_action_min: float = -1.0 + embed_action_max: float = 1.0 + embed_action_min: float = -1.0 + embed_action_noise_sigma: float = 0.1 + embed_action_noise_abs: float = 1.0 + embed_dim: int = 6 + latent_dim: int = 6 + + +class HyARQTrainer(TD3QTrainer): + # 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 + _target_functions: Sequence[QFunction] + _target_policy: DeterministicPolicy + _config: HyARQTrainerConfig + + def __init__(self, + train_functions: Union[QFunction, Sequence[QFunction]], + solvers: Dict[str, nn.solver.Solver], + target_functions: Union[QFunction, Sequence[QFunction]], + target_policy: DeterministicPolicy, + vae: HyARVAE, + env_info: EnvironmentInfo, + config: HyARQTrainerConfig = HyARQTrainerConfig()): + self._vae = vae + super().__init__(train_functions, solvers, target_functions, target_policy, env_info, config) + + def _compute_target(self, training_variables: TrainingVariables, **kwargs) -> nn.Variable: + gamma = training_variables.gamma + reward = training_variables.reward + non_terminal = training_variables.non_terminal + s_next = training_variables.s_next + + a_next = self._compute_noisy_action(s_next) + a_next.need_grad = False + + q_values = [] + for target_q_function in self._target_functions: + q_value = target_q_function.q(s_next, a_next) + q_values.append(q_value) + # Use the minimum among computed q_values by default + target_q = RF.minimum_n(q_values) + target_q.persistent = True + return reward + gamma * non_terminal * target_q + + def _compute_noisy_action(self, state): + a_next_var = self._target_policy.pi(state) + epsilon = NF.clip_by_value(NF.randn(sigma=self._config.train_action_noise_sigma, shape=a_next_var.shape), + min=-self._config.train_action_noise_abs, + max=self._config.train_action_noise_abs) + a_tilde_var = a_next_var + epsilon + a_tilde_var = NF.clip_by_value(a_tilde_var, self._config.noisy_action_min, self._config.noisy_action_max) + return a_tilde_var + + def _update_model(self, + models: Sequence[Model], + solvers: Dict[str, Any], + batch: TrainingBatch, + training_variables: TrainingVariables, + **kwargs): + for t, b in zip(training_variables, batch): + set_data_to_variable(t.extra['e'], b.extra['e']) + set_data_to_variable(t.extra['z'], b.extra['z']) + set_data_to_variable(t.extra['c_rate'], b.extra['c_rate']) + set_data_to_variable(t.extra['ds_rate'], b.extra['ds_rate']) + result = super()._update_model(models, solvers, batch, training_variables, **kwargs) + return result + + def _compute_loss(self, + model: QFunction, + target_q: nn.Variable, + training_variables: TrainingVariables) -> Tuple[nn.Variable, Dict[str, nn.Variable]]: + e = training_variables.extra['e'] + z = training_variables.extra['z'] + + e, z = self._reweight_action(e, z, training_variables) + latent_action = NF.concatenate(e, z) + latent_action.need_grad = False + + s_current = training_variables.s_current + q = model.q(s_current, latent_action) + td_error = target_q - q + + q_loss = 0 + if self._config.loss_type == 'squared': + squared_td_error = training_variables.weight * NF.pow_scalar(td_error, 2.0) + else: + raise RuntimeError + if self._config.reduction_method == 'mean': + q_loss += self._config.q_loss_scalar * NF.mean(squared_td_error) + else: + raise RuntimeError + extra = {'td_error': td_error} + return q_loss, extra + + def _reweight_action(self, e, z, training_variables: TrainingVariables): + c_rate = training_variables.extra['c_rate'] + ds_rate = training_variables.extra['ds_rate'] + + s_current = training_variables.s_current + s_next = training_variables.s_next + action1, action2 = training_variables.a_current + action_space = cast(gym.spaces.Tuple, self._env_info.action_space) + a_continuous, a_discrete = (action1, action2) if isinstance( + action_space[0], gym.spaces.Box) else (action2, action1) + + a_discrete_emb = self._vae.encode_discrete_action(a_discrete) + a_discrete_emb = NF.clip_by_value(a_discrete_emb, + self._config.embed_action_min, + self._config.embed_action_max) + noise = NF.clip_by_value(NF.randn(shape=a_discrete_emb.shape) * self._config.embed_action_noise_sigma, + -self._config.embed_action_noise_abs, + self._config.embed_action_noise_abs) + a_discrete_emb_with_noise = NF.clip_by_value(a_discrete_emb + noise, + self._config.embed_action_min, + self._config.embed_action_max) + + a_discrete_new = a_discrete + a_discrete_old = self._vae.decode_discrete_action(e) + d_mix_rate = NF.equal(a_discrete_new, a_discrete_old) + + e_mixed = d_mix_rate * e + (1.0 - d_mix_rate) * a_discrete_emb_with_noise + + _, ds_model = self._vae.decode(z=z, state=s_current, e=a_discrete_emb) + ds_data = cast(nn.Variable, s_next) - cast(nn.Variable, s_current) + actual_ds_rate = NF.reshape(NF.mean(NF.squared_error(ds_model, ds_data), axis=1), shape=(-1, 1)) + actual_ds_rate = NF.abs(actual_ds_rate) + c_mix_rate = NF.less_equal(actual_ds_rate, ds_rate) + + z_encoded = self._vae.encode(x=a_continuous, state=s_current, e=a_discrete_emb) + z_encoded = self._apply_c_rate(z_encoded, c_rate) + z_mixed = c_mix_rate * z + (1.0 - c_mix_rate) * z_encoded + + e_mixed = NF.clip_by_value(e_mixed, self._config.embed_action_min, self._config.embed_action_max) + z_mixed = NF.clip_by_value(z_mixed, self._config.embed_action_min, self._config.embed_action_max) + return e_mixed, z_mixed + + def _apply_c_rate(self, z, c_rate): + median = 0.5 * (c_rate[0] - c_rate[1]) + offset = c_rate[0] - median + median = NF.reshape(median, shape=(1, -1)) + offset = NF.reshape(offset, shape=(1, -1)) + z = (z - offset) / median + return z + + def _setup_training_variables(self, batch_size: int) -> TrainingVariables: + training_variables = super()._setup_training_variables(batch_size) + + extras = {} + extras['e'] = create_variable(batch_size, (self._config.embed_dim, )) + extras['z'] = create_variable(batch_size, (self._config.latent_dim, )) + extras['ds_rate'] = create_variable(1, (1, )) + extras['c_rate'] = create_variable(1, ((self._config.latent_dim, ), (self._config.latent_dim, ))) + + training_variables.extra.update(extras) + return training_variables + + def support_rnn(self) -> bool: + return False diff --git a/nnabla_rl/models/__init__.py b/nnabla_rl/models/__init__.py index 2bd0fd8a..d78b9d1d 100644 --- a/nnabla_rl/models/__init__.py +++ b/nnabla_rl/models/__init__.py @@ -70,3 +70,7 @@ from nnabla_rl.models.classic_control.policies import REINFORCEContinousPolicy, REINFORCEDiscretePolicy # noqa from nnabla_rl.models.classic_control.dynamics import MPPIDeterministicDynamics # noqa + +from nnabla_rl.models.hybrid_env.encoders import HyARVAE # noqa +from nnabla_rl.models.hybrid_env.policies import HyARPolicy # noqa +from nnabla_rl.models.hybrid_env.q_functions import HyARQFunction # noqa diff --git a/nnabla_rl/models/hybrid_env/__init__.py b/nnabla_rl/models/hybrid_env/__init__.py new file mode 100644 index 00000000..48e5feeb --- /dev/null +++ b/nnabla_rl/models/hybrid_env/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2023 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/nnabla_rl/models/hybrid_env/encoders.py b/nnabla_rl/models/hybrid_env/encoders.py new file mode 100644 index 00000000..b674b785 --- /dev/null +++ b/nnabla_rl/models/hybrid_env/encoders.py @@ -0,0 +1,174 @@ +# Copyright 2023 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, Dict, 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.functions as RF +import nnabla_rl.initializers as RI +from nnabla_rl.distributions import Distribution, Gaussian +from nnabla_rl.models import VariationalAutoEncoder + + +class HyARVAE(VariationalAutoEncoder): + """Variational Auto Encoder model proposed by Li et al. + + in the HyAR paper. + See: https://arxiv.org/abs/2109.05490 + """ + + def __init__(self, + scope_name: str, + state_dim, + action_dim, + encode_dim, + embed_dim): + super().__init__(scope_name) + self._state_dim = state_dim + self._action_dim = action_dim + self._encode_dim = encode_dim + + self._class_num, self._latent_dim = action_dim + self._embed_dim = embed_dim + + def __deepcopy__(self, memodict: Dict[Any, Any] = {}): + # nn.Variable cannot be deepcopied directly + return self.__class__(self._scope_name, self._state_dim, self._action_dim, self._encode_dim, self._embed_dim) + + def encode(self, x: nn.Variable, **kwargs) -> nn.Variable: + latent_distribution = self.latent_distribution(x, **kwargs) + return latent_distribution.sample() + + def encode_and_decode(self, x: nn.Variable, **kwargs) -> Tuple[Distribution, Any]: + if 'action' in kwargs: + (d_action, _) = kwargs['action'] + e = self.encode_discrete_action(d_action) + elif 'e' in kwargs: + e = kwargs['e'] + else: + raise NotImplementedError + + latent_distribution = self.latent_distribution(x, e=e, state=kwargs['state']) + z = latent_distribution.sample() + reconstructed = self.decode(z, e=e, state=kwargs['state']) + return latent_distribution, reconstructed + + def decode(self, z: Any, **kwargs) -> nn.Variable: + state = kwargs['state'] + if 'action' in kwargs: + (d_action, _) = kwargs['action'] + action = self.encode_discrete_action(d_action) + elif 'e' in kwargs: + action = kwargs['e'] + else: + raise NotImplementedError + + with nn.parameter_scope(self._scope_name): + with nn.parameter_scope('decoder'): + c = NF.concatenate(state, action) + linear1_init = RI.HeUniform(inmaps=c.shape[1], outmaps=256, factor=1/3) + c = NF.relu(NPF.affine(c, n_outmaps=256, name='linear1', w_init=linear1_init, b_init=linear1_init)) + linear2_init = RI.HeUniform(inmaps=z.shape[1], outmaps=256, factor=1/3) + z = NF.relu(NPF.affine(z, n_outmaps=256, name='linear2', w_init=linear2_init, b_init=linear2_init)) + + h = z * c + linear3_init = RI.HeUniform(inmaps=h.shape[1], outmaps=256, factor=1/3) + h = NF.relu(NPF.affine(h, n_outmaps=256, name='linear3', w_init=linear3_init, b_init=linear3_init)) + linear4_init = RI.HeUniform(inmaps=h.shape[1], outmaps=256, factor=1/3) + h = NF.relu(NPF.affine(h, n_outmaps=256, name='linear4', w_init=linear4_init, b_init=linear4_init)) + + linear5_init = RI.HeUniform(inmaps=h.shape[1], outmaps=256, factor=1/3) + ds = NF.relu(NPF.affine(h, n_outmaps=256, name='linear5', w_init=linear5_init, b_init=linear5_init)) + linear6_init = RI.HeUniform(inmaps=ds.shape[1], outmaps=self._state_dim, factor=1/3) + ds = NPF.affine(ds, n_outmaps=self._state_dim, name='linear6', w_init=linear6_init, b_init=linear6_init) + + linear7_init = RI.HeUniform(inmaps=h.shape[1], outmaps=self._latent_dim, factor=1/3) + x = NPF.affine(h, n_outmaps=self._latent_dim, name='linear7', w_init=linear7_init, b_init=linear7_init) + return NF.tanh(x), NF.tanh(ds) + + def decode_multiple(self, z, decode_num: int, **kwargs): + raise NotImplementedError + + def latent_distribution(self, x: nn.Variable, **kwargs) -> Distribution: + state = kwargs['state'] + if 'action' in kwargs: + (d_action, _) = kwargs['action'] + action = self.encode_discrete_action(d_action) + elif 'e' in kwargs: + action = kwargs['e'] + else: + raise NotImplementedError + + with nn.parameter_scope(self._scope_name): + with nn.parameter_scope('encoder'): + c = NF.concatenate(state, action) + linear1_init = RI.HeUniform(inmaps=c.shape[1], outmaps=256, factor=1/3) + c = NF.relu(NPF.affine(c, n_outmaps=256, name='linear1', + w_init=linear1_init, b_init=linear1_init)) + linear2_init = RI.HeUniform(inmaps=x.shape[1], outmaps=256, factor=1/3) + x = NF.relu(NPF.affine(x, n_outmaps=256, name='linear2', + w_init=linear2_init, b_init=linear2_init)) + + h = x * c + linear3_init = RI.HeUniform(inmaps=h.shape[1], outmaps=256, factor=1/3) + h = NF.relu(NPF.affine(h, n_outmaps=256, name='linear3', + w_init=linear3_init, b_init=linear3_init)) + linear4_init = RI.HeUniform(inmaps=h.shape[1], outmaps=256, factor=1/3) + h = NF.relu(NPF.affine(h, n_outmaps=256, name='linear4', + w_init=linear4_init, b_init=linear4_init)) + linear5_init = RI.HeUniform(inmaps=h.shape[1], outmaps=self._encode_dim*2, factor=1/3) + h = NPF.affine(h, n_outmaps=self._encode_dim*2, name='linear5', + w_init=linear5_init, b_init=linear5_init) + reshaped = NF.reshape(h, shape=(-1, 2, self._encode_dim)) + mean, ln_var = NF.split(reshaped, axis=1) + ln_var = NF.clip_by_value(ln_var, min=-8, max=30) + + return Gaussian(mean, ln_var) + + def encode_discrete_action(self, action): + with nn.parameter_scope(self.scope_name): + with nn.parameter_scope("embed"): + embedding = NPF.embed(action, + n_inputs=self._class_num, + n_features=self._embed_dim, + initializer=NI.UniformInitializer()) + embedding = NF.reshape(embedding, shape=(-1, self._embed_dim)) + embedding = NF.tanh(embedding) + return embedding + + def decode_discrete_action(self, action_embedding): + with nn.parameter_scope(self.scope_name): + with nn.parameter_scope("embed"): + label_embedding = NPF.embed(self._labels, + n_inputs=self._class_num, + n_features=self._embed_dim, + initializer=NI.UniformInitializer()) + label_embedding = NF.reshape(label_embedding, shape=(-1, self._class_num, self._embed_dim)) + label_embedding = NF.tanh(label_embedding) + + action_embedding = NF.reshape(action_embedding, shape=(action_embedding.shape[0], 1, self._embed_dim)) + similarity = -NF.sum(NF.squared_error(label_embedding, action_embedding), axis=-1) + d_action = RF.argmax(similarity, axis=1, keepdims=True) + return d_action + + @property + def _labels(self) -> nn.Variable: + labels = np.array( + [label for label in range(self._class_num)], dtype=np.int32) + labels = np.reshape(labels, newshape=(1, self._class_num)) + return nn.Variable.from_numpy_array(labels) diff --git a/nnabla_rl/models/hybrid_env/policies.py b/nnabla_rl/models/hybrid_env/policies.py new file mode 100644 index 00000000..c265cd29 --- /dev/null +++ b/nnabla_rl/models/hybrid_env/policies.py @@ -0,0 +1,48 @@ +# Copyright 2023 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 nnabla as nn +import nnabla.functions as NF +import nnabla.parametric_functions as NPF +import nnabla_rl.initializers as RI +from nnabla_rl.models.policy import DeterministicPolicy + + +class HyARPolicy(DeterministicPolicy): + """Actor model proposed by Li et al. + + in the HyAR paper. + See: https://arxiv.org/abs/2109.05490 + """ + # 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 + _max_action_value: float + + def __init__(self, scope_name: str, action_dim: int, max_action_value: float): + super(HyARPolicy, self).__init__(scope_name) + self._action_dim = action_dim + self._max_action_value = max_action_value + + def pi(self, s: nn.Variable) -> nn.Variable: + with nn.parameter_scope(self.scope_name): + linear1_init = RI.HeUniform(inmaps=s.shape[1], outmaps=256, factor=1/3) + h = NPF.affine(s, n_outmaps=256, name="linear1", w_init=linear1_init, b_init=linear1_init) + h = NF.relu(x=h) + linear2_init = RI.HeUniform(inmaps=h.shape[1], outmaps=256, factor=1/3) + h = NPF.affine(h, n_outmaps=256, name="linear2", w_init=linear2_init, b_init=linear2_init) + h = NF.relu(x=h) + linear3_init = RI.HeUniform(inmaps=h.shape[1], outmaps=self._action_dim, factor=1/3) + h = NPF.affine(h, n_outmaps=self._action_dim, name="linear3", w_init=linear3_init, b_init=linear3_init) + return NF.tanh(h) * self._max_action_value diff --git a/nnabla_rl/models/hybrid_env/q_functions.py b/nnabla_rl/models/hybrid_env/q_functions.py new file mode 100644 index 00000000..e2ecb9a5 --- /dev/null +++ b/nnabla_rl/models/hybrid_env/q_functions.py @@ -0,0 +1,48 @@ +# Copyright 2023 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 nnabla as nn +import nnabla.functions as NF +import nnabla.parametric_functions as NPF +import nnabla_rl.initializers as RI +from nnabla_rl.models import ContinuousQFunction + + +class HyARQFunction(ContinuousQFunction): + """Q-function model proposed by Li et al. + + in the HyAR paper. + See: https://arxiv.org/abs/2109.05490 + """ + # 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 + _max_action_value: float + + def __init__(self, scope_name: str): + super(HyARQFunction, self).__init__(scope_name) + + def q(self, s: nn.Variable, a: nn.Variable) -> nn.Variable: + with nn.parameter_scope(self.scope_name): + h = NF.concatenate(s, a) + linear1_init = RI.HeUniform(inmaps=h.shape[1], outmaps=256, factor=1/3) + h = NPF.affine(h, n_outmaps=256, name="linear1", + w_init=linear1_init, b_init=linear1_init) + h = NF.relu(x=h) + linear2_init = RI.HeUniform(inmaps=h.shape[1], outmaps=256, factor=1/3) + h = NPF.affine(h, n_outmaps=256, name="linear2", + w_init=linear2_init, b_init=linear2_init) + h = NF.relu(x=h) + linear3_init = RI.HeUniform(inmaps=h.shape[1], outmaps=1, factor=1/3) + return NPF.affine(h, n_outmaps=1, name="linear3", + w_init=linear3_init, b_init=linear3_init) diff --git a/reproductions/algorithms/hybrid_env/hyar/.gitignore b/reproductions/algorithms/hybrid_env/hyar/.gitignore new file mode 100644 index 00000000..cd22311a --- /dev/null +++ b/reproductions/algorithms/hybrid_env/hyar/.gitignore @@ -0,0 +1,6 @@ +*v0_results/** +**/best/+* +*.h5 +*.pickle +*.json + diff --git a/reproductions/algorithms/hybrid_env/hyar/README.md b/reproductions/algorithms/hybrid_env/hyar/README.md new file mode 100644 index 00000000..88c64e2b --- /dev/null +++ b/reproductions/algorithms/hybrid_env/hyar/README.md @@ -0,0 +1,105 @@ +# HyAR (Hybrid Action Representation) reproduction + +This reproduction script trains the HyAR (Hybrid Action Representation) algorithm proposed by Li, et al. in the paper: +[HyAR: Addressing Discrete-Continuous Action Reinfocement Learning via Hybrid Action Representation](https://openreview.net/pdf?id=64trBbOhdGU). + +## Prerequisites + +Install gym-goal and/or gym-platform package from [this](https://github.com/cycraig/gym-goal) and [this](https://github.com/cycraig/gym-goal) github repository. + +```sh +$ pip install -e git+https://github.com/cycraig/gym-goal#egg=gym_goal +``` + +```sh +$ pip install -e git+https://github.com/cycraig/gym-platform#egg=gym_platform +``` + +## Note + +If you encounter the following error, update the gym version to 0.25.2 (Not gymnasium). + +```sh + File "/home/ishihara/github/nnabla-rl/.venv/lib/python3.9/site-packages/gym/utils/passive_env_checker.py", line 247, in passive_env_reset_check + _check_obs(obs, env.observation_space, "reset") + File "/home/ishihara/github/nnabla-rl/.venv/lib/python3.9/site-packages/gym/utils/passive_env_checker.py", line 113, in _check_obs + assert observation_space.contains( +AssertionError: The observation returned by the `reset()` method is not contained with the observation space (Tuple(Box([ -0. -15. -1. -1. -3.1415927 -0. + -15. -1. -1. -3.1415927 -0. -15. + -3. -3. ], [20. 15. 1. 1. 3.1415927 20. + 15. 1. 1. 3.1415927 20. 15. + 3. 3. ], (14,), float32), Discrete(200))) +``` + +```sh +$ pip install gym==0.25.2 +``` + +## How to run the reproduction script + +To run the reproduction script do + +```sh +$ python hyar_reproduction.py +``` + +If you omit options, the script will run on Goal-v0 environment with gpu id 0. + +You can change the training environment and gpu as follows + +```sh +$ python hyar_reproduction.py --env --gpu +``` + +```sh +# Example1: run the script on cpu and train the agent with Platform: +$ python hyar_reproduction.py --env Platform --gpu -1 +# Example2: run the script on gpu 1 and train the agent with Goal: +$ python hyar_reproduction.py --env Goal-v0 --gpu 1 +``` + +To check all available options type: + +```sh +$ python hyar_reproduction.py --help +``` + +To check the trained result do + +```sh +$ python hyar_reproduction.py --showcase --snapshot-dir --render +``` + +```sh +# Example: +$ python hyar_reproduction.py --showcase --snapshot-dir ./Platform-v0/seed-1/iteration-250000/ --render +``` + +## Evaluation procedure + +We tested our implementation with the following hybrid environments also used in the [original paper](https://openreview.net/pdf?id=64trBbOhdGU) using 3 different initial random seeds: + +- Goal-v0 +- Platform-v0 + +## Result + +Result of our implementation is the average of 3 different initial random seeds. + +Our implementation seems to perform worse in Goal-v0 environment compared to the original author's implementation. We checked the original author's implementation to find the cause of performance degredation but we could not figure out the difference. +(We are looking forward to have pull requests if anyone finds the fix to this issue) + +|Env|nnabla_rl best mean score|Reported score| +|:---|:---:|:---:| +|Goal-v0|25.569+/-28.464|~35| +|Platform-v0|1.0+/-0.004|~0.95| + +## Learning curves + +### Goal-v0 + +![Goal-v0 Result](reproduction_results/Goal-v0_results/result.png) + +### Platform-v0 + +![Platform-v0 Result](reproduction_results/Platform-v0_results/result.png) diff --git a/reproductions/algorithms/hybrid_env/hyar/goal_env_wrapper.py b/reproductions/algorithms/hybrid_env/hyar/goal_env_wrapper.py new file mode 100644 index 00000000..81a2f8f5 --- /dev/null +++ b/reproductions/algorithms/hybrid_env/hyar/goal_env_wrapper.py @@ -0,0 +1,73 @@ +# Copyright 2023 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. + +# We referred original author's code for this additional modification to Goal-v0 environment. +# See the supplemental material of the HyAR's paper. + +import gym +import gym.spaces +import numpy as np +from gym_goal.envs.goal_env import GOAL_WIDTH, PITCH_LENGTH + + +class ExtendedGoalEnvWrapper(gym.ObservationWrapper): + def __init__(self, env): + super().__init__(env) + original_observation_space = env.observation_space.spaces[0] + extended_observation_shape = (17,) + + low = np.zeros(extended_observation_shape) + low[:14] = original_observation_space.low + low[14] = -1. + low[15] = -1. + low[16] = -GOAL_WIDTH / 2 + + high = np.ones(extended_observation_shape) + high[:14] = original_observation_space.high + high[14] = 1. + high[15] = 1. + high[16] = GOAL_WIDTH + + max_steps = 200 + self.observation_space = gym.spaces.Tuple((gym.spaces.Box(low=low, high=high, dtype=np.float32), + gym.spaces.Discrete(max_steps))) + + def observation(self, obs): + state, steps = obs + ball_feature = self._ball_feature(state) + gk_feature = self._gk_feature(state) + state = np.concatenate((state, ball_feature, gk_feature)) + return (state, steps) + + def _gk_feature(self, state): + (ball_x, ball_y) = self._ball_position(state) + (gk_x, gk_y) = self._gk_position(state) + if gk_x == ball_x: + feature = -GOAL_WIDTH / 2 if gk_y < ball_y else GOAL_WIDTH / 2 + else: + grad = (gk_y - ball_y) / (gk_x - ball_x) + feature = grad * PITCH_LENGTH / 2 + ball_y - grad * ball_x + feature = np.asarray([feature]) + return np.clip(feature, -GOAL_WIDTH / 2, GOAL_WIDTH) + + def _ball_feature(self, state): + ball = np.asarray(self._ball_position(state)) + gk = np.asarray(self._gk_position(state)) + return (ball - gk) / np.linalg.norm(ball - gk) + + def _ball_position(self, state): + return state[10], state[11] + + def _gk_position(self, state): + return state[5], state[6] diff --git a/reproductions/algorithms/hybrid_env/hyar/hyar_reproduction.py b/reproductions/algorithms/hybrid_env/hyar/hyar_reproduction.py new file mode 100644 index 00000000..64916cdc --- /dev/null +++ b/reproductions/algorithms/hybrid_env/hyar/hyar_reproduction.py @@ -0,0 +1,165 @@ +# Copyright 2023 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 gym + +import nnabla_rl.hooks as H +import nnabla_rl.writers as W +from nnabla_rl.algorithms import HyAR, HyARConfig +from nnabla_rl.environments.wrappers import NumpyFloat32Env, ScreenRenderEnv +from nnabla_rl.environments.wrappers.common import PrintEpisodeResultEnv +from nnabla_rl.environments.wrappers.hybrid_env import (FlattenActionWrapper, MergeBoxActionWrapper, RemoveStepWrapper, + ScaleActionWrapper, ScaleStateWrapper) +from nnabla_rl.utils import serializers +from nnabla_rl.utils.evaluator import EpisodicEvaluator +from nnabla_rl.utils.reproductions import print_env_info, set_global_seed + +try: + import gym_goal # noqa + from goal_env_wrapper import ExtendedGoalEnvWrapper +except ModuleNotFoundError: + pass +try: + import gym_platform # noqa +except ModuleNotFoundError: + pass + + +def setup_platform_env(env): + env = FlattenActionWrapper(env) + env = ScaleStateWrapper(env) + env = ScaleActionWrapper(env) + env = MergeBoxActionWrapper(env) + env = RemoveStepWrapper(env) + return env + + +def setup_goal_env(env): + env = ExtendedGoalEnvWrapper(env) + + env = FlattenActionWrapper(env) + env = ScaleStateWrapper(env) + env = ScaleActionWrapper(env) + env = MergeBoxActionWrapper(env) + env = RemoveStepWrapper(env) + return env + + +def build_env(env_name, test=False, seed=None, render=False, print_episode_result=False): + env = gym.make(env_name) + if env_name == 'Goal-v0': + env = setup_goal_env(env) + elif env_name == "Platform-v0": + env = setup_platform_env(env) + else: + pass + print_env_info(env) + + env = NumpyFloat32Env(env) + if render: + env = ScreenRenderEnv(env) + if print_episode_result: + env = PrintEpisodeResultEnv(env) + env.seed(seed) + + return env + + +def setup_hyar(env, args): + config = HyARConfig(gpu_id=args.gpu, + learning_rate=3e-4, + batch_size=128, + start_timesteps=128, + train_action_noise_abs=1.0, + train_action_noise_sigma=0.1, + replay_buffer_size=int(1e5), + vae_learning_rate=1e-4, + vae_pretrain_episodes=args.vae_pretrain_episodes, + vae_pretrain_times=args.vae_pretrain_times) + return HyAR(env, config=config) + + +def setup_algorithm(env, args): + return setup_hyar(env, args) + + +def run_training(args): + outdir = f'{args.env}_results/seed-{args.seed}' + if args.save_dir: + outdir = os.path.join(os.path.abspath(args.save_dir), outdir) + set_global_seed(args.seed) + + eval_env = build_env(args.env, test=True, seed=args.seed + 100) + evaluator = EpisodicEvaluator(run_per_evaluation=100) + evaluation_hook = H.EvaluationHook(eval_env, + evaluator, + timing=args.eval_timing, + writer=W.FileWriter(outdir=outdir, file_prefix='evaluation_result')) + + iteration_num_hook = H.IterationNumHook(timing=100) + save_snapshot_hook = H.SaveSnapshotHook(outdir, timing=args.save_timing) + + train_env = build_env(args.env, seed=args.seed, render=args.render) + algorithm = setup_algorithm(train_env, args) + + hooks = [iteration_num_hook, save_snapshot_hook, evaluation_hook] + algorithm.set_hooks(hooks) + algorithm.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_env(args.env, seed=args.seed + 200, render=args.render) + config = HyARConfig(gpu_id=args.gpu) + hyar = serializers.load_snapshot(args.snapshot_dir, eval_env, algorithm_kwargs={"config": config}) + if not isinstance(hyar, HyAR): + raise ValueError('Loaded snapshot is not trained with PPO!') + + evaluator = EpisodicEvaluator(run_per_evaluation=args.showcase_runs) + evaluator(hyar, eval_env) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('--env', type=str, default='Goal-v0') + parser.add_argument('--gpu', type=int, default=0) + parser.add_argument('--seed', type=int, default=0) + parser.add_argument('--render', action='store_true') + parser.add_argument('--snapshot-dir', type=str, default=None) + parser.add_argument('--save-dir', type=str, default=None) + parser.add_argument('--total_iterations', type=int, default=300000) + parser.add_argument('--save_timing', type=int, default=5000) + parser.add_argument('--eval_timing', type=int, default=5000) + parser.add_argument('--showcase_runs', type=int, default=10) + parser.add_argument('--showcase', action='store_true') + parser.add_argument('--vae-pretrain-episodes', type=int, default=20000) + parser.add_argument('--vae-pretrain-times', type=int, default=5000) + + args = parser.parse_args() + + if args.showcase: + run_showcase(args) + else: + run_training(args) + + +if __name__ == '__main__': + main() diff --git a/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/evaluation_result_average_scalar.tsv b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/evaluation_result_average_scalar.tsv new file mode 100644 index 00000000..b8b931fc --- /dev/null +++ b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/evaluation_result_average_scalar.tsv @@ -0,0 +1,61 @@ +iteration mean std_dev min max median +5000 -3.522 12.319 -9.926 50.000 -6.173 +10000 -5.192 15.965 -18.193 50.000 -6.611 +15000 2.216 21.788 -15.860 50.000 -6.159 +20000 -2.902 17.370 -20.034 50.000 -6.156 +25000 2.685 21.833 -18.153 50.000 -6.153 +30000 1.460 21.225 -17.552 50.000 -6.138 +35000 4.112 23.870 -18.664 50.000 -6.178 +40000 4.582 23.904 -20.055 50.000 -6.152 +45000 2.962 23.330 -20.034 50.000 -6.167 +50000 6.098 24.236 -20.040 50.000 -5.803 +55000 2.994 23.110 -18.294 50.000 -6.160 +60000 8.418 25.953 -20.043 50.000 -5.755 +65000 7.533 24.836 -20.020 50.000 -5.631 +70000 4.553 23.132 -17.807 50.000 -5.643 +75000 9.716 26.091 -18.701 50.000 -5.516 +80000 11.067 27.062 -18.173 50.000 -5.366 +85000 16.379 27.501 -18.495 50.000 -0.410 +90000 12.885 26.761 -20.038 50.000 -0.934 +95000 12.872 26.094 -19.282 50.000 -0.499 +100000 14.051 27.256 -20.034 50.000 -0.326 +105000 15.398 27.572 -17.345 50.000 -0.319 +110000 10.876 26.456 -17.821 50.000 -0.479 +115000 10.675 26.653 -20.052 50.000 -0.925 +120000 13.186 28.490 -20.058 50.000 -1.566 +125000 15.265 28.884 -20.051 50.000 -0.299 +130000 17.179 28.439 -18.399 50.000 -0.337 +135000 14.976 28.536 -20.015 50.000 -0.465 +140000 18.742 29.385 -20.031 50.000 -0.169 +145000 13.798 28.038 -18.521 50.000 -2.058 +150000 18.433 28.595 -18.720 50.000 -0.153 +155000 18.489 28.201 -20.009 50.000 -0.161 +160000 16.246 27.849 -18.632 50.000 -0.447 +165000 13.822 27.294 -20.047 50.000 -0.574 +170000 18.537 28.522 -18.108 50.000 -0.143 +175000 20.999 28.635 -20.001 50.000 -0.025 +180000 20.680 28.634 -20.003 50.000 -0.038 +185000 19.276 29.569 -20.074 50.000 -0.119 +190000 19.082 28.660 -18.797 50.000 -0.056 +195000 18.709 29.552 -20.036 50.000 -0.139 +200000 19.218 28.899 -19.222 50.000 -0.098 +205000 17.102 29.032 -20.007 50.000 -0.486 +210000 17.852 29.268 -20.025 50.000 -0.158 +215000 16.794 29.556 -18.890 50.000 -0.603 +220000 15.895 28.697 -19.305 50.000 -0.627 +225000 13.216 27.901 -19.493 50.000 -5.322 +230000 15.572 28.337 -18.761 50.000 -1.021 +235000 14.164 28.505 -20.013 50.000 -0.339 +240000 12.617 26.953 -18.938 50.000 -0.568 +245000 17.197 28.585 -20.006 50.000 -0.202 +250000 18.183 29.301 -20.018 50.000 -0.124 +255000 18.356 28.648 -18.733 50.000 -0.228 +260000 19.425 28.377 -17.565 50.000 -0.171 +265000 19.298 28.173 -20.000 50.000 -0.124 +270000 16.377 27.503 -18.617 50.000 -0.215 +275000 21.707 28.919 -18.578 50.000 50.000 +280000 15.389 27.945 -17.329 50.000 -0.544 +285000 18.310 28.697 -18.346 50.000 -0.175 +290000 19.791 28.494 -18.126 50.000 -0.078 +295000 19.297 28.528 -18.779 50.000 -0.143 +300000 23.569 28.464 -18.219 50.000 50.000 diff --git a/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/result.png b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/result.png new file mode 100644 index 0000000000000000000000000000000000000000..90deeb987747344964ef0f2588cc5f2deae5f541 GIT binary patch literal 21541 zcmZs@1yogE^fh|vZlqHX5H8)_-Jq0ogLH!+-7O_8B_IugfYNd4kd_8%5D@8lo8S9? z-+SY|Zw$C{;oNif*=O&y=9+UZqczmzvCzrTArJ_bqJoST1Ok@?z9mqR!EZhUGjD=_ z1U+Q+JhYvyJ-p4_tRSjp9xe{f9u9WqG+tJ2?sm>j+-w4DTu>TY4-Xf2A$E4h|9t?P zvzrY&&Fw=kI0>4Ig1$Qhf~ofO4HxJgM+bpue^8W>eC3mKwCwFeG1DggaOp5vy9$dqiEa(de9m5)ILu&@nWOuUb# z+2)2W$*g9)ZyPJvj_h?87e|h9^xrDJY5c_;U_8FLbNXjwEN@cbEYp2#C#T1S0v3!b zg__A=T#O-sN=whD384+c#m7ab3B#3wmx2SY3KC2~;1D!aB=AZLR{#O8^fZLv=rF`E zc<`DOr1Ag$(DNt{xNcc`d|Gbqsh#&ku}II8nJ{0Vw=KA_HEfAMgfeVpcet!=ZBdD0 z`;PB-R3L*RBQoCJ-^TCB$jEB#rap6|GX1k2ZW&2GgX|g>KFb{@$yDL1x-UnIeHzTR z3RW*cx)rCV+`Gsgyn>&II6WN6Z1A*}>Ddi%z4nb#1sa{!4XS?P+}s3JRaJP*uU$sd z`HZ9#JhB?#WC}EB1O-X=_V!ZpX65DOlRtdG@A`lgIcXc#WeS10z9Od$3+v6nq=621 zTQ|^(ic-RN{icRXgdyaQCu$6aFw)Y(iBKhiyQa6?wq(5V$%h#>*Zqv?3ro_-OnI8E zfsy|`gJvGP6SS2k9aL|=IrVjiW7IjXiY@saRF!@C(*1CMJ2^8GKAO$H`Ri>>pX0Y> zvd1ZEQ3HGwr?N%lP-~?DVi zDDZBR`ZQAf4sP|TpZ}zv+?j@x6E6~ny1&}!`^n#7b_7WE_dh~+cRS*+P#m$So=6;v z` zD#&R{Nbz!^l)_#RlI(Hog1lZ~D8^X!!_F+tM=duV1rvHgkT6b0xW`Q=3uPhw$inUC zvu_ksRC*(+-$zMDVy|b~HS~Athf}@9DY$6JzsEGW{WX^pK&>uvil|d% z5N`C{%WShhzO1@BL7@eec5>Xo-BiIwPT<&BlUxE~y4oI4R$iX@Z>0xEJnm@mo5f<2 zqtE$_Zk^*IUygw5b1tNu&z=XfW?&*9{qVm#9?sc!nlOmjAdrXa@xWI9vE^$@A&-IU z$LL0UF#cjp_alU;I%s8Amt>BJFaG6{I}XHjIGt64InCDDIniYhm9|$nSMY1*hao%* zg~VgES13uhf4<|y60`Sbblh2CVqr;^zk1HkKPPyP+QY#Fg@#ELM7b!U(e{2%Ff$rR zsN&Nzt^FnK<*#1Ygmy5HO!suisCCa}`=#ho;N$((I!@s3<<7yufu@Pcv47R1?Zm{y zntyI)X7uEw=7~>=1ru0?_Kn=)!KmcAw zt!gFk*~56muoa(=Z+@^2sg8Y&IJc%aqUev=z_ff38|vrqJ+$vT@y(j4AO|F@O_kdq zc_KgU4NTSwtJjnRgbqpOGJKaRG=^+>LaY`9InC%>M(n*m)!88Gpd9!oj$6>+VI(Kh%jwjk z{=5>nX+!01>_Uf-a2kYCN!-Y(x`g>c)|<;PX%G+)=IgC6D6mlk5~LLs(Tx4}UO+lA z*nb2$E;g;V?Bq!+DWQ8EuTV~S$6e-@&Fm{4XR9#S?7LJ>9h`drmYnq|eFKWoD2ehNbOoQe^dNCaNv7ImJ^2B=Y|ID>;8JS&Vn<$Y ztgK!nP>Bj{9!JH-O6%)q4u5Du!J*1|rX9k8DLshf9;f7d%0d9!H=V5FEPP`TMsFNd zQqMylOUHd-$7ZUJP4~I3vw%}Sv{f##%REvDQF72klT@O6(CD$#K~E!QgcUkmQ0Hy= zD}O4>LExuY6q4Y}j~RKtFZ!)(=L;I2w^K zKJ&&V;zXw7?o8GMSQs|0lpQo{oM!pW>^kM~>54V-akF+vxLZ+h@uFn46p;dAIGKay zmM@}{GwEXn<`bhq*5i^!5aPzf!=yourK}3&rnca4s9n=ogvh|Rk8>hT(I+V7Ao>>Um%vO!C`H#rQzKt7g%J$x!Sx;3!&sT?{$Qaas$Cj14(kav028zQek|eLzH}SpAl~JSA#F(K% z+?8HLl+r?$rBRGC*!>7F*)*yq&_}zt0qCP@{meY)+KlWnzC#X#>Z@W1LAaqnwtD9p`(XZ6mcWLaNxYlA}NEv~Aqn?K8{xT#`BQ=8)v)8$-Fw zcl$jPAD6~QSaemfTPG9jX~Gc8bcF>8tb1+G4N^{KmpokcA~kXNpQ#s?TyQ3L&{a`F zBQ5@#?JgIiM&b{gL|VX>jBe+E*Ky-5)gO?I`K^ z^+uE}XlDu-eR7@b91?Y-(V zK0*L{4mGHb{Bm;4ERk}GIP!e#pHl9^_UU$KSL0sy>MxkURumpHwJPi6e6X1I5MJow zcDJb}d8H(I-Eq93<4Hxi%G>(xu6ho=!}q+da&+i4^iX)p9b7im05V&Zm3*~vj|#Ke z`G7HL9?w5T!4TwI-t)I2US*4v1%V$D5V1RD#q)Y$@^0$7W!W|T3lz|-8y>OCO%6VC zx5`;D2sj<)2%r2bZ(QuXk@ud)i~87%&zS#Rk?it1G*fUmVDo(%bE+ELuFF)hs_mWD z3*OuP%j=2CKP&H99Dpk%o{a(ScDJKQz;7NNN`(Jjo$e)ZzNX|)d;W^(|BeZsw zmT>4DX*Bx^VeO=N(0hErbV4W{?b_%r+0zQDGj&%g@4q&VA8%Bg)--sFA)l|p1VB1% zpDRTKnT1vH-Gwt60%zACn^ry0hOyP#zNOH_}Y!5y;X}#-M*p3?X7~iX% zr_``FM6g->GDLi`Y?UFrk<6 zgefE-JcHXIr zUDNAS8%8%Z@g1(Tk$W$D5g4*Lz%q}%73Qqiz(2i1Y>zMf_OuOVL$|g>X>i5u z?NqwPzAw^Q-)#G%FxYYf`la62Skd1q-wTM&y zKI?&kBwO0Pm4N)i{InPk-+ODe7nCwm(^b*$AMSjAT>N^={b#kTrba#>pzW+tu1Hc^ zI&^$IbJV)yA{HrGgcxNw`26SHr$hLNtZS-oZ;lSP5}YEj9CV9d0XSayDEY9f*Po;K z5v~O?KH~T7n8Qs>^o536t?RbS5athi2vRiF-Y?4=L9S1FaA-4z!9&A_>>eM(E{+yY zS0C?JaZwS$Tklz^-)@5F7#Pb`Hn0TB`8tcpvqlw$p3kb;{_g|9h)iz#LKO0bIj?KS zw_nuhMfvV24rKI)j(;~Kbt0$e3lG+`IsbTMk62?H4cq*!L{R&cX4EEAtVMwElmW|R z2Vc4H-jIX}A!2LocJlenc%KO-#LQWH{^3tiHQE7-$u;`T%?(Y)Fc{&}LbwCfOQ&x8 z-)9cXtgqVv?Kk_V86Q>p>K|CY3E4NTJB*{Qe4j|%7CV~nR%ReK zKq=*y>&f?6F&*!dEzGBjV0;<(Oj8%(bQ>oA!1<@`(il`DbZl(c?=B95HJIW&>IMky zi>wR+fAFEif)oyL0L|~S&!TcY`=$lF3pA=xXU&Nn4Ndq`cf{v#zb6W$#~y8LY&Ms@ zSK|%MqD($#8we*zo7!b}&ZoXyfmf(yaH9`1B=S_%qrZ?f?-qByXQh+Fz@#-~PD^Tu zfk#FAVjR!;oM0}Vq>75WvbFp|Qb7UiQAvv?!OxAYCLFFo?#s#1dg*5^h^(~q9Ga^r zQs%IQyyU2a23zV`v)@0L^hQd4t2Qj-UDr{Ejc5@{C};qv$88+o{P`;b`B#Q4^7tf| z0tP6T1#)bFfwmKYlr;)EjisDGLeHKPFV?T;me_?5DeGbjz2kaYLRw2F5TD_#-D_(e&NJ)ZfZ=1T!z1L(i z&<}Z#5$s2&{bdIX<>4%`E%dR4&h)rb`z`xg>_&=}0q%M_Ud6dioeWk$!YNVx^Y&c- ziQPh{asT+;y6mitEI)T2J3V{_j5w*~>4MwUL|t$K%c2{+ZMtvkgZuLdq?m$6%nVX) z6I_aB{&Qrq|(oFenM(AXM+K%p6wRDFMqh-{M|+7QiLCl2y~+ z^0xnH=FxPp8Y&!aADj$xn$Tm-jC~geCNc_&>)+psOYY;MkRaAKO%mm=3ftO5rAp$A z+vU=3r!Z$qd0QwVZ^Th)HxZNBg7`0&y{W~n)({|_i_RTbC0fx-ONOY37Jb$v$WM$7 z6Co1|ORS}4(b%w8}ajRk4T)T<|Pe4tL(_)zL_pciu2v8B>T__^K zVEqBrB=(kuD-&~hd0DKZw4eYko6iwlr;cvJzXloPZ;~xRf3q_zw#8d{RRH_{9_UGl z;gIj_gupC1>nT?3{$Sm5H96?g`N%4F-{clZ?cnDEX7WGY0B*JCu1!55c1R2tP+Ti3 z#ybc1x0iH)GSt`CFRQBR%M*PEfz-5JkO4-F*F+VZua#F05)`_*bP=w?h&8uu%2~{h z0P!FquL94?HD-tbTBQ?P_2yf*C08(P6VRsw&TZ#JAYJ|+NPxW!xwLjo0talbLnMBk z#eozCm0z&@hs0>VuMC!@y;D~>QUmm${EmrUUa2L4zHc!EEyAUikHs(e$tzU)==;SbX1;X2A3*7yeDP#te z&@qohQ(0Fbl8DT&ss((l6rl*8C^$cfupk8mBA_ns&5|HIKxr+#VusW_xMmG`d41vl zh@9jU@m*(3-vWm=FPjLu3D(*oV8R24u`j_GrXmGLuY?ts)#lVOQPUT7>gN6$6lk-j zV`nchb-ueNm+g6dB9Mw=B$Oze4jOw0S%>6kB?xd=6Vg?W>Jr4yNtIED;^ITWpOfx? z53f^u9_fFGBl!}jGAP5Of7EOE_JM<2ePVC>EyZP;vE1u40p&Xa_r9|G&I%MKX?pJ+sM8qKGg?4znIAPm98 zr0!iNw=096L%`3Z6D@3XPj8~&6%YX?#=!?vgC9o80=|?v0#XtOxBihpxrVTOgt|;4 zj+6ql0D@2N7dv{ip;~>r(B(#<=233?QETxNh>HU%9_3iOyeiI3N130%VR98cHQS8K zC6a+UD6ydM(_>eya&oVAdix>_ccVs}`g;_PU$-~)(-|4Emq{spWRh57>If%zm#>-X z1DfDdixV1cFd3(TYwJ72xj`ATTeYkqdWAS06q2iIA+@TKIFc%XDvGYu5>c>V46wi9 zn3^RZ3ZhlVj)tQnCDCv$P`F$zpm4ngBotH%^%Mo>>eFEb`SyAkQr3OZHXZhio}q$L zh&q-RR3^|VL$!2VDgPFMN&qV3X3n^JZrTVXLV9f}vzeE>{PH4tb%SWbMvO-T3|wdp zX3p+s;VRh%!}Lhnw^@SV6*Ow0C}$;E;onrCWb_IHOVi@^-6_s_U41W=HBmxADd2Jo zsje8nzNrfUH;lNAHmW7Wjf9J@&xdlL8%TkcziDJ~k00Nb^@;knSSlW|0D|HELQ=em zU2`GYi7(rAC)c|W5b~#|rvpPn-N)}Qg;Ueg%v@Y>pJF6nFlq3kPZn1nh;)rSU&{=? z&8Z#A|Mto_@TWgoCR))<0?gzdldR}j-(ED+u!5YOHU1D+ie_p$Dpkp?Y;QE%GdJxG z*J|C+Hx(EmeutNDZd@H@y=1B#r)MRaoL3V7`T4|j@~`@HQ~B-ELON5_#iG+#bPKDh zu)cdA_ZxXHBW1JJ^INAlnq&34KW#y&qdp7b`l-f;)=htzqzlx4W0JuJ>br|t4;*A11fLb&?%`dLy5!`l8|2Y+8rQm^G# zp^x9+y#VR0{cOAe)ChD&(}G*6Ziv1gd@7m7APC6Bk)D#m7wb)u&;dnBH6{Ov1VKs= z#XjF`u?I$HJGYZEr=jy@V+jfhjyd-A^??+G2ck+J>TPt9B;csk6Ma(ml~ek+TbI5%wz9}ZU;de8q1x(8ANniB*J{9Wu0E-%YS-M zPE1ND9=hR$O~j*1?Ne$wJdwWz33?d`B!rIj(`t4Gji1$YbalB3yqw$k-l%B$olNtY zbAKi_tCQ-?mC;viX}-H-QqfAN2HU!YtPVx>0Dkw7+wK%etriEQ>Fvp1Zy|@N_DCdq zIk@7Q8XQ(uR=sadl!sozdg-!;hK9965%~}QN`3Cn=Uh+LBmZM(`ZqHJz@jUGg1EN-?4M@Sr9zp|tNh;tgl|hbO|&`reG{Fa0UN8{MGb@t+rql59f)2^QQL zbVRW$gaVD|w}M7iGGYS4*hSo$?G8tRCsrs5vUN6=cxt@)doLx_agKU`#0#1v@76cH zpzJC=v6q#IC=ze$&89^zj{DTv%_S2Mbu+A5{2#)k!mYyX#>kX44W1*4ARqPk<%@s& zmhE@CV?liSJ3>}Z=OZ%E9chTkiGPEvw+1R9C9V%4@5iR_Tp$aLZ;91%g~HDd<`5uX zDk^|x`7Bk+)7yJ9nlVoTNC(v|+hmX+1^Vtf3)smf^&`pU$~*R<;bA;t;z-eV7ZOZ_ z$Xo9a%rbxaBQ=lr7GhQ|9Q0gB8j_Io1sdyb&plAUy2jjU=k)`cGRr<9DgK;`{yLOTbY6W){u5m7kn0?W?dMtew|8@x}Zg3tyR)5q#`m7OVv_t3X27+RW7x zWk=|K*%-5F#Jtq_WBxh|#-W$W($``f4})~OQarpj2<9L2+RPk{t)qc?`bX*wz+%w0 zqEmwqQ1i#-{rqlgQr?cERn)dUo)MzVuU>=~WCnu0}KVe;^NdZY^BNTkvD^oUf(7$UyJ~U@5?WAbp4dW$(qc z7T`V24z%VzdqaG#eHd4qDLdWyUt1XaS-vG{N2HMWkdng5!LfE1?)P|qnGCYg*O0!L z=$Ah>`?>3`L{>`XurmzMGbzd5@l0enDyZYGbC;0mru*cL{At6uFB>J?$n#XjgY8Jt zuhAxq_pFS!o=jbe!^WMeWOF(nC0w-1<@`P{6{{*>_I&D;o+9btxT^6?ySjN>deX1| zqG`IhgH}jy>{xBbMR>WY|5)4sRyG+2ji%U(er`!0lf)Pg`^HRUT0U|q8b5AP>u81c z{^nsv&m=RHep0ViaHT}*bsiy_Yl?G2>{;>ESzTd<%P*x=|#LWzpJz8A&Rg|M- z6a9vV0CM6tXAn@`s7)xk`72}w)QHr7T~H6lxO{$x7%1j7d2G!AxvI6meXCsm!^-TZkbyT^7*^qD~dx>n?<5E)L8RSKfR zA9ePP*w@#bcp^a%Sa2;ABeEwLN9+pn?($Eccl#M74=-=Q=g$lSeX;Kua6%Cny^6KZ zW)68iac^>mlg+V@^nLLq1=zF4-aG%x^1Lv-SdXb$)&X~R(0C8Q+$gLo{k{KZm;4an zw81BliR`UXk8r>@;Vu1_&4IFL50|Fga&bET)0|PxKi;E@-(Dg?2QxPI$cZ*J4j}D~ zk36l@5mD(gU2Xy{?IfdZx0Y2%M*(!?hfRl~ILmn-=`Ka|6BEIH9j7o72#`Pqh~weyK^?$5OqHaA_~dcyI&+LrJr zSKr-vlfLepKX}?pUh48rmDZ`|!rjYYihOun$93lu!Zhi?zr+S&pj1jkz6{KKRw zH7bW7K`eu2oM@mZtvpaUj(ILOnt|r^z3)%wJK~#@@Gt%l3-z>$ZL77ESZTIfz@h_+ z+M+6(XFPgVciYsg8nHucdc%D=Dp3fz?(_8RX?L_4iHMgcQhVEbTI1$3bpHb8RZ@|l zI+@^GomA5~Ro<(s4ct7RO&*{fn6VaxZk+&_B;xm4b|Mtk{BD1HeKS_tXS4F>QD|>- zpRX2(?BPd0*EXab5jYkp=6^7;({G`t1tCNkRLQBTV(~dGMJ+mgAH8<2cFhP!QW@*b zI^e}^>q}63eKIGBng%{5Ffkok>Ri^XJDa+h5&0Cy7>?YV190u4pF^`a!Y}s0s+=te z2^fk)C{4Aek3lROQM$Nk!|Yjm`<7**oNFz2TP*RG6zY|u^`(vvJ*$R6DT)A8pAmCe zvcA?_0EqOZy&%2H_a57nKjte?C(nD4JAQ7TGb&&3Ar0CeANzNLulS5i!ty5~I62_6 z!ol3;5#%->$M{MPf5ylNI#9Y?4HO6Fkq6WC7u!I8I;66msv1yRD28yFO zrzVBclE!;7>|<-q-m^Wp6%r)g-_!H44`KM8jV516R=ym>^p$^@{Z%IxHv}DDa0OwO zSvSPJjSM_2S%VN%UAYB>U~y|g35Y<&ujCQLXhQFoKM3|%y$t42EEbrA8nCFpVwrB< zEh!MgifD65$9Z#LU_WWRaS?<#bkt)C8;gg}jWgGI+R=&~Q}=xu3-R1aDV^Bn#MB|O zSp&MI4TN)%LV$s~|8b>$`q&LRmSWy>XLz^of{}M?9zTqA+>_8%wkwifJ{=|?;^+Co zsd5OGpWwBY+(8LbcQzvXkZA?W!izi^*`82u`#_Js5&XJD?D9oKCr-_SXffybahIC6K=*BTQ`(F9z$Rg) zO)~(v-RPSaL>RIW#`$t!L%yWVu1dllQaO;-A5L(_f-~V52t_^z{y4Ma7x`r6E?*jR;?T*ltT^pw{%c<`@5%g=T=up-D;kj7SNY@_Pt3=| zDkG)wrDrY0Q);^UV8>Tm1ErO(7tu=<|>_phG=37MJ9>iCI`C7JV0KLgTDpr`^tOleB~JHo5Mub9JM zG53KA7Og~!bfjKZR2=|`r>BEMvl&_*=1d23zh5X<3NYzkw^0THFF!ACwBH0b3HFpG``C5$X~hVUy6M`1 zfzRLwOs|{pf*Cz0W~g(O$*ya0;L~jYV&~!E{mub+>BvX6#xP+4R0&^=^3s?W^6>Aj zR{#?fXj^rL2k)uBT`l6=cyp^xCzg;%y=)lD&Nc>%Jd);i!hgFzwN}HpHQ!=ZFpdW2 ziy3t`e) zZdRnmqE(%MYV&_gn?eVe>XFmTdU3>(^S#HJ*2g1k|I2)v0?rnbFW!};oUQiM4YHkZ zzgONJ_jQG$Xuf$9`|Fp%4^V(K0}tGPx5E-N;t6AC-4dKsjXiTMR1P<;I)3q5KcR=* zCe7y}l?ta4+67|4n94J_{7BvxnF32Ir|8%wNR*gv)6ho$gY`EM_ieP z0HM59;;!qcTRhllWMIj=pYx@#-S5LW_)yoSdUO1GOCO|V4T(*Mr*KbJgk|#m%X50l ziUSt++RyadwvFK^I_c)Jt~WWpAKC-0(8kUa);{`^JXH$-n8?^g++s4*=0{S_u}N6z zaOL@(VMZ`a8;bp*kkYsQTd6D*MFfYE1UUcYnoDbzF9AN@AUs5vE%9M38yE!ze#7>0 za1)rT=n8DRA>BX}xicT;dZn<8qic|q8v>rM+ROXwAeSXTYk_iOV=x{A@7U@-A+s#K zWMh$>2>Hk-`Z-+t_j2@dw5~T?LRpFcNO^-Dx!Y#ld+OV~3=7fsrwWD5zAltYk11Ud z34NHX8)@uuoc4dF1cyWa)u0MDmR;Pa4+iTouk*R?J=|ak_pTNO!SFAdvacEsyC_<$ z8~xQVnxM|;FeK5elfxo+I$o4+esw+`Ov^?@cnfeq1&9;t~Y20OH-@+Iu?wirRZ%@^6kgrAxe zLm-F)GZZ*9Ev@2ZFI&>XWqEOr0m0;|Zd3<5dJ4DKbXB&0rb3WVfVOd#)DK$^bk^U$ zRB|{NYN*>h*XA%dV#By>J`0o=uH}%IQZL~Q8n-yvok^Rz!R+DivGsfj=2#@)6W&by zw4nCe*svgkfz3qm1mF=~2WuY*a=6fdB7W6{6QWaVy94He?EpC50Bt{-S|Y;uWk9Km z-PuHJ^O#vhS*D$bDt{;vu!{+E0qQSjo-)Xp$(PtKa8~rqAh-wUj!4TD+Ws0wOxZ&d z2ogEzL|}UPvMU$?<gmJsg-$KX_)u&~k%>Cu=$${9ftmZtj)l%SlTk{At;t61o33 z^}kLC6NPS(GV7*U71Zg5;uYPh`9iJ^6a{}0Y`WZc@8*sqC+QKmKuAeQfB!!Fe(j%}2)7x?oO3?(qHnct4hxVrz_E2+%`GK-++Dke1E2_tW3hl zh!W62A%6p=`doA7$_cjX0i{l;K+r8_aI;?z{pM}~ymK9bKVufZU}z}l>xLn|?u0A; z@&%oL$pvA>?|{|t-BBY4SwJH6Vh-?02~QSRSy|bXmB6d@$hv@Audhu_<~w7#^G%L# zCfePFM))Gf!-KaAdmIt2?&TeuN9D)fGa2fCKx-Kaa&C7;7Z;q5d*blDv)E^0)25p897v@J&;~T<34~i9wi-XXJ;XFZfNZfST!QX4VRL{VX(` zfpIGiOaidDfC55xx+Y9P0SY*@s6O*0w_(fd`1H%jugm4Q|k;023iPAyKRI;!2$b3XoRU{aI56pRD%zt5d-0>?ID? zG~H3?THgd>%zxx&!5aj>%iDbE=g-y_4~U;LT?hC)YmvD5oNY#ePD4hA$-u~azw3{eD+53W?9?yH9_@w=0r zq(RHwKY#jxYa&N-Bb?ayKNm32iSKsh#k>D3fA7)C>!*r`Wm@cfISU|*LiA6yYRxy# z#^t(|wIY}WYT??&{m_sSg{U7-rIjW*baxh!T~_c{Ed}w!TC0WIvuY-_(qP}P5i?DF zglGnAuZx7MH396zHaGmo`wKx2Rk{XX#Czg|WRnB6%YgLH_#~FQ^+v(9kpik-~OeXg6A zuJgtmq(M2((%q~_NK5Yr#u|>@^l!6~Tj|G)mDl$+;8`^dim4>5fwfrZ| zJ^6{=z)bl>WWRVCA6o&0Yxu{z0-V9;v`sZHrR~tEZ^^$KT?iIv6pf8TzW_}MD5x8N zMFtMH=|@Ra*Fp$aEMOY%?!Ur&v$7*6nz?xUiahvMqx?c6kOWphz%$l;?d*7sK(K*0 z-})7|Lu5LHunxBm&yWL*(}*dk7XrLvi9!)4u{dmNC@5s2YW#o4cG?t_qujCoX6G|^ zf~v$=yvXB^yHp4D8|*w8=KR|fI2eZ z!-sSRpNS5r;e9XOPPbwx(n*id9cOZVe0DZ5U(|)bqWsw?FDLaXGap!6bPC862=`y@ zO}Z4|s5|L}jmG}X?LvTnvfZS^S}bM?|MdPF8K-@H7cl9@Hz+NM0=w;>>MdEH%QLaN z?~agiG}k0Wf^J`-uq6E$Ao-dJVs|{2VF9!r37xr*&jXz0<}W00$jLo|P2FWN1yVU$ zS#nA1a)*E@8q1E=S|atgqH3nx8(^!EeA1TvCxn7%+mO7ciF}tqf5Ay_<5_YFeqvzG zf$QGw$9?hiXTe(n)4rquYN)hRk^wYkUMga7~9C3_ozkrmwq}!5)}>mOEBVK(imp$g6H(*E3Ev> z_02I_|Fd&#HiBn=1Zm|J5&>+rt3_UWuQU#~ z=AV!JLAj`9r-ae$y%+lXhb|=ll^R)C681M}I<2}Csa9ChyaaC&4RHCJ)(M+_U6|yo zylh^zLFY|>RxF61Vx%ebzTJw{0L2sNjew#sYmQMtrR63{fhz{;X@zc$9B4t=-`}5@ zo+h09`xSd%<3nDU72wTZi5nAX1wtbNf_YbE07dox-zB)Mcw0w-GCStC)M3$^Ko6Hx?t~=VZ7N%j6lp-%tS_{& z1lw4fn6K)(5BI7yqN7TD=7CK`9($YP}_rQl;L%Her%jwl`)Gl^o zOo(2xSrGcn2)GfLbqGEW(OVR5qgK+ODQdSRlep3j5CH{W-ri zH9!^t5skJ%aRdn$;D{05C=9<;LR@+9vG~!7pVg1RaZDp5tgKfpAtYbSqNGOhAJ(;Ek2QKARzAe@jgZO%rvGT#DOk1Tk@YR z9-k6f#+4!zIwMnOX&8ac4|py<0Shn`R=~tMdE`aavo`cWg#(i*AOn|+MH6yrrsoU? zb7hlU>t1654u!5AUuw24@HXZ1Q7?&=cC88&k=vtOJJsG^!^{nI+pN$cD6)7y83(f1l6!SA6GO;K%&v zfDN4ARKgQzPX~zMilBW(<-rPn z6H!5(P;$-cvn{?cIJ;vMQF=-*Mlyc)+Hb6_LVT{+6B6WMjHzUNc0`yfhXLh8RwW6i zzN@Pq_1?y){`F5EdXOsnVUia0$mjFPhP4Tx^`Sw*$}8r~F4c?#(9;TpXi1E!z&JtK z(~6qm;zVZR!zQdxF%9X43}nc#1!)iv(Kg5c-~bdO5vP1GbC#NxSwh=fia&76(JV-{ z1YdSh?q;MxBNPU3_Bl)G_TdLWwO8w~z!fF)-2eW-B>!u?mA=Tuyaf|0tE|30>HD+n zRhiF8VKSt^J)xzaHK#&BmDu$&c{VoEa50gHk)c)NKc1$N&qiMpIsBg$+|zqu1G-~iB==|sh?%M2+D5*${3$$LxxD%?t#RNUK|%F&)f z2a(wy@{Gw^qpqFai zM=46`ac2iM{Nln$XFvYg$%fYQn^hS!qJy&8>07Q?02vYzlH_&X&5a)@vV=|E@{sWW zkH=lkfS0&YBL|HkLa+Z~y+Vfhw)Lym&aft69?MurqYc>i$ zLZLFcy2PL#7YULyyaifTJ-#3Re-q1HLPSJ_;w{$R2*~6VE}3-E|JlkFi(@%0KpQ$( z6F>f(Q3c`v7G!slU+~E9fODT3xKmgB&r~6u zZI>&t*JnFLKYmbndU^uyJ_-@LF~vGQLEy;t#owVr%T${i)$05k$vPFv%oQLD>J5a>{(jiOcY>!1{aZ;0Y(xq~Xf#BBfj62=h$O?IJagcm#o$4C z(a(y%^my4*%o=qB`wAmNX}v`>yj>RiwmkTMeaptw`<~+7uc_WwL-_2Z+~MU9r3;^X zG3qKgmJfnDxNu&UBy(}5@fr_2LE~!ZU~j~=px&FTa9^`8tk+su$#L}~mca9bN6i>D zK)AbEug!*%3CiD?pM{$?Je0s7Kd_~^0mk&@FTA=g);AzxM1}j;INsR-6NB50)lbCU z7T=hyGm^yI@;q=J&8-4f5pG3_H1#i}ispv8nW5)r?f@*te3ii?iD>aSD$&bfjNfJQ zNe)WfiowI27PE6V`0#IdO+$DB_jo2 zd@sV}V|tVWzbZaPY251CDakkWU%qhFuZ?o@emCiCI<{9RWd9lz({%O2*CDhC3t0Z+ znzq1wyo%ans3-y;xa^?~mv)`LJwCUac5h17leG!{k4EC=S#2c^mM)>qCmLQ(dW?U7 z`PJLl9_$bj_tZLi&i`UXP;x~^)-IZjuBCL!pLeF4Vz78E?K#oSOgmK-S4y9rc2=}y zGOm;uyF<|m!6qViD|SIW4I|P|JIfW>?A^U^x(2O3slGwIQes2gDXwOwe(s!u#b_3L z$pj3AEW--@HcFlvLxN6<@4qZAsLD!-eX%MBhAjBdI*Hu`g@H(wEJ)wLyrDcWoc+90 zI6V(*`HDLUBaY;-Zz>o`bf~e-pvN~ilD#Ot1PUVPH-%A3*ZPra3_{9Sl;pqlM*;i) z@v&hNU9@drB;%wGT^1YYwzC8l>TjELAQyv9gl^kLb?~25D8?B^llVtOo_2U5cP>y- zrMK#jvg+a|_QJtoY9|ns`P+pkcV;s&T0u!AIyZfDn``Om21zACPN!Mc&T0z<5b|HX z;>>0{!06#nz(;#B6%^(6n2N?ZnWVDFdMSz2f9Ny)h}VH^{F$NGx2>Aq zkAYd#f|3H5;=trHDX7Y58Wh5^{|e%$Cjf;Q$}PyW*L5n@Zi3MK#jS+O*=h4bpN01O z3QQuxVq}|E$GW7%*JoUGV!p;@B`;z$=#=|j^79TCewEo-(!lI7Eq8FRzj30Lv@D4H z^*mGX>F$4svhEc3ZpIXP0FYqgp`EHoFu}#K@5SsG7>#JbZxblQbx+CiWPGE|&z%0v zr`;gx6E~c}AmLnB2U!9zJG?f1y$7fViv`J!= zl%-J9OtNGNH6cSOTc#p}l4MDKRAVW`Ae1suB0`GESO;0sWE)hdAtgqcCRtx)GL7cKi)R-TV*HBq#qpm@QHypp-G= zm!QW1d01d>hRQ}@yIFOH9vMusO=7YTK;;kzQz1nnT-49M2ig)|)-`lU<=ch;xfQji z3%5Mnj}8qr@GzltJh&UxD)v_6QONnEf=&^Cq^BL~e$Y^C$0i+l_33OxO!S4CjlI6F z2)FKCL^DI2fh)E|8Mlj^$;t?Ry`K?#DKnF+vVyME7{M2B?2Lg?Ptyz$@)l1=5wDrm z^JL|lhFZp2!^WGVhsGQ=4iCrY=98P*?+{AjfSv}TaF^K6eEEth|sT^Jh2RtgsEd=R7U zo@Y>|WUeS{77SH0_`11{l=PC-M53bh!uRwh)}`47EE3ag%eNG|cQ!#(Z1x-B^J=Yv zi}Mc?LAmCwvtfs<^Kj}`oW24}_&MHY{Qx#P*(uF97|J|9iF(@B7+S-sIv0h=w9AJ? zh{pa$P(LmIh{TpX?3CQQt-#{QgFAz}_>Q2O(6f9DyaX(n7<~;@4>hwJhn5Kw+-gSS z%h&Nw+2tEYIVjZzfuWveBa?}>k63(rxT^tb_*LgK5Z;rKd1uPvsj!XmwBpHZ`SvqCu zVbdM!GPlm?Hv7^QWE!|Qg=KtBnCOLL?Yb5V-)*Xh*4FFb%#7Y*n&1H8YkaZ(>|g;B zH=jMLTsiw`lAnkXa(j(l?(nE_Hn? zN16Ls7iX*hP9Nm5i^_=iNNcMFK$43gA2oDxl3y%@ravDw$vIiEes{OO6S*-VQ9&ry zkwQ1-9eSW3BSn%^YBzE{`2K7_!VB`}&@A=zFiLmFw)1Oe)F88asD4Z_cT>fiy73Nx z0b(H#<=FWpk1aqnSl`fa6$z3JuV zwYXfq^L@^WRabhl65| zZy_=&*oW8Bdv&QyH3V$;)noX7M_N9c^_H$SBM04cMCqi&t}fp?qWA@+!-kajoBxU! zrv6u{J}t7QW@;5Jd_J?GEAzqfr9DoDu8nIC#KwP`B*_wR?t4II%wBNR~uL2y}lxx8I;Dh$~!P_C!?P>){3 zUj+h^_^+NsUdpn>~9AO~wsvj5i1q@XW09X@~-byK3M%v4m^0C%L+ zVAfaVUNiG+!igj1=2xM$=iZTr9vT|*n7T1Juq)YzIyoSO+OXS$b!&?$%%YH@a~$qC zzs+N6`Lu6u|6NF+uXh1}UFR)5HC45ce4>&v9X%PP5X2^1S+O7))TS(1UfugLTr0zZ zUy#G_vYXSTxmMw~##42?dQf%wIONI!`-P-(kjZ}<-Y~>*(dLN_al-mEJ)E6c(+eE? zpyU(z&eX17!~nZ~E2LN31L9$=d(E}p(sc|R+vUs|9~cKTJb9b46K-x_^w`n&WF~&? ztIMdw?=0$CTXXZ9>{$ko5G`Y+UbcgFv`^)JKJVVW!;ggbl{IB=#r=gL3ZYPcIT|f< ztujvXkQyl;(Zij5j5oW{wMMWVp185HCblKL?a^%qVzMCq;4*zvjLq9pPc+- z@I%q|R>MRUAdctc>es3$-&M= zDF2}%&gS?Aut<`46L|BBr_@T!BDM85#wMT^!MMn8^^#C`J=I$#*nX658W5n17#D#A zW;GxRLwbx0c5_-Zc+~YbFclRQEu7h@5zwt`x3;!!9g<8K5Gy<)E|0fmR_EH5-r7ze z@Bm7$RoBqaE(w@s+xLSSI!N%5a9rSn-?(w3Elkf6|DUJmPo6}U^E2-;TUuJ`*L?^9 zpDQ0|^-8C_=0V|=3C9$#m|TuW_8(ix42uSIkBNy16J{&DtSqUV8@c^{mlMBCa0L$& z3?K^|8=E?7Yin=Q1Y9rJj+K$rKY5*$Ogad`J(#^&K>_QZ{P2G_okQSVQ78rokeA6n zCCW_zip9eNkC>^!K1%5613X$`G5Axs`hi@43k0@5KZ7Quhk?S~X($l?F7JRzo4K9c z4WMl-7Pc<`Q-6?xC7>= zdD3;>_g^^lKEB~(+5J4!q^ffpEC57;1AH@BK(ziw($(t0GE&`w^}+}zv}@EbMz&3J%j03r|8GpG1Y zwp&qJL4i-}74Y@DQ2KFtX0pq(?!cyi(6lr;+H0hFjmWW&pE$wr;hDL26|Y1A85b89 z7c3C?!6`ZXbd-Ok+FI_&1no1|GNF&7r9-PiJ|oqh(- zJaByNikAXk_gz=ickf1Q=rsL?rBT(cYTPLMIqoCh56|G&!TY1VUbSi!_e(=OllK6) z+Y`m^NE8E_hVjd~!Hm!Bc*VnMsi~V&MA>f`@CJFD7T8jvi+ zOaK{nC~YF~BdnDl{r5b%xh35-AmH#tT=>FY_U?s!Xdcdc?btpq&Af|z3+xKa91?PZ zTBZ9EZzIi#a4cWp+8NWD^B`Ced>RQ12cx-On8hz(tN$gn$p>uf_L1sS`5%R;LXe-q ze%(hr;5@uuMg|cY3x< z+1Y6Z&S@5VeELp#R#CALAyWOIT81F;8mz|DF>M-6-dTlAQ( zq9m8*QvURuOv-~G;cu-c{|o`ZPV0a0tNgo*rWeo|QJyB2g_$E@*@+?F(|hX{5Vb8tIbmP66rel9C1qDJ7*_Ksuy5q#Hr_hWA}x{jnBY zz4vg=oip>y%zpOX&xv}gB8!Sdgam;=Q03*M)FBY4MDQzy00%xv4rbZ{|M0s@>$+<= zS-N|fy1s`fo4PyOJGtB2m{EAXcXhLIa^zy=W94L_uy%KMb`xM@bNF9>!0O~`#YXY) z)CVqt=q&fn4FW+?dHID3^opg1Ky=;ZrNlM8bB2`XH9@V&=3As)%&y(`YDlzqO;cVXPX58y-(rx0fe=hnXb{UdVB-8W zxoUMu?vsey`0eeW^}zJ_Xx60WflsH=hwiJ>Nx41#wY_`1c#Z)v1j^7px%3k_3<-o` z6`cRP4TA^P7ItnifV#!U$KUD+L$ zUN*qN!-F%ZR#jE)HDNEVdmm-`P0zGWw~L@?72FLYo&^N+6%=a*a#&c{TL$RBSDaZW zt}Q~!uN6shRp7IfWI#tGb0gPBo>cp=gkm!v>nb70r^6Dy^xP=v|LmA#33xP;E{}P` z2*HzP7-pTCzNdc==M|~}NR>KY2V&SdB2P{nm))n8n|D9iogJtK65++bLTb$i(d^ec zNV9pJ2C}%UAdsadr$L?0zgh-?|E^y;XULjU0zv*e>^mv+0fOGx6;w#(_qMKzT~E&O zSq7;;%$5y=UpxLXt@@n`F9+PNSlik4?(Z|4wEkh$)Yjf?Tl>d4SFImm{O?fbZig)} z>g$K=O7D#@{Lk}$&gb-UdQLyw3PQTR%^Ss#|J#@KKI?}6&!N^oHQ5?%h?F#V zIAV~|g_WTPr(d*3|4Kicp|e}3nUdSt+J01`lho3})vnS7gB}M)EjA&c*MigZSDr9L z=+ENIjcHfn8b5C0Pp+<_xADM_oKQ*02fl}TP1^WW0LkmAHHFGzF@oS!S7hF4Ddg;Gw$6T%RZmcP&FNl zC$+YfmzvBUZjK>At*ru&|4svMg*{J}`5|4#PZt@9^8t4o5tO&2e9m3B&rd(F zl3NJOXJ9BV6$ava4i67|zz8tg|85-iTI20FM+N^wbZ~H3X!Bw_>3DD?3XrM~pML!o zKXjCtkWlQEcvmmFXl(w|RT-4@)?S_;T7t-528hYlKwNowd6&M^kF**~EG%q#wjlXf z3e9P%MG9&dIYmX}n&wTUH3n)30XccZ&mD<(@3KxiKx412u8NDILiiJfN z9Z)C{6J2-`HOf>r?)UNsyF=jju0&qHer;`IbH4H>OUc^7;d+IYm33fdMsuhqDwab@ zS$XWBfh*W6KV{xHPqyg>}=&dvylnpG})b{y^A8_{f(Z(<&GcJzV2q43)J>; z)0&Kq4t_eTArgduh^XgerR_ZT)E^!x3|dlBvcpIY9JIBy?dbr4M_p~JR zy{V~p$FnIzf2 zxn$g?S}hzrs4>(2_eKzbbno{Dko)C5k%(UbCvF`}|CwJM7r4uwOAdVgckCa|V~p3M z=<~WF$Uj6rJ$*3nnALI#P*GM!_4V~-=itC}?i{lW(XPy$=CD9&Sj@TZHWzVeg@pw5 z(o)cm7#VAP-$qBvs%uLu!ZYRxPPFD^4U)P5F+qO2;zj;)!)Xd(0S`Cg6|qj^;R+=^ z$+U_R-x~w|UC;0JCsU9Nss%9g@-638Cm){->C+)Y_r?m}Ls@taptUF==Q35Qz|e$P zJUYcc`$tSoski?GofE8*M>GFS-O1g(Y_6xXNY5Je(bjs=Aa|rlt;| zbon`?rW-mc+krE86xhFD=-+jj(%p}o*(hM@F=@?)B?=b#;z(X+ZR^g=- zZyzI(ufbP9H96a0rj#?XlwFZU@-FD+I_3~@Z(O@c?i1uj-F;%r{)wN1=ZjvvX3?8E zCM}%Erv{;XCoeZmyOlZ?b-=f4eTUzd+m2E9&$H=@NY0tv^#XbvMY-F;Bf4WCy8~J% zcnp*F^O#OM#rjdA)huE#hh88H8jhHpHmBf}+s?AEX?O7$=H;J{e%MJ<8g(;beZE|K zvZd0-T$}h}5SE1`UHrk(jNR?ptA8r*xsWJmn8*0kJ7YVu@j-8xarVsq$XpMi^xU+H z?dOi2XT8WtA{3;nE(jjq*fgz&{l0c+;4O?15hLsO_KOqM=&u+lu$5SpXpYXH&56Db z(>KYi?ZXuNsB&fY1G!B9Y*t}Y-t=Bjltd4ikYh>mq=BW2`Sg-{+8MqCbL-v+UjQ`V z5BtDWvg3Z^ zp7_3∨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ŋzP;N-J6v)e!ZXcn(y^~715{FLclU8ei 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 IZ|3{I0DFBt5&!@I literal 0 HcmV?d00001 diff --git a/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/seed-100/best_score_scalar.tsv b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/seed-100/best_score_scalar.tsv new file mode 100644 index 00000000..e3c993f0 --- /dev/null +++ b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/seed-100/best_score_scalar.tsv @@ -0,0 +1,2 @@ +iteration best_mean_iteration mean std_dev best_median_iteration median +1 300000.000 40.652 22.291 50000.000 50.000 diff --git a/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/seed-100/evaluation_result_histogram.tsv b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/seed-100/evaluation_result_histogram.tsv new file mode 100644 index 00000000..e79e17b4 --- /dev/null +++ b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/seed-100/evaluation_result_histogram.tsv @@ -0,0 +1,61 @@ +iteration(key) values +5000 (returns) -6.623 -6.172 -6.204 -6.644 -5.642 -5.750 -7.114 -6.649 -6.167 -6.172 -7.128 -5.800 -5.781 -6.225 -6.606 -5.786 -6.171 -6.180 -5.759 -7.112 -7.128 -5.908 -7.154 -6.155 -6.616 -6.173 -6.605 -6.176 -6.157 -7.716 -6.161 -6.203 -7.128 -6.147 -6.640 -5.830 -6.195 -5.443 -6.625 -5.822 -6.156 -6.170 -6.619 -5.809 -7.132 -5.467 -6.196 -5.660 -6.614 -5.867 -6.200 -5.827 -7.150 -5.650 -7.711 -6.607 -7.160 -5.491 -7.126 -6.185 -6.673 -7.127 -7.691 -6.619 -7.127 -5.730 -5.784 -7.144 -6.190 -7.127 -5.385 -5.965 -5.429 -7.161 -6.150 -7.149 -5.820 -7.127 -5.906 -7.709 -5.480 -7.158 -7.151 -7.132 -5.681 -5.823 -7.713 -6.615 -5.711 -5.632 -5.535 -5.832 -5.934 -6.610 -5.843 -7.127 -5.908 -6.635 -5.967 -7.138 +10000 (returns) -14.437 -17.774 -17.334 -14.125 50.000 -17.824 -18.092 -8.886 -14.531 -14.455 -16.394 -16.224 -14.478 -14.344 -18.156 50.000 -14.300 -14.421 -18.135 50.000 -17.561 -8.823 50.000 50.000 50.000 -18.134 -16.865 -14.094 -17.371 -17.056 -14.035 -16.082 -18.121 50.000 -18.164 -17.720 -17.541 -18.104 -16.779 -17.867 -17.892 -15.334 -14.292 -17.264 -17.123 -17.139 -17.306 -18.142 -14.056 -16.699 -16.042 50.000 -16.113 -17.578 50.000 -17.279 -15.496 -14.630 -18.025 -17.946 -14.267 -18.093 -18.193 -17.902 -15.878 -17.723 -17.523 -15.136 -16.954 -18.093 -17.222 -17.962 -18.149 -17.702 -17.588 -16.507 -17.819 -18.102 -15.454 -14.311 -18.048 -18.134 -17.971 -14.336 -14.592 -14.988 -18.044 -17.946 -17.185 50.000 -18.128 -18.096 -18.130 -17.624 -16.429 50.000 -17.402 -16.443 -17.326 -18.171 +15000 (returns) 50.000 -11.327 50.000 50.000 -14.297 50.000 -11.673 50.000 -13.900 -5.485 -10.617 -14.051 50.000 -10.303 -5.788 -10.589 50.000 -5.530 50.000 -13.126 -10.992 -14.145 -5.510 50.000 -11.968 50.000 -9.192 50.000 -14.885 50.000 -5.894 50.000 -5.860 -5.918 -5.592 -14.120 -5.895 50.000 -11.464 -5.500 -11.227 50.000 -9.973 -15.541 50.000 -10.708 -5.945 -15.234 -11.282 -5.891 -14.342 -5.464 -13.242 -14.284 -12.933 50.000 -13.119 -5.507 -14.456 50.000 50.000 50.000 -5.863 -5.882 -9.589 -15.200 50.000 50.000 50.000 -12.340 -5.527 -5.931 50.000 -14.074 -15.646 -11.244 -5.900 -5.769 -13.655 -11.690 50.000 -6.018 50.000 -15.630 -14.596 -5.912 50.000 50.000 50.000 50.000 -10.969 50.000 50.000 -12.233 -15.172 -5.906 -15.860 50.000 50.000 -11.460 +20000 (returns) -14.506 -12.004 -5.575 -17.954 -17.994 -15.249 -12.893 -14.731 -17.696 -20.004 -15.618 -5.844 50.000 -20.034 -8.833 50.000 50.000 -6.386 -20.012 50.000 -16.881 -14.262 -10.305 -19.276 50.000 -17.216 -14.282 -18.632 -14.445 -7.292 -9.264 -13.197 -18.654 50.000 -5.625 -18.478 -20.008 -9.252 50.000 50.000 -12.218 -20.013 50.000 -17.173 -18.745 50.000 -20.028 -5.682 -15.253 -20.032 -12.486 -15.796 -20.009 -13.379 -6.705 -12.723 -17.188 -11.778 -5.682 -17.903 -20.029 -17.700 -12.769 -14.963 -12.743 50.000 -12.537 -6.256 -17.436 -5.509 -13.047 -13.434 50.000 -18.782 50.000 50.000 -17.878 50.000 50.000 -14.302 -20.024 -18.419 -15.293 -17.439 50.000 -14.400 -13.388 -14.440 -17.395 -17.129 -14.099 -17.512 50.000 -12.205 50.000 -17.715 -16.607 -12.939 -14.042 -14.651 +25000 (returns) -12.856 -5.858 50.000 50.000 50.000 -9.464 -5.520 -16.097 -6.339 -5.510 -5.847 50.000 -9.067 -5.847 50.000 -10.254 50.000 -12.570 50.000 -10.776 -16.875 50.000 -9.561 -16.165 50.000 50.000 -10.384 -6.739 -6.288 -6.223 -7.379 -9.888 50.000 -10.010 -10.553 -11.729 -12.120 50.000 -12.622 50.000 -10.082 -9.565 -9.755 -13.147 -6.308 50.000 -11.684 -10.937 -17.729 50.000 -18.153 50.000 50.000 -17.195 50.000 -9.711 -8.993 50.000 -8.541 -5.983 -9.571 -13.509 -17.542 50.000 50.000 -6.284 -10.337 50.000 50.000 50.000 50.000 -8.198 50.000 -14.584 -10.371 -5.933 -5.907 -11.423 -9.696 -13.077 -10.014 -12.910 -12.608 -10.030 -9.581 -10.386 -9.224 50.000 -5.939 50.000 -9.911 50.000 -5.905 50.000 50.000 -11.017 -9.527 50.000 50.000 -10.135 +30000 (returns) -11.460 50.000 -14.471 50.000 -12.330 50.000 -10.465 -17.246 -14.869 50.000 -17.481 -16.911 -15.373 -5.828 -15.439 -5.654 -5.901 50.000 50.000 -12.942 -12.755 50.000 -15.718 -5.598 -15.539 50.000 50.000 -11.119 -5.922 -11.041 -15.595 -11.994 -10.718 50.000 -6.227 -5.884 50.000 -14.760 -15.572 -17.124 -14.699 -15.570 -5.568 -14.137 -12.377 -10.989 50.000 -11.428 -5.788 -10.620 -17.174 -15.088 50.000 -10.689 -10.721 -6.251 -14.052 -5.893 -15.463 -13.246 -5.509 -5.793 -14.047 50.000 50.000 -15.086 -11.009 -17.552 -5.851 50.000 50.000 -12.469 50.000 50.000 -12.512 -5.790 -6.236 -5.463 50.000 -5.523 -16.052 -5.471 -16.128 -14.195 -12.234 -5.434 -11.922 -11.086 -10.901 -13.099 50.000 -11.585 -5.540 -5.772 -5.802 -12.381 -5.441 50.000 -11.418 -5.520 +35000 (returns) -15.905 -15.102 50.000 -15.382 -12.314 -14.635 50.000 -14.010 -8.582 -12.644 50.000 -10.154 -10.065 -13.348 50.000 -7.419 -14.839 -8.579 -13.428 -10.860 -8.459 -14.292 -8.894 -11.666 -13.131 -9.069 50.000 -18.664 -17.529 -9.416 -15.223 50.000 -12.770 50.000 -12.934 50.000 50.000 -14.860 50.000 50.000 -15.549 -10.976 50.000 -14.071 50.000 -15.730 -15.420 -14.138 -12.252 -10.777 50.000 -8.302 -18.248 -7.886 50.000 50.000 -13.946 50.000 50.000 50.000 50.000 50.000 -13.501 50.000 50.000 -9.138 50.000 -9.587 -16.032 -14.805 -7.192 -11.658 50.000 -14.191 -14.006 -15.105 50.000 50.000 50.000 -10.840 -14.379 -12.777 -9.376 -14.216 -14.493 50.000 -12.112 -14.084 -8.511 -6.885 50.000 -17.982 -13.035 50.000 50.000 50.000 -17.788 -14.238 -11.610 -10.652 +40000 (returns) 50.000 50.000 -15.280 50.000 50.000 -10.890 -12.134 50.000 50.000 50.000 50.000 50.000 50.000 -0.079 50.000 -13.133 50.000 -0.050 50.000 50.000 -9.558 50.000 50.000 -10.248 -10.053 -10.567 -8.251 -9.026 -11.119 50.000 -10.437 50.000 50.000 50.000 50.000 -13.370 50.000 50.000 50.000 -10.067 -14.515 -15.405 50.000 50.000 50.000 50.000 -15.767 -14.520 50.000 -11.318 -18.128 50.000 -11.555 50.000 -11.093 -10.483 -6.733 -13.675 -11.100 -7.820 50.000 -10.875 50.000 -13.826 50.000 50.000 50.000 -7.363 -14.304 -15.307 50.000 50.000 -12.731 50.000 -12.303 50.000 -10.267 50.000 50.000 -10.441 50.000 -15.145 -11.910 50.000 -18.183 50.000 -13.614 -9.213 -13.066 -18.373 -9.223 -14.940 -12.095 -9.817 -7.785 -10.542 50.000 -15.673 50.000 50.000 +45000 (returns) 50.000 50.000 -14.000 -11.519 -14.912 -11.150 50.000 -14.542 -14.046 50.000 -10.588 50.000 50.000 -6.244 -11.462 -13.746 -7.898 50.000 50.000 50.000 -14.206 50.000 -14.513 -13.267 -13.789 -6.277 50.000 -10.084 -14.403 -12.532 50.000 50.000 -13.687 50.000 -18.200 50.000 50.000 -10.047 50.000 -6.300 -12.712 50.000 -11.850 -10.914 -6.486 -14.084 50.000 -11.988 50.000 -14.689 50.000 -14.548 50.000 50.000 -6.012 -14.905 50.000 50.000 50.000 -14.800 -12.269 -13.562 -13.123 50.000 -14.490 -14.364 -10.624 50.000 -11.144 50.000 -16.458 50.000 -12.182 50.000 50.000 -14.023 -12.782 -5.876 -6.301 -14.762 50.000 50.000 -11.418 -17.679 50.000 -13.845 50.000 -12.032 50.000 -7.997 50.000 -11.496 50.000 -14.678 50.000 -14.677 -12.380 -11.232 50.000 -14.623 +50000 (returns) 50.000 -13.552 50.000 50.000 -14.219 -9.415 50.000 -14.099 50.000 -8.924 50.000 -6.399 50.000 50.000 -14.368 50.000 -13.330 -12.781 -13.599 -18.018 -10.838 50.000 -14.103 -14.489 -11.407 -11.540 -5.850 50.000 -5.873 50.000 -10.542 -12.306 50.000 -18.086 -12.239 50.000 -6.303 -14.168 50.000 50.000 -14.011 -10.695 -9.524 50.000 50.000 -6.316 50.000 -9.836 50.000 50.000 -13.105 -14.107 50.000 50.000 -11.953 50.000 50.000 -10.046 -11.605 50.000 -17.814 50.000 50.000 50.000 -11.505 50.000 50.000 50.000 50.000 50.000 50.000 -6.765 50.000 50.000 -14.399 50.000 50.000 50.000 -14.581 50.000 -13.018 50.000 50.000 50.000 50.000 -14.100 -14.188 50.000 -5.985 -6.407 50.000 -13.224 50.000 -12.852 -5.792 -14.025 50.000 -6.286 50.000 50.000 +55000 (returns) -8.978 50.000 50.000 -5.549 -9.489 -5.504 50.000 50.000 -13.759 50.000 -13.224 50.000 -18.294 50.000 -12.164 -5.557 -11.362 -10.623 50.000 50.000 50.000 50.000 50.000 -8.501 50.000 -10.836 50.000 50.000 -13.835 50.000 50.000 -5.562 50.000 -14.172 -9.593 -14.233 -5.635 50.000 50.000 -10.260 50.000 50.000 -5.846 50.000 50.000 -5.677 -5.622 50.000 -10.830 50.000 -12.065 50.000 50.000 50.000 50.000 50.000 -5.565 50.000 -5.609 50.000 50.000 -12.596 -13.937 -13.208 -13.899 50.000 50.000 50.000 -5.671 -11.267 -12.705 -11.673 -13.122 -11.789 -12.771 -12.665 -14.130 -14.048 -7.826 -5.690 50.000 -5.520 -14.040 -10.262 -12.531 -12.451 50.000 -14.069 -8.322 -8.808 -12.729 50.000 -10.852 -12.085 -11.365 -5.709 -5.919 50.000 -9.614 50.000 +60000 (returns) -9.778 50.000 -5.858 50.000 50.000 50.000 -12.570 50.000 -5.579 -9.656 50.000 -10.547 -11.285 -12.887 50.000 -5.564 50.000 -9.831 -5.902 50.000 -5.862 50.000 50.000 -10.500 -9.752 50.000 -10.905 50.000 -5.473 -5.695 50.000 -9.496 50.000 -5.521 50.000 50.000 50.000 50.000 50.000 -9.803 50.000 50.000 -5.567 50.000 50.000 -5.793 50.000 50.000 50.000 50.000 50.000 50.000 -8.446 -5.458 50.000 -5.422 -10.761 50.000 50.000 -10.181 -13.074 50.000 50.000 50.000 50.000 50.000 50.000 -5.794 -18.431 50.000 50.000 50.000 50.000 -5.541 50.000 50.000 -5.661 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -5.933 50.000 -5.849 50.000 -11.351 -10.880 -5.636 50.000 -13.225 50.000 -14.311 -5.888 50.000 -10.553 -5.875 -8.978 +65000 (returns) 50.000 50.000 -14.440 50.000 50.000 50.000 50.000 -5.900 50.000 -5.628 50.000 50.000 50.000 50.000 -10.411 50.000 50.000 -5.644 50.000 50.000 50.000 -5.757 50.000 -5.898 50.000 -9.872 -5.683 50.000 50.000 50.000 -5.845 50.000 -5.575 50.000 50.000 50.000 -5.432 50.000 -13.102 50.000 50.000 -5.754 50.000 -5.813 50.000 50.000 50.000 -6.222 50.000 50.000 -5.461 -11.612 50.000 50.000 50.000 -16.977 -9.620 -12.608 50.000 50.000 -12.835 50.000 50.000 50.000 -16.337 -5.790 -17.476 50.000 50.000 -12.365 -5.772 50.000 -5.436 50.000 -5.464 50.000 50.000 50.000 -5.460 -15.302 -5.822 50.000 -12.488 -5.461 50.000 50.000 50.000 50.000 50.000 50.000 -5.575 50.000 50.000 50.000 -10.453 50.000 -14.506 -11.527 50.000 50.000 +70000 (returns) 50.000 -11.893 50.000 50.000 -15.141 50.000 -6.272 -12.673 -12.506 50.000 50.000 -15.524 50.000 50.000 -5.489 50.000 -11.704 50.000 -6.311 50.000 -15.687 50.000 -5.954 50.000 50.000 50.000 -12.345 -5.838 -5.512 50.000 50.000 50.000 -6.306 -6.757 50.000 50.000 50.000 -11.943 -6.746 50.000 -9.037 50.000 -5.517 50.000 50.000 50.000 50.000 50.000 -16.207 -12.078 50.000 -12.590 -15.554 -5.531 -10.869 50.000 -16.914 50.000 50.000 -5.836 -12.556 -12.531 50.000 -6.279 -14.240 50.000 -12.743 -12.749 -12.367 50.000 50.000 -15.906 50.000 -6.283 50.000 50.000 -5.775 -14.773 -12.378 -5.863 -5.531 50.000 50.000 -16.096 -13.368 50.000 50.000 50.000 -12.621 -5.828 50.000 -5.952 50.000 50.000 50.000 50.000 -14.430 50.000 50.000 -12.225 +75000 (returns) 50.000 50.000 50.000 -11.566 50.000 50.000 50.000 50.000 50.000 -18.195 -5.833 -13.080 50.000 50.000 -12.259 50.000 50.000 -5.809 50.000 50.000 50.000 50.000 50.000 50.000 -18.701 50.000 50.000 -13.339 -6.801 -9.832 50.000 50.000 -10.693 50.000 -6.257 -9.832 50.000 50.000 50.000 50.000 -12.718 50.000 -13.240 50.000 -18.598 -5.835 -11.818 50.000 50.000 50.000 50.000 -5.836 50.000 50.000 50.000 50.000 -5.872 50.000 -5.826 50.000 50.000 -6.290 -10.122 50.000 50.000 -13.112 50.000 -6.337 50.000 -13.194 -5.822 50.000 50.000 -6.323 -10.520 50.000 50.000 50.000 50.000 -6.318 -12.044 -5.860 50.000 -5.910 50.000 50.000 -6.305 -11.419 -5.922 50.000 50.000 50.000 50.000 50.000 50.000 -12.628 50.000 50.000 -5.815 50.000 +80000 (returns) 50.000 50.000 -7.150 50.000 -15.955 -15.601 50.000 -6.214 -6.503 50.000 50.000 50.000 50.000 50.000 -10.506 50.000 -10.738 50.000 50.000 -15.930 50.000 -6.548 50.000 -6.268 50.000 50.000 -6.694 50.000 50.000 -7.361 -10.285 50.000 -14.652 -14.065 -17.735 -14.210 -14.071 -14.028 50.000 50.000 -9.824 50.000 50.000 -7.754 50.000 50.000 -14.066 50.000 50.000 50.000 -10.292 50.000 50.000 -18.015 -14.281 -6.186 50.000 50.000 50.000 50.000 50.000 50.000 -11.924 -6.163 50.000 50.000 50.000 -6.653 50.000 50.000 -10.921 -11.409 50.000 -6.944 50.000 50.000 -12.373 50.000 -14.421 -14.216 50.000 -11.292 50.000 50.000 50.000 50.000 50.000 -10.633 50.000 50.000 50.000 -11.974 50.000 -15.324 50.000 -7.457 -10.399 50.000 50.000 -12.057 +85000 (returns) 50.000 50.000 -13.669 -14.152 50.000 50.000 -12.793 50.000 -13.762 50.000 50.000 50.000 50.000 -14.086 50.000 50.000 50.000 -10.403 -6.806 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -7.171 -13.222 50.000 50.000 -0.210 50.000 50.000 50.000 50.000 -11.937 -10.119 50.000 50.000 50.000 -14.364 -7.708 50.000 -14.414 50.000 50.000 50.000 50.000 50.000 50.000 -6.662 50.000 -12.019 -6.941 -7.403 50.000 50.000 50.000 50.000 50.000 -8.841 -7.318 50.000 50.000 50.000 -14.117 50.000 50.000 50.000 -17.662 50.000 50.000 50.000 50.000 50.000 50.000 -18.335 50.000 -13.541 50.000 -12.446 50.000 -7.850 50.000 50.000 -7.210 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -12.270 50.000 50.000 50.000 -13.643 -10.173 +90000 (returns) 50.000 50.000 -0.195 50.000 50.000 -9.162 50.000 50.000 50.000 -10.308 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -9.197 50.000 50.000 50.000 50.000 50.000 -0.661 50.000 -5.898 -5.985 50.000 -11.406 50.000 50.000 -6.247 50.000 -14.161 50.000 50.000 -9.489 -14.404 -9.340 50.000 -0.434 50.000 -5.963 -14.198 -12.032 50.000 50.000 -6.274 50.000 -10.923 -5.990 -6.793 50.000 -13.382 50.000 -12.247 -9.831 50.000 50.000 50.000 -12.300 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -13.384 50.000 -17.750 50.000 50.000 -9.261 -6.275 -6.270 50.000 -0.059 -5.861 50.000 50.000 50.000 50.000 -10.330 50.000 50.000 -12.192 -10.527 50.000 50.000 -11.403 -0.018 50.000 -11.989 -10.025 50.000 50.000 50.000 50.000 50.000 +95000 (returns) -6.322 -12.354 50.000 50.000 -9.650 50.000 50.000 50.000 50.000 -5.847 -11.390 50.000 -12.548 -5.947 -5.952 -0.558 50.000 50.000 -5.838 -12.037 50.000 -14.228 50.000 50.000 50.000 50.000 50.000 -6.240 50.000 -6.413 50.000 50.000 50.000 50.000 -5.820 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -6.304 50.000 50.000 50.000 -6.236 50.000 -6.361 50.000 50.000 -6.280 50.000 -9.664 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -5.904 50.000 -0.346 -6.235 50.000 -6.044 -6.327 -6.317 50.000 -12.640 50.000 -12.524 50.000 50.000 -12.482 -12.328 -11.420 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -5.899 -12.127 -14.039 50.000 50.000 50.000 50.000 50.000 -9.858 50.000 -9.808 50.000 +100000 (returns) 50.000 50.000 -18.005 50.000 50.000 50.000 50.000 -9.935 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -5.473 -16.994 50.000 50.000 50.000 -9.439 50.000 50.000 -11.413 50.000 50.000 50.000 50.000 50.000 -9.726 50.000 50.000 -17.551 50.000 50.000 50.000 50.000 -12.882 50.000 -14.132 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -14.810 -12.466 50.000 -17.562 50.000 50.000 50.000 -14.837 50.000 -16.704 50.000 -14.722 -17.398 50.000 -11.989 -11.286 50.000 -14.200 -13.973 -5.876 -15.165 50.000 50.000 50.000 50.000 -5.972 -10.392 50.000 50.000 50.000 -12.577 -17.333 -14.877 50.000 50.000 50.000 50.000 50.000 50.000 -5.832 -7.006 50.000 50.000 -5.563 -14.072 50.000 50.000 50.000 50.000 50.000 -14.186 -10.896 +105000 (returns) 50.000 -14.223 50.000 50.000 -13.553 -12.432 -0.702 -14.372 -5.734 -7.646 50.000 -5.551 -14.451 50.000 -5.707 -15.540 -5.477 50.000 -11.003 50.000 50.000 50.000 50.000 50.000 -14.381 50.000 -14.348 50.000 50.000 -14.569 -15.716 50.000 -14.312 50.000 50.000 50.000 -5.976 -5.549 50.000 50.000 50.000 50.000 50.000 -14.636 -15.617 50.000 50.000 50.000 50.000 -15.876 50.000 50.000 -5.651 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -14.106 -13.750 50.000 50.000 50.000 -11.354 50.000 50.000 -14.076 -5.583 50.000 50.000 -14.097 50.000 50.000 50.000 -13.571 50.000 50.000 -0.317 -14.602 -14.230 -14.264 50.000 -14.474 -0.054 50.000 50.000 -5.493 -5.241 50.000 50.000 50.000 50.000 50.000 -0.341 50.000 -14.615 +110000 (returns) -16.598 50.000 -11.994 50.000 -13.739 50.000 50.000 -12.084 50.000 50.000 -11.457 50.000 50.000 -0.532 50.000 -16.733 -11.136 50.000 -3.291 50.000 -12.193 -13.229 50.000 -12.818 -16.080 50.000 50.000 -12.793 50.000 50.000 50.000 50.000 50.000 -10.618 50.000 50.000 -11.756 -12.608 -16.510 -11.910 -11.910 -16.082 50.000 50.000 -15.978 50.000 -14.576 -15.207 -14.982 50.000 50.000 50.000 50.000 50.000 -15.888 -15.719 50.000 50.000 -13.375 50.000 50.000 -11.552 50.000 -13.697 50.000 50.000 50.000 -17.556 -12.051 50.000 -12.560 -12.999 50.000 -15.897 -11.481 -15.432 50.000 50.000 -12.405 -0.388 50.000 50.000 -11.960 50.000 50.000 -14.079 50.000 50.000 50.000 -15.078 50.000 50.000 -11.972 -11.486 50.000 -12.095 50.000 50.000 -12.369 -15.813 +115000 (returns) 50.000 -9.881 50.000 -18.650 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -17.830 50.000 -18.544 -18.026 50.000 50.000 50.000 50.000 50.000 -15.623 -17.871 -10.918 -20.002 -0.620 -11.711 -20.005 -18.074 -16.156 50.000 50.000 -14.102 -18.335 50.000 50.000 50.000 50.000 -0.401 50.000 -20.002 50.000 50.000 50.000 50.000 50.000 -17.812 50.000 50.000 50.000 50.000 -14.623 50.000 50.000 50.000 -11.484 -20.008 50.000 50.000 -19.279 -14.236 50.000 50.000 -20.004 -16.561 -20.052 -10.532 -20.000 50.000 50.000 50.000 -20.006 -19.535 -11.436 -15.715 50.000 -9.368 -18.606 50.000 50.000 50.000 -11.384 -11.695 50.000 -20.007 50.000 -13.320 -16.762 50.000 50.000 -16.783 -0.510 50.000 -14.297 -20.007 50.000 -11.597 50.000 50.000 50.000 +120000 (returns) 50.000 50.000 50.000 50.000 50.000 -0.835 50.000 -20.051 50.000 50.000 -16.610 50.000 -20.043 50.000 50.000 -20.048 50.000 50.000 -9.760 50.000 50.000 -20.056 -20.041 -20.038 50.000 50.000 50.000 -20.036 50.000 -20.018 50.000 -16.989 50.000 50.000 50.000 50.000 -16.689 -20.011 -11.611 50.000 -0.626 -20.038 -16.897 -20.039 -20.052 50.000 50.000 -12.444 -8.959 50.000 -20.034 -8.788 -20.058 50.000 50.000 -20.027 -20.032 50.000 50.000 -17.292 -20.044 -20.054 -13.335 50.000 50.000 50.000 -18.350 50.000 50.000 50.000 50.000 50.000 -20.034 50.000 -20.023 -10.509 50.000 -20.054 -20.047 50.000 -20.001 -16.748 -20.055 -17.896 50.000 -20.006 -20.004 -20.046 50.000 50.000 -20.015 50.000 50.000 50.000 50.000 50.000 50.000 -20.014 50.000 50.000 +125000 (returns) 50.000 50.000 -0.244 -20.007 -20.027 -0.473 -18.491 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -20.014 50.000 -20.026 -20.013 -20.018 50.000 50.000 50.000 -0.597 -20.030 -20.003 -20.009 50.000 -20.012 50.000 -20.025 50.000 -0.432 50.000 50.000 50.000 50.000 -20.028 50.000 50.000 -20.051 -20.021 -20.011 -20.015 50.000 50.000 50.000 -20.023 50.000 -20.010 50.000 50.000 50.000 -20.046 -16.646 -19.224 50.000 -0.436 -20.013 -10.960 -20.011 -16.438 50.000 -0.572 -20.018 50.000 50.000 -16.667 -0.578 50.000 50.000 50.000 -19.471 50.000 50.000 50.000 -0.496 -19.158 50.000 50.000 50.000 -20.007 50.000 -19.342 50.000 -20.041 50.000 50.000 50.000 -20.009 50.000 50.000 -20.003 -20.035 50.000 50.000 50.000 50.000 -10.670 -11.535 -11.591 +130000 (returns) 50.000 50.000 -0.346 50.000 50.000 -0.793 -0.364 -9.692 50.000 50.000 50.000 50.000 50.000 -18.043 50.000 50.000 50.000 -0.502 50.000 -16.520 50.000 -0.361 -0.249 50.000 50.000 50.000 50.000 50.000 -0.870 50.000 50.000 50.000 50.000 -16.283 -10.740 50.000 -0.590 -0.519 -0.431 50.000 50.000 50.000 50.000 50.000 -17.835 -0.496 -0.629 -16.426 50.000 50.000 -10.904 50.000 50.000 50.000 50.000 50.000 50.000 -0.680 50.000 50.000 -16.416 50.000 50.000 50.000 -17.833 50.000 50.000 -10.288 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -10.541 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -11.125 50.000 50.000 50.000 -0.327 -11.342 50.000 50.000 50.000 50.000 -0.520 -10.299 50.000 50.000 -0.135 +135000 (returns) -10.347 -11.544 50.000 -18.866 -17.172 50.000 50.000 -0.474 -9.659 -10.186 -11.155 50.000 50.000 -18.241 50.000 -16.667 50.000 50.000 -16.509 50.000 -18.283 50.000 50.000 -16.912 50.000 50.000 -12.325 50.000 -16.265 50.000 -10.466 -11.959 -12.836 50.000 -17.347 -17.092 50.000 -10.477 50.000 50.000 50.000 50.000 -0.552 -18.328 -10.573 -16.790 -11.279 -17.650 50.000 50.000 50.000 -17.487 50.000 50.000 -10.956 -16.223 50.000 50.000 -11.007 50.000 50.000 50.000 -0.456 -14.922 50.000 50.000 50.000 50.000 -15.832 50.000 50.000 -17.794 50.000 50.000 -8.962 -9.971 -16.771 -17.511 50.000 -17.047 50.000 50.000 -15.048 50.000 -0.743 -0.349 -0.413 50.000 50.000 -16.545 -0.585 50.000 -10.230 50.000 -11.001 50.000 50.000 -15.649 50.000 50.000 +140000 (returns) -18.432 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -10.601 -18.605 -16.638 50.000 -18.409 50.000 50.000 50.000 -20.028 50.000 50.000 -14.256 50.000 -20.031 50.000 50.000 50.000 50.000 50.000 -20.017 50.000 50.000 50.000 50.000 -17.738 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -20.028 -14.729 -14.094 50.000 50.000 50.000 50.000 50.000 -14.328 -20.002 50.000 50.000 -20.027 -14.249 50.000 50.000 -14.553 -0.503 -20.001 50.000 50.000 50.000 -17.711 50.000 50.000 -16.243 -18.651 -13.667 -20.031 50.000 50.000 -20.012 50.000 50.000 50.000 -13.808 50.000 50.000 -15.209 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -20.003 -16.972 50.000 50.000 50.000 -20.024 +145000 (returns) -14.271 50.000 50.000 50.000 50.000 -0.085 50.000 50.000 -17.951 -13.925 -18.521 -15.938 50.000 50.000 50.000 50.000 -11.737 -11.564 50.000 50.000 50.000 -9.581 50.000 -16.470 50.000 50.000 50.000 -7.981 50.000 50.000 50.000 -14.481 -8.289 -0.659 50.000 50.000 50.000 50.000 50.000 -11.724 50.000 -11.763 50.000 -0.326 50.000 50.000 -13.706 -9.810 -16.454 50.000 -14.160 -11.506 -11.538 50.000 50.000 50.000 50.000 -8.287 -12.966 50.000 50.000 50.000 50.000 -15.774 50.000 50.000 -12.670 50.000 -13.810 -14.529 -11.486 -1.050 50.000 -15.390 -17.393 50.000 50.000 50.000 50.000 50.000 -0.594 50.000 50.000 -16.089 50.000 -16.946 50.000 50.000 -0.552 50.000 50.000 50.000 50.000 50.000 -14.490 -13.456 50.000 -0.550 -14.283 50.000 +150000 (returns) 50.000 50.000 50.000 -10.109 -2.358 50.000 -11.092 -14.955 -14.771 -10.853 -0.441 -14.548 -10.414 -0.640 50.000 50.000 50.000 50.000 50.000 -14.751 50.000 -14.293 50.000 50.000 -0.612 50.000 -3.176 50.000 -18.284 -13.896 -11.134 -14.348 -1.865 -0.439 50.000 50.000 -11.998 -17.793 50.000 50.000 50.000 50.000 -0.155 -13.989 50.000 -11.142 50.000 -14.306 50.000 -10.477 50.000 50.000 50.000 50.000 50.000 -14.841 50.000 50.000 -3.355 50.000 50.000 50.000 -14.484 -10.936 -11.545 50.000 50.000 -12.949 -14.301 50.000 -14.265 50.000 50.000 50.000 -10.413 50.000 50.000 -14.122 -9.935 50.000 50.000 50.000 -18.720 50.000 -14.504 50.000 50.000 50.000 -10.995 50.000 50.000 -10.891 50.000 50.000 50.000 50.000 -17.563 -0.013 -17.788 50.000 +155000 (returns) 50.000 50.000 50.000 -10.144 -17.525 -14.059 50.000 50.000 -11.608 50.000 50.000 -13.962 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -10.938 -14.313 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -14.348 50.000 50.000 50.000 50.000 50.000 50.000 -14.265 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -10.964 50.000 50.000 -12.250 -10.170 50.000 50.000 -13.044 50.000 50.000 50.000 50.000 50.000 50.000 -0.208 50.000 50.000 50.000 50.000 50.000 -14.121 50.000 50.000 50.000 50.000 -0.058 -12.228 50.000 -14.298 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -0.298 50.000 -14.159 50.000 50.000 -12.981 50.000 -14.359 -13.956 50.000 50.000 +160000 (returns) -13.479 -14.063 -13.594 -13.903 50.000 50.000 50.000 50.000 -10.393 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -12.748 -13.474 50.000 50.000 -13.801 -13.720 -11.844 50.000 -13.427 50.000 -0.009 -0.837 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -11.257 50.000 -12.182 -11.901 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -11.626 50.000 -3.186 50.000 50.000 -13.379 50.000 -0.822 -0.458 -11.476 -14.422 50.000 50.000 50.000 50.000 50.000 -1.266 50.000 50.000 50.000 -14.028 -10.451 50.000 -12.832 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -13.006 -12.310 50.000 -0.430 50.000 50.000 -13.713 -14.488 50.000 50.000 50.000 -18.632 50.000 50.000 50.000 50.000 50.000 50.000 +165000 (returns) 50.000 -11.179 50.000 50.000 50.000 -14.086 50.000 50.000 50.000 50.000 50.000 -9.033 50.000 50.000 -12.528 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -8.314 50.000 50.000 50.000 50.000 50.000 -9.823 50.000 50.000 -9.895 50.000 -10.867 -10.903 50.000 -11.658 50.000 -17.577 50.000 -12.860 50.000 -18.290 50.000 50.000 50.000 50.000 50.000 -13.221 50.000 50.000 -10.470 -17.061 -9.001 50.000 50.000 50.000 -0.862 50.000 50.000 50.000 50.000 -14.039 -12.400 50.000 -5.503 -0.384 50.000 50.000 50.000 -12.419 -10.708 50.000 -8.339 50.000 -14.122 -9.941 50.000 -9.902 50.000 50.000 -9.940 50.000 -8.821 -13.104 -13.315 50.000 50.000 50.000 -12.794 50.000 50.000 50.000 -0.832 -9.918 50.000 50.000 -17.595 +170000 (returns) 50.000 50.000 -14.187 -17.090 50.000 -12.320 50.000 50.000 -14.375 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -14.490 -0.012 -14.708 50.000 50.000 50.000 -17.756 50.000 50.000 50.000 -18.108 -12.151 -14.209 50.000 50.000 50.000 50.000 -18.037 50.000 50.000 50.000 -17.985 50.000 50.000 -17.981 50.000 50.000 50.000 50.000 50.000 -0.183 -17.872 50.000 50.000 50.000 50.000 -14.594 50.000 -17.563 50.000 -12.517 -3.427 50.000 50.000 50.000 50.000 -13.949 50.000 -14.628 50.000 -17.902 -14.745 50.000 -14.297 50.000 50.000 -13.182 -17.643 50.000 -9.026 50.000 50.000 -0.742 50.000 50.000 -14.184 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -12.575 50.000 50.000 +175000 (returns) -10.886 50.000 -3.472 50.000 50.000 50.000 50.000 50.000 -3.588 50.000 50.000 -13.409 50.000 -0.626 -18.098 50.000 50.000 50.000 -1.296 -14.180 50.000 50.000 -18.263 50.000 50.000 -16.237 50.000 -2.442 50.000 50.000 50.000 50.000 50.000 -0.464 50.000 50.000 50.000 -1.052 50.000 50.000 50.000 -12.922 -12.811 50.000 50.000 -14.704 50.000 -2.511 50.000 50.000 50.000 -14.559 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -17.561 50.000 50.000 50.000 -0.490 50.000 50.000 50.000 50.000 50.000 -11.489 -14.732 50.000 50.000 -14.054 50.000 50.000 50.000 50.000 50.000 50.000 -1.653 -1.643 50.000 -15.572 50.000 50.000 50.000 50.000 50.000 -12.703 -4.335 50.000 -14.349 50.000 -18.182 -13.443 -3.485 -2.509 50.000 50.000 +180000 (returns) 50.000 -13.301 -17.980 50.000 50.000 50.000 -1.488 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -0.641 50.000 50.000 50.000 -14.377 -14.977 50.000 50.000 50.000 50.000 50.000 -13.097 50.000 50.000 -14.132 -11.545 -15.326 50.000 -11.574 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -13.233 50.000 50.000 50.000 -16.673 -1.036 50.000 50.000 50.000 50.000 -14.287 -12.186 50.000 50.000 50.000 -13.312 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -14.369 50.000 50.000 50.000 50.000 50.000 -10.691 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -13.784 50.000 50.000 50.000 50.000 +185000 (returns) -18.189 -16.019 50.000 50.000 50.000 50.000 50.000 -9.433 50.000 50.000 50.000 50.000 50.000 50.000 -15.793 50.000 -15.532 -15.324 50.000 50.000 -11.486 -11.562 -16.498 50.000 50.000 -15.037 50.000 -17.750 50.000 50.000 50.000 -11.860 50.000 50.000 -12.431 -16.395 50.000 50.000 50.000 -16.238 50.000 50.000 -15.918 -16.511 50.000 -8.938 -10.968 50.000 -16.088 -17.166 50.000 50.000 50.000 -16.422 -8.873 -16.526 -15.800 50.000 50.000 50.000 -16.175 -15.481 50.000 50.000 50.000 -15.485 50.000 50.000 -11.449 -16.518 50.000 -10.686 50.000 50.000 50.000 -10.690 -15.663 -15.323 -10.490 50.000 -15.520 50.000 -10.230 50.000 -8.211 50.000 -8.741 -14.705 50.000 50.000 50.000 50.000 50.000 50.000 -12.783 50.000 50.000 -10.609 -15.734 50.000 +190000 (returns) 50.000 -12.308 50.000 50.000 -15.625 50.000 50.000 50.000 50.000 -12.953 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -16.323 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -17.024 -14.765 -15.779 50.000 50.000 50.000 50.000 50.000 -16.592 50.000 50.000 50.000 50.000 -0.089 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -17.257 -16.479 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -15.748 -16.627 50.000 50.000 -18.009 50.000 50.000 -17.889 50.000 50.000 50.000 50.000 50.000 -16.549 50.000 50.000 50.000 50.000 50.000 -16.412 50.000 50.000 50.000 50.000 50.000 -14.250 50.000 -15.731 50.000 50.000 50.000 50.000 50.000 50.000 +195000 (returns) 50.000 50.000 -9.082 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -12.487 -10.355 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -10.853 -16.423 50.000 50.000 50.000 50.000 50.000 50.000 -16.866 50.000 50.000 -14.017 -16.385 -15.808 50.000 50.000 50.000 50.000 50.000 50.000 -17.920 50.000 -16.758 50.000 50.000 50.000 -9.013 50.000 -10.913 50.000 50.000 -3.396 50.000 50.000 -18.424 50.000 50.000 50.000 -14.183 50.000 50.000 -11.423 -11.461 50.000 -10.500 50.000 -18.170 -10.408 50.000 -11.003 50.000 -16.261 50.000 50.000 50.000 -11.526 50.000 50.000 50.000 50.000 50.000 -10.789 -16.487 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -10.547 -10.687 50.000 50.000 50.000 50.000 50.000 50.000 50.000 +200000 (returns) -16.839 50.000 50.000 -11.661 -10.419 50.000 50.000 50.000 50.000 50.000 -15.606 -17.918 50.000 50.000 50.000 -15.607 50.000 50.000 50.000 50.000 50.000 50.000 -14.620 50.000 50.000 -12.608 -15.942 -10.246 50.000 50.000 -15.516 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -10.136 -15.677 50.000 50.000 50.000 50.000 -10.469 50.000 50.000 -18.207 50.000 50.000 50.000 -11.586 -15.714 -19.207 50.000 50.000 -19.222 -16.345 -18.423 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -10.497 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -15.975 50.000 50.000 -15.735 50.000 50.000 50.000 -18.022 -11.107 50.000 50.000 -13.069 50.000 -10.275 50.000 50.000 50.000 50.000 50.000 +205000 (returns) 50.000 50.000 -15.403 -8.664 50.000 -12.503 50.000 50.000 50.000 -0.370 -12.996 -12.147 50.000 50.000 50.000 -16.570 50.000 50.000 50.000 50.000 -11.254 -17.136 50.000 -16.865 50.000 -11.438 50.000 -11.674 50.000 50.000 50.000 50.000 50.000 -15.792 -11.681 50.000 50.000 50.000 50.000 -12.485 -13.385 50.000 50.000 50.000 50.000 -12.086 50.000 50.000 50.000 50.000 -12.203 50.000 -16.804 -10.445 -16.109 50.000 -17.569 50.000 50.000 50.000 -10.550 -14.406 50.000 -15.619 50.000 50.000 -15.999 -17.759 -15.614 50.000 50.000 -16.639 50.000 -11.346 50.000 50.000 -14.129 -11.424 50.000 50.000 -17.115 -10.584 -16.249 -11.025 50.000 50.000 -15.556 50.000 50.000 50.000 50.000 50.000 -11.150 -15.411 -16.125 -16.629 50.000 -11.145 50.000 50.000 +210000 (returns) 50.000 -10.645 50.000 50.000 -16.912 50.000 50.000 -11.953 50.000 50.000 50.000 50.000 50.000 -16.220 50.000 50.000 50.000 -18.770 50.000 50.000 50.000 50.000 -18.503 50.000 50.000 -18.489 50.000 50.000 50.000 50.000 -12.608 -20.025 50.000 50.000 50.000 -11.358 50.000 50.000 -19.384 50.000 50.000 50.000 50.000 50.000 -18.446 50.000 -18.659 50.000 50.000 50.000 50.000 -18.895 50.000 50.000 50.000 50.000 -20.023 -18.384 50.000 50.000 50.000 -18.743 50.000 -17.953 50.000 50.000 -19.158 -18.701 50.000 -19.238 50.000 -17.037 -10.771 50.000 50.000 50.000 50.000 50.000 50.000 -18.720 -10.843 -18.468 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -19.139 50.000 -11.544 -18.496 50.000 +215000 (returns) 50.000 50.000 -18.571 -18.883 50.000 -17.764 -10.030 50.000 -10.003 -13.014 50.000 -16.844 -18.890 -17.392 50.000 50.000 -17.949 50.000 -17.358 50.000 -18.843 50.000 50.000 50.000 -17.958 50.000 -17.406 -18.838 -18.710 50.000 50.000 -18.840 -17.915 -18.864 -17.842 50.000 50.000 50.000 50.000 -10.520 50.000 50.000 -14.807 50.000 50.000 50.000 50.000 -18.812 -10.239 50.000 -12.151 50.000 50.000 -18.730 -17.184 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -18.594 -16.969 50.000 50.000 -12.472 50.000 -15.262 -18.208 50.000 50.000 -17.924 50.000 50.000 50.000 50.000 -9.770 50.000 50.000 50.000 -17.562 -18.347 50.000 -17.363 -9.165 -18.401 -11.775 50.000 50.000 50.000 50.000 -17.532 50.000 -18.028 -16.913 50.000 50.000 50.000 -17.569 +220000 (returns) -10.939 50.000 50.000 -9.899 -9.800 50.000 50.000 -11.277 -9.531 -14.011 50.000 50.000 50.000 -17.687 -9.825 50.000 50.000 -12.830 -10.259 -19.041 50.000 -19.151 -8.609 50.000 -15.669 50.000 -9.573 -12.677 -15.774 -18.961 50.000 -9.549 -18.996 50.000 -10.106 50.000 -9.978 50.000 -10.073 50.000 -10.076 -18.235 50.000 50.000 50.000 -9.901 50.000 50.000 50.000 -9.889 -11.997 50.000 50.000 50.000 50.000 50.000 50.000 -11.065 -18.447 50.000 50.000 50.000 50.000 -17.843 -19.305 -10.188 50.000 50.000 -9.550 -18.709 50.000 -10.342 -9.809 50.000 50.000 50.000 50.000 50.000 -11.052 -11.217 50.000 50.000 50.000 50.000 50.000 50.000 -9.887 50.000 -13.384 -18.641 50.000 50.000 -15.973 50.000 50.000 -13.083 50.000 -9.952 -9.859 -18.743 +225000 (returns) 50.000 50.000 -7.686 50.000 -9.254 50.000 50.000 -9.431 -18.642 50.000 50.000 50.000 50.000 -19.457 -15.420 50.000 50.000 50.000 -8.768 50.000 -14.946 -12.029 50.000 -10.778 50.000 50.000 -9.413 50.000 -7.885 50.000 -8.076 50.000 -19.416 50.000 50.000 50.000 -8.708 50.000 50.000 -7.844 -8.519 -9.116 50.000 50.000 -14.592 -19.129 -8.092 50.000 -8.269 50.000 50.000 -8.835 -9.585 -8.779 -19.059 50.000 50.000 50.000 -19.493 -7.700 -18.429 -11.451 50.000 -8.863 50.000 50.000 -7.812 -15.263 -19.456 50.000 -8.230 -14.760 50.000 -19.072 50.000 -14.981 -14.502 50.000 50.000 -17.607 -14.866 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -19.286 50.000 -9.642 50.000 50.000 -8.701 50.000 50.000 -14.579 50.000 50.000 +230000 (returns) 50.000 50.000 -15.299 50.000 -13.376 -14.051 50.000 50.000 -7.806 50.000 50.000 50.000 50.000 50.000 -11.230 -8.696 -13.531 -7.660 50.000 50.000 50.000 -8.073 50.000 -8.566 50.000 50.000 50.000 -8.567 -7.757 50.000 -12.023 -15.324 -12.614 50.000 -14.606 -18.422 -12.907 -8.954 -13.452 -10.641 50.000 -9.334 50.000 -12.085 -10.736 -7.905 -13.797 -11.221 50.000 50.000 50.000 50.000 -12.371 -7.822 50.000 -7.905 -11.769 -8.016 -10.642 50.000 -11.824 50.000 -7.894 -13.337 50.000 50.000 -13.740 -13.959 50.000 50.000 50.000 -7.659 50.000 50.000 -9.919 -13.576 50.000 50.000 -8.254 50.000 50.000 50.000 -15.501 -17.516 -9.709 -18.761 50.000 -8.678 50.000 -7.643 50.000 50.000 -13.856 50.000 50.000 -13.565 -17.811 -7.908 -13.294 -9.871 +235000 (returns) 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -18.549 50.000 50.000 -20.013 -20.009 50.000 -14.921 -15.269 50.000 50.000 -20.003 50.000 -15.807 -19.439 50.000 50.000 50.000 50.000 50.000 50.000 -18.676 -18.399 -17.426 50.000 -20.011 -14.006 50.000 -20.003 50.000 -18.303 50.000 -17.701 -14.424 -2.671 50.000 50.000 50.000 -9.518 -16.671 -20.011 -17.411 -11.557 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -18.882 -13.807 50.000 50.000 50.000 50.000 50.000 -12.964 50.000 50.000 50.000 50.000 50.000 -3.291 50.000 50.000 -20.000 50.000 -18.593 -15.455 -9.955 50.000 -18.458 50.000 -14.051 -10.696 50.000 -12.626 -18.928 -20.000 50.000 50.000 50.000 50.000 50.000 -15.530 -18.828 -16.023 -9.701 +240000 (returns) 50.000 -15.702 -0.421 -16.726 50.000 50.000 -11.185 50.000 50.000 -10.091 -10.326 -9.813 50.000 -0.256 -0.363 50.000 -0.352 50.000 -0.288 50.000 -9.881 -10.024 -2.811 50.000 50.000 -0.362 -0.406 -14.034 50.000 -2.633 -11.202 -10.123 50.000 50.000 -11.600 50.000 -16.376 -11.928 -16.515 -0.343 50.000 -17.168 -11.614 -9.127 -9.291 -2.379 50.000 50.000 50.000 -0.243 50.000 50.000 -9.694 -11.788 -18.938 50.000 -17.865 50.000 -11.551 -0.380 50.000 50.000 -10.680 -10.882 -0.054 -0.442 -9.694 50.000 50.000 50.000 -0.428 -15.768 50.000 50.000 -0.421 -17.325 -11.690 50.000 -0.298 -14.020 50.000 -13.579 -10.681 -0.401 -14.394 -17.611 50.000 50.000 -0.296 -12.789 50.000 -9.873 -14.155 50.000 50.000 -0.395 50.000 -0.260 -7.684 50.000 +245000 (returns) 50.000 50.000 50.000 50.000 50.000 50.000 -11.712 50.000 -9.942 -9.961 50.000 -10.406 50.000 -7.875 50.000 -12.191 50.000 50.000 50.000 -20.000 50.000 50.000 50.000 -8.294 50.000 50.000 50.000 -13.407 -11.639 50.000 50.000 50.000 50.000 -20.006 50.000 50.000 50.000 -17.857 50.000 50.000 50.000 -11.617 50.000 -14.182 50.000 -11.035 50.000 50.000 50.000 50.000 50.000 -9.848 50.000 50.000 -9.837 50.000 -10.794 -9.676 50.000 50.000 -10.914 50.000 50.000 -13.857 50.000 50.000 50.000 -11.327 50.000 -20.001 50.000 50.000 -10.769 50.000 -10.957 -18.585 50.000 50.000 -11.339 50.000 -10.661 -14.842 50.000 -9.405 50.000 -15.820 -11.297 50.000 50.000 -19.868 -16.822 -10.469 50.000 -9.923 50.000 50.000 50.000 -8.067 50.000 -11.950 +250000 (returns) 50.000 -18.334 50.000 50.000 50.000 50.000 50.000 -8.004 50.000 -20.004 50.000 50.000 50.000 -11.938 50.000 50.000 -13.092 50.000 50.000 50.000 -11.930 -9.901 50.000 50.000 50.000 -3.743 -14.662 50.000 50.000 50.000 -19.781 50.000 50.000 50.000 50.000 -10.787 50.000 -12.579 50.000 50.000 50.000 -14.101 -19.695 50.000 50.000 -14.586 -13.782 50.000 50.000 50.000 50.000 -11.157 50.000 50.000 -10.325 50.000 -8.545 -11.429 -1.999 50.000 50.000 -2.836 -15.775 50.000 50.000 50.000 50.000 -14.275 -20.000 50.000 50.000 -14.546 50.000 50.000 50.000 -20.015 50.000 50.000 -19.908 50.000 -19.672 50.000 50.000 50.000 50.000 50.000 50.000 -16.619 50.000 50.000 50.000 -12.141 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 +255000 (returns) 50.000 50.000 50.000 50.000 -14.765 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -13.246 50.000 50.000 -11.545 50.000 -12.890 50.000 -2.169 50.000 50.000 -14.585 50.000 -18.733 50.000 -11.506 50.000 -14.548 50.000 50.000 50.000 -13.048 50.000 50.000 50.000 50.000 50.000 -13.159 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -11.931 -11.906 50.000 50.000 50.000 -11.259 50.000 50.000 -11.493 -12.874 50.000 50.000 -18.085 50.000 -16.332 50.000 50.000 -14.688 -15.166 50.000 -14.042 -15.086 50.000 -11.001 -11.736 -11.699 50.000 50.000 50.000 -16.467 50.000 -12.586 50.000 -12.275 50.000 50.000 -16.592 -16.300 50.000 50.000 50.000 50.000 50.000 -13.607 -13.075 50.000 -14.750 50.000 50.000 -2.771 50.000 50.000 +260000 (returns) 50.000 50.000 50.000 -14.106 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -7.829 -11.474 -4.840 50.000 50.000 -7.933 -16.218 -12.713 -11.353 -11.656 50.000 50.000 -11.911 50.000 50.000 50.000 -9.729 -8.997 -7.847 50.000 50.000 50.000 50.000 50.000 -14.556 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -12.141 50.000 50.000 50.000 50.000 50.000 50.000 -4.499 -10.953 -8.892 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -8.005 -11.775 50.000 50.000 50.000 -9.461 50.000 50.000 50.000 50.000 -9.477 -10.334 50.000 50.000 50.000 50.000 -11.997 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -12.781 50.000 50.000 50.000 -11.859 -11.412 50.000 50.000 50.000 50.000 50.000 50.000 50.000 +265000 (returns) 50.000 -14.294 50.000 50.000 -14.103 -9.063 50.000 50.000 -9.367 -9.255 50.000 50.000 50.000 -15.930 -15.362 50.000 -13.969 50.000 -14.482 50.000 50.000 -9.659 50.000 -14.266 50.000 -2.234 50.000 50.000 -2.048 -16.321 -13.381 -9.746 -2.266 50.000 -12.728 50.000 50.000 50.000 50.000 -2.850 -12.245 50.000 50.000 50.000 -11.800 50.000 50.000 50.000 50.000 -2.755 50.000 -15.610 50.000 -9.922 50.000 50.000 50.000 50.000 -14.667 50.000 50.000 -2.666 50.000 -9.616 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -9.331 -12.983 50.000 50.000 50.000 -10.509 50.000 50.000 50.000 50.000 -10.674 50.000 50.000 50.000 50.000 -13.413 -9.651 -15.647 50.000 50.000 50.000 50.000 50.000 50.000 -2.266 -14.130 +270000 (returns) 50.000 50.000 50.000 -18.617 50.000 50.000 -12.537 50.000 50.000 50.000 50.000 50.000 50.000 -14.055 50.000 -10.556 50.000 -13.823 -3.197 50.000 50.000 50.000 -11.463 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -0.149 -3.605 50.000 50.000 50.000 50.000 50.000 -0.138 -14.274 50.000 50.000 -0.017 -9.460 -14.888 -0.179 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -11.254 50.000 -2.550 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -9.175 50.000 -10.849 50.000 50.000 50.000 -3.738 -11.385 50.000 50.000 50.000 50.000 50.000 -2.938 50.000 50.000 -14.143 -0.144 50.000 50.000 -0.202 -11.213 50.000 -12.319 -3.079 50.000 50.000 50.000 -0.032 -3.009 -10.059 50.000 +275000 (returns) 50.000 50.000 50.000 50.000 -17.664 -18.578 -11.244 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -10.962 50.000 50.000 50.000 50.000 -14.903 50.000 50.000 -16.895 50.000 -12.320 50.000 50.000 -14.274 50.000 -17.494 -17.374 -11.670 -17.402 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -14.218 -13.926 50.000 50.000 -14.272 50.000 50.000 50.000 -3.097 50.000 -13.962 50.000 50.000 -8.399 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -12.559 -14.571 -10.642 -15.622 -14.339 50.000 50.000 50.000 50.000 50.000 -12.108 50.000 -3.572 50.000 50.000 50.000 50.000 50.000 -13.236 -17.310 50.000 50.000 -14.243 50.000 50.000 50.000 -14.609 -12.441 -14.310 50.000 50.000 50.000 -13.806 50.000 +280000 (returns) 50.000 -15.470 50.000 -10.545 50.000 -10.122 50.000 -9.490 50.000 50.000 -10.188 50.000 -11.257 50.000 -10.027 -17.010 -11.795 50.000 50.000 -10.910 50.000 50.000 -10.473 50.000 -15.482 -15.060 50.000 50.000 50.000 50.000 50.000 -15.898 50.000 50.000 -1.880 -17.006 -9.625 50.000 50.000 -11.117 -14.029 -9.526 -16.206 50.000 50.000 50.000 50.000 -13.145 50.000 -2.146 -15.394 50.000 50.000 -10.716 50.000 50.000 -10.849 50.000 50.000 -10.131 50.000 50.000 -3.198 50.000 50.000 -14.308 -1.189 50.000 50.000 50.000 -10.709 50.000 50.000 50.000 -16.131 50.000 -11.032 50.000 50.000 -17.301 -14.986 -10.479 50.000 -12.998 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -9.675 50.000 50.000 +285000 (returns) 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -10.939 50.000 -10.749 50.000 50.000 -3.274 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -18.346 50.000 50.000 50.000 -10.859 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -9.578 50.000 50.000 50.000 50.000 50.000 50.000 -13.822 -18.086 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -18.150 50.000 50.000 50.000 50.000 50.000 -14.872 50.000 -10.152 -9.995 50.000 -1.099 50.000 50.000 -3.521 50.000 -9.858 -14.078 50.000 50.000 50.000 -2.722 -10.872 50.000 -10.721 -3.192 50.000 50.000 50.000 -10.697 50.000 50.000 -0.080 50.000 50.000 50.000 -11.015 -10.952 -2.953 50.000 -10.904 -14.723 -10.734 -10.702 50.000 +290000 (returns) 50.000 50.000 -14.458 50.000 50.000 50.000 50.000 -13.173 -2.843 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -9.496 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -15.156 -14.236 50.000 -3.937 -11.066 50.000 -12.913 50.000 50.000 50.000 -10.871 50.000 -17.503 50.000 50.000 50.000 50.000 -11.188 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -3.120 -13.612 -2.199 50.000 50.000 50.000 50.000 50.000 50.000 -11.608 50.000 50.000 50.000 50.000 -12.877 50.000 -13.507 50.000 -14.350 50.000 -11.095 50.000 50.000 -13.022 50.000 50.000 50.000 50.000 -3.004 50.000 50.000 50.000 -2.285 50.000 50.000 -3.636 -2.545 50.000 50.000 50.000 +295000 (returns) 50.000 50.000 50.000 50.000 50.000 -10.465 -10.760 50.000 -18.562 -9.067 -4.278 50.000 50.000 50.000 50.000 50.000 -10.452 50.000 50.000 50.000 50.000 50.000 -1.760 50.000 50.000 50.000 50.000 50.000 -14.358 50.000 50.000 -10.476 -15.399 50.000 50.000 50.000 -10.329 50.000 50.000 50.000 50.000 50.000 -10.066 -13.332 50.000 50.000 50.000 -10.200 50.000 50.000 50.000 50.000 50.000 -10.424 -13.933 50.000 -10.566 -10.281 -13.840 -10.588 50.000 -1.997 -10.282 50.000 50.000 50.000 -12.880 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -13.067 -2.384 50.000 -10.468 50.000 50.000 50.000 50.000 50.000 50.000 -11.108 50.000 50.000 -18.779 50.000 50.000 50.000 -10.576 50.000 50.000 -10.406 50.000 -14.372 +300000 (returns) 50.000 50.000 50.000 50.000 50.000 50.000 -11.234 50.000 50.000 50.000 50.000 50.000 50.000 -11.589 50.000 50.000 50.000 50.000 -4.920 50.000 50.000 50.000 -12.671 -4.354 50.000 50.000 -12.944 50.000 50.000 50.000 -15.108 50.000 50.000 -12.819 -11.908 50.000 50.000 -12.387 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -14.124 50.000 50.000 50.000 50.000 50.000 50.000 -16.176 50.000 50.000 50.000 50.000 -15.663 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 -13.628 50.000 50.000 -15.287 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 50.000 diff --git a/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/seed-100/evaluation_result_scalar.tsv b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/seed-100/evaluation_result_scalar.tsv new file mode 100644 index 00000000..f0aa5fd3 --- /dev/null +++ b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/seed-100/evaluation_result_scalar.tsv @@ -0,0 +1,61 @@ +iteration mean std_dev min max median +5000 -6.381 0.623 -7.716 -5.385 -6.188 +10000 -9.262 20.905 -18.193 50.000 -17.131 +15000 10.152 28.758 -15.860 50.000 -5.898 +20000 -2.303 25.618 -20.034 50.000 -14.071 +25000 9.661 28.439 -18.153 50.000 -7.788 +30000 2.355 25.559 -17.552 50.000 -10.704 +35000 8.003 29.570 -18.664 50.000 -10.403 +40000 17.966 30.885 -18.373 50.000 -3.406 +45000 13.256 30.713 -18.200 50.000 -9.022 +50000 19.814 30.885 -18.086 50.000 50.000 +55000 15.004 29.886 -18.294 50.000 -5.628 +60000 24.789 29.099 -18.431 50.000 50.000 +65000 27.587 28.735 -17.476 50.000 50.000 +70000 20.348 30.373 -16.914 50.000 50.000 +75000 27.341 29.042 -18.701 50.000 50.000 +80000 24.309 30.277 -18.015 50.000 50.000 +85000 31.088 28.294 -18.335 50.000 50.000 +90000 27.078 28.794 -17.750 50.000 50.000 +95000 28.997 28.082 -14.228 50.000 50.000 +100000 28.748 29.695 -18.005 50.000 50.000 +105000 25.168 29.963 -15.876 50.000 50.000 +110000 20.473 31.447 -17.556 50.000 50.000 +115000 20.676 32.602 -20.052 50.000 50.000 +120000 19.046 33.699 -20.058 50.000 50.000 +125000 19.155 33.135 -20.051 50.000 50.000 +130000 32.379 26.572 -18.043 50.000 50.000 +135000 19.445 31.423 -18.866 50.000 50.000 +140000 29.304 30.956 -20.031 50.000 50.000 +145000 24.872 30.346 -18.521 50.000 50.000 +150000 22.655 30.459 -18.720 50.000 50.000 +155000 35.857 25.974 -17.525 50.000 50.000 +160000 30.028 28.611 -18.632 50.000 50.000 +165000 28.083 29.328 -18.290 50.000 50.000 +170000 30.376 29.421 -18.108 50.000 50.000 +175000 30.423 28.140 -18.263 50.000 50.000 +180000 37.620 24.855 -17.980 50.000 50.000 +185000 22.528 31.686 -18.189 50.000 50.000 +190000 37.636 25.583 -18.009 50.000 50.000 +195000 32.379 28.318 -18.424 50.000 50.000 +200000 31.934 29.015 -19.222 50.000 50.000 +205000 23.299 31.447 -17.759 50.000 50.000 +210000 30.619 30.374 -20.025 50.000 50.000 +215000 20.838 32.963 -18.890 50.000 50.000 +220000 20.386 31.549 -19.305 50.000 50.000 +225000 21.836 31.276 -19.493 50.000 50.000 +230000 16.786 30.740 -18.761 50.000 -7.782 +235000 23.014 32.488 -20.013 50.000 50.000 +240000 14.424 28.862 -18.938 50.000 -0.371 +245000 26.229 30.442 -20.006 50.000 50.000 +250000 30.338 29.464 -20.015 50.000 50.000 +255000 28.541 29.960 -18.733 50.000 50.000 +260000 33.653 26.915 -16.218 50.000 50.000 +265000 28.208 29.183 -16.321 50.000 50.000 +270000 32.170 26.790 -18.617 50.000 50.000 +275000 29.680 29.687 -18.578 50.000 50.000 +280000 26.625 29.963 -17.301 50.000 50.000 +285000 32.624 27.317 -18.346 50.000 50.000 +290000 35.063 25.989 -17.503 50.000 50.000 +295000 31.145 28.215 -18.779 50.000 50.000 +300000 40.652 22.291 -16.176 50.000 50.000 diff --git a/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/seed-100/result.png b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Goal-v0_results/seed-100/result.png new file mode 100644 index 0000000000000000000000000000000000000000..b80cd98c74dcddaeb9e463cb83cc22bea52df955 GIT binary patch literal 25004 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 VHOCyUhJQ{#=xAQVmT6cA|1Ugo5*q*j literal 0 HcmV?d00001 diff --git a/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/evaluation_result_average_scalar.tsv b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/evaluation_result_average_scalar.tsv new file mode 100644 index 00000000..4c0e93e6 --- /dev/null +++ b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/evaluation_result_average_scalar.tsv @@ -0,0 +1,61 @@ +iteration mean std_dev min max median +5000 0.560 0.229 0.299 0.903 0.415 +10000 0.614 0.282 0.207 0.902 0.754 +15000 0.832 0.114 0.283 1.000 0.859 +20000 0.691 0.317 0.245 1.000 0.887 +25000 0.963 0.092 0.546 1.000 1.000 +30000 0.967 0.093 0.440 1.000 1.000 +35000 0.933 0.045 0.877 1.000 0.920 +40000 0.985 0.060 0.556 1.000 1.000 +45000 0.789 0.240 0.434 1.000 0.889 +50000 0.946 0.071 0.487 1.000 1.000 +55000 0.915 0.163 0.244 1.000 1.000 +60000 0.913 0.089 0.555 1.000 0.921 +65000 0.971 0.107 0.262 1.000 1.000 +70000 0.943 0.127 0.246 1.000 1.000 +75000 0.955 0.114 0.246 1.000 1.000 +80000 0.947 0.150 0.244 1.000 1.000 +85000 0.958 0.114 0.266 1.000 1.000 +90000 0.896 0.109 0.268 1.000 0.886 +95000 0.775 0.240 0.432 1.000 0.879 +100000 0.999 0.010 0.906 1.000 1.000 +105000 0.951 0.136 0.242 1.000 1.000 +110000 0.950 0.102 0.295 1.000 1.000 +115000 0.961 0.105 0.421 1.000 1.000 +120000 0.965 0.087 0.431 1.000 1.000 +125000 0.972 0.107 0.428 1.000 1.000 +130000 0.951 0.093 0.439 1.000 1.000 +135000 0.965 0.100 0.091 1.000 1.000 +140000 0.970 0.140 0.269 1.000 1.000 +145000 0.989 0.085 0.256 1.000 1.000 +150000 0.973 0.090 0.244 1.000 1.000 +155000 0.953 0.138 0.242 1.000 1.000 +160000 0.967 0.130 0.272 1.000 1.000 +165000 0.988 0.088 0.263 1.000 1.000 +170000 1.000 0.004 0.932 1.000 1.000 +175000 0.980 0.112 0.286 1.000 1.000 +180000 0.967 0.112 0.286 1.000 1.000 +185000 0.981 0.094 0.275 1.000 1.000 +190000 0.986 0.071 0.437 1.000 1.000 +195000 0.995 0.058 0.285 1.000 1.000 +200000 0.978 0.121 0.091 1.000 1.000 +205000 0.988 0.090 0.244 1.000 1.000 +210000 0.981 0.117 0.242 1.000 1.000 +215000 1.000 0.000 1.000 1.000 1.000 +220000 0.999 0.026 0.554 1.000 1.000 +225000 0.991 0.049 0.728 1.000 1.000 +230000 0.907 0.137 0.277 1.000 1.000 +235000 1.000 0.000 1.000 1.000 1.000 +240000 0.993 0.041 0.729 1.000 1.000 +245000 0.981 0.073 0.683 1.000 1.000 +250000 0.925 0.141 0.435 1.000 1.000 +255000 0.993 0.046 0.691 1.000 1.000 +260000 0.990 0.058 0.558 1.000 1.000 +265000 0.997 0.031 0.681 1.000 1.000 +270000 0.994 0.051 0.554 1.000 1.000 +275000 0.999 0.024 0.575 1.000 1.000 +280000 0.935 0.128 0.084 1.000 1.000 +285000 0.976 0.094 0.566 1.000 1.000 +290000 0.988 0.079 0.089 1.000 1.000 +295000 0.931 0.102 0.571 1.000 1.000 +300000 0.986 0.070 0.565 1.000 1.000 diff --git a/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/result.png b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/result.png new file mode 100644 index 0000000000000000000000000000000000000000..2306864a9520f60b96d4988790d15ffc98dbc156 GIT binary patch literal 26753 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 literal 0 HcmV?d00001 diff --git a/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-1/best_score_scalar.tsv b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-1/best_score_scalar.tsv new file mode 100644 index 00000000..f8c4b175 --- /dev/null +++ b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-1/best_score_scalar.tsv @@ -0,0 +1,2 @@ +iteration best_mean_iteration mean std_dev best_median_iteration median +1 45000.000 1.000 0.000 25000.000 1.000 diff --git a/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-1/evaluation_result_histogram.tsv b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-1/evaluation_result_histogram.tsv new file mode 100644 index 00000000..0210f87c --- /dev/null +++ b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-1/evaluation_result_histogram.tsv @@ -0,0 +1,61 @@ +iteration(key) values +5000 (returns) 0.383 0.385 0.385 0.387 0.382 0.385 0.385 0.385 0.386 0.382 0.384 0.384 0.385 0.387 0.387 0.384 0.385 0.385 0.382 0.385 0.386 0.386 0.387 0.384 0.386 0.385 0.387 0.379 0.388 0.385 0.387 0.385 0.387 0.386 0.381 0.385 0.387 0.387 0.388 0.383 0.387 0.386 0.383 0.385 0.380 0.386 0.387 0.383 0.385 0.384 0.387 0.388 0.385 0.378 0.384 0.386 0.386 0.387 0.383 0.386 0.382 0.387 0.382 0.387 0.381 0.384 0.382 0.387 0.384 0.384 0.380 0.382 0.382 0.386 0.388 0.386 0.385 0.388 0.382 0.387 0.384 0.383 0.386 0.383 0.386 0.380 0.386 0.747 0.386 0.382 0.383 0.380 0.387 0.387 0.750 0.384 0.387 0.386 0.384 0.386 +10000 (returns) 0.895 0.896 0.898 0.899 0.899 0.900 0.897 0.897 0.798 0.897 0.797 0.898 0.897 0.898 0.898 0.900 0.886 0.894 0.900 0.894 0.901 0.894 0.893 0.899 0.901 0.798 0.898 0.902 0.895 0.898 0.899 0.797 0.890 0.900 0.898 0.901 0.896 0.896 0.798 0.892 0.901 0.893 0.896 0.894 0.898 0.898 0.900 0.894 0.892 0.799 0.894 0.901 0.901 0.900 0.898 0.902 0.899 0.900 0.893 0.898 0.900 0.797 0.894 0.896 0.900 0.898 0.897 0.898 0.896 0.895 0.899 0.897 0.901 0.889 0.900 0.898 0.901 0.898 0.897 0.901 0.899 0.896 0.898 0.895 0.900 0.890 0.892 0.896 0.798 0.799 0.895 0.798 0.900 0.897 0.895 0.798 0.898 0.893 0.897 0.899 +15000 (returns) 0.729 0.824 0.826 0.827 0.729 0.729 0.726 0.729 0.823 0.726 0.825 0.822 0.825 0.730 0.826 0.824 0.825 0.727 0.727 0.725 0.728 0.731 0.727 0.725 0.725 0.725 0.725 0.727 0.824 0.728 0.725 0.824 0.725 0.824 0.726 0.824 0.827 0.727 0.727 0.727 0.823 0.726 0.729 0.731 0.727 0.728 0.725 0.823 0.726 0.726 0.729 0.728 0.820 0.824 0.725 0.826 0.726 0.828 0.828 0.730 0.729 0.827 0.727 0.828 0.725 0.726 0.727 0.725 0.827 0.727 0.824 0.725 0.725 0.823 0.823 0.825 0.822 0.727 0.728 0.825 0.726 0.725 0.826 0.728 0.726 0.725 0.825 0.828 0.822 0.819 0.725 0.728 0.825 0.728 0.823 0.730 0.726 0.823 0.823 0.727 +20000 (returns) 0.888 0.887 1.000 1.000 0.885 0.890 0.883 1.000 0.886 0.888 1.000 0.878 0.886 0.886 0.889 0.889 0.878 1.000 0.886 1.000 1.000 0.879 1.000 0.883 1.000 0.888 0.879 1.000 0.890 1.000 1.000 0.880 0.886 0.889 1.000 0.891 0.881 1.000 1.000 0.890 1.000 1.000 1.000 1.000 0.887 0.878 1.000 1.000 1.000 1.000 1.000 1.000 0.880 1.000 1.000 0.879 1.000 0.884 0.888 1.000 1.000 1.000 1.000 1.000 0.883 1.000 1.000 1.000 0.873 1.000 0.883 0.893 0.888 1.000 1.000 0.889 0.888 1.000 0.884 1.000 1.000 0.885 1.000 0.887 0.885 0.888 1.000 0.881 0.883 0.890 0.886 0.889 0.885 0.883 0.872 1.000 1.000 0.884 1.000 1.000 +25000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 0.556 1.000 1.000 1.000 1.000 1.000 0.729 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.556 1.000 1.000 1.000 1.000 1.000 1.000 0.554 1.000 0.554 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +30000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.728 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +35000 (returns) 1.000 1.000 0.911 0.919 0.921 0.920 0.918 0.922 0.920 0.917 0.917 0.922 0.913 0.919 0.910 0.914 0.915 0.918 0.920 0.921 0.916 0.915 0.921 0.920 0.916 0.924 0.919 0.923 0.918 0.919 0.919 0.923 1.000 0.917 0.918 1.000 0.921 0.917 0.920 0.921 0.919 0.921 0.915 0.919 0.922 0.918 1.000 1.000 0.920 0.922 0.920 0.927 0.921 0.921 0.925 0.912 0.921 0.923 0.921 0.917 0.921 0.918 0.916 0.913 0.922 0.926 1.000 1.000 0.925 0.919 0.921 0.924 0.916 0.915 0.918 0.916 0.921 0.921 0.921 1.000 0.913 0.917 0.921 0.911 0.919 1.000 0.922 0.916 0.912 0.920 0.916 0.910 0.911 0.919 0.928 0.917 0.919 0.921 0.918 0.922 +40000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 0.730 0.730 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.729 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.730 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.729 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.730 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.729 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.729 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +45000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +50000 (returns) 0.926 1.000 1.000 1.000 0.893 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.921 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.893 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.487 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.927 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.917 1.000 0.890 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +55000 (returns) 1.000 1.000 0.248 1.000 1.000 0.246 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.247 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.247 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +60000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +65000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.729 1.000 1.000 0.731 1.000 1.000 1.000 1.000 0.730 1.000 0.731 1.000 1.000 1.000 1.000 1.000 0.728 1.000 0.730 0.729 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.730 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.731 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.729 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.728 1.000 0.731 1.000 1.000 1.000 0.728 0.731 1.000 +70000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.247 0.246 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.248 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.728 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.728 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.729 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.728 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.728 1.000 1.000 +75000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +80000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +85000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +90000 (returns) 0.882 0.889 0.889 0.889 0.887 0.882 0.885 0.883 0.887 0.887 0.881 0.883 0.891 0.890 0.890 0.890 0.883 0.886 0.875 0.887 0.890 0.883 0.889 0.887 0.882 0.888 0.885 0.886 0.885 0.888 0.886 0.890 0.888 0.883 0.884 0.883 0.885 0.884 0.887 0.887 0.887 0.881 0.888 0.888 0.882 0.880 0.888 0.881 0.888 0.875 0.889 0.887 0.888 0.884 0.886 0.888 0.888 0.882 0.881 0.887 0.888 0.886 0.888 0.888 0.890 0.890 0.889 0.882 0.886 0.877 0.887 0.886 0.889 0.888 0.882 0.885 0.886 0.881 0.883 0.886 0.886 0.887 0.886 0.884 0.887 0.891 0.883 0.886 0.888 0.887 0.886 0.890 0.887 0.891 0.882 0.887 0.892 0.889 0.891 0.885 +95000 (returns) 0.880 0.873 0.876 0.881 0.880 0.874 0.877 0.882 0.883 0.881 0.878 0.880 0.881 0.878 0.879 0.878 0.878 0.879 0.872 0.880 0.880 0.872 0.875 0.881 0.876 0.878 0.878 0.881 0.883 0.881 0.880 0.872 0.884 0.874 0.881 0.879 0.881 0.869 0.874 0.881 0.879 0.875 0.881 0.882 0.881 0.881 0.879 0.876 0.870 0.876 0.882 0.874 0.883 0.875 0.873 0.879 0.880 0.876 0.878 0.881 0.879 0.884 0.876 0.874 0.878 0.877 0.874 0.880 0.878 0.883 0.883 0.879 0.877 0.879 1.000 0.880 0.882 0.880 0.882 0.878 0.879 0.879 0.884 0.882 0.875 0.880 0.874 1.000 1.000 0.873 0.877 0.875 0.881 0.885 0.882 0.878 0.881 0.880 0.876 0.874 +100000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +105000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +110000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +115000 (returns) 0.729 1.000 1.000 0.729 0.729 0.729 0.731 1.000 1.000 1.000 0.729 1.000 1.000 0.728 0.728 1.000 0.729 1.000 0.731 1.000 0.730 1.000 1.000 1.000 0.729 1.000 1.000 1.000 1.000 0.730 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.729 1.000 1.000 0.728 1.000 0.729 1.000 1.000 0.729 1.000 0.728 1.000 0.729 0.728 1.000 1.000 0.729 0.730 0.729 0.730 1.000 1.000 0.728 0.729 1.000 1.000 0.729 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.729 1.000 0.728 0.730 1.000 0.731 1.000 1.000 1.000 0.731 1.000 1.000 1.000 1.000 0.728 1.000 1.000 1.000 0.730 0.729 1.000 1.000 1.000 +120000 (returns) 0.931 0.924 0.921 0.911 0.930 0.930 0.926 0.932 0.912 1.000 0.932 0.924 0.905 0.928 0.927 0.929 0.919 0.930 0.929 0.932 0.929 0.927 0.927 0.914 0.931 0.923 1.000 0.931 0.930 0.932 0.925 0.924 0.912 0.928 0.927 0.927 0.931 0.921 1.000 1.000 0.929 0.929 1.000 0.920 1.000 0.932 0.921 0.923 0.923 0.925 0.932 0.922 0.927 0.922 0.915 0.924 0.930 0.925 0.932 0.932 0.932 0.932 1.000 0.926 0.931 0.927 0.932 0.931 0.931 1.000 0.930 0.929 0.932 0.925 0.916 0.925 0.930 0.926 0.925 0.932 0.932 0.914 0.930 0.922 0.927 0.923 0.930 1.000 0.926 0.932 0.925 0.929 0.924 0.931 0.925 0.930 0.931 0.929 0.927 0.931 +125000 (returns) 0.930 0.929 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.932 1.000 0.929 1.000 0.926 1.000 1.000 0.927 1.000 1.000 1.000 0.932 1.000 1.000 1.000 0.926 1.000 1.000 0.929 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.927 1.000 1.000 1.000 1.000 0.927 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.932 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.931 0.926 0.931 1.000 1.000 1.000 1.000 1.000 1.000 0.932 1.000 1.000 0.932 1.000 1.000 1.000 0.928 0.926 1.000 0.931 1.000 1.000 0.932 0.932 0.931 1.000 1.000 1.000 0.932 0.932 1.000 1.000 1.000 1.000 1.000 1.000 0.932 1.000 0.926 0.931 0.932 1.000 +130000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.932 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.932 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.932 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.932 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.932 1.000 1.000 1.000 1.000 1.000 0.932 1.000 1.000 1.000 0.932 1.000 1.000 1.000 0.932 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.932 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.932 0.932 1.000 0.931 1.000 1.000 1.000 1.000 1.000 1.000 +135000 (returns) 1.000 1.000 1.000 0.091 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.932 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.930 1.000 0.091 0.932 1.000 1.000 1.000 1.000 1.000 1.000 0.930 0.930 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.931 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.932 1.000 0.932 1.000 1.000 1.000 0.932 0.932 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.930 1.000 0.929 1.000 0.932 1.000 1.000 1.000 1.000 1.000 +140000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +145000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +150000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +155000 (returns) 1.000 0.874 0.880 0.879 1.000 0.879 1.000 1.000 1.000 0.880 1.000 0.874 0.876 0.877 1.000 0.879 1.000 0.874 1.000 0.877 0.877 0.932 0.877 0.877 0.877 1.000 0.878 0.879 1.000 1.000 1.000 1.000 0.876 0.878 0.874 1.000 1.000 1.000 1.000 0.879 0.878 0.874 0.875 1.000 0.876 1.000 0.877 0.879 1.000 1.000 0.877 1.000 0.875 0.876 1.000 0.875 0.876 1.000 1.000 0.875 0.875 0.877 1.000 0.876 0.880 1.000 0.879 0.874 1.000 1.000 1.000 1.000 1.000 0.873 0.878 1.000 1.000 1.000 0.874 0.872 0.877 1.000 0.878 0.874 0.875 1.000 0.880 1.000 1.000 1.000 1.000 1.000 1.000 0.875 1.000 1.000 1.000 1.000 1.000 1.000 +160000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.553 1.000 1.000 1.000 0.555 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.556 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +165000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.682 1.000 1.000 1.000 +170000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +175000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +180000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.682 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.694 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +185000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +190000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.555 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +195000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +200000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.556 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.091 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +205000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.554 1.000 +210000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +215000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +220000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +225000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.729 1.000 1.000 0.729 1.000 0.729 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.728 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.728 1.000 1.000 1.000 1.000 1.000 1.000 0.730 1.000 1.000 1.000 1.000 1.000 0.729 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.729 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.728 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.728 1.000 +230000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +235000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +240000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +245000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.693 1.000 1.000 1.000 1.000 1.000 0.694 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.698 1.000 1.000 1.000 0.686 0.691 0.691 1.000 1.000 1.000 0.693 1.000 1.000 1.000 1.000 1.000 1.000 0.686 0.696 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.693 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.700 0.690 1.000 1.000 1.000 1.000 1.000 1.000 0.696 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.689 1.000 1.000 1.000 1.000 0.698 1.000 1.000 1.000 1.000 1.000 0.683 1.000 0.689 1.000 1.000 1.000 1.000 +250000 (returns) 0.688 1.000 0.678 1.000 1.000 0.686 1.000 1.000 1.000 0.688 0.686 0.684 1.000 0.700 0.684 1.000 0.678 0.700 1.000 0.684 1.000 1.000 1.000 0.687 1.000 1.000 0.692 1.000 1.000 0.673 0.689 0.682 0.696 0.687 1.000 0.701 1.000 1.000 0.678 1.000 0.686 0.681 0.681 1.000 1.000 1.000 1.000 0.686 1.000 1.000 1.000 0.684 0.677 0.683 0.702 0.687 0.684 0.684 1.000 0.679 0.684 0.673 0.686 1.000 0.680 0.686 0.682 0.683 0.683 0.694 0.699 1.000 0.686 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.681 1.000 1.000 1.000 0.686 1.000 1.000 1.000 1.000 0.691 0.686 0.687 1.000 1.000 1.000 1.000 1.000 0.692 0.685 0.680 +255000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.697 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.691 1.000 1.000 1.000 1.000 0.700 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.699 0.697 1.000 0.700 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.692 +260000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.672 1.000 0.677 1.000 1.000 1.000 0.672 0.679 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.683 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.675 1.000 1.000 1.000 1.000 1.000 1.000 0.679 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.679 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +265000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.684 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.681 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.686 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +270000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.554 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.558 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.556 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +275000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +280000 (returns) 0.730 1.000 0.727 0.084 0.920 0.729 0.730 0.728 0.729 1.000 0.729 1.000 1.000 0.923 0.730 0.728 0.731 1.000 0.727 0.729 0.727 0.727 0.729 1.000 1.000 0.726 1.000 0.731 1.000 0.729 1.000 0.726 0.729 0.729 1.000 0.727 0.729 1.000 1.000 0.728 1.000 0.727 1.000 0.728 1.000 0.730 1.000 1.000 0.731 0.729 0.728 0.729 0.921 0.728 1.000 0.727 0.730 0.727 0.731 0.731 1.000 1.000 0.727 0.730 0.728 1.000 1.000 0.730 1.000 1.000 1.000 0.730 0.727 0.731 0.553 1.000 0.728 0.728 0.729 0.727 0.915 0.728 1.000 0.729 0.730 0.729 1.000 0.727 1.000 1.000 0.729 0.729 0.914 1.000 0.731 0.727 0.731 1.000 0.728 1.000 +285000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +290000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +295000 (returns) 0.782 0.784 1.000 0.783 0.781 1.000 0.786 0.783 0.788 0.788 1.000 0.782 0.781 0.786 0.780 0.780 1.000 0.785 0.786 0.785 0.786 0.784 0.777 0.781 0.783 0.784 0.784 0.786 0.783 0.785 0.784 0.784 0.785 0.786 0.783 0.783 0.778 0.787 0.781 0.782 0.782 0.786 0.788 0.778 0.786 0.776 0.783 0.783 0.781 0.783 0.783 0.779 0.777 0.784 0.784 0.781 0.781 0.781 0.781 0.786 0.784 0.783 0.784 0.785 0.783 1.000 0.779 0.785 0.782 1.000 0.786 1.000 0.782 0.784 0.783 0.787 0.781 0.781 0.785 0.784 0.788 0.785 0.784 0.783 0.780 0.784 0.784 0.780 0.785 0.784 0.785 0.775 0.783 0.783 0.780 0.781 0.785 0.785 0.785 0.785 +300000 (returns) 0.930 1.000 0.932 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.930 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.932 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.932 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.932 1.000 0.932 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 diff --git a/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-1/evaluation_result_scalar.tsv b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-1/evaluation_result_scalar.tsv new file mode 100644 index 00000000..3c6fd441 --- /dev/null +++ b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-1/evaluation_result_scalar.tsv @@ -0,0 +1,61 @@ +iteration mean std_dev min max median +5000 0.392 0.051 0.378 0.750 0.385 +10000 0.886 0.031 0.797 0.902 0.897 +15000 0.766 0.048 0.725 0.828 0.729 +20000 0.940 0.058 0.872 1.000 0.890 +25000 0.979 0.091 0.554 1.000 1.000 +30000 0.997 0.027 0.728 1.000 1.000 +35000 0.927 0.025 0.910 1.000 0.920 +40000 0.978 0.073 0.729 1.000 1.000 +45000 1.000 0.000 1.000 1.000 1.000 +50000 0.989 0.056 0.487 1.000 1.000 +55000 0.970 0.148 0.246 1.000 1.000 +60000 1.000 0.000 1.000 1.000 1.000 +65000 0.962 0.094 0.728 1.000 1.000 +70000 0.964 0.139 0.246 1.000 1.000 +75000 1.000 0.000 1.000 1.000 1.000 +80000 1.000 0.000 1.000 1.000 1.000 +85000 1.000 0.000 1.000 1.000 1.000 +90000 0.886 0.003 0.875 0.892 0.887 +95000 0.882 0.021 0.869 1.000 0.879 +100000 1.000 0.000 1.000 1.000 1.000 +105000 1.000 0.000 1.000 1.000 1.000 +110000 1.000 0.000 1.000 1.000 1.000 +115000 0.905 0.129 0.728 1.000 1.000 +120000 0.933 0.022 0.905 1.000 0.929 +125000 0.980 0.032 0.926 1.000 1.000 +130000 0.992 0.022 0.931 1.000 1.000 +135000 0.973 0.128 0.091 1.000 1.000 +140000 1.000 0.000 1.000 1.000 1.000 +145000 1.000 0.000 1.000 1.000 1.000 +150000 1.000 0.000 1.000 1.000 1.000 +155000 0.939 0.061 0.872 1.000 0.966 +160000 0.987 0.076 0.553 1.000 1.000 +165000 0.997 0.032 0.682 1.000 1.000 +170000 1.000 0.000 1.000 1.000 1.000 +175000 1.000 0.000 1.000 1.000 1.000 +180000 0.994 0.044 0.682 1.000 1.000 +185000 1.000 0.000 1.000 1.000 1.000 +190000 0.996 0.044 0.555 1.000 1.000 +195000 1.000 0.000 1.000 1.000 1.000 +200000 0.986 0.100 0.091 1.000 1.000 +205000 0.996 0.044 0.554 1.000 1.000 +210000 1.000 0.000 1.000 1.000 1.000 +215000 1.000 0.000 1.000 1.000 1.000 +220000 1.000 0.000 1.000 1.000 1.000 +225000 0.973 0.081 0.728 1.000 1.000 +230000 1.000 0.000 1.000 1.000 1.000 +235000 1.000 0.000 1.000 1.000 1.000 +240000 1.000 0.000 1.000 1.000 1.000 +245000 0.948 0.116 0.683 1.000 1.000 +250000 0.840 0.157 0.673 1.000 0.701 +255000 0.979 0.077 0.691 1.000 1.000 +260000 0.974 0.088 0.672 1.000 1.000 +265000 0.991 0.054 0.681 1.000 1.000 +270000 0.987 0.076 0.554 1.000 1.000 +275000 1.000 0.000 1.000 1.000 1.000 +280000 0.822 0.150 0.084 1.000 0.730 +285000 1.000 0.000 1.000 1.000 1.000 +290000 1.000 0.000 1.000 1.000 1.000 +295000 0.798 0.055 0.775 1.000 0.784 +300000 0.995 0.017 0.930 1.000 1.000 diff --git a/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-1/result.png b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-1/result.png new file mode 100644 index 0000000000000000000000000000000000000000..c09204882a00e6519735c4f69d41b46f312efa2f GIT binary patch literal 24154 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 literal 0 HcmV?d00001 diff --git a/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-10/best_score_scalar.tsv b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-10/best_score_scalar.tsv new file mode 100644 index 00000000..4267d370 --- /dev/null +++ b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-10/best_score_scalar.tsv @@ -0,0 +1,2 @@ +iteration best_mean_iteration mean std_dev best_median_iteration median +1 40000.000 1.000 0.000 25000.000 1.000 diff --git a/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-10/evaluation_result_histogram.tsv b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-10/evaluation_result_histogram.tsv new file mode 100644 index 00000000..da3a16e4 --- /dev/null +++ b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-10/evaluation_result_histogram.tsv @@ -0,0 +1,61 @@ +iteration(key) values +5000 (returns) 0.900 0.896 0.898 0.899 0.897 0.893 0.901 0.896 0.895 0.899 0.895 0.900 0.899 0.896 0.895 0.796 0.900 0.898 0.898 0.798 0.898 0.796 0.899 0.898 0.894 0.898 0.901 0.903 0.895 0.898 0.900 0.797 0.797 0.798 0.901 0.897 0.896 0.894 0.897 0.902 0.796 0.894 0.896 0.902 0.894 0.897 0.899 0.900 0.895 0.895 0.898 0.893 0.797 0.899 0.903 0.898 0.797 0.894 0.799 0.900 0.899 0.899 0.896 0.799 0.796 0.900 0.900 0.796 0.900 0.898 0.895 0.899 0.895 0.898 0.899 0.901 0.892 0.895 0.899 0.899 0.901 0.895 0.796 0.903 0.900 0.796 0.797 0.894 0.899 0.899 0.899 0.796 0.799 0.896 0.898 0.897 0.898 0.896 0.797 0.893 +10000 (returns) 0.756 0.756 0.734 0.737 0.555 0.759 0.759 0.737 0.755 0.740 0.754 0.760 0.754 0.758 0.556 0.758 0.751 0.755 0.756 0.758 0.738 0.738 0.280 0.757 0.758 0.754 0.555 0.755 0.735 0.757 0.738 0.734 0.751 0.739 0.753 0.757 0.757 0.741 0.740 0.757 0.755 0.756 0.737 0.756 0.757 0.741 0.753 0.754 0.756 0.739 0.756 0.756 0.759 0.756 0.756 0.757 0.757 0.737 0.755 0.555 0.739 0.754 0.279 0.554 0.738 0.756 0.736 0.740 0.740 0.757 0.737 0.755 0.758 0.738 0.554 0.757 0.758 0.554 0.740 0.741 0.759 0.755 0.759 0.757 0.756 0.741 0.756 0.738 0.756 0.757 0.555 0.741 0.739 0.755 0.757 0.281 0.757 0.756 0.752 0.755 +15000 (returns) 0.859 1.000 0.931 0.931 0.927 0.928 1.000 0.932 0.924 0.860 0.931 0.932 0.930 1.000 0.924 0.930 0.928 0.858 0.858 0.856 0.928 0.931 0.862 0.855 0.932 0.858 0.928 0.929 1.000 1.000 0.932 1.000 0.926 0.857 1.000 0.859 0.931 0.852 0.929 0.927 1.000 0.929 0.854 0.929 0.857 0.932 0.855 1.000 0.855 0.856 0.930 0.928 1.000 0.926 0.928 0.924 0.854 0.926 0.858 0.860 0.927 1.000 0.858 0.860 1.000 0.930 0.857 1.000 0.853 0.852 0.928 0.932 0.929 0.931 0.858 0.931 0.856 0.928 0.931 0.926 0.931 0.929 0.929 0.930 0.931 0.861 0.927 0.927 0.930 1.000 0.932 0.858 0.929 0.923 1.000 0.926 0.862 0.932 0.928 0.917 +20000 (returns) 0.891 0.891 0.889 0.891 0.891 0.889 0.890 0.806 0.895 0.891 0.893 0.894 0.891 0.806 0.893 0.889 0.891 0.892 0.892 0.806 0.893 0.894 0.802 0.892 0.896 0.889 0.809 0.888 0.890 0.889 0.895 0.888 0.892 0.891 0.883 0.889 0.887 0.891 0.888 0.895 0.893 0.893 0.883 0.891 0.895 0.890 0.892 0.891 0.892 0.888 0.895 0.892 0.797 0.891 0.886 0.892 0.890 0.887 0.892 0.892 0.891 0.895 0.893 0.894 0.884 0.894 0.893 0.895 0.892 0.893 0.890 0.891 0.893 0.893 0.884 0.891 0.887 0.888 0.890 0.893 0.890 0.805 0.896 0.891 0.882 0.893 0.894 0.892 0.892 0.894 0.889 0.896 0.889 0.887 0.892 0.892 0.889 0.891 0.892 0.891 +25000 (returns) 0.796 1.000 0.797 0.798 1.000 1.000 1.000 0.799 1.000 0.799 1.000 1.000 1.000 1.000 1.000 1.000 0.798 0.799 1.000 1.000 1.000 1.000 1.000 1.000 0.796 1.000 1.000 1.000 1.000 0.798 1.000 1.000 1.000 1.000 1.000 1.000 0.797 1.000 0.795 0.800 1.000 1.000 1.000 1.000 0.797 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.797 1.000 1.000 0.799 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.795 1.000 1.000 1.000 1.000 1.000 1.000 0.797 1.000 1.000 0.799 1.000 1.000 0.799 0.796 0.795 1.000 1.000 0.797 1.000 1.000 1.000 0.797 1.000 1.000 1.000 1.000 1.000 0.795 0.798 1.000 1.000 0.799 1.000 1.000 +30000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.931 1.000 1.000 1.000 +35000 (returns) 1.000 1.000 1.000 1.000 1.000 0.931 1.000 0.930 1.000 0.931 1.000 1.000 1.000 1.000 1.000 0.932 1.000 1.000 1.000 0.931 1.000 0.930 1.000 1.000 1.000 1.000 1.000 0.931 0.932 1.000 1.000 1.000 0.932 1.000 1.000 0.930 0.932 1.000 1.000 0.930 0.932 0.932 0.931 0.930 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.925 1.000 0.932 1.000 1.000 1.000 0.930 1.000 1.000 0.929 1.000 1.000 1.000 0.932 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.932 1.000 1.000 0.931 1.000 1.000 1.000 0.928 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.931 1.000 1.000 +40000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +45000 (returns) 0.438 0.731 0.437 0.440 0.438 0.436 0.439 0.440 0.439 0.730 0.438 0.436 0.434 0.438 0.731 0.437 0.435 0.438 0.436 0.440 0.438 0.435 0.437 0.440 0.731 0.439 0.439 0.440 0.438 0.434 0.439 0.438 1.000 0.435 0.438 0.438 0.435 0.436 0.438 0.438 0.440 0.437 0.436 0.438 0.439 0.439 0.437 0.436 0.436 0.438 0.440 0.440 0.438 0.438 0.728 0.438 0.440 0.437 0.440 0.439 0.438 0.438 1.000 0.438 0.731 0.437 0.439 0.438 0.434 0.439 0.440 0.436 0.440 0.440 0.440 0.439 0.440 0.440 0.440 0.440 0.439 0.437 0.440 0.439 0.434 0.440 0.439 0.437 0.440 0.440 0.434 0.439 0.439 0.436 0.439 0.436 0.437 0.439 0.440 0.434 +50000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.799 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.799 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.797 1.000 1.000 1.000 1.000 0.798 0.800 1.000 1.000 0.799 1.000 1.000 1.000 0.797 0.796 0.798 0.798 1.000 0.800 1.000 1.000 1.000 1.000 1.000 0.798 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.799 1.000 0.795 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.798 1.000 1.000 1.000 1.000 1.000 1.000 0.797 1.000 1.000 1.000 +55000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.298 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.298 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.299 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.300 1.000 1.000 1.000 0.295 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.299 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +60000 (returns) 0.731 0.927 0.921 0.928 1.000 0.729 0.730 0.918 0.929 0.731 0.914 1.000 0.730 0.921 0.925 0.729 0.730 0.729 0.729 0.799 0.925 0.924 0.919 0.925 0.731 0.729 0.926 0.927 0.922 0.730 0.731 0.729 0.730 1.000 0.728 0.925 0.925 0.801 0.729 0.729 0.929 0.731 0.925 0.922 0.802 0.925 0.797 0.729 0.799 0.925 0.731 0.912 0.729 0.729 0.929 0.730 0.923 0.924 0.921 0.919 0.924 0.731 0.926 0.730 0.729 0.924 0.922 0.730 1.000 0.926 0.731 0.927 0.730 0.924 1.000 1.000 0.555 0.730 0.919 0.928 0.729 1.000 0.929 0.930 1.000 0.924 0.922 0.914 0.918 0.731 1.000 0.729 0.921 0.928 0.921 0.927 0.919 0.729 0.730 0.731 +65000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.286 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.284 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +70000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.277 0.279 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.278 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.274 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.279 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +75000 (returns) 1.000 0.913 0.932 0.900 1.000 1.000 0.553 0.913 1.000 0.907 1.000 0.902 0.246 0.909 0.912 0.932 0.905 0.906 1.000 0.730 0.906 0.932 1.000 0.908 0.905 1.000 1.000 0.930 1.000 0.931 0.907 1.000 0.554 0.908 0.930 0.904 0.909 1.000 0.932 1.000 0.929 1.000 0.902 0.932 0.932 1.000 1.000 0.932 0.910 0.912 1.000 1.000 1.000 0.911 0.907 0.900 1.000 1.000 1.000 0.908 0.930 0.911 0.909 0.907 0.932 0.904 0.905 0.907 1.000 0.932 0.897 0.554 1.000 0.932 0.908 0.908 0.911 1.000 0.905 0.906 0.246 0.932 1.000 0.910 0.932 0.911 0.932 1.000 1.000 0.904 1.000 0.906 0.911 0.556 0.912 0.931 0.907 1.000 0.905 1.000 +80000 (returns) 1.000 0.730 1.000 1.000 0.730 0.245 0.729 0.730 1.000 1.000 1.000 0.730 0.730 1.000 1.000 1.000 1.000 1.000 0.729 0.730 1.000 0.731 0.729 1.000 1.000 1.000 0.728 0.244 0.728 1.000 1.000 1.000 0.731 1.000 1.000 0.730 1.000 1.000 1.000 1.000 1.000 0.729 1.000 1.000 1.000 0.436 1.000 1.000 0.728 1.000 1.000 1.000 0.244 0.728 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.731 1.000 1.000 0.730 0.731 0.731 1.000 0.730 1.000 0.731 1.000 1.000 0.731 0.730 1.000 1.000 1.000 0.730 0.244 0.729 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.245 1.000 0.731 0.244 0.728 1.000 1.000 1.000 1.000 +85000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.912 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.911 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.556 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.729 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.729 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.730 1.000 1.000 1.000 1.000 1.000 1.000 +90000 (returns) 0.808 0.809 0.810 0.804 0.810 1.000 0.807 1.000 1.000 0.811 1.000 1.000 1.000 1.000 0.807 0.808 1.000 1.000 0.811 0.811 0.812 0.811 1.000 0.809 0.810 1.000 0.808 0.811 1.000 0.810 0.812 1.000 1.000 0.811 1.000 1.000 1.000 1.000 0.811 1.000 1.000 1.000 1.000 0.813 1.000 1.000 1.000 0.813 0.439 1.000 1.000 0.440 0.440 1.000 0.812 0.440 0.812 1.000 1.000 1.000 1.000 0.814 1.000 0.731 1.000 0.814 1.000 1.000 1.000 0.807 0.810 0.729 1.000 1.000 0.814 1.000 1.000 0.728 1.000 1.000 1.000 0.812 1.000 0.811 1.000 1.000 1.000 0.811 1.000 0.810 1.000 0.440 1.000 1.000 1.000 1.000 1.000 1.000 0.808 0.810 +95000 (returns) 0.438 0.438 0.436 0.439 0.436 0.436 0.439 0.437 0.435 0.435 0.439 0.438 0.436 0.437 0.438 0.435 0.436 0.439 0.439 0.437 0.439 0.440 0.436 0.437 0.438 0.439 0.438 0.433 0.439 0.437 0.440 0.439 0.436 0.436 0.437 0.438 0.439 0.434 0.439 0.438 0.440 0.437 0.438 0.436 0.435 0.436 0.436 0.439 0.438 0.437 0.440 0.437 0.439 0.438 0.438 0.439 0.439 0.432 0.433 0.439 0.439 0.436 0.438 0.434 0.437 0.432 0.438 0.439 0.433 0.438 0.439 0.435 0.436 0.440 0.439 0.437 0.435 0.437 0.439 0.436 0.437 0.439 0.898 0.911 0.438 0.438 0.438 0.437 0.440 0.437 0.438 0.439 0.438 0.439 0.437 0.437 0.438 0.437 0.437 0.440 +100000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +105000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.914 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +110000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.555 1.000 1.000 0.435 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.556 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.553 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.439 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +115000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.426 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.421 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.556 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.424 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +120000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.435 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.431 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.434 1.000 1.000 0.433 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.433 1.000 1.000 1.000 1.000 0.438 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.556 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +125000 (returns) 1.000 1.000 1.000 1.000 1.000 0.435 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.434 1.000 1.000 1.000 0.436 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.434 1.000 1.000 1.000 0.440 1.000 1.000 1.000 0.435 1.000 1.000 1.000 1.000 0.433 1.000 0.433 1.000 1.000 1.000 0.433 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.428 0.439 +130000 (returns) 0.729 0.729 1.000 0.925 0.921 0.928 0.922 0.922 0.928 0.929 0.920 0.926 0.731 0.926 0.925 0.923 0.926 0.731 0.728 0.729 0.927 0.930 0.440 0.729 0.916 0.925 0.927 0.925 0.924 0.918 0.921 0.845 1.000 0.922 0.848 0.927 0.729 0.730 0.922 0.728 0.923 0.927 0.439 0.925 0.730 0.925 0.730 0.928 0.922 0.927 0.924 0.924 0.731 0.728 0.847 0.929 0.923 0.730 0.929 0.729 0.923 1.000 1.000 0.919 0.729 0.925 0.850 0.440 0.926 0.921 1.000 0.924 0.925 0.928 0.924 0.922 0.922 0.731 0.923 0.928 0.926 0.731 0.925 0.916 0.922 0.925 0.730 0.729 0.925 0.922 0.927 0.730 0.921 0.728 0.729 0.729 0.923 0.921 0.924 0.728 +135000 (returns) 1.000 1.000 0.929 0.929 0.931 0.929 1.000 1.000 0.929 0.926 0.872 0.932 0.929 0.931 1.000 0.928 0.555 0.931 1.000 1.000 0.869 1.000 0.929 1.000 0.556 0.854 0.930 0.929 0.931 0.929 0.925 0.879 0.932 0.930 1.000 0.931 0.886 0.931 0.862 0.930 1.000 0.877 0.862 0.553 0.932 1.000 0.865 1.000 0.924 1.000 0.927 1.000 1.000 0.876 0.928 0.931 0.932 1.000 0.926 0.926 1.000 0.555 1.000 0.927 1.000 0.923 0.555 0.932 1.000 0.930 0.932 1.000 1.000 0.929 0.929 1.000 0.932 0.928 0.929 0.930 1.000 0.920 0.878 0.931 1.000 1.000 0.928 0.924 1.000 1.000 1.000 0.924 1.000 1.000 0.555 0.932 0.932 0.929 0.932 0.932 +140000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.423 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.421 1.000 1.000 1.000 1.000 0.420 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.422 1.000 +145000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.932 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.932 1.000 1.000 0.932 1.000 1.000 1.000 1.000 1.000 1.000 +150000 (returns) 1.000 0.920 1.000 0.922 0.247 0.931 0.910 0.917 1.000 1.000 1.000 0.932 1.000 1.000 1.000 0.927 0.932 0.917 1.000 0.922 1.000 0.926 0.923 0.927 1.000 1.000 0.924 0.929 0.932 0.929 1.000 0.930 0.930 0.930 0.932 0.928 0.930 0.926 0.928 0.931 0.930 0.931 0.930 0.248 0.922 1.000 1.000 0.932 1.000 1.000 0.930 0.907 0.932 0.923 0.925 0.926 0.931 0.927 0.928 0.897 0.926 1.000 1.000 0.932 1.000 1.000 0.918 0.931 0.914 1.000 0.930 0.917 0.932 0.930 0.927 0.931 0.931 0.932 0.928 1.000 1.000 0.930 0.929 0.923 0.930 1.000 0.928 0.929 0.925 0.930 0.930 0.905 0.926 1.000 0.924 1.000 1.000 0.932 0.922 0.923 +155000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.555 1.000 1.000 1.000 0.438 1.000 1.000 0.553 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.431 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +160000 (returns) 1.000 0.555 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.555 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.554 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.551 1.000 0.555 1.000 1.000 1.000 0.556 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.555 1.000 1.000 1.000 1.000 0.555 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.552 1.000 1.000 1.000 1.000 1.000 0.554 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.555 1.000 1.000 1.000 1.000 1.000 +165000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +170000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.932 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +175000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.928 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.924 1.000 1.000 1.000 1.000 1.000 0.917 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.440 0.924 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.932 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.927 1.000 1.000 +180000 (returns) 1.000 1.000 0.929 1.000 0.930 1.000 1.000 1.000 0.928 0.926 0.930 1.000 0.931 1.000 1.000 1.000 1.000 0.438 0.930 0.931 1.000 1.000 0.436 0.928 0.930 1.000 0.932 0.932 0.926 0.930 0.440 0.922 1.000 0.925 1.000 1.000 0.930 1.000 0.930 1.000 1.000 0.927 1.000 0.931 1.000 0.930 0.929 1.000 1.000 1.000 1.000 0.929 1.000 0.930 1.000 0.925 0.920 1.000 0.928 1.000 0.922 1.000 0.927 1.000 1.000 0.932 0.925 0.927 1.000 0.932 0.436 1.000 0.929 1.000 0.924 0.930 0.932 1.000 0.930 0.930 1.000 1.000 1.000 0.931 0.921 1.000 0.928 0.926 1.000 1.000 0.926 1.000 0.925 1.000 0.928 0.932 0.920 1.000 0.930 0.424 +185000 (returns) 0.924 1.000 1.000 1.000 1.000 1.000 1.000 0.924 1.000 1.000 1.000 1.000 1.000 0.923 1.000 1.000 1.000 0.926 1.000 0.926 1.000 0.930 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.923 1.000 1.000 1.000 1.000 0.927 0.919 1.000 0.930 0.921 1.000 1.000 1.000 1.000 1.000 0.919 0.921 1.000 1.000 0.923 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.926 1.000 1.000 1.000 1.000 1.000 1.000 0.916 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.925 1.000 1.000 1.000 0.920 1.000 1.000 1.000 1.000 0.921 1.000 0.922 1.000 0.923 1.000 1.000 0.923 1.000 1.000 0.923 0.927 0.914 1.000 0.919 +190000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.932 1.000 1.000 1.000 1.000 1.000 1.000 0.923 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.555 0.929 1.000 1.000 1.000 1.000 0.919 1.000 1.000 0.928 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.930 1.000 0.932 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.932 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.555 1.000 0.437 1.000 0.932 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.927 0.932 1.000 1.000 1.000 1.000 0.553 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +195000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +200000 (returns) 0.555 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.555 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.922 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +205000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +210000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +215000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +220000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.554 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +225000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +230000 (returns) 0.731 0.731 0.729 0.729 0.729 0.730 0.728 0.731 0.730 0.729 0.731 0.730 0.731 0.731 0.729 0.731 0.729 0.728 0.729 0.731 0.731 0.729 0.730 0.729 0.729 0.731 0.729 0.729 0.729 0.728 0.730 0.728 0.728 0.731 0.730 0.730 0.730 0.728 0.731 0.729 0.730 0.730 0.730 0.729 0.729 0.731 0.730 0.729 0.729 0.730 0.728 0.731 0.729 0.731 0.731 0.729 0.731 0.730 0.729 0.728 0.728 0.729 0.731 0.730 0.730 0.728 0.730 0.730 0.728 0.728 0.729 0.731 0.730 0.730 0.729 0.729 0.730 0.730 0.730 0.729 0.728 0.729 0.731 0.731 0.729 0.730 0.728 0.278 0.731 0.728 0.731 0.730 0.729 0.277 0.730 0.731 0.729 0.731 0.730 0.730 +235000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +240000 (returns) 1.000 1.000 1.000 0.749 0.746 1.000 1.000 1.000 1.000 0.751 1.000 1.000 1.000 1.000 0.752 1.000 1.000 1.000 1.000 1.000 1.000 0.752 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.747 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.751 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +245000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +250000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +255000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +260000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +265000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +270000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +275000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +280000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +285000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.728 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.729 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.728 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.729 1.000 1.000 1.000 1.000 1.000 0.728 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +290000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.089 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +295000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 +300000 (returns) 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 diff --git a/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-10/evaluation_result_scalar.tsv b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-10/evaluation_result_scalar.tsv new file mode 100644 index 00000000..8640eabe --- /dev/null +++ b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-10/evaluation_result_scalar.tsv @@ -0,0 +1,61 @@ +iteration mean std_dev min max median +5000 0.879 0.040 0.796 0.903 0.897 +10000 0.721 0.094 0.279 0.760 0.754 +15000 0.919 0.046 0.852 1.000 0.928 +20000 0.885 0.022 0.797 0.896 0.891 +25000 0.947 0.089 0.795 1.000 1.000 +30000 0.999 0.007 0.931 1.000 1.000 +35000 0.983 0.030 0.925 1.000 1.000 +40000 1.000 0.000 1.000 1.000 1.000 +45000 0.467 0.103 0.434 1.000 0.438 +50000 0.968 0.074 0.795 1.000 1.000 +55000 0.958 0.167 0.295 1.000 1.000 +60000 0.849 0.105 0.555 1.000 0.919 +65000 0.986 0.100 0.284 1.000 1.000 +70000 0.964 0.158 0.274 1.000 1.000 +75000 0.911 0.130 0.246 1.000 0.921 +80000 0.871 0.205 0.244 1.000 1.000 +85000 0.986 0.064 0.556 1.000 1.000 +90000 0.896 0.141 0.439 1.000 1.000 +95000 0.447 0.065 0.432 0.911 0.438 +100000 1.000 0.000 1.000 1.000 1.000 +105000 0.999 0.009 0.914 1.000 1.000 +110000 0.975 0.108 0.435 1.000 1.000 +115000 0.978 0.107 0.421 1.000 1.000 +120000 0.962 0.140 0.431 1.000 1.000 +125000 0.938 0.177 0.428 1.000 1.000 +130000 0.860 0.115 0.439 1.000 0.922 +135000 0.923 0.102 0.553 1.000 0.931 +140000 0.977 0.113 0.420 1.000 1.000 +145000 0.998 0.012 0.932 1.000 1.000 +150000 0.933 0.104 0.247 1.000 0.930 +155000 0.980 0.100 0.431 1.000 1.000 +160000 0.951 0.139 0.551 1.000 1.000 +165000 1.000 0.000 1.000 1.000 1.000 +170000 0.999 0.007 0.932 1.000 1.000 +175000 0.990 0.058 0.440 1.000 1.000 +180000 0.937 0.120 0.424 1.000 0.932 +185000 0.980 0.034 0.914 1.000 1.000 +190000 0.973 0.095 0.437 1.000 1.000 +195000 1.000 0.000 1.000 1.000 1.000 +200000 0.990 0.063 0.555 1.000 1.000 +205000 1.000 0.000 1.000 1.000 1.000 +210000 1.000 0.000 1.000 1.000 1.000 +215000 1.000 0.000 1.000 1.000 1.000 +220000 0.996 0.044 0.554 1.000 1.000 +225000 1.000 0.000 1.000 1.000 1.000 +230000 0.721 0.063 0.277 0.731 0.730 +235000 1.000 0.000 1.000 1.000 1.000 +240000 0.982 0.064 0.746 1.000 1.000 +245000 1.000 0.000 1.000 1.000 1.000 +250000 1.000 0.000 1.000 1.000 1.000 +255000 1.000 0.000 1.000 1.000 1.000 +260000 1.000 0.000 1.000 1.000 1.000 +265000 1.000 0.000 1.000 1.000 1.000 +270000 1.000 0.000 1.000 1.000 1.000 +275000 1.000 0.000 1.000 1.000 1.000 +280000 1.000 0.000 1.000 1.000 1.000 +285000 0.986 0.059 0.728 1.000 1.000 +290000 0.991 0.091 0.089 1.000 1.000 +295000 1.000 0.000 1.000 1.000 1.000 +300000 1.000 0.000 1.000 1.000 1.000 diff --git a/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-10/result.png b/reproductions/algorithms/hybrid_env/hyar/reproduction_results/Platform-v0_results/seed-10/result.png new file mode 100644 index 0000000000000000000000000000000000000000..7d5676708123733738c070a18d37c1f5d7432cdb GIT binary patch literal 27483 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

5~NJP{JrM_Kd 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