From 19ca5c24b10ef90e37c50df935c8e2200c85ed11 Mon Sep 17 00:00:00 2001 From: Gal Novik Date: Mon, 13 Aug 2018 17:11:34 +0300 Subject: [PATCH] pre-release 0.10.0 --- MANIFEST.in | 3 + README.md | 212 ++- agents/__init__.py | 38 - agents/actor_critic_agent.py | 146 -- agents/agent.py | 580 ------- agents/bc_agent.py | 39 - agents/bootstrapped_dqn_agent.py | 58 - agents/categorical_dqn_agent.py | 60 - agents/clipped_ppo_agent.py | 212 --- agents/ddpg_agent.py | 109 -- agents/ddqn_agent.py | 42 - agents/dfp_agent.py | 86 - agents/distributional_dqn_agent.py | 60 - agents/dqn_agent.py | 43 - agents/human_agent.py | 67 - agents/imitation_agent.py | 65 - agents/mmc_agent.py | 42 - agents/n_step_q_agent.py | 88 - agents/naf_agent.py | 81 - agents/nec_agent.py | 96 -- agents/pal_agent.py | 65 - agents/policy_gradients_agent.py | 93 -- agents/policy_optimization_agent.py | 123 -- agents/ppo_agent.py | 289 ---- agents/qr_dqn_agent.py | 66 - agents/value_optimization_agent.py | 77 - architectures/__init__.py | 31 - architectures/neon_components/architecture.py | 129 -- architectures/neon_components/embedders.py | 88 - .../neon_components/general_network.py | 192 --- architectures/neon_components/heads.py | 194 --- architectures/neon_components/middleware.py | 50 - architectures/network_wrapper.py | 187 --- .../tensorflow_components/architecture.py | 367 ----- .../tensorflow_components/embedders.py | 144 -- .../tensorflow_components/general_network.py | 206 --- architectures/tensorflow_components/heads.py | 558 ------- .../tensorflow_components/middleware.py | 77 - .../tensorflow_components/shared_variables.py | 82 - benchmarks/README.md | 190 +-- benchmarks/a3c/README.md | 43 + benchmarks/a3c/hopper_a3c_16_workers.png | Bin 0 -> 118324 bytes benchmarks/a3c/inverted_pendulum_a3c.png | Bin 0 -> 182003 bytes .../a3c/space_invaders_a3c_16_workers.png | Bin 0 -> 62816 bytes benchmarks/a3c/walker2d_a3c_16_workers.png | Bin 0 -> 120974 bytes benchmarks/bootstrapped_dqn/README.md | 31 + .../breakout_bootstrapped_dqn.png | Bin 0 -> 93194 bytes .../pong_bootstrapped_dqn.png | Bin 0 -> 55882 bytes .../space_invaders_bootstrapped_dqn.png | Bin 0 -> 60284 bytes benchmarks/clipped_ppo/README.md | 84 + benchmarks/clipped_ppo/ant_clipped_ppo.png | Bin 0 -> 115317 bytes .../clipped_ppo/half_cheetah_clipped_ppo.png | Bin 0 -> 89106 bytes benchmarks/clipped_ppo/hopper_clipped_ppo.png | Bin 0 -> 111194 bytes .../clipped_ppo/humanoid_clipped_ppo.png | Bin 0 -> 111349 bytes .../inverted_double_pendulum_clipped_ppo.png | Bin 0 -> 72148 bytes .../inverted_pendulum_clipped_ppo.png | Bin 0 -> 59330 bytes .../clipped_ppo/reacher_clipped_ppo.png | Bin 0 -> 95752 bytes .../clipped_ppo/swimmer_clipped_ppo.png | Bin 0 -> 130937 bytes .../clipped_ppo/walker2d_clipped_ppo.png | Bin 0 -> 102165 bytes benchmarks/ddpg/README.md | 84 + benchmarks/ddpg/ant_ddpg.png | Bin 0 -> 138244 bytes benchmarks/ddpg/half_cheetah_ddpg.png | Bin 0 -> 91190 bytes benchmarks/ddpg/hopper_ddpg.png | Bin 0 -> 113681 bytes benchmarks/ddpg/humanoid_ddpg.png | Bin 0 -> 115588 bytes .../ddpg/inverted_double_pendulum_ddpg.png | Bin 0 -> 106847 bytes benchmarks/ddpg/inverted_pendulum_ddpg.png | Bin 0 -> 129717 bytes benchmarks/ddpg/reacher_ddpg.png | Bin 0 -> 72077 bytes benchmarks/ddpg/swimmer_ddpg.png | Bin 0 -> 83733 bytes benchmarks/ddpg/walker2d_ddpg.png | Bin 0 -> 121470 bytes benchmarks/ddpg_her/README.md | 40 + ...etch_ddpg_her_pick_and_place_8_workers.png | Bin 0 -> 60786 bytes .../fetch_ddpg_her_push_8_workers.png | Bin 0 -> 90736 bytes .../fetch_ddpg_her_reach_1_worker.png | Bin 0 -> 51481 bytes .../fetch_ddpg_her_slide_8_workers.png | Bin 0 -> 80958 bytes benchmarks/dfp/README.md | 31 + benchmarks/dfp/doom_basic_dfp_8_workers.png | Bin 0 -> 92056 bytes benchmarks/dfp/doom_health_dfp_8_workers.png | Bin 0 -> 69992 bytes .../dfp/doom_health_supreme_dfp_8_workers.png | Bin 0 -> 115723 bytes benchmarks/dqn/README.md | 14 + benchmarks/dqn/breakout_dqn.png | Bin 0 -> 88548 bytes benchmarks/dueling_ddqn/README.md | 14 + .../dueling_ddqn/breakout_dueling_ddqn.png | Bin 0 -> 133867 bytes benchmarks/dueling_ddqn_with_per/README.md | 31 + .../breakout_dueling_ddqn_with_per.png | Bin 0 -> 85201 bytes .../pong_dueling_ddqn_with_per.png | Bin 0 -> 54818 bytes .../space_invaders_dueling_ddqn_with_per.png | Bin 0 -> 83212 bytes benchmarks/img/Ant_A3C_16_workers.png | Bin 75256 -> 0 bytes benchmarks/img/Breakout_A3C_16_workers.png | Bin 51989 -> 0 bytes benchmarks/img/CartPole_PG.png | Bin 41568 -> 0 bytes benchmarks/img/Doom_Basic_DQN.png | Bin 64588 -> 0 bytes benchmarks/img/Doom_Basic_Dueling_DDQN.png | Bin 62522 -> 0 bytes benchmarks/img/Doom_Basic_NEC.png | Bin 67338 -> 0 bytes benchmarks/img/Doom_Health_DFP.png | Bin 55543 -> 0 bytes benchmarks/img/Doom_Health_MMC.png | Bin 59661 -> 0 bytes benchmarks/img/Hopper_A3C_16_workers.png | Bin 67094 -> 0 bytes .../img/Hopper_ClippedPPO_16_workers.png | Bin 44859 -> 0 bytes .../img/Humanoid_ClippedPPO_16_workers.png | Bin 65647 -> 0 bytes ...InvertedPendulum_ClippedPPO_16_workers.png | Bin 44514 -> 0 bytes benchmarks/img/InvertedPendulum_NAF.png | Bin 60233 -> 0 bytes .../img/Inverted_Pendulum_A3C_16_workers.png | Bin 45193 -> 0 bytes benchmarks/img/Pendulum_DDPG.png | Bin 62910 -> 0 bytes benchmarks/img/Pendulum_NAF.png | Bin 52912 -> 0 bytes benchmarks/img/Pong_DQN.png | Bin 65007 -> 0 bytes benchmarks/img/Pong_NEC.png | Bin 21568 -> 0 bytes benchmarks/qr_dqn/README.md | 21 + benchmarks/qr_dqn/breakout_qr_dqn.png | Bin 0 -> 120632 bytes benchmarks/qr_dqn/pong_qr_dqn.png | Bin 0 -> 91889 bytes coach.py | 333 ---- configurations.py | 628 -------- dashboard_components/boards.py | 18 - dashboard_components/signals_file.py | 39 - docs/404.html | 244 +++ .../neon_components => docs}/__init__.py | 0 docs/algorithms/imitation/bc/index.html | 346 ++-- docs/algorithms/other/dfp/index.html | 346 ++-- .../policy_optimization/ac/index.html | 346 ++-- .../policy_optimization/cppo/index.html | 346 ++-- .../policy_optimization/ddpg/index.html | 346 ++-- .../policy_optimization/pg/index.html | 346 ++-- .../policy_optimization/ppo/index.html | 346 ++-- .../value_optimization/bs_dqn/index.html | 346 ++-- .../categorical_dqn/index.html | 346 ++-- .../value_optimization/double_dqn/index.html | 346 ++-- .../value_optimization/dqn/index.html | 346 ++-- .../value_optimization/dueling_dqn/index.html | 346 ++-- .../value_optimization/mmc/index.html | 346 ++-- .../value_optimization/n_step/index.html | 346 ++-- .../value_optimization/naf/index.html | 346 ++-- .../value_optimization/nec/index.html | 346 ++-- .../value_optimization/pal/index.html | 346 ++-- docs/contributing/add_agent/index.html | 400 +++-- docs/contributing/add_env/index.html | 419 +++-- docs/css/highlight.css | 1 - docs/css/theme.css | 2 +- docs/css/theme_extra.css | 126 +- docs/dashboard/index.html | 354 ++-- docs/design/control_flow/index.html | 367 +++++ docs/design/features/index.html | 328 ++++ docs/design/filters/index.html | 416 +++++ docs/design/index.html | 363 ----- docs/design/network/index.html | 310 ++++ docs/diagrams.xml | 1 + docs/fonts/fontawesome-webfont.eot | Bin 70807 -> 37405 bytes docs/fonts/fontawesome-webfont.svg | 1052 +++++------- docs/fonts/fontawesome-webfont.ttf | Bin 142072 -> 79076 bytes docs/fonts/fontawesome-webfont.woff | Bin 83588 -> 43572 bytes docs/img/act.png | Bin 0 -> 50270 bytes docs/img/filters.png | Bin 0 -> 21550 bytes docs/img/graph.png | Bin 0 -> 29603 bytes docs/img/improve.png | Bin 0 -> 32646 bytes docs/img/level.png | Bin 0 -> 24295 bytes docs/img/observe.png | Bin 0 -> 41060 bytes docs/img/train.png | Bin 0 -> 39593 bytes docs/index.html | 360 ++--- docs/js/theme.js | 46 +- docs/mkdocs/js/lunr-0.5.7.min.js | 7 - docs/mkdocs/search_index.txt | 454 ------ docs/search.html | 326 ++-- docs/search/lunr.min.js | 7 + docs/{mkdocs/js => search}/mustache.min.js | 0 docs/{mkdocs/js => search}/require.js | 0 .../search-results-template.mustache | 0 docs/{mkdocs/js => search}/search.js | 14 +- docs/search/search_index.json | 704 ++++++++ docs/{mkdocs/js => search}/text.js | 0 docs/sitemap.xml | 147 +- docs/usage/index.html | 370 ++--- .../__init__.py | 0 .../docs}/__init__.py | 0 docs_raw/docs/contributing/add_agent.md | 70 +- docs_raw/docs/contributing/add_env.md | 87 +- docs_raw/docs/design/control_flow.md | 94 ++ docs_raw/docs/design/features.md | 44 + docs_raw/docs/design/filters.md | 116 ++ .../docs/{design.md => design/network.md} | 18 +- docs_raw/docs/diagrams.xml | 1 + docs_raw/docs/img/act.png | Bin 0 -> 50270 bytes docs_raw/docs/img/filters.png | Bin 0 -> 21550 bytes docs_raw/docs/img/graph.png | Bin 0 -> 29603 bytes docs_raw/docs/img/improve.png | Bin 0 -> 32646 bytes docs_raw/docs/img/level.png | Bin 0 -> 24295 bytes docs_raw/docs/img/observe.png | Bin 0 -> 41060 bytes docs_raw/docs/img/train.png | Bin 0 -> 39593 bytes docs_raw/docs/index.md | 2 +- docs_raw/mkdocs.yml | 11 +- environments/CarlaSettings.ini | 62 - environments/__init__.py | 36 - environments/carla_environment_wrapper.py | 232 --- environments/doom_environment_wrapper.py | 161 -- environments/environment_wrapper.py | 264 --- environments/gym_environment_wrapper.py | 191 --- exploration_policies/__init__.py | 28 - exploration_policies/additive_noise.py | 46 - ...ximated_thompson_sampling_using_dropout.py | 40 - exploration_policies/bayesian.py | 56 - exploration_policies/boltzmann.py | 48 - exploration_policies/bootstrapped.py | 37 - exploration_policies/categorical.py | 33 - exploration_policies/e_greedy.py | 70 - exploration_policies/ou_process.py | 52 - exploration_policies/thompson_sampling.py | 35 - img/coach_logo.png | Bin 0 -> 34388 bytes img/dashboard.gif | Bin 0 -> 655093 bytes install.sh | 205 --- logger.py | 320 ---- memories/episodic_experience_replay.py | 176 -- memories/memory.py | 161 -- parallel_actor.py | 181 --- presets.py | 1427 ----------------- requirements_coach.txt | 9 - requirements_dashboard.txt | 4 - rl_coach/__init__.py | 0 {memories => rl_coach/agents}/__init__.py | 4 - rl_coach/agents/actor_critic_agent.py | 165 ++ rl_coach/agents/agent.py | 791 +++++++++ rl_coach/agents/agent_interface.py | 125 ++ rl_coach/agents/bc_agent.py | 81 + rl_coach/agents/bootstrapped_dqn_agent.py | 84 + rl_coach/agents/categorical_dqn_agent.py | 114 ++ rl_coach/agents/clipped_ppo_agent.py | 277 ++++ rl_coach/agents/composite_agent.py | 415 +++++ rl_coach/agents/ddpg_agent.py | 192 +++ rl_coach/agents/ddqn_agent.py | 69 + rl_coach/agents/dfp_agent.py | 219 +++ rl_coach/agents/dqn_agent.py | 99 ++ rl_coach/agents/hac_ddpg_agent.py | 108 ++ rl_coach/agents/human_agent.py | 115 ++ rl_coach/agents/imitation_agent.py | 76 + rl_coach/agents/mmc_agent.py | 72 + rl_coach/agents/n_step_q_agent.py | 126 ++ rl_coach/agents/naf_agent.py | 126 ++ rl_coach/agents/nec_agent.py | 176 ++ rl_coach/agents/pal_agent.py | 94 ++ rl_coach/agents/policy_gradients_agent.py | 105 ++ rl_coach/agents/policy_optimization_agent.py | 166 ++ rl_coach/agents/ppo_agent.py | 338 ++++ rl_coach/agents/qr_dqn_agent.py | 112 ++ rl_coach/agents/value_optimization_agent.py | 98 ++ .../architectures/__init__.py | 17 - .../architectures}/architecture.py | 43 +- rl_coach/architectures/network_wrapper.py | 210 +++ .../tensorflow_components/__init__.py | 0 .../tensorflow_components/architecture.py | 664 ++++++++ .../distributed_tf_utils.py | 102 ++ .../embedders/__init__.py | 0 .../embedders/embedder.py | 114 ++ .../embedders/image_embedder.py | 74 + .../embedders/vector_embedder.py | 64 + .../tensorflow_components/general_network.py | 344 ++++ .../tensorflow_components/heads/__init__.py | 0 .../heads/categorical_q_head.py | 54 + .../heads/ddpg_actor_head.py | 66 + .../tensorflow_components/heads/dnd_q_head.py | 87 + .../heads/dueling_q_head.py | 50 + .../tensorflow_components/heads/head.py | 165 ++ .../heads/measurements_prediction_head.py | 65 + .../tensorflow_components/heads/naf_head.py | 88 + .../heads/policy_head.py | 151 ++ .../tensorflow_components/heads/ppo_head.py | 144 ++ .../tensorflow_components/heads/ppo_v_head.py | 52 + .../tensorflow_components/heads/q_head.py | 50 + .../heads/quantile_regression_q_head.py | 76 + .../tensorflow_components/heads/v_head.py | 45 + .../middlewares/__init__.py | 0 .../middlewares/fc_middleware.py | 86 + .../middlewares/lstm_middleware.py | 113 ++ .../middlewares/middleware.py | 68 + .../tensorflow_components/shared_variables.py | 121 ++ rl_coach/base_parameters.py | 350 ++++ rl_coach/coach.py | 402 +++++ rl_coach/core_types.py | 687 ++++++++ dashboard.py => rl_coach/dashboard.py | 24 +- rl_coach/dashboard_components/__init__.py | 0 rl_coach/dashboard_components/boards.py | 21 + .../dashboard_components/episodic_board.py | 99 ++ .../dashboard_components}/experiment_board.py | 163 +- .../dashboard_components}/globals.py | 8 +- .../dashboard_components}/landing_page.py | 5 +- .../dashboard_components}/signals.py | 6 +- rl_coach/dashboard_components/signals_file.py | 63 + .../signals_file_base.py | 19 +- .../signals_files_group.py | 101 +- .../dashboard_components/spinner.css | 4 +- rl_coach/datasets/README.md | 0 rl_coach/datasets/doom_basic.tar.gz | Bin 0 -> 772802 bytes rl_coach/datasets/montezuma_revenge.tar.gz | Bin 0 -> 321074 bytes debug_utils.py => rl_coach/debug_utils.py | 35 +- rl_coach/environments/CarlaSettings.ini | 112 ++ rl_coach/environments/README.md | 19 + .../environments/__init__.py | 6 - rl_coach/environments/carla_environment.py | 357 +++++ .../environments/control_suite_environment.py | 162 ++ rl_coach/environments/doom/D2_navigation.cfg | 39 + rl_coach/environments/doom/D2_navigation.wad | Bin 0 -> 29498 bytes rl_coach/environments/doom/D3_battle.cfg | 44 + rl_coach/environments/doom/D3_battle.wad | Bin 0 -> 15496 bytes rl_coach/environments/doom_environment.py | 229 +++ rl_coach/environments/environment.py | 540 +++++++ rl_coach/environments/environment_group.py | 149 ++ .../environments/environment_interface.py | 76 + rl_coach/environments/gym_environment.py | 454 ++++++ rl_coach/environments/mujoco/__init__.py | 0 .../environments/mujoco/common/__init__.py | 38 + .../environments/mujoco/common/materials.xml | 22 + .../environments/mujoco/common/skybox.xml | 6 + .../environments/mujoco/common/visual.xml | 7 + .../mujoco/pendulum_with_goals.py | 185 +++ .../mujoco/pendulum_with_goals.xml | 42 + .../environments/starcraft2_environment.py | 245 +++ .../environments/toy_problems/__init__.py | 0 .../environments/toy_problems/bit_flip.py | 82 + .../toy_problems/exploration_chain.py | 126 ++ rl_coach/exploration_policies/README.md | 42 + rl_coach/exploration_policies/__init__.py | 15 + .../exploration_policies/additive_noise.py | 95 ++ rl_coach/exploration_policies/boltzmann.py | 59 + rl_coach/exploration_policies/bootstrapped.py | 77 + rl_coach/exploration_policies/categorical.py | 48 + .../continuous_entropy.py | 19 +- rl_coach/exploration_policies/e_greedy.py | 102 ++ .../exploration_policy.py | 40 +- rl_coach/exploration_policies/greedy.py | 46 + rl_coach/exploration_policies/ou_process.py | 81 + .../exploration_policies/truncated_normal.py | 100 ++ rl_coach/exploration_policies/ucb.py | 83 + rl_coach/filters/README.md | 70 + rl_coach/filters/__init__.py | 0 rl_coach/filters/action/__init__.py | 0 rl_coach/filters/action/action_filter.py | 69 + .../action/attention_discretization.py | 66 + rl_coach/filters/action/box_discretization.py | 70 + rl_coach/filters/action/box_masking.py | 83 + .../action/full_discrete_action_space_map.py | 32 + .../filters/action/linear_box_to_box_map.py | 60 + .../partial_discrete_action_space_map.py | 54 + rl_coach/filters/filter.py | 418 +++++ rl_coach/filters/observation/__init__.py | 0 .../observation_clipping_filter.py | 44 + .../observation/observation_crop_filter.py | 92 ++ .../filters/observation/observation_filter.py | 40 + .../observation_move_axis_filter.py | 62 + .../observation_normalization_filter.py | 73 + ...tion_reduction_by_sub_parts_name_filter.py | 76 + ...servation_rescale_size_by_factor_filter.py | 72 + .../observation_rescale_to_size_filter.py | 98 ++ .../observation_rgb_to_y_filter.py | 50 + .../observation/observation_squeeze_filter.py | 46 + .../observation_stacking_filter.py | 105 ++ .../observation_to_uint8_filter.py | 60 + rl_coach/filters/reward/__init__.py | 0 .../filters/reward/reward_clipping_filter.py | 53 + rl_coach/filters/reward/reward_filter.py | 31 + .../reward/reward_normalization_filter.py | 68 + .../filters/reward/reward_rescale_filter.py | 44 + rl_coach/graph_managers/README.md | 32 + rl_coach/graph_managers/__init__.py | 0 .../graph_managers/basic_rl_graph_manager.py | 60 + rl_coach/graph_managers/graph_manager.py | 492 ++++++ rl_coach/graph_managers/hac_graph_manager.py | 107 ++ rl_coach/graph_managers/hrl_graph_manager.py | 117 ++ rl_coach/level_manager.py | 258 +++ rl_coach/local_batch_run_coach.py | 125 ++ rl_coach/logger.py | 378 +++++ rl_coach/memories/__init__.py | 15 + rl_coach/memories/episodic/__init__.py | 0 .../episodic/episodic_experience_replay.py | 318 ++++ .../episodic_hindsight_experience_replay.py | 147 ++ ...pisodic_hrl_hindsight_experience_replay.py | 69 + .../episodic/single_episode_buffer.py | 34 + rl_coach/memories/memory.py | 67 + rl_coach/memories/non_episodic/__init__.py | 0 .../differentiable_neural_dictionary.py | 112 +- .../non_episodic/experience_replay.py | 220 +++ .../prioritized_experience_replay.py | 292 ++++ plot_atari.py => rl_coach/plot_atari.py | 59 +- rl_coach/presets/Atari_A3C.py | 53 + rl_coach/presets/Atari_A3C_LSTM.py | 55 + rl_coach/presets/Atari_Bootstrapped_DQN.py | 44 + rl_coach/presets/Atari_C51.py | 43 + rl_coach/presets/Atari_DDQN.py | 43 + rl_coach/presets/Atari_DDQN_with_PER.py | 48 + rl_coach/presets/Atari_DQN.py | 43 + rl_coach/presets/Atari_DQN_with_PER.py | 47 + rl_coach/presets/Atari_Dueling_DDQN.py | 50 + .../Atari_Dueling_DDQN_with_PER_OpenAI.py | 57 + rl_coach/presets/Atari_NEC.py | 47 + rl_coach/presets/Atari_NStepQ.py | 48 + rl_coach/presets/Atari_QR_DQN.py | 44 + .../presets/Atari_UCB_with_Q_Ensembles.py | 45 + rl_coach/presets/BitFlip_DQN.py | 68 + rl_coach/presets/BitFlip_DQN_HER.py | 81 + rl_coach/presets/Carla_3_Cameras_DDPG.py | 61 + rl_coach/presets/Carla_DDPG.py | 40 + rl_coach/presets/Carla_Dueling_DDQN.py | 51 + rl_coach/presets/CartPole_A3C.py | 63 + rl_coach/presets/CartPole_DFP.py | 58 + rl_coach/presets/CartPole_DQN.py | 62 + rl_coach/presets/CartPole_Dueling_DDQN.py | 67 + rl_coach/presets/CartPole_NEC.py | 57 + rl_coach/presets/CartPole_NStepQ.py | 52 + rl_coach/presets/CartPole_PAL.py | 63 + rl_coach/presets/CartPole_PG.py | 59 + rl_coach/presets/ControlSuite_DDPG.py | 63 + rl_coach/presets/Doom_Basic_A3C.py | 64 + rl_coach/presets/Doom_Basic_BC.py | 43 + rl_coach/presets/Doom_Basic_DFP.py | 51 + rl_coach/presets/Doom_Basic_DQN.py | 57 + rl_coach/presets/Doom_Basic_Dueling_DDQN.py | 48 + rl_coach/presets/Doom_Battle_DFP.py | 57 + rl_coach/presets/Doom_Health_DFP.py | 68 + rl_coach/presets/Doom_Health_MMC.py | 59 + rl_coach/presets/Doom_Health_Supreme_DFP.py | 67 + .../ExplorationChain_Bootstrapped_DQN.py | 66 + .../presets/ExplorationChain_Dueling_DDQN.py | 56 + .../ExplorationChain_UCB_Q_ensembles.py | 55 + rl_coach/presets/Fetch_DDPG_HER_baselines.py | 130 ++ rl_coach/presets/InvertedPendulum_PG.py | 47 + rl_coach/presets/MontezumaRevenge_BC.py | 44 + rl_coach/presets/Mujoco_A3C.py | 62 + rl_coach/presets/Mujoco_A3C_LSTM.py | 68 + rl_coach/presets/Mujoco_ClippedPPO.py | 78 + rl_coach/presets/Mujoco_DDPG.py | 53 + rl_coach/presets/Mujoco_NAF.py | 56 + rl_coach/presets/Mujoco_PPO.py | 67 + rl_coach/presets/Pendulum_HAC.py | 148 ++ .../presets/Starcraft_CollectMinerals_A3C.py | 65 + .../Starcraft_CollectMinerals_Dueling_DDQN.py | 65 + rl_coach/presets/__init__.py | 0 renderer.py => rl_coach/renderer.py | 20 +- rl_coach/schedules.py | 125 ++ rl_coach/spaces.py | 605 +++++++ rl_coach/tests/__init__.py | 0 rl_coach/tests/agents/__init__.py | 0 .../test_agent_external_communication.py | 33 + rl_coach/tests/architectures/__init__.py | 0 .../tensorflow_components/__init__.py | 0 .../embedders/__init__.py | 0 .../embedders/test_identity_embedder.py | 45 + .../embedders/test_image_embedder.py | 99 ++ .../embedders/test_vector_embedder.py | 95 ++ rl_coach/tests/environments/__init__.py | 0 .../environments/test_gym_environment.py | 67 + .../tests/exploration_policies/__init__.py | 0 .../test_additive_noise.py | 44 + .../exploration_policies/test_e_greedy.py | 81 + .../tests/exploration_policies/test_greedy.py | 34 + .../exploration_policies/test_ou_process.py | 85 + rl_coach/tests/filters/__init__.py | 0 rl_coach/tests/filters/action/__init__.py | 0 .../action/test_attention_discretization.py | 44 + .../filters/action/test_box_discretization.py | 45 + .../tests/filters/action/test_box_masking.py | 27 + .../action/test_linear_box_to_box_map.py | 29 + .../tests/filters/observation/__init__.py | 0 .../test_observation_crop_filter.py | 90 ++ ...tion_reduction_by_sub_parts_name_filter.py | 84 + ...servation_rescale_size_by_factor_filter.py | 66 + ...test_observation_rescale_to_size_filter.py | 106 ++ .../test_observation_rgb_to_y_filter.py | 47 + .../test_observation_squeeze_filter.py | 72 + .../test_observation_stacking_filter.py | 78 + .../test_observation_to_uint8_filter.py | 50 + rl_coach/tests/filters/reward/__init__.py | 0 .../reward/test_reward_clipping_filter.py | 74 + .../reward/test_reward_rescale_filter.py | 56 + .../tests/filters/test_filters_stacking.py | 70 + rl_coach/tests/golden_tests.py | 355 ++++ rl_coach/tests/graph_managers/__init__.py | 0 .../test_basic_rl_graph_manager.py | 52 + rl_coach/tests/memories/__init__.py | 0 .../test_differential_neural_dictionary.py | 91 ++ .../test_hindsight_experience_replay.py | 97 ++ .../test_prioritized_experience_replay.py | 93 ++ .../memories/test_single_episode_buffer.py | 81 + rl_coach/tests/presets/__init__.py | 0 rl_coach/tests/presets/test_presets.py | 56 + rl_coach/tests/pytest.ini | 5 + rl_coach/tests/test_schedules.py | 106 ++ rl_coach/tests/test_spaces.py | 198 +++ utils.py => rl_coach/utils.py | 273 +++- run_test.py | 220 --- setup.py | 80 + tutorials/1. Implementing an Algorithm.ipynb | 407 +++++ tutorials/2. Adding an Environment.ipynb | 386 +++++ ...Implementing a Hierarchical RL Graph.ipynb | 410 +++++ 485 files changed, 33292 insertions(+), 16770 deletions(-) create mode 100644 MANIFEST.in delete mode 100644 agents/__init__.py delete mode 100644 agents/actor_critic_agent.py delete mode 100644 agents/agent.py delete mode 100644 agents/bc_agent.py delete mode 100644 agents/bootstrapped_dqn_agent.py delete mode 100644 agents/categorical_dqn_agent.py delete mode 100644 agents/clipped_ppo_agent.py delete mode 100644 agents/ddpg_agent.py delete mode 100644 agents/ddqn_agent.py delete mode 100644 agents/dfp_agent.py delete mode 100644 agents/distributional_dqn_agent.py delete mode 100644 agents/dqn_agent.py delete mode 100644 agents/human_agent.py delete mode 100644 agents/imitation_agent.py delete mode 100644 agents/mmc_agent.py delete mode 100644 agents/n_step_q_agent.py delete mode 100644 agents/naf_agent.py delete mode 100644 agents/nec_agent.py delete mode 100644 agents/pal_agent.py delete mode 100644 agents/policy_gradients_agent.py delete mode 100644 agents/policy_optimization_agent.py delete mode 100644 agents/ppo_agent.py delete mode 100644 agents/qr_dqn_agent.py delete mode 100644 agents/value_optimization_agent.py delete mode 100644 architectures/__init__.py delete mode 100644 architectures/neon_components/architecture.py delete mode 100644 architectures/neon_components/embedders.py delete mode 100644 architectures/neon_components/general_network.py delete mode 100644 architectures/neon_components/heads.py delete mode 100644 architectures/neon_components/middleware.py delete mode 100644 architectures/network_wrapper.py delete mode 100644 architectures/tensorflow_components/architecture.py delete mode 100644 architectures/tensorflow_components/embedders.py delete mode 100644 architectures/tensorflow_components/general_network.py delete mode 100644 architectures/tensorflow_components/heads.py delete mode 100644 architectures/tensorflow_components/middleware.py delete mode 100644 architectures/tensorflow_components/shared_variables.py create mode 100644 benchmarks/a3c/README.md create mode 100644 benchmarks/a3c/hopper_a3c_16_workers.png create mode 100644 benchmarks/a3c/inverted_pendulum_a3c.png create mode 100644 benchmarks/a3c/space_invaders_a3c_16_workers.png create mode 100644 benchmarks/a3c/walker2d_a3c_16_workers.png create mode 100644 benchmarks/bootstrapped_dqn/README.md create mode 100644 benchmarks/bootstrapped_dqn/breakout_bootstrapped_dqn.png create mode 100644 benchmarks/bootstrapped_dqn/pong_bootstrapped_dqn.png create mode 100644 benchmarks/bootstrapped_dqn/space_invaders_bootstrapped_dqn.png create mode 100644 benchmarks/clipped_ppo/README.md create mode 100644 benchmarks/clipped_ppo/ant_clipped_ppo.png create mode 100644 benchmarks/clipped_ppo/half_cheetah_clipped_ppo.png create mode 100644 benchmarks/clipped_ppo/hopper_clipped_ppo.png create mode 100644 benchmarks/clipped_ppo/humanoid_clipped_ppo.png create mode 100644 benchmarks/clipped_ppo/inverted_double_pendulum_clipped_ppo.png create mode 100644 benchmarks/clipped_ppo/inverted_pendulum_clipped_ppo.png create mode 100644 benchmarks/clipped_ppo/reacher_clipped_ppo.png create mode 100644 benchmarks/clipped_ppo/swimmer_clipped_ppo.png create mode 100644 benchmarks/clipped_ppo/walker2d_clipped_ppo.png create mode 100644 benchmarks/ddpg/README.md create mode 100644 benchmarks/ddpg/ant_ddpg.png create mode 100644 benchmarks/ddpg/half_cheetah_ddpg.png create mode 100644 benchmarks/ddpg/hopper_ddpg.png create mode 100644 benchmarks/ddpg/humanoid_ddpg.png create mode 100644 benchmarks/ddpg/inverted_double_pendulum_ddpg.png create mode 100644 benchmarks/ddpg/inverted_pendulum_ddpg.png create mode 100644 benchmarks/ddpg/reacher_ddpg.png create mode 100644 benchmarks/ddpg/swimmer_ddpg.png create mode 100644 benchmarks/ddpg/walker2d_ddpg.png create mode 100644 benchmarks/ddpg_her/README.md create mode 100644 benchmarks/ddpg_her/fetch_ddpg_her_pick_and_place_8_workers.png create mode 100644 benchmarks/ddpg_her/fetch_ddpg_her_push_8_workers.png create mode 100644 benchmarks/ddpg_her/fetch_ddpg_her_reach_1_worker.png create mode 100644 benchmarks/ddpg_her/fetch_ddpg_her_slide_8_workers.png create mode 100644 benchmarks/dfp/README.md create mode 100644 benchmarks/dfp/doom_basic_dfp_8_workers.png create mode 100644 benchmarks/dfp/doom_health_dfp_8_workers.png create mode 100644 benchmarks/dfp/doom_health_supreme_dfp_8_workers.png create mode 100644 benchmarks/dqn/README.md create mode 100644 benchmarks/dqn/breakout_dqn.png create mode 100644 benchmarks/dueling_ddqn/README.md create mode 100644 benchmarks/dueling_ddqn/breakout_dueling_ddqn.png create mode 100644 benchmarks/dueling_ddqn_with_per/README.md create mode 100644 benchmarks/dueling_ddqn_with_per/breakout_dueling_ddqn_with_per.png create mode 100644 benchmarks/dueling_ddqn_with_per/pong_dueling_ddqn_with_per.png create mode 100644 benchmarks/dueling_ddqn_with_per/space_invaders_dueling_ddqn_with_per.png delete mode 100644 benchmarks/img/Ant_A3C_16_workers.png delete mode 100644 benchmarks/img/Breakout_A3C_16_workers.png delete mode 100644 benchmarks/img/CartPole_PG.png delete mode 100644 benchmarks/img/Doom_Basic_DQN.png delete mode 100644 benchmarks/img/Doom_Basic_Dueling_DDQN.png delete mode 100644 benchmarks/img/Doom_Basic_NEC.png delete mode 100644 benchmarks/img/Doom_Health_DFP.png delete mode 100644 benchmarks/img/Doom_Health_MMC.png delete mode 100644 benchmarks/img/Hopper_A3C_16_workers.png delete mode 100644 benchmarks/img/Hopper_ClippedPPO_16_workers.png delete mode 100644 benchmarks/img/Humanoid_ClippedPPO_16_workers.png delete mode 100644 benchmarks/img/InvertedPendulum_ClippedPPO_16_workers.png delete mode 100644 benchmarks/img/InvertedPendulum_NAF.png delete mode 100644 benchmarks/img/Inverted_Pendulum_A3C_16_workers.png delete mode 100644 benchmarks/img/Pendulum_DDPG.png delete mode 100644 benchmarks/img/Pendulum_NAF.png delete mode 100644 benchmarks/img/Pong_DQN.png delete mode 100644 benchmarks/img/Pong_NEC.png create mode 100644 benchmarks/qr_dqn/README.md create mode 100644 benchmarks/qr_dqn/breakout_qr_dqn.png create mode 100644 benchmarks/qr_dqn/pong_qr_dqn.png delete mode 100644 coach.py delete mode 100644 configurations.py delete mode 100644 dashboard_components/boards.py delete mode 100644 dashboard_components/signals_file.py create mode 100644 docs/404.html rename {architectures/neon_components => docs}/__init__.py (100%) create mode 100644 docs/design/control_flow/index.html create mode 100644 docs/design/features/index.html create mode 100644 docs/design/filters/index.html delete mode 100644 docs/design/index.html create mode 100644 docs/design/network/index.html create mode 100644 docs/diagrams.xml create mode 100644 docs/img/act.png create mode 100644 docs/img/filters.png create mode 100644 docs/img/graph.png create mode 100644 docs/img/improve.png create mode 100644 docs/img/level.png create mode 100644 docs/img/observe.png create mode 100644 docs/img/train.png delete mode 100644 docs/mkdocs/js/lunr-0.5.7.min.js delete mode 100644 docs/mkdocs/search_index.txt create mode 100644 docs/search/lunr.min.js rename docs/{mkdocs/js => search}/mustache.min.js (100%) rename docs/{mkdocs/js => search}/require.js (100%) rename docs/{mkdocs/js => search}/search-results-template.mustache (100%) rename docs/{mkdocs/js => search}/search.js (91%) create mode 100644 docs/search/search_index.json rename docs/{mkdocs/js => search}/text.js (100%) rename {architectures/tensorflow_components => docs_raw}/__init__.py (100%) rename {dashboard_components => docs_raw/docs}/__init__.py (100%) create mode 100644 docs_raw/docs/design/control_flow.md create mode 100644 docs_raw/docs/design/features.md create mode 100644 docs_raw/docs/design/filters.md rename docs_raw/docs/{design.md => design/network.md} (77%) create mode 100644 docs_raw/docs/diagrams.xml create mode 100644 docs_raw/docs/img/act.png create mode 100644 docs_raw/docs/img/filters.png create mode 100644 docs_raw/docs/img/graph.png create mode 100644 docs_raw/docs/img/improve.png create mode 100644 docs_raw/docs/img/level.png create mode 100644 docs_raw/docs/img/observe.png create mode 100644 docs_raw/docs/img/train.png delete mode 100644 environments/CarlaSettings.ini delete mode 100644 environments/__init__.py delete mode 100644 environments/carla_environment_wrapper.py delete mode 100644 environments/doom_environment_wrapper.py delete mode 100644 environments/environment_wrapper.py delete mode 100644 environments/gym_environment_wrapper.py delete mode 100644 exploration_policies/__init__.py delete mode 100644 exploration_policies/additive_noise.py delete mode 100644 exploration_policies/approximated_thompson_sampling_using_dropout.py delete mode 100644 exploration_policies/bayesian.py delete mode 100644 exploration_policies/boltzmann.py delete mode 100644 exploration_policies/bootstrapped.py delete mode 100644 exploration_policies/categorical.py delete mode 100644 exploration_policies/e_greedy.py delete mode 100644 exploration_policies/ou_process.py delete mode 100644 exploration_policies/thompson_sampling.py create mode 100644 img/coach_logo.png create mode 100644 img/dashboard.gif delete mode 100755 install.sh delete mode 100644 logger.py delete mode 100644 memories/episodic_experience_replay.py delete mode 100644 memories/memory.py delete mode 100644 parallel_actor.py delete mode 100644 presets.py delete mode 100644 requirements_coach.txt delete mode 100644 requirements_dashboard.txt create mode 100644 rl_coach/__init__.py rename {memories => rl_coach/agents}/__init__.py (81%) create mode 100644 rl_coach/agents/actor_critic_agent.py create mode 100644 rl_coach/agents/agent.py create mode 100644 rl_coach/agents/agent_interface.py create mode 100644 rl_coach/agents/bc_agent.py create mode 100644 rl_coach/agents/bootstrapped_dqn_agent.py create mode 100644 rl_coach/agents/categorical_dqn_agent.py create mode 100644 rl_coach/agents/clipped_ppo_agent.py create mode 100644 rl_coach/agents/composite_agent.py create mode 100644 rl_coach/agents/ddpg_agent.py create mode 100644 rl_coach/agents/ddqn_agent.py create mode 100644 rl_coach/agents/dfp_agent.py create mode 100644 rl_coach/agents/dqn_agent.py create mode 100644 rl_coach/agents/hac_ddpg_agent.py create mode 100644 rl_coach/agents/human_agent.py create mode 100644 rl_coach/agents/imitation_agent.py create mode 100644 rl_coach/agents/mmc_agent.py create mode 100644 rl_coach/agents/n_step_q_agent.py create mode 100644 rl_coach/agents/naf_agent.py create mode 100644 rl_coach/agents/nec_agent.py create mode 100644 rl_coach/agents/pal_agent.py create mode 100644 rl_coach/agents/policy_gradients_agent.py create mode 100644 rl_coach/agents/policy_optimization_agent.py create mode 100644 rl_coach/agents/ppo_agent.py create mode 100644 rl_coach/agents/qr_dqn_agent.py create mode 100644 rl_coach/agents/value_optimization_agent.py rename exploration_policies/greedy.py => rl_coach/architectures/__init__.py (55%) rename {architectures => rl_coach/architectures}/architecture.py (54%) create mode 100644 rl_coach/architectures/network_wrapper.py create mode 100644 rl_coach/architectures/tensorflow_components/__init__.py create mode 100644 rl_coach/architectures/tensorflow_components/architecture.py create mode 100644 rl_coach/architectures/tensorflow_components/distributed_tf_utils.py create mode 100644 rl_coach/architectures/tensorflow_components/embedders/__init__.py create mode 100644 rl_coach/architectures/tensorflow_components/embedders/embedder.py create mode 100644 rl_coach/architectures/tensorflow_components/embedders/image_embedder.py create mode 100644 rl_coach/architectures/tensorflow_components/embedders/vector_embedder.py create mode 100644 rl_coach/architectures/tensorflow_components/general_network.py create mode 100644 rl_coach/architectures/tensorflow_components/heads/__init__.py create mode 100644 rl_coach/architectures/tensorflow_components/heads/categorical_q_head.py create mode 100644 rl_coach/architectures/tensorflow_components/heads/ddpg_actor_head.py create mode 100644 rl_coach/architectures/tensorflow_components/heads/dnd_q_head.py create mode 100644 rl_coach/architectures/tensorflow_components/heads/dueling_q_head.py create mode 100644 rl_coach/architectures/tensorflow_components/heads/head.py create mode 100644 rl_coach/architectures/tensorflow_components/heads/measurements_prediction_head.py create mode 100644 rl_coach/architectures/tensorflow_components/heads/naf_head.py create mode 100644 rl_coach/architectures/tensorflow_components/heads/policy_head.py create mode 100644 rl_coach/architectures/tensorflow_components/heads/ppo_head.py create mode 100644 rl_coach/architectures/tensorflow_components/heads/ppo_v_head.py create mode 100644 rl_coach/architectures/tensorflow_components/heads/q_head.py create mode 100644 rl_coach/architectures/tensorflow_components/heads/quantile_regression_q_head.py create mode 100644 rl_coach/architectures/tensorflow_components/heads/v_head.py create mode 100644 rl_coach/architectures/tensorflow_components/middlewares/__init__.py create mode 100644 rl_coach/architectures/tensorflow_components/middlewares/fc_middleware.py create mode 100644 rl_coach/architectures/tensorflow_components/middlewares/lstm_middleware.py create mode 100644 rl_coach/architectures/tensorflow_components/middlewares/middleware.py create mode 100644 rl_coach/architectures/tensorflow_components/shared_variables.py create mode 100644 rl_coach/base_parameters.py create mode 100644 rl_coach/coach.py create mode 100644 rl_coach/core_types.py rename dashboard.py => rl_coach/dashboard.py (78%) create mode 100644 rl_coach/dashboard_components/__init__.py create mode 100644 rl_coach/dashboard_components/boards.py create mode 100644 rl_coach/dashboard_components/episodic_board.py rename {dashboard_components => rl_coach/dashboard_components}/experiment_board.py (73%) rename {dashboard_components => rl_coach/dashboard_components}/globals.py (94%) rename {dashboard_components => rl_coach/dashboard_components}/landing_page.py (83%) rename {dashboard_components => rl_coach/dashboard_components}/signals.py (95%) create mode 100644 rl_coach/dashboard_components/signals_file.py rename {dashboard_components => rl_coach/dashboard_components}/signals_file_base.py (92%) rename {dashboard_components => rl_coach/dashboard_components}/signals_files_group.py (58%) rename spinner.css => rl_coach/dashboard_components/spinner.css (99%) create mode 100644 rl_coach/datasets/README.md create mode 100644 rl_coach/datasets/doom_basic.tar.gz create mode 100644 rl_coach/datasets/montezuma_revenge.tar.gz rename debug_utils.py => rl_coach/debug_utils.py (52%) create mode 100644 rl_coach/environments/CarlaSettings.ini create mode 100644 rl_coach/environments/README.md rename exploration_policies/continuous_entropy.py => rl_coach/environments/__init__.py (82%) create mode 100644 rl_coach/environments/carla_environment.py create mode 100644 rl_coach/environments/control_suite_environment.py create mode 100644 rl_coach/environments/doom/D2_navigation.cfg create mode 100644 rl_coach/environments/doom/D2_navigation.wad create mode 100644 rl_coach/environments/doom/D3_battle.cfg create mode 100644 rl_coach/environments/doom/D3_battle.wad create mode 100644 rl_coach/environments/doom_environment.py create mode 100644 rl_coach/environments/environment.py create mode 100644 rl_coach/environments/environment_group.py create mode 100644 rl_coach/environments/environment_interface.py create mode 100644 rl_coach/environments/gym_environment.py create mode 100644 rl_coach/environments/mujoco/__init__.py create mode 100644 rl_coach/environments/mujoco/common/__init__.py create mode 100644 rl_coach/environments/mujoco/common/materials.xml create mode 100644 rl_coach/environments/mujoco/common/skybox.xml create mode 100644 rl_coach/environments/mujoco/common/visual.xml create mode 100644 rl_coach/environments/mujoco/pendulum_with_goals.py create mode 100644 rl_coach/environments/mujoco/pendulum_with_goals.xml create mode 100644 rl_coach/environments/starcraft2_environment.py create mode 100644 rl_coach/environments/toy_problems/__init__.py create mode 100644 rl_coach/environments/toy_problems/bit_flip.py create mode 100644 rl_coach/environments/toy_problems/exploration_chain.py create mode 100644 rl_coach/exploration_policies/README.md create mode 100644 rl_coach/exploration_policies/__init__.py create mode 100644 rl_coach/exploration_policies/additive_noise.py create mode 100644 rl_coach/exploration_policies/boltzmann.py create mode 100644 rl_coach/exploration_policies/bootstrapped.py create mode 100644 rl_coach/exploration_policies/categorical.py rename architectures/neon_components/losses.py => rl_coach/exploration_policies/continuous_entropy.py (61%) create mode 100644 rl_coach/exploration_policies/e_greedy.py rename {exploration_policies => rl_coach/exploration_policies}/exploration_policy.py (54%) create mode 100644 rl_coach/exploration_policies/greedy.py create mode 100644 rl_coach/exploration_policies/ou_process.py create mode 100644 rl_coach/exploration_policies/truncated_normal.py create mode 100644 rl_coach/exploration_policies/ucb.py create mode 100644 rl_coach/filters/README.md create mode 100644 rl_coach/filters/__init__.py create mode 100644 rl_coach/filters/action/__init__.py create mode 100644 rl_coach/filters/action/action_filter.py create mode 100644 rl_coach/filters/action/attention_discretization.py create mode 100644 rl_coach/filters/action/box_discretization.py create mode 100644 rl_coach/filters/action/box_masking.py create mode 100644 rl_coach/filters/action/full_discrete_action_space_map.py create mode 100644 rl_coach/filters/action/linear_box_to_box_map.py create mode 100644 rl_coach/filters/action/partial_discrete_action_space_map.py create mode 100644 rl_coach/filters/filter.py create mode 100644 rl_coach/filters/observation/__init__.py create mode 100644 rl_coach/filters/observation/observation_clipping_filter.py create mode 100644 rl_coach/filters/observation/observation_crop_filter.py create mode 100644 rl_coach/filters/observation/observation_filter.py create mode 100644 rl_coach/filters/observation/observation_move_axis_filter.py create mode 100644 rl_coach/filters/observation/observation_normalization_filter.py create mode 100644 rl_coach/filters/observation/observation_reduction_by_sub_parts_name_filter.py create mode 100644 rl_coach/filters/observation/observation_rescale_size_by_factor_filter.py create mode 100644 rl_coach/filters/observation/observation_rescale_to_size_filter.py create mode 100644 rl_coach/filters/observation/observation_rgb_to_y_filter.py create mode 100644 rl_coach/filters/observation/observation_squeeze_filter.py create mode 100644 rl_coach/filters/observation/observation_stacking_filter.py create mode 100644 rl_coach/filters/observation/observation_to_uint8_filter.py create mode 100644 rl_coach/filters/reward/__init__.py create mode 100644 rl_coach/filters/reward/reward_clipping_filter.py create mode 100644 rl_coach/filters/reward/reward_filter.py create mode 100644 rl_coach/filters/reward/reward_normalization_filter.py create mode 100644 rl_coach/filters/reward/reward_rescale_filter.py create mode 100644 rl_coach/graph_managers/README.md create mode 100644 rl_coach/graph_managers/__init__.py create mode 100644 rl_coach/graph_managers/basic_rl_graph_manager.py create mode 100644 rl_coach/graph_managers/graph_manager.py create mode 100644 rl_coach/graph_managers/hac_graph_manager.py create mode 100644 rl_coach/graph_managers/hrl_graph_manager.py create mode 100644 rl_coach/level_manager.py create mode 100644 rl_coach/local_batch_run_coach.py create mode 100644 rl_coach/logger.py create mode 100644 rl_coach/memories/__init__.py create mode 100644 rl_coach/memories/episodic/__init__.py create mode 100644 rl_coach/memories/episodic/episodic_experience_replay.py create mode 100644 rl_coach/memories/episodic/episodic_hindsight_experience_replay.py create mode 100644 rl_coach/memories/episodic/episodic_hrl_hindsight_experience_replay.py create mode 100644 rl_coach/memories/episodic/single_episode_buffer.py create mode 100644 rl_coach/memories/memory.py create mode 100644 rl_coach/memories/non_episodic/__init__.py rename {memories => rl_coach/memories/non_episodic}/differentiable_neural_dictionary.py (58%) create mode 100644 rl_coach/memories/non_episodic/experience_replay.py create mode 100644 rl_coach/memories/non_episodic/prioritized_experience_replay.py rename plot_atari.py => rl_coach/plot_atari.py (65%) create mode 100644 rl_coach/presets/Atari_A3C.py create mode 100644 rl_coach/presets/Atari_A3C_LSTM.py create mode 100644 rl_coach/presets/Atari_Bootstrapped_DQN.py create mode 100644 rl_coach/presets/Atari_C51.py create mode 100644 rl_coach/presets/Atari_DDQN.py create mode 100644 rl_coach/presets/Atari_DDQN_with_PER.py create mode 100644 rl_coach/presets/Atari_DQN.py create mode 100644 rl_coach/presets/Atari_DQN_with_PER.py create mode 100644 rl_coach/presets/Atari_Dueling_DDQN.py create mode 100644 rl_coach/presets/Atari_Dueling_DDQN_with_PER_OpenAI.py create mode 100644 rl_coach/presets/Atari_NEC.py create mode 100644 rl_coach/presets/Atari_NStepQ.py create mode 100644 rl_coach/presets/Atari_QR_DQN.py create mode 100644 rl_coach/presets/Atari_UCB_with_Q_Ensembles.py create mode 100644 rl_coach/presets/BitFlip_DQN.py create mode 100644 rl_coach/presets/BitFlip_DQN_HER.py create mode 100644 rl_coach/presets/Carla_3_Cameras_DDPG.py create mode 100644 rl_coach/presets/Carla_DDPG.py create mode 100644 rl_coach/presets/Carla_Dueling_DDQN.py create mode 100644 rl_coach/presets/CartPole_A3C.py create mode 100644 rl_coach/presets/CartPole_DFP.py create mode 100644 rl_coach/presets/CartPole_DQN.py create mode 100644 rl_coach/presets/CartPole_Dueling_DDQN.py create mode 100644 rl_coach/presets/CartPole_NEC.py create mode 100644 rl_coach/presets/CartPole_NStepQ.py create mode 100644 rl_coach/presets/CartPole_PAL.py create mode 100644 rl_coach/presets/CartPole_PG.py create mode 100644 rl_coach/presets/ControlSuite_DDPG.py create mode 100644 rl_coach/presets/Doom_Basic_A3C.py create mode 100644 rl_coach/presets/Doom_Basic_BC.py create mode 100644 rl_coach/presets/Doom_Basic_DFP.py create mode 100644 rl_coach/presets/Doom_Basic_DQN.py create mode 100644 rl_coach/presets/Doom_Basic_Dueling_DDQN.py create mode 100644 rl_coach/presets/Doom_Battle_DFP.py create mode 100644 rl_coach/presets/Doom_Health_DFP.py create mode 100644 rl_coach/presets/Doom_Health_MMC.py create mode 100644 rl_coach/presets/Doom_Health_Supreme_DFP.py create mode 100644 rl_coach/presets/ExplorationChain_Bootstrapped_DQN.py create mode 100644 rl_coach/presets/ExplorationChain_Dueling_DDQN.py create mode 100644 rl_coach/presets/ExplorationChain_UCB_Q_ensembles.py create mode 100644 rl_coach/presets/Fetch_DDPG_HER_baselines.py create mode 100644 rl_coach/presets/InvertedPendulum_PG.py create mode 100644 rl_coach/presets/MontezumaRevenge_BC.py create mode 100644 rl_coach/presets/Mujoco_A3C.py create mode 100644 rl_coach/presets/Mujoco_A3C_LSTM.py create mode 100644 rl_coach/presets/Mujoco_ClippedPPO.py create mode 100644 rl_coach/presets/Mujoco_DDPG.py create mode 100644 rl_coach/presets/Mujoco_NAF.py create mode 100644 rl_coach/presets/Mujoco_PPO.py create mode 100644 rl_coach/presets/Pendulum_HAC.py create mode 100644 rl_coach/presets/Starcraft_CollectMinerals_A3C.py create mode 100644 rl_coach/presets/Starcraft_CollectMinerals_Dueling_DDQN.py create mode 100644 rl_coach/presets/__init__.py rename renderer.py => rl_coach/renderer.py (82%) create mode 100644 rl_coach/schedules.py create mode 100644 rl_coach/spaces.py create mode 100644 rl_coach/tests/__init__.py create mode 100644 rl_coach/tests/agents/__init__.py create mode 100644 rl_coach/tests/agents/test_agent_external_communication.py create mode 100644 rl_coach/tests/architectures/__init__.py create mode 100644 rl_coach/tests/architectures/tensorflow_components/__init__.py create mode 100644 rl_coach/tests/architectures/tensorflow_components/embedders/__init__.py create mode 100644 rl_coach/tests/architectures/tensorflow_components/embedders/test_identity_embedder.py create mode 100644 rl_coach/tests/architectures/tensorflow_components/embedders/test_image_embedder.py create mode 100644 rl_coach/tests/architectures/tensorflow_components/embedders/test_vector_embedder.py create mode 100644 rl_coach/tests/environments/__init__.py create mode 100644 rl_coach/tests/environments/test_gym_environment.py create mode 100644 rl_coach/tests/exploration_policies/__init__.py create mode 100644 rl_coach/tests/exploration_policies/test_additive_noise.py create mode 100644 rl_coach/tests/exploration_policies/test_e_greedy.py create mode 100644 rl_coach/tests/exploration_policies/test_greedy.py create mode 100644 rl_coach/tests/exploration_policies/test_ou_process.py create mode 100644 rl_coach/tests/filters/__init__.py create mode 100644 rl_coach/tests/filters/action/__init__.py create mode 100644 rl_coach/tests/filters/action/test_attention_discretization.py create mode 100644 rl_coach/tests/filters/action/test_box_discretization.py create mode 100644 rl_coach/tests/filters/action/test_box_masking.py create mode 100644 rl_coach/tests/filters/action/test_linear_box_to_box_map.py create mode 100644 rl_coach/tests/filters/observation/__init__.py create mode 100644 rl_coach/tests/filters/observation/test_observation_crop_filter.py create mode 100644 rl_coach/tests/filters/observation/test_observation_reduction_by_sub_parts_name_filter.py create mode 100644 rl_coach/tests/filters/observation/test_observation_rescale_size_by_factor_filter.py create mode 100644 rl_coach/tests/filters/observation/test_observation_rescale_to_size_filter.py create mode 100644 rl_coach/tests/filters/observation/test_observation_rgb_to_y_filter.py create mode 100644 rl_coach/tests/filters/observation/test_observation_squeeze_filter.py create mode 100644 rl_coach/tests/filters/observation/test_observation_stacking_filter.py create mode 100644 rl_coach/tests/filters/observation/test_observation_to_uint8_filter.py create mode 100644 rl_coach/tests/filters/reward/__init__.py create mode 100644 rl_coach/tests/filters/reward/test_reward_clipping_filter.py create mode 100644 rl_coach/tests/filters/reward/test_reward_rescale_filter.py create mode 100644 rl_coach/tests/filters/test_filters_stacking.py create mode 100644 rl_coach/tests/golden_tests.py create mode 100644 rl_coach/tests/graph_managers/__init__.py create mode 100644 rl_coach/tests/graph_managers/test_basic_rl_graph_manager.py create mode 100644 rl_coach/tests/memories/__init__.py create mode 100644 rl_coach/tests/memories/test_differential_neural_dictionary.py create mode 100644 rl_coach/tests/memories/test_hindsight_experience_replay.py create mode 100644 rl_coach/tests/memories/test_prioritized_experience_replay.py create mode 100644 rl_coach/tests/memories/test_single_episode_buffer.py create mode 100644 rl_coach/tests/presets/__init__.py create mode 100644 rl_coach/tests/presets/test_presets.py create mode 100644 rl_coach/tests/pytest.ini create mode 100644 rl_coach/tests/test_schedules.py create mode 100644 rl_coach/tests/test_spaces.py rename utils.py => rl_coach/utils.py (52%) delete mode 100644 run_test.py create mode 100644 setup.py create mode 100644 tutorials/1. Implementing an Algorithm.ipynb create mode 100644 tutorials/2. Adding an Environment.ipynb create mode 100644 tutorials/3. Implementing a Hierarchical RL Graph.ipynb diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..b2ed5e5 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,3 @@ +include *.txt +include rl_coach/environments/CarlaSettings.ini +include rl_coach/dashboard_components/spinner.css diff --git a/README.md b/README.md index 84291a8..a93f7a9 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # Coach [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/NervanaSystems/coach/blob/master/LICENSE) -[![Docs](https://readthedocs.org/projects/pip/badge/?version=latest&style=flat)](http://NervanaSystems.github.io/coach/) +[![Docs](https://media.readthedocs.org/static/projects/badges/passing-flat.svg)](https://nervanasystems.github.io/coach/) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.1134898.svg)](https://doi.org/10.5281/zenodo.1134898) -## Overview +

Coach Logo

Coach is a python reinforcement learning research framework containing implementation of many state-of-the-art algorithms. @@ -36,7 +36,6 @@ Contacting the Coach development team is also possible through the email [coach@ * [Usage](#usage) + [Running Coach](#running-coach) + [Running Coach Dashboard (Visualization)](#running-coach-dashboard-visualization) - + [Parallelizing an Algorithm](#parallelizing-an-algorithm) * [Supported Environments](#supported-environments) * [Supported Algorithms](#supported-algorithms) * [Citation](#citation) @@ -44,56 +43,69 @@ Contacting the Coach development team is also possible through the email [coach@ ## Documentation -Framework documentation, algorithm description and instructions on how to contribute a new agent/environment can be found [here](http://NervanaSystems.github.io/coach/). +Framework documentation, algorithm description and instructions on how to contribute a new agent/environment can be found [here](https://nervanasystems.github.io/coach/). ## Installation Note: Coach has only been tested on Ubuntu 16.04 LTS, and with Python 3.5. -### Coach Installer +For some information on installing on Ubuntu 17.10 with Python 3.6.3, please refer to the following issue: https://github.com/NervanaSystems/coach/issues/54 -Coach's installer will setup all the basics needed to get the user going with running Coach on top of [OpenAI Gym](https://github.com/openai/gym) environments. This can be done by running the following command and then following the on-screen printed instructions: +In order to install coach, there are a few prerequisites required. This will setup all the basics needed to get the user going with running Coach on top of [OpenAI Gym](https://github.com/openai/gym) environments: -```bash -./install.sh +``` +# General +sudo -E apt-get install python3-pip cmake zlib1g-dev python3-tk python-opencv -y + +# Boost libraries +sudo -E apt-get install libboost-all-dev -y + +# Scipy requirements +sudo -E apt-get install libblas-dev liblapack-dev libatlas-base-dev gfortran -y + +# PyGame +sudo -E apt-get install libsdl-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev +libsmpeg-dev libportmidi-dev libavformat-dev libswscale-dev -y + +# Dashboard +sudo -E apt-get install dpkg-dev build-essential python3.5-dev libjpeg-dev libtiff-dev libsdl1.2-dev libnotify-dev +freeglut3 freeglut3-dev libsm-dev libgtk2.0-dev libgtk-3-dev libwebkitgtk-dev libgtk-3-dev libwebkitgtk-3.0-dev +libgstreamer-plugins-base1.0-dev -y + +# Gym +sudo -E apt-get install libav-tools libsdl2-dev swig cmake -y ``` -Coach creates a virtual environment and installs in it to avoid changes to the user's system. +We recommend installing coach in a virtualenv: -In order to activate and deactivate Coach's virtual environment: - -```bash -source coach_env/bin/activate +``` +sudo -E pip3 install virtualenv +virtualenv -p python3 coach_env +. coach_env/bin/activate ``` -```bash -deactivate +Finally, install coach using pip: ``` +pip3 install rl_coach +``` + +Or alternatively, for a development environment, install coach from the cloned repository: +``` +cd coach +pip3 install -e . +``` + +If a GPU is present, Coach's pip package will install tensorflow-gpu, by default. If a GPU is not present, an [Intel-Optimized TensorFlow](https://software.intel.com/en-us/articles/intel-optimized-tensorflow-wheel-now-available), will be installed. In addition to OpenAI Gym, several other environments were tested and are supported. Please follow the instructions in the Supported Environments section below in order to install more environments. -### TensorFlow GPU Support - -Coach's installer installs [Intel-Optimized TensorFlow](https://software.intel.com/en-us/articles/intel-optimized-tensorflow-wheel-now-available), which does not support GPU, by default. In order to have Coach running with GPU, a GPU supported TensorFlow version must be installed. This can be done by overriding the TensorFlow version: - -```bash -pip3 install tensorflow-gpu -``` - ## Usage ### Running Coach -Coach supports both TensorFlow and neon deep learning frameworks. - -Switching between TensorFlow and neon backends is possible by using the `-f` flag. - -Using TensorFlow (default): `-f tensorflow` - -Using neon: `-f neon` - -There are several available presets in presets.py. +To allow reproducing results in Coach, we defined a mechanism called _preset_. +There are several available presets under the `presets` directory. To list all the available presets use the `-l` flag. To run a preset, use: @@ -103,39 +115,44 @@ python3 coach.py -r -p ``` For example: -1. CartPole environment using Policy Gradients: +* CartPole environment using Policy Gradients (PG): ```bash python3 coach.py -r -p CartPole_PG ``` - -2. Pendulum using Clipped PPO: + +* Basic level of Doom using Dueling network and Double DQN (DDQN) algorithm: ```bash - python3 coach.py -r -p Pendulum_ClippedPPO -n 8 + python3 coach.py -r -p Doom_Basic_Dueling_DDQN ``` -3. MountainCar using A3C: +Some presets apply to a group of environment levels, like the entire Atari or Mujoco suites for example. +To use these presets, the requeseted level should be defined using the `-lvl` flag. + +For example: + + +* Pong using the Nerual Episodic Control (NEC) algorithm: ```bash - python3 coach.py -r -p MountainCar_A3C -n 8 + python3 coach.py -r -p Atari_NEC -lvl pong ``` -4. Doom basic level using Dueling network and Double DQN algorithm: +There are several types of agents that can benefit from running them in a distrbitued fashion with multiple workers in parallel. Each worker interacts with its own copy of the environment but updates a shared network, which improves the data collection speed and the stability of the learning process. +To specify the number of workers to run, use the `-n` flag. + +For example: +* Breakout using Asynchronous Advantage Actor-Critic (A3C) with 8 workers: ```bash - python3 coach.py -r -p Doom_Basic_Dueling_DDQN + python3 coach.py -r -p Atari_A3C -lvl breakout -n 8 ``` -5. Doom health gathering level using Mixed Monte Carlo: - - ```bash - python3 coach.py -r -p Doom_Health_MMC - ``` It is easy to create new presets for different levels or environments by following the same pattern as in presets.py -More usage examples can be found [here](http://NervanaSystems.github.io/coach/usage/index.html). +More usage examples can be found [here](https://nervanasystems.github.io/coach/usage/index.html). ### Running Coach Dashboard (Visualization) Training an agent to solve an environment can be tricky, at times. @@ -152,36 +169,14 @@ python3 dashboard.py -Coach Design - - -### Parallelizing an Algorithm - -Since the introduction of [A3C](https://arxiv.org/abs/1602.01783) in 2016, many algorithms were shown to benefit from running multiple instances in parallel, on many CPU cores. So far, these algorithms include [A3C](https://arxiv.org/abs/1602.01783), [DDPG](https://arxiv.org/pdf/1704.03073.pdf), [PPO](https://arxiv.org/pdf/1707.06347.pdf), and [NAF](https://arxiv.org/pdf/1610.00633.pdf), and this is most probably only the begining. - -Parallelizing an algorithm using Coach is straight-forward. - -The following method of NetworkWrapper parallelizes an algorithm seamlessly: - -```python -network.train_and_sync_networks(current_states, targets) -``` - -Once a parallelized run is started, the ```train_and_sync_networks``` API will apply gradients from each local worker's network to the main global network, allowing for parallel training to take place. - -Then, it merely requires running Coach with the ``` -n``` flag and with the number of workers to run with. For instance, the following command will set 16 workers to work together to train a MuJoCo Hopper: - -```bash -python3 coach.py -p Hopper_A3C -n 16 -``` - +Coach Design ## Supported Environments * *OpenAI Gym:* - Installed by default by Coach's installer. + Installed by default by Coach's installer. The version used by Coach is 0.10.5. * *ViZDoom:* @@ -189,6 +184,7 @@ python3 coach.py -p Hopper_A3C -n 16 https://github.com/mwydmuch/ViZDoom + The version currently used by Coach is 1.1.4. Additionally, Coach assumes that the environment variable VIZDOOM_ROOT points to the ViZDoom installation directory. * *Roboschool:* @@ -211,7 +207,7 @@ python3 coach.py -p Hopper_A3C -n 16 * *CARLA:* - Download release 0.7 from the CARLA repository - + Download release 0.8.4 from the CARLA repository - https://github.com/carla-simulator/carla/releases @@ -219,6 +215,22 @@ python3 coach.py -p Hopper_A3C -n 16 A simple CARLA settings file (```CarlaSettings.ini```) is supplied with Coach, and is located in the ```environments``` directory. +* *Starcraft:* + + Follow the instructions described in the PySC2 repository - + + https://github.com/deepmind/pysc2 + + The version used by Coach is 2.0.1 + +* *DeepMind Control Suite:* + + Follow the instructions described in the DeepMind Control Suite repository - + + https://github.com/deepmind/dm_control + + The version used by Coach is 0.0.0 + ## Supported Algorithms @@ -227,25 +239,47 @@ python3 coach.py -p Hopper_A3C -n 16 - -* [Deep Q Network (DQN)](https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf) ([code](agents/dqn_agent.py)) -* [Double Deep Q Network (DDQN)](https://arxiv.org/pdf/1509.06461.pdf) ([code](agents/ddqn_agent.py)) +### Value Optimization Agents +* [Deep Q Network (DQN)](https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf) ([code](rl_coach/agents/dqn_agent.py)) +* [Double Deep Q Network (DDQN)](https://arxiv.org/pdf/1509.06461.pdf) ([code](rl_coach/agents/ddqn_agent.py)) * [Dueling Q Network](https://arxiv.org/abs/1511.06581) -* [Mixed Monte Carlo (MMC)](https://arxiv.org/abs/1703.01310) ([code](agents/mmc_agent.py)) -* [Persistent Advantage Learning (PAL)](https://arxiv.org/abs/1512.04860) ([code](agents/pal_agent.py)) -* [Categorical Deep Q Network (C51)](https://arxiv.org/abs/1707.06887) ([code](agents/categorical_dqn_agent.py)) -* [Quantile Regression Deep Q Network (QR-DQN)](https://arxiv.org/pdf/1710.10044v1.pdf) ([code](agents/qr_dqn_agent.py)) -* [Bootstrapped Deep Q Network](https://arxiv.org/abs/1602.04621) ([code](agents/bootstrapped_dqn_agent.py)) -* [N-Step Q Learning](https://arxiv.org/abs/1602.01783) | **Distributed** ([code](agents/n_step_q_agent.py)) -* [Neural Episodic Control (NEC)](https://arxiv.org/abs/1703.01988) ([code](agents/nec_agent.py)) -* [Normalized Advantage Functions (NAF)](https://arxiv.org/abs/1603.00748.pdf) | **Distributed** ([code](agents/naf_agent.py)) -* [Policy Gradients (PG)](http://www-anw.cs.umass.edu/~barto/courses/cs687/williams92simple.pdf) | **Distributed** ([code](agents/policy_gradients_agent.py)) -* [Asynchronous Advantage Actor-Critic (A3C)](https://arxiv.org/abs/1602.01783) | **Distributed** ([code](agents/actor_critic_agent.py)) -* [Deep Deterministic Policy Gradients (DDPG)](https://arxiv.org/abs/1509.02971) | **Distributed** ([code](agents/ddpg_agent.py)) -* [Proximal Policy Optimization (PPO)](https://arxiv.org/pdf/1707.06347.pdf) ([code](agents/ppo_agent.py)) -* [Clipped Proximal Policy Optimization](https://arxiv.org/pdf/1707.06347.pdf) | **Distributed** ([code](agents/clipped_ppo_agent.py)) -* [Direct Future Prediction (DFP)](https://arxiv.org/abs/1611.01779) | **Distributed** ([code](agents/dfp_agent.py)) -* Behavioral Cloning (BC) ([code](agents/bc_agent.py)) +* [Mixed Monte Carlo (MMC)](https://arxiv.org/abs/1703.01310) ([code](rl_coach/agents/mmc_agent.py)) +* [Persistent Advantage Learning (PAL)](https://arxiv.org/abs/1512.04860) ([code](rl_coach/agents/pal_agent.py)) +* [Categorical Deep Q Network (C51)](https://arxiv.org/abs/1707.06887) ([code](rl_coach/agents/categorical_dqn_agent.py)) +* [Quantile Regression Deep Q Network (QR-DQN)](https://arxiv.org/pdf/1710.10044v1.pdf) ([code](rl_coach/agents/qr_dqn_agent.py)) +* [N-Step Q Learning](https://arxiv.org/abs/1602.01783) | **Distributed** ([code](rl_coach/agents/n_step_q_agent.py)) +* [Neural Episodic Control (NEC)](https://arxiv.org/abs/1703.01988) ([code](rl_coach/agents/nec_agent.py)) +* [Normalized Advantage Functions (NAF)](https://arxiv.org/abs/1603.00748.pdf) | **Distributed** ([code](rl_coach/agents/naf_agent.py)) + +### Policy Optimization Agents +* [Policy Gradients (PG)](http://www-anw.cs.umass.edu/~barto/courses/cs687/williams92simple.pdf) | **Distributed** ([code](rl_coach/agents/policy_gradients_agent.py)) +* [Asynchronous Advantage Actor-Critic (A3C)](https://arxiv.org/abs/1602.01783) | **Distributed** ([code](rl_coach/agents/actor_critic_agent.py)) +* [Deep Deterministic Policy Gradients (DDPG)](https://arxiv.org/abs/1509.02971) | **Distributed** ([code](rl_coach/agents/ddpg_agent.py)) +* [Proximal Policy Optimization (PPO)](https://arxiv.org/pdf/1707.06347.pdf) ([code](rl_coach/agents/ppo_agent.py)) +* [Clipped Proximal Policy Optimization (CPPO)](https://arxiv.org/pdf/1707.06347.pdf) | **Distributed** ([code](rl_coach/agents/clipped_ppo_agent.py)) +* [Generalized Advantage Estimation (GAE)](https://arxiv.org/abs/1506.02438) ([code](rl_coach/agents/actor_critic_agent.py#L86)) + +### General Agents +* [Direct Future Prediction (DFP)](https://arxiv.org/abs/1611.01779) | **Distributed** ([code](rl_coach/agents/dfp_agent.py)) + +### Imitation Learning Agents +* Behavioral Cloning (BC) ([code](rl_coach/agents/bc_agent.py)) + +### Hierarchical Reinforcement Learning Agents +* [Hierarchical Actor Critic (HAC)](https://arxiv.org/abs/1712.00948.pdf) ([code](rl_coach/agents/ddpg_hac_agent.py)) + +### Memory Types +* [Hindsight Experience Replay (HER)](https://arxiv.org/abs/1707.01495.pdf) ([code](rl_coach/memories/episodic/episodic_hindsight_experience_replay.py)) +* [Prioritized Experience Replay (PER)](https://arxiv.org/abs/1511.05952) ([code](rl_coach/memories/non_episodic/prioritized_experience_replay.py)) + +### Exploration Techniques +* E-Greedy ([code](rl_coach/exploration_policies/e_greedy.py)) +* Boltzmann ([code](rl_coach/exploration_policies/boltzmann.py)) +* Ornstein–Uhlenbeck process ([code](rl_coach/exploration_policies/ou_process.py)) +* Normal Noise ([code](rl_coach/exploration_policies/additive_noise.py)) +* Truncated Normal Noise ([code](rl_coach/exploration_policies/truncated_normal.py)) +* [Bootstrapped Deep Q Network](https://arxiv.org/abs/1602.04621) ([code](rl_coach/agents/bootstrapped_dqn_agent.py)) +* [UCB Exploration via Q-Ensembles (UCB)](https://arxiv.org/abs/1706.01502) ([code](rl_coach/exploration_policies/ucb.py)) ## Citation diff --git a/agents/__init__.py b/agents/__init__.py deleted file mode 100644 index fdbd13e..0000000 --- a/agents/__init__.py +++ /dev/null @@ -1,38 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 agents.actor_critic_agent import * -from agents.agent import * -from agents.bc_agent import * -from agents.bootstrapped_dqn_agent import * -from agents.clipped_ppo_agent import * -from agents.ddpg_agent import * -from agents.ddqn_agent import * -from agents.dfp_agent import * -from agents.dqn_agent import * -from agents.categorical_dqn_agent import * -from agents.human_agent import * -from agents.imitation_agent import * -from agents.mmc_agent import * -from agents.n_step_q_agent import * -from agents.naf_agent import * -from agents.nec_agent import * -from agents.pal_agent import * -from agents.policy_gradients_agent import * -from agents.policy_optimization_agent import * -from agents.ppo_agent import * -from agents.value_optimization_agent import * -from agents.qr_dqn_agent import * diff --git a/agents/actor_critic_agent.py b/agents/actor_critic_agent.py deleted file mode 100644 index 729e67f..0000000 --- a/agents/actor_critic_agent.py +++ /dev/null @@ -1,146 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 agents.policy_optimization_agent import * -from logger import * -from utils import * -import scipy.signal - - -# Actor Critic - https://arxiv.org/abs/1602.01783 -class ActorCriticAgent(PolicyOptimizationAgent): - def __init__(self, env, tuning_parameters, replicated_device=None, thread_id=0, create_target_network = False): - PolicyOptimizationAgent.__init__(self, env, tuning_parameters, replicated_device, thread_id, create_target_network) - self.last_gradient_update_step_idx = 0 - self.action_advantages = Signal('Advantages') - self.state_values = Signal('Values') - self.unclipped_grads = Signal('Grads (unclipped)') - self.value_loss = Signal('Value Loss') - self.policy_loss = Signal('Policy Loss') - self.signals.append(self.action_advantages) - self.signals.append(self.state_values) - self.signals.append(self.unclipped_grads) - self.signals.append(self.value_loss) - self.signals.append(self.policy_loss) - - # Discounting function used to calculate discounted returns. - def discount(self, x, gamma): - return scipy.signal.lfilter([1], [1, -gamma], x[::-1], axis=0)[::-1] - - def get_general_advantage_estimation_values(self, rewards, values): - # values contain n+1 elements (t ... t+n+1), rewards contain n elements (t ... t + n) - bootstrap_extended_rewards = np.array(rewards.tolist() + [values[-1]]) - - # Approximation based calculation of GAE (mathematically correct only when Tmax = inf, - # although in practice works even in much smaller Tmax values, e.g. 20) - deltas = rewards + self.tp.agent.discount * values[1:] - values[:-1] - gae = self.discount(deltas, self.tp.agent.discount * self.tp.agent.gae_lambda) - - if self.tp.agent.estimate_value_using_gae: - discounted_returns = np.expand_dims(gae + values[:-1], -1) - else: - discounted_returns = np.expand_dims(np.array(self.discount(bootstrap_extended_rewards, - self.tp.agent.discount)), 1)[:-1] - return gae, discounted_returns - - def learn_from_batch(self, batch): - # batch contains a list of episodes to learn from - current_states, next_states, actions, rewards, game_overs, _ = self.extract_batch(batch) - - # get the values for the current states - result = self.main_network.online_network.predict(current_states) - current_state_values = result[0] - self.state_values.add_sample(current_state_values) - - # the targets for the state value estimator - num_transitions = len(game_overs) - state_value_head_targets = np.zeros((num_transitions, 1)) - - # estimate the advantage function - action_advantages = np.zeros((num_transitions, 1)) - - if self.policy_gradient_rescaler == PolicyGradientRescaler.A_VALUE: - if game_overs[-1]: - R = 0 - else: - R = self.main_network.online_network.predict(last_sample(next_states))[0] - - for i in reversed(range(num_transitions)): - R = rewards[i] + self.tp.agent.discount * R - state_value_head_targets[i] = R - action_advantages[i] = R - current_state_values[i] - - elif self.policy_gradient_rescaler == PolicyGradientRescaler.GAE: - # get bootstraps - bootstrapped_value = self.main_network.online_network.predict(last_sample(next_states))[0] - values = np.append(current_state_values, bootstrapped_value) - if game_overs[-1]: - values[-1] = 0 - - # get general discounted returns table - gae_values, state_value_head_targets = self.get_general_advantage_estimation_values(rewards, values) - action_advantages = np.vstack(gae_values) - else: - screen.warning("WARNING: The requested policy gradient rescaler is not available") - - action_advantages = action_advantages.squeeze(axis=-1) - if not self.env.discrete_controls and len(actions.shape) < 2: - actions = np.expand_dims(actions, -1) - - # train - result = self.main_network.online_network.accumulate_gradients({**current_states, 'output_1_0': actions}, - [state_value_head_targets, action_advantages]) - - # logging - total_loss, losses, unclipped_grads = result[:3] - self.action_advantages.add_sample(action_advantages) - self.unclipped_grads.add_sample(unclipped_grads) - self.value_loss.add_sample(losses[0]) - self.policy_loss.add_sample(losses[1]) - - return total_loss - - def choose_action(self, curr_state, phase=RunPhase.TRAIN): - # TODO: rename curr_state -> state - - # convert to batch so we can run it through the network - curr_state = { - k: np.expand_dims(np.array(curr_state[k]), 0) - for k in curr_state.keys() - } - - if self.env.discrete_controls: - # DISCRETE - state_value, action_probabilities = self.main_network.online_network.predict(curr_state) - action_probabilities = action_probabilities.squeeze() - if phase == RunPhase.TRAIN: - action = self.exploration_policy.get_action(action_probabilities) - else: - action = np.argmax(action_probabilities) - action_info = {"action_probability": action_probabilities[action], "state_value": state_value} - self.entropy.add_sample(-np.sum(action_probabilities * np.log(action_probabilities + eps))) - else: - # CONTINUOUS - state_value, action_values_mean, action_values_std = self.main_network.online_network.predict(curr_state) - action_values_mean = action_values_mean.squeeze() - action_values_std = action_values_std.squeeze() - if phase == RunPhase.TRAIN: - action = np.squeeze(np.random.randn(1, self.action_space_size) * action_values_std + action_values_mean) - else: - action = action_values_mean - action_info = {"action_probability": action, "state_value": state_value} - - return action, action_info diff --git a/agents/agent.py b/agents/agent.py deleted file mode 100644 index 888f1b2..0000000 --- a/agents/agent.py +++ /dev/null @@ -1,580 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 scipy.ndimage -try: - import matplotlib.pyplot as plt -except: - from logger import failed_imports - failed_imports.append("matplotlib") - -import copy -from renderer import Renderer -from configurations import Preset -from collections import deque -from utils import LazyStack -from collections import OrderedDict -from utils import RunPhase, Signal, is_empty, RunningStat -from architectures import * -from exploration_policies import * -from memories import * -from memories.memory import * -from logger import logger, screen -import random -import time -import os -import itertools -from architectures.tensorflow_components.shared_variables import SharedRunningStats -from six.moves import range - - -class Agent(object): - def __init__(self, env, tuning_parameters, replicated_device=None, task_id=0): - """ - :param env: An environment instance - :type env: EnvironmentWrapper - :param tuning_parameters: A Preset class instance with all the running paramaters - :type tuning_parameters: Preset - :param replicated_device: A tensorflow device for distributed training (optional) - :type replicated_device: instancemethod - :param thread_id: The current thread id - :param thread_id: int - """ - - screen.log_title("Creating agent {}".format(task_id)) - self.task_id = task_id - self.sess = tuning_parameters.sess - self.env = tuning_parameters.env_instance = env - self.imitation = False - - # i/o dimensions - if not tuning_parameters.env.desired_observation_width or not tuning_parameters.env.desired_observation_height: - tuning_parameters.env.desired_observation_width = self.env.width - tuning_parameters.env.desired_observation_height = self.env.height - self.action_space_size = tuning_parameters.env.action_space_size = self.env.action_space_size - self.measurements_size = tuning_parameters.env.measurements_size = self.env.measurements_size - if tuning_parameters.agent.use_accumulated_reward_as_measurement: - self.measurements_size = tuning_parameters.env.measurements_size = (self.measurements_size[0] + 1,) - - # modules - if tuning_parameters.agent.load_memory_from_file_path: - screen.log_title("Loading replay buffer from pickle. Pickle path: {}" - .format(tuning_parameters.agent.load_memory_from_file_path)) - self.memory = read_pickle(tuning_parameters.agent.load_memory_from_file_path) - else: - self.memory = eval(tuning_parameters.memory + '(tuning_parameters)') - # self.architecture = eval(tuning_parameters.architecture) - - self.has_global = replicated_device is not None - self.replicated_device = replicated_device - self.worker_device = "/job:worker/task:{}/cpu:0".format(task_id) if replicated_device is not None else "/gpu:0" - - self.exploration_policy = eval(tuning_parameters.exploration.policy + '(tuning_parameters)') - self.evaluation_exploration_policy = eval(tuning_parameters.exploration.evaluation_policy - + '(tuning_parameters)') - self.evaluation_exploration_policy.change_phase(RunPhase.TEST) - - # initialize all internal variables - self.tp = tuning_parameters - self.in_heatup = False - self.total_reward_in_current_episode = 0 - self.total_steps_counter = 0 - self.running_reward = None - self.training_iteration = 0 - self.current_episode = self.tp.current_episode = 0 - self.curr_state = {} - self.current_episode_steps_counter = 0 - self.episode_running_info = {} - self.last_episode_evaluation_ran = 0 - self.running_observations = [] - logger.set_current_time(self.current_episode) - self.main_network = None - self.networks = [] - self.last_episode_images = [] - self.renderer = Renderer() - - # signals - self.signals = [] - self.loss = Signal('Loss') - self.signals.append(self.loss) - self.curr_learning_rate = Signal('Learning Rate') - self.signals.append(self.curr_learning_rate) - - if self.tp.env.normalize_observation and not self.env.is_state_type_image: - if not self.tp.distributed or not self.tp.agent.share_statistics_between_workers: - self.running_observation_stats = RunningStat((self.tp.env.desired_observation_width,)) - self.running_reward_stats = RunningStat(()) - if self.tp.checkpoint_restore_dir: - checkpoint_path = os.path.join(self.tp.checkpoint_restore_dir, "running_stats.p") - self.running_observation_stats = read_pickle(checkpoint_path) - else: - self.running_observation_stats = RunningStat((self.tp.env.desired_observation_width,)) - self.running_reward_stats = RunningStat(()) - else: - self.running_observation_stats = SharedRunningStats(self.tp, replicated_device, - shape=(self.tp.env.desired_observation_width,), - name='observation_stats') - self.running_reward_stats = SharedRunningStats(self.tp, replicated_device, - shape=(), - name='reward_stats') - - # env is already reset at this point. Otherwise we're getting an error where you cannot - # reset an env which is not done - self.reset_game(do_not_reset_env=True) - - # use seed - if self.tp.seed is not None: - random.seed(self.tp.seed) - np.random.seed(self.tp.seed) - - def log_to_screen(self, phase): - # log to screen - if self.current_episode >= 0: - if phase == RunPhase.TRAIN: - exploration = self.exploration_policy.get_control_param() - else: - exploration = self.evaluation_exploration_policy.get_control_param() - - screen.log_dict( - OrderedDict([ - ("Worker", self.task_id), - ("Episode", self.current_episode), - ("total reward", self.total_reward_in_current_episode), - ("exploration", exploration), - ("steps", self.total_steps_counter), - ("training iteration", self.training_iteration) - ]), - prefix=phase - ) - - def update_log(self, phase=RunPhase.TRAIN): - """ - Writes logging messages to screen and updates the log file with all the signal values. - :return: None - """ - # log all the signals to file - logger.set_current_time(self.current_episode) - logger.create_signal_value('Training Iter', self.training_iteration) - logger.create_signal_value('In Heatup', int(phase == RunPhase.HEATUP)) - logger.create_signal_value('ER #Transitions', self.memory.num_transitions()) - logger.create_signal_value('ER #Episodes', self.memory.length()) - logger.create_signal_value('Episode Length', self.current_episode_steps_counter) - logger.create_signal_value('Total steps', self.total_steps_counter) - logger.create_signal_value("Epsilon", self.exploration_policy.get_control_param()) - logger.create_signal_value("Training Reward", self.total_reward_in_current_episode - if phase == RunPhase.TRAIN else np.nan) - logger.create_signal_value('Evaluation Reward', self.total_reward_in_current_episode - if phase == RunPhase.TEST else np.nan) - logger.create_signal_value('Update Target Network', 0, overwrite=False) - logger.update_wall_clock_time(self.current_episode) - - for signal in self.signals: - logger.create_signal_value("{}/Mean".format(signal.name), signal.get_mean()) - logger.create_signal_value("{}/Stdev".format(signal.name), signal.get_stdev()) - logger.create_signal_value("{}/Max".format(signal.name), signal.get_max()) - logger.create_signal_value("{}/Min".format(signal.name), signal.get_min()) - - # dump - if self.current_episode % self.tp.visualization.dump_signals_to_csv_every_x_episodes == 0 \ - and self.current_episode > 0: - logger.dump_output_csv() - - def reset_game(self, do_not_reset_env=False): - """ - Resets all the episodic parameters and start a new environment episode. - :param do_not_reset_env: A boolean that allows prevention of environment reset - :return: None - """ - - for signal in self.signals: - signal.reset() - self.total_reward_in_current_episode = 0 - self.curr_state = {} - self.last_episode_images = [] - self.current_episode_steps_counter = 0 - self.episode_running_info = {} - if not do_not_reset_env: - self.env.reset() - self.exploration_policy.reset() - - # required for online plotting - if self.tp.visualization.plot_action_values_online: - if hasattr(self, 'episode_running_info') and hasattr(self.env, 'actions_description'): - for action in self.env.actions_description: - self.episode_running_info[action] = [] - plt.clf() - - if self.tp.agent.middleware_type == MiddlewareTypes.LSTM: - for network in self.networks: - network.online_network.curr_rnn_c_in = network.online_network.middleware_embedder.c_init - network.online_network.curr_rnn_h_in = network.online_network.middleware_embedder.h_init - - self.prepare_initial_state() - - def preprocess_observation(self, observation): - """ - Preprocesses the given observation. - For images - convert to grayscale, resize and convert to int. - For measurements vectors - normalize by a running average and std. - :param observation: The agents observation - :return: A processed version of the observation - """ - - if self.env.is_state_type_image: - # rescale - observation = scipy.misc.imresize(observation, - (self.tp.env.desired_observation_height, - self.tp.env.desired_observation_width), - interp=self.tp.rescaling_interpolation_type) - # rgb to y - if len(observation.shape) > 2 and observation.shape[2] > 1: - r, g, b = observation[:, :, 0], observation[:, :, 1], observation[:, :, 2] - observation = 0.2989 * r + 0.5870 * g + 0.1140 * b - - # Render the processed observation which is how the agent will see it - # Warning: this cannot currently be done in parallel to rendering the environment - if self.tp.visualization.render_observation: - if not self.renderer.is_open: - self.renderer.create_screen(observation.shape[0], observation.shape[1]) - self.renderer.render_image(observation) - - return observation.astype('uint8') - else: - if self.tp.env.normalize_observation and self.sess is not None: - # standardize the input observation using a running mean and std - if not self.tp.distributed or not self.tp.agent.share_statistics_between_workers: - self.running_observation_stats.push(observation) - observation = (observation - self.running_observation_stats.mean) / \ - (self.running_observation_stats.std + 1e-15) - observation = np.clip(observation, -5.0, 5.0) - return observation - - def learn_from_batch(self, batch): - """ - Given a batch of transitions, calculates their target values and updates the network. - :param batch: A list of transitions - :return: The loss of the training - """ - pass - - def train(self): - """ - A single training iteration. Sample a batch, train on it and update target networks. - :return: The training loss. - """ - batch = self.memory.sample(self.tp.batch_size) - loss = self.learn_from_batch(batch) - - if self.tp.learning_rate_decay_rate != 0: - self.curr_learning_rate.add_sample(self.tp.sess.run(self.tp.learning_rate)) - else: - self.curr_learning_rate.add_sample(self.tp.learning_rate) - - # update the target network of every network that has a target network - if self.total_steps_counter % self.tp.agent.num_steps_between_copying_online_weights_to_target == 0: - for network in self.networks: - network.update_target_network(self.tp.agent.rate_for_copying_weights_to_target) - logger.create_signal_value('Update Target Network', 1) - else: - logger.create_signal_value('Update Target Network', 0, overwrite=False) - - return loss - - def extract_batch(self, batch): - """ - Extracts a single numpy array for each object in a batch of transitions (state, action, etc.) - :param batch: An array of transitions - :return: For each transition element, returns a numpy array of all the transitions in the batch - """ - current_states = {} - next_states = {} - current_states['observation'] = np.array([np.array(transition.state['observation']) for transition in batch]) - next_states['observation'] = np.array([np.array(transition.next_state['observation']) for transition in batch]) - actions = np.array([transition.action for transition in batch]) - rewards = np.array([transition.reward for transition in batch]) - game_overs = np.array([transition.game_over for transition in batch]) - total_return = np.array([transition.total_return for transition in batch]) - - # get the entire state including measurements if available - if self.tp.agent.use_measurements: - current_states['measurements'] = np.array([transition.state['measurements'] for transition in batch]) - next_states['measurements'] = np.array([transition.next_state['measurements'] for transition in batch]) - - return current_states, next_states, actions, rewards, game_overs, total_return - - def plot_action_values_online(self): - """ - Plot an animated graph of the value of each possible action during the episode - :return: None - """ - - plt.clf() - for key, data_list in self.episode_running_info.items(): - plt.plot(data_list, label=key) - plt.legend() - plt.pause(0.00000001) - - def choose_action(self, curr_state, phase=RunPhase.TRAIN): - """ - choose an action to act with in the current episode being played. Different behavior might be exhibited when training - or testing. - - :param curr_state: the current state to act upon. - :param phase: the current phase: training or testing. - :return: chosen action, some action value describing the action (q-value, probability, etc) - """ - pass - - def preprocess_reward(self, reward): - if self.tp.env.reward_scaling: - reward /= float(self.tp.env.reward_scaling) - if self.tp.env.reward_clipping_max: - reward = min(reward, self.tp.env.reward_clipping_max) - if self.tp.env.reward_clipping_min: - reward = max(reward, self.tp.env.reward_clipping_min) - return reward - - def tf_input_state(self, curr_state): - """ - convert curr_state into input tensors tensorflow is expecting. - """ - # add batch axis with length 1 onto each value - # extract values from the state based on agent.input_types - input_state = {} - for input_name in self.tp.agent.input_types.keys(): - input_state[input_name] = np.expand_dims(np.array(curr_state[input_name]), 0) - return input_state - - def prepare_initial_state(self): - """ - Create an initial state when starting a new episode - :return: None - """ - observation = self.preprocess_observation(self.env.state['observation']) - self.curr_stack = deque([observation]*self.tp.env.observation_stack_size, maxlen=self.tp.env.observation_stack_size) - observation = LazyStack(self.curr_stack, -1) - - self.curr_state = { - 'observation': observation - } - if self.tp.agent.use_measurements: - if 'measurements' in self.env.state.keys(): - self.curr_state['measurements'] = self.env.state['measurements'] - else: - self.curr_state['measurements'] = np.zeros(0) - if self.tp.agent.use_accumulated_reward_as_measurement: - self.curr_state['measurements'] = np.append(self.curr_state['measurements'], 0) - - def act(self, phase=RunPhase.TRAIN): - """ - Take one step in the environment according to the network prediction and store the transition in memory - :param phase: Either Train or Test to specify if greedy actions should be used and if transitions should be stored - :return: A boolean value that signals an episode termination - """ - - if phase != RunPhase.TEST: - self.total_steps_counter += 1 - self.current_episode_steps_counter += 1 - - # get new action - action_info = {"action_probability": 1.0 / self.env.action_space_size, "action_value": 0, "max_action_value": 0} - - if phase == RunPhase.HEATUP and not self.tp.heatup_using_network_decisions: - action = self.env.get_random_action() - else: - action, action_info = self.choose_action(self.curr_state, phase=phase) - - # perform action - if type(action) == np.ndarray: - action = action.squeeze() - result = self.env.step(action) - - shaped_reward = self.preprocess_reward(result['reward']) - if 'action_intrinsic_reward' in action_info.keys(): - shaped_reward += action_info['action_intrinsic_reward'] - # TODO: should total_reward_in_current_episode include shaped_reward? - self.total_reward_in_current_episode += result['reward'] - next_state = copy.copy(result['state']) - next_state['observation'] = self.preprocess_observation(next_state['observation']) - - # plot action values online - if self.tp.visualization.plot_action_values_online and phase != RunPhase.HEATUP: - self.plot_action_values_online() - - # initialize the next state - # TODO: provide option to stack more than just the observation - self.curr_stack.append(next_state['observation']) - observation = LazyStack(self.curr_stack, -1) - - next_state['observation'] = observation - if self.tp.agent.use_measurements: - if 'measurements' in result['state'].keys(): - next_state['measurements'] = result['state']['measurements'] - else: - next_state['measurements'] = np.zeros(0) - if self.tp.agent.use_accumulated_reward_as_measurement: - next_state['measurements'] = np.append(next_state['measurements'], self.total_reward_in_current_episode) - - # store the transition only if we are training - if phase == RunPhase.TRAIN or phase == RunPhase.HEATUP: - transition = Transition(self.curr_state, result['action'], shaped_reward, next_state, result['done']) - for key in action_info.keys(): - transition.info[key] = action_info[key] - if self.tp.agent.add_a_normalized_timestep_to_the_observation: - transition.info['timestep'] = float(self.current_episode_steps_counter) / self.env.timestep_limit - self.memory.store(transition) - elif phase == RunPhase.TEST and self.tp.visualization.dump_gifs: - # we store the transitions only for saving gifs - self.last_episode_images.append(self.env.get_rendered_image()) - - # update the current state for the next step - self.curr_state = next_state - - # deal with episode termination - if result['done']: - if self.tp.visualization.dump_csv: - self.update_log(phase=phase) - self.log_to_screen(phase=phase) - - if phase == RunPhase.TRAIN or phase == RunPhase.HEATUP: - self.reset_game() - - self.current_episode += 1 - self.tp.current_episode = self.current_episode - - # return episode really ended - return result['done'] - - def evaluate(self, num_episodes, keep_networks_synced=False): - """ - Run in an evaluation mode for several episodes. Actions will be chosen greedily. - :param keep_networks_synced: keep the online network in sync with the global network after every episode - :param num_episodes: The number of episodes to evaluate on - :return: None - """ - - max_reward_achieved = -float('inf') - average_evaluation_reward = 0 - screen.log_title("Running evaluation") - self.env.change_phase(RunPhase.TEST) - for i in range(num_episodes): - # keep the online network in sync with the global network - if keep_networks_synced: - for network in self.networks: - network.sync() - - episode_ended = False - while not episode_ended: - episode_ended = self.act(phase=RunPhase.TEST) - - if keep_networks_synced \ - and self.total_steps_counter % self.tp.agent.update_evaluation_agent_network_after_every_num_steps: - for network in self.networks: - network.sync() - - if self.total_reward_in_current_episode > max_reward_achieved: - max_reward_achieved = self.total_reward_in_current_episode - frame_skipping = int(5/self.tp.env.frame_skip) - if self.tp.visualization.dump_gifs: - logger.create_gif(self.last_episode_images[::frame_skipping], - name='score-{}'.format(max_reward_achieved), fps=10) - - average_evaluation_reward += self.total_reward_in_current_episode - self.reset_game() - - average_evaluation_reward /= float(num_episodes) - - self.env.change_phase(RunPhase.TRAIN) - screen.log_title("Evaluation done. Average reward = {}.".format(average_evaluation_reward)) - - def post_training_commands(self): - pass - - def improve(self): - """ - Training algorithms wrapper. Heatup >> [ Evaluate >> Play >> Train >> Save checkpoint ] - - :return: None - """ - - # synchronize the online network weights with the global network - for network in self.networks: - network.sync() - - # heatup phase - if self.tp.num_heatup_steps != 0: - self.in_heatup = True - screen.log_title("Starting heatup {}".format(self.task_id)) - num_steps_required_for_one_training_batch = self.tp.batch_size * self.tp.env.observation_stack_size - for step in range(max(self.tp.num_heatup_steps, num_steps_required_for_one_training_batch)): - self.act(phase=RunPhase.HEATUP) - - # training phase - self.in_heatup = False - screen.log_title("Starting training {}".format(self.task_id)) - self.exploration_policy.change_phase(RunPhase.TRAIN) - training_start_time = time.time() - model_snapshots_periods_passed = -1 - self.reset_game() - - while self.training_iteration < self.tp.num_training_iterations: - # evaluate - evaluate_agent = (self.last_episode_evaluation_ran is not self.current_episode) and \ - (self.current_episode % self.tp.evaluate_every_x_episodes == 0) - evaluate_agent = evaluate_agent or \ - (self.imitation and self.training_iteration > 0 and - self.training_iteration % self.tp.evaluate_every_x_training_iterations == 0) - - if evaluate_agent: - self.env.reset(force_environment_reset=True) - self.last_episode_evaluation_ran = self.current_episode - self.evaluate(self.tp.evaluation_episodes) - - # snapshot model - if self.tp.save_model_sec and self.tp.save_model_sec > 0 and not self.tp.distributed: - total_training_time = time.time() - training_start_time - current_snapshot_period = (int(total_training_time) // self.tp.save_model_sec) - if current_snapshot_period > model_snapshots_periods_passed: - model_snapshots_periods_passed = current_snapshot_period - self.save_model(model_snapshots_periods_passed) - if hasattr(self, 'running_observation_state') and self.running_observation_stats is not None: - to_pickle(self.running_observation_stats, - os.path.join(self.tp.save_model_dir, - "running_stats.p".format(model_snapshots_periods_passed))) - - # play and record in replay buffer - if self.tp.agent.collect_new_data: - if self.tp.agent.step_until_collecting_full_episodes: - step = 0 - while step < self.tp.agent.num_consecutive_playing_steps or self.memory.get_episode(-1).length() != 0: - self.act() - step += 1 - else: - for step in range(self.tp.agent.num_consecutive_playing_steps): - self.act() - - # train - if self.tp.train: - for step in range(self.tp.agent.num_consecutive_training_steps): - loss = self.train() - self.loss.add_sample(loss) - self.training_iteration += 1 - if self.imitation: - self.log_to_screen(RunPhase.TRAIN) - self.post_training_commands() - - def save_model(self, model_id): - self.main_network.save_model(model_id) diff --git a/agents/bc_agent.py b/agents/bc_agent.py deleted file mode 100644 index 70fe3e6..0000000 --- a/agents/bc_agent.py +++ /dev/null @@ -1,39 +0,0 @@ -# -# Copyright (c) 2017 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -import numpy as np - -from agents.imitation_agent import ImitationAgent - - -# Behavioral Cloning Agent -class BCAgent(ImitationAgent): - def __init__(self, env, tuning_parameters, replicated_device=None, thread_id=0): - ImitationAgent.__init__(self, env, tuning_parameters, replicated_device, thread_id) - - def learn_from_batch(self, batch): - current_states, _, actions, _, _, _ = self.extract_batch(batch) - - # the targets for the network are the actions since this is supervised learning - if self.env.discrete_controls: - targets = np.eye(self.env.action_space_size)[[actions]] - else: - targets = actions - - result = self.main_network.train_and_sync_networks(current_states, targets) - total_loss = result[0] - - return total_loss diff --git a/agents/bootstrapped_dqn_agent.py b/agents/bootstrapped_dqn_agent.py deleted file mode 100644 index 3476022..0000000 --- a/agents/bootstrapped_dqn_agent.py +++ /dev/null @@ -1,58 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 agents.value_optimization_agent import * - - -# Bootstrapped DQN - https://arxiv.org/pdf/1602.04621.pdf -class BootstrappedDQNAgent(ValueOptimizationAgent): - def __init__(self, env, tuning_parameters, replicated_device=None, thread_id=0): - ValueOptimizationAgent.__init__(self, env, tuning_parameters, replicated_device, thread_id) - - def reset_game(self, do_not_reset_env=False): - ValueOptimizationAgent.reset_game(self, do_not_reset_env) - self.exploration_policy.select_head() - - def learn_from_batch(self, batch): - current_states, next_states, actions, rewards, game_overs, _ = self.extract_batch(batch) - - # for the action we actually took, the error is: - # TD error = r + discount*max(q_st_plus_1) - q_st - # for all other actions, the error is 0 - q_st_plus_1 = self.main_network.target_network.predict(next_states) - # initialize with the current prediction so that we will - TD_targets = self.main_network.online_network.predict(current_states) - - # only update the action that we have actually done in this transition - for i in range(self.tp.batch_size): - mask = batch[i].info['mask'] - for head_idx in range(self.tp.exploration.architecture_num_q_heads): - if mask[head_idx] == 1: - TD_targets[head_idx][i, actions[i]] = rewards[i] + \ - (1.0 - game_overs[i]) * self.tp.agent.discount * np.max( - q_st_plus_1[head_idx][i], 0) - - result = self.main_network.train_and_sync_networks(current_states, TD_targets) - - total_loss = result[0] - - return total_loss - - def act(self, phase=RunPhase.TRAIN): - ValueOptimizationAgent.act(self, phase) - mask = np.random.binomial(1, self.tp.exploration.bootstrapped_data_sharing_probability, - self.tp.exploration.architecture_num_q_heads) - self.memory.update_last_transition_info({'mask': mask}) diff --git a/agents/categorical_dqn_agent.py b/agents/categorical_dqn_agent.py deleted file mode 100644 index dec8ba2..0000000 --- a/agents/categorical_dqn_agent.py +++ /dev/null @@ -1,60 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 agents.value_optimization_agent import * - - -# Categorical Deep Q Network - https://arxiv.org/pdf/1707.06887.pdf -class CategoricalDQNAgent(ValueOptimizationAgent): - def __init__(self, env, tuning_parameters, replicated_device=None, thread_id=0): - ValueOptimizationAgent.__init__(self, env, tuning_parameters, replicated_device, thread_id) - self.z_values = np.linspace(self.tp.agent.v_min, self.tp.agent.v_max, self.tp.agent.atoms) - - # prediction's format is (batch,actions,atoms) - def get_q_values(self, prediction): - return np.dot(prediction, self.z_values) - - def learn_from_batch(self, batch): - current_states, next_states, actions, rewards, game_overs, _ = self.extract_batch(batch) - - # for the action we actually took, the error is calculated by the atoms distribution - # for all other actions, the error is 0 - distributed_q_st_plus_1 = self.main_network.target_network.predict(next_states) - # initialize with the current prediction so that we will - TD_targets = self.main_network.online_network.predict(current_states) - - # only update the action that we have actually done in this transition - target_actions = np.argmax(self.get_q_values(distributed_q_st_plus_1), axis=1) - m = np.zeros((self.tp.batch_size, self.z_values.size)) - - batches = np.arange(self.tp.batch_size) - for j in range(self.z_values.size): - tzj = np.fmax(np.fmin(rewards + (1.0 - game_overs) * self.tp.agent.discount * self.z_values[j], - self.z_values[self.z_values.size - 1]), - self.z_values[0]) - bj = (tzj - self.z_values[0])/(self.z_values[1] - self.z_values[0]) - u = (np.ceil(bj)).astype(int) - l = (np.floor(bj)).astype(int) - m[batches, l] = m[batches, l] + (distributed_q_st_plus_1[batches, target_actions, j] * (u - bj)) - m[batches, u] = m[batches, u] + (distributed_q_st_plus_1[batches, target_actions, j] * (bj - l)) - # total_loss = cross entropy between actual result above and predicted result for the given action - TD_targets[batches, actions] = m - - result = self.main_network.train_and_sync_networks(current_states, TD_targets) - total_loss = result[0] - - return total_loss - diff --git a/agents/clipped_ppo_agent.py b/agents/clipped_ppo_agent.py deleted file mode 100644 index ad066ae..0000000 --- a/agents/clipped_ppo_agent.py +++ /dev/null @@ -1,212 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 agents.actor_critic_agent import * -from random import shuffle - - -# Clipped Proximal Policy Optimization - https://arxiv.org/abs/1707.06347 -class ClippedPPOAgent(ActorCriticAgent): - def __init__(self, env, tuning_parameters, replicated_device=None, thread_id=0): - ActorCriticAgent.__init__(self, env, tuning_parameters, replicated_device, thread_id, - create_target_network=True) - # signals definition - self.value_loss = Signal('Value Loss') - self.signals.append(self.value_loss) - self.policy_loss = Signal('Policy Loss') - self.signals.append(self.policy_loss) - self.total_kl_divergence_during_training_process = 0.0 - self.unclipped_grads = Signal('Grads (unclipped)') - self.signals.append(self.unclipped_grads) - self.value_targets = Signal('Value Targets') - self.signals.append(self.value_targets) - self.kl_divergence = Signal('KL Divergence') - self.signals.append(self.kl_divergence) - - def fill_advantages(self, batch): - current_states, next_states, actions, rewards, game_overs, total_return = self.extract_batch(batch) - - current_state_values = self.main_network.online_network.predict(current_states)[0] - current_state_values = current_state_values.squeeze() - self.state_values.add_sample(current_state_values) - - # calculate advantages - advantages = [] - value_targets = [] - if self.policy_gradient_rescaler == PolicyGradientRescaler.A_VALUE: - advantages = total_return - current_state_values - elif self.policy_gradient_rescaler == PolicyGradientRescaler.GAE: - # get bootstraps - episode_start_idx = 0 - advantages = np.array([]) - value_targets = np.array([]) - for idx, game_over in enumerate(game_overs): - if game_over: - # get advantages for the rollout - value_bootstrapping = np.zeros((1,)) - rollout_state_values = np.append(current_state_values[episode_start_idx:idx+1], value_bootstrapping) - - rollout_advantages, gae_based_value_targets = \ - self.get_general_advantage_estimation_values(rewards[episode_start_idx:idx+1], - rollout_state_values) - episode_start_idx = idx + 1 - advantages = np.append(advantages, rollout_advantages) - value_targets = np.append(value_targets, gae_based_value_targets) - else: - screen.warning("WARNING: The requested policy gradient rescaler is not available") - - # standardize - advantages = (advantages - np.mean(advantages)) / (np.std(advantages) + 1e-8) - - for transition, advantage, value_target in zip(batch, advantages, value_targets): - transition.info['advantage'] = advantage - transition.info['gae_based_value_target'] = value_target - - self.action_advantages.add_sample(advantages) - - def train_network(self, dataset, epochs): - loss = [] - for j in range(epochs): - loss = { - 'total_loss': [], - 'policy_losses': [], - 'unclipped_grads': [], - 'fetch_result': [] - } - shuffle(dataset) - for i in range(int(len(dataset) / self.tp.batch_size)): - batch = dataset[i * self.tp.batch_size:(i + 1) * self.tp.batch_size] - current_states, _, actions, _, _, total_return = self.extract_batch(batch) - - advantages = np.array([t.info['advantage'] for t in batch]) - gae_based_value_targets = np.array([t.info['gae_based_value_target'] for t in batch]) - if not self.tp.env_instance.discrete_controls and len(actions.shape) == 1: - actions = np.expand_dims(actions, -1) - - # get old policy probabilities and distribution - result = self.main_network.target_network.predict(current_states) - old_policy_distribution = result[1:] - - # calculate gradients and apply on both the local policy network and on the global policy network - fetches = [self.main_network.online_network.output_heads[1].kl_divergence, - self.main_network.online_network.output_heads[1].entropy] - - total_return = np.expand_dims(total_return, -1) - value_targets = gae_based_value_targets if self.tp.agent.estimate_value_using_gae else total_return - inputs = copy.copy(current_states) - # TODO: why is this output 0 and not output 1? - inputs['output_0_0'] = actions - # TODO: does old_policy_distribution really need to be represented as a list? - # A: yes it does, in the event of discrete controls, it has just a mean - # otherwise, it has both a mean and standard deviation - for input_index, input in enumerate(old_policy_distribution): - inputs['output_0_{}'.format(input_index + 1)] = input - total_loss, policy_losses, unclipped_grads, fetch_result =\ - self.main_network.online_network.accumulate_gradients( - inputs, [total_return, advantages], additional_fetches=fetches) - - self.value_targets.add_sample(value_targets) - if self.tp.distributed: - self.main_network.apply_gradients_to_global_network() - self.main_network.update_online_network() - else: - self.main_network.apply_gradients_to_online_network() - - self.main_network.online_network.reset_accumulated_gradients() - - loss['total_loss'].append(total_loss) - loss['policy_losses'].append(policy_losses) - loss['unclipped_grads'].append(unclipped_grads) - loss['fetch_result'].append(fetch_result) - - self.unclipped_grads.add_sample(unclipped_grads) - - for key in loss.keys(): - loss[key] = np.mean(loss[key], 0) - - if self.tp.learning_rate_decay_rate != 0: - curr_learning_rate = self.main_network.online_network.get_variable_value(self.tp.learning_rate) - self.curr_learning_rate.add_sample(curr_learning_rate) - else: - curr_learning_rate = self.tp.learning_rate - - # log training parameters - screen.log_dict( - OrderedDict([ - ("Surrogate loss", loss['policy_losses'][0]), - ("KL divergence", loss['fetch_result'][0]), - ("Entropy", loss['fetch_result'][1]), - ("training epoch", j), - ("learning_rate", curr_learning_rate) - ]), - prefix="Policy training" - ) - - self.total_kl_divergence_during_training_process = loss['fetch_result'][0] - self.entropy.add_sample(loss['fetch_result'][1]) - self.kl_divergence.add_sample(loss['fetch_result'][0]) - return policy_losses - - def post_training_commands(self): - - # clean memory - self.memory.clean() - - def train(self): - self.main_network.sync() - - dataset = self.memory.transitions - - self.fill_advantages(dataset) - - # take only the requested number of steps - dataset = dataset[:self.tp.agent.num_consecutive_playing_steps] - - if self.tp.distributed and self.tp.agent.share_statistics_between_workers: - self.running_observation_stats.push(np.array([np.array(t.state['observation']) for t in dataset])) - - losses = self.train_network(dataset, 10) - self.value_loss.add_sample(losses[0]) - self.policy_loss.add_sample(losses[1]) - self.update_log() # should be done in order to update the data that has been accumulated * while not playing * - return np.append(losses[0], losses[1]) - - def choose_action(self, current_state, phase=RunPhase.TRAIN): - if self.env.discrete_controls: - # DISCRETE - _, action_values = self.main_network.online_network.predict(self.tf_input_state(current_state)) - action_values = action_values.squeeze() - - if phase == RunPhase.TRAIN: - action = self.exploration_policy.get_action(action_values) - else: - action = np.argmax(action_values) - action_info = {"action_probability": action_values[action]} - # self.entropy.add_sample(-np.sum(action_values * np.log(action_values))) - else: - # CONTINUOUS - _, action_values_mean, action_values_std = self.main_network.online_network.predict(self.tf_input_state(current_state)) - action_values_mean = action_values_mean.squeeze() - action_values_std = action_values_std.squeeze() - if phase == RunPhase.TRAIN: - action = np.squeeze(np.random.randn(1, self.action_space_size) * action_values_std + action_values_mean) - # if self.current_episode % 5 == 0 and self.current_episode_steps_counter < 5: - # print action - else: - action = action_values_mean - action_info = {"action_probability": action_values_mean} - - return action, action_info diff --git a/agents/ddpg_agent.py b/agents/ddpg_agent.py deleted file mode 100644 index 425f1de..0000000 --- a/agents/ddpg_agent.py +++ /dev/null @@ -1,109 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 agents.actor_critic_agent import * -from configurations import * - - -# Deep Deterministic Policy Gradients Network - https://arxiv.org/pdf/1509.02971.pdf -class DDPGAgent(ActorCriticAgent): - def __init__(self, env, tuning_parameters, replicated_device=None, thread_id=0): - ActorCriticAgent.__init__(self, env, tuning_parameters, replicated_device, thread_id, - create_target_network=True) - # define critic network - self.critic_network = self.main_network - # self.networks.append(self.critic_network) - - # define actor network - tuning_parameters.agent.input_types = {'observation': InputTypes.Observation} - tuning_parameters.agent.output_types = [OutputTypes.Pi] - self.actor_network = NetworkWrapper(tuning_parameters, True, self.has_global, 'actor', - self.replicated_device, self.worker_device) - self.networks.append(self.actor_network) - - self.q_values = Signal("Q") - self.signals.append(self.q_values) - - self.reset_game(do_not_reset_env=True) - - def learn_from_batch(self, batch): - current_states, next_states, actions, rewards, game_overs, _ = self.extract_batch(batch) - - # TD error = r + discount*max(q_st_plus_1) - q_st - next_actions = self.actor_network.target_network.predict(next_states) - inputs = copy.copy(next_states) - inputs['action'] = next_actions - q_st_plus_1 = self.critic_network.target_network.predict(inputs) - TD_targets = np.expand_dims(rewards, -1) + \ - (1.0 - np.expand_dims(game_overs, -1)) * self.tp.agent.discount * q_st_plus_1 - - # get the gradients of the critic output with respect to the action - actions_mean = self.actor_network.online_network.predict(current_states) - critic_online_network = self.critic_network.online_network - # TODO: convert into call to predict, current method ignores lstm middleware for example - action_gradients = self.critic_network.sess.run(critic_online_network.gradients_wrt_inputs['action'], - feed_dict=critic_online_network._feed_dict({ - **current_states, - 'action': actions_mean, - }))[0] - - # train the critic - if len(actions.shape) == 1: - actions = np.expand_dims(actions, -1) - result = self.critic_network.train_and_sync_networks({**current_states, 'action': actions}, TD_targets) - total_loss = result[0] - - # apply the gradients from the critic to the actor - actor_online_network = self.actor_network.online_network - gradients = self.actor_network.sess.run(actor_online_network.weighted_gradients, - feed_dict=actor_online_network._feed_dict({ - **current_states, - actor_online_network.gradients_weights_ph: -action_gradients, - })) - if self.actor_network.has_global: - self.actor_network.global_network.apply_gradients(gradients) - self.actor_network.update_online_network() - else: - self.actor_network.online_network.apply_gradients(gradients) - - return total_loss - - def train(self): - return Agent.train(self) - - def choose_action(self, curr_state, phase=RunPhase.TRAIN): - assert not self.env.discrete_controls, 'DDPG works only for continuous control problems' - result = self.actor_network.online_network.predict(self.tf_input_state(curr_state)) - action_values = result[0].squeeze() - - if phase == RunPhase.TRAIN: - action = self.exploration_policy.get_action(action_values) - else: - action = action_values - - action = np.clip(action, self.env.action_space_low, self.env.action_space_high) - - # get q value - action_batch = np.expand_dims(action, 0) - if type(action) != np.ndarray: - action_batch = np.array([[action]]) - inputs = self.tf_input_state(curr_state) - inputs['action'] = action_batch - q_value = self.critic_network.online_network.predict(inputs)[0] - self.q_values.add_sample(q_value) - action_info = {"action_value": q_value} - - return action, action_info diff --git a/agents/ddqn_agent.py b/agents/ddqn_agent.py deleted file mode 100644 index 838ae3f..0000000 --- a/agents/ddqn_agent.py +++ /dev/null @@ -1,42 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 agents.value_optimization_agent import * - - -# Double DQN - https://arxiv.org/abs/1509.06461 -class DDQNAgent(ValueOptimizationAgent): - def __init__(self, env, tuning_parameters, replicated_device=None, thread_id=0): - ValueOptimizationAgent.__init__(self, env, tuning_parameters, replicated_device, thread_id) - - def learn_from_batch(self, batch): - current_states, next_states, actions, rewards, game_overs, _ = self.extract_batch(batch) - - selected_actions = np.argmax(self.main_network.online_network.predict(next_states), 1) - q_st_plus_1 = self.main_network.target_network.predict(next_states) - TD_targets = self.main_network.online_network.predict(current_states) - - # initialize with the current prediction so that we will - # only update the action that we have actually done in this transition - for i in range(self.tp.batch_size): - TD_targets[i, actions[i]] = rewards[i] \ - + (1.0 - game_overs[i]) * self.tp.agent.discount * q_st_plus_1[i][ - selected_actions[i]] - - result = self.main_network.train_and_sync_networks(current_states, TD_targets) - total_loss = result[0] - - return total_loss diff --git a/agents/dfp_agent.py b/agents/dfp_agent.py deleted file mode 100644 index 8f98b94..0000000 --- a/agents/dfp_agent.py +++ /dev/null @@ -1,86 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 agents.agent import * - - -# Direct Future Prediction Agent - http://vladlen.info/papers/learning-to-act.pdf -class DFPAgent(Agent): - def __init__(self, env, tuning_parameters, replicated_device=None, thread_id=0): - Agent.__init__(self, env, tuning_parameters, replicated_device, thread_id) - self.current_goal = self.tp.agent.goal_vector - self.main_network = NetworkWrapper(tuning_parameters, False, self.has_global, 'main', - self.replicated_device, self.worker_device) - self.networks.append(self.main_network) - - def learn_from_batch(self, batch): - current_states, next_states, actions, rewards, game_overs, total_returns = self.extract_batch(batch) - - # create the inputs for the network - input = current_states - input['goal'] = np.repeat(np.expand_dims(self.current_goal, 0), self.tp.batch_size, 0) - - # get the current outputs of the network - targets = self.main_network.online_network.predict(input) - - # change the targets for the taken actions - for i in range(self.tp.batch_size): - targets[i, actions[i]] = batch[i].info['future_measurements'].flatten() - - result = self.main_network.train_and_sync_networks(input, targets) - total_loss = result[0] - - return total_loss - - def choose_action(self, curr_state, phase=RunPhase.TRAIN): - # convert to batch so we can run it through the network - observation = np.expand_dims(np.array(curr_state['observation']), 0) - measurements = np.expand_dims(np.array(curr_state['measurements']), 0) - goal = np.expand_dims(self.current_goal, 0) - - # predict the future measurements - measurements_future_prediction = self.main_network.online_network.predict({ - "observation": observation, - "measurements": measurements, - "goal": goal})[0] - action_values = np.zeros((self.action_space_size,)) - num_steps_used_for_objective = len(self.tp.agent.future_measurements_weights) - - # calculate the score of each action by multiplying it's future measurements with the goal vector - for action_idx in range(self.action_space_size): - action_measurements = measurements_future_prediction[action_idx] - action_measurements = np.reshape(action_measurements, - (self.tp.agent.num_predicted_steps_ahead, self.measurements_size[0])) - future_steps_values = np.dot(action_measurements, self.current_goal) - action_values[action_idx] = np.dot(future_steps_values[-num_steps_used_for_objective:], - self.tp.agent.future_measurements_weights) - - # choose action according to the exploration policy and the current phase (evaluating or training the agent) - if phase == RunPhase.TRAIN: - action = self.exploration_policy.get_action(action_values) - else: - action = np.argmax(action_values) - - action_values = action_values.squeeze() - - # store information for plotting interactively (actual plotting is done in agent) - if self.tp.visualization.plot_action_values_online: - for idx, action_name in enumerate(self.env.actions_description): - self.episode_running_info[action_name].append(action_values[idx]) - - action_info = {"action_probability": 0, "action_value": action_values[action]} - - return action, action_info diff --git a/agents/distributional_dqn_agent.py b/agents/distributional_dqn_agent.py deleted file mode 100644 index d7c0088..0000000 --- a/agents/distributional_dqn_agent.py +++ /dev/null @@ -1,60 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 agents.value_optimization_agent import * - - -# Distributional Deep Q Network - https://arxiv.org/pdf/1707.06887.pdf -class DistributionalDQNAgent(ValueOptimizationAgent): - def __init__(self, env, tuning_parameters, replicated_device=None, thread_id=0): - ValueOptimizationAgent.__init__(self, env, tuning_parameters, replicated_device, thread_id) - self.z_values = np.linspace(self.tp.agent.v_min, self.tp.agent.v_max, self.tp.agent.atoms) - - # prediction's format is (batch,actions,atoms) - def get_q_values(self, prediction): - return np.dot(prediction, self.z_values) - - def learn_from_batch(self, batch): - current_states, next_states, actions, rewards, game_overs, _ = self.extract_batch(batch) - - # for the action we actually took, the error is calculated by the atoms distribution - # for all other actions, the error is 0 - distributed_q_st_plus_1 = self.main_network.target_network.predict(next_states) - # initialize with the current prediction so that we will - TD_targets = self.main_network.online_network.predict(current_states) - - # only update the action that we have actually done in this transition - target_actions = np.argmax(self.get_q_values(distributed_q_st_plus_1), axis=1) - m = np.zeros((self.tp.batch_size, self.z_values.size)) - - batches = np.arange(self.tp.batch_size) - for j in range(self.z_values.size): - tzj = np.fmax(np.fmin(rewards + (1.0 - game_overs) * self.tp.agent.discount * self.z_values[j], - self.z_values[self.z_values.size - 1]), - self.z_values[0]) - bj = (tzj - self.z_values[0])/(self.z_values[1] - self.z_values[0]) - u = (np.ceil(bj)).astype(int) - l = (np.floor(bj)).astype(int) - m[batches, l] = m[batches, l] + (distributed_q_st_plus_1[batches, target_actions, j] * (u - bj)) - m[batches, u] = m[batches, u] + (distributed_q_st_plus_1[batches, target_actions, j] * (bj - l)) - # total_loss = cross entropy between actual result above and predicted result for the given action - TD_targets[batches, actions] = m - - result = self.main_network.train_and_sync_networks(current_states, TD_targets) - total_loss = result[0] - - return total_loss - diff --git a/agents/dqn_agent.py b/agents/dqn_agent.py deleted file mode 100644 index 70c0c7d..0000000 --- a/agents/dqn_agent.py +++ /dev/null @@ -1,43 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 agents.value_optimization_agent import * - - -# Deep Q Network - https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf -class DQNAgent(ValueOptimizationAgent): - def __init__(self, env, tuning_parameters, replicated_device=None, thread_id=0): - ValueOptimizationAgent.__init__(self, env, tuning_parameters, replicated_device, thread_id) - - def learn_from_batch(self, batch): - current_states, next_states, actions, rewards, game_overs, _ = self.extract_batch(batch) - - # for the action we actually took, the error is: - # TD error = r + discount*max(q_st_plus_1) - q_st - # for all other actions, the error is 0 - q_st_plus_1 = self.main_network.target_network.predict(next_states) - # initialize with the current prediction so that we will - TD_targets = self.main_network.online_network.predict(current_states) - - # only update the action that we have actually done in this transition - for i in range(self.tp.batch_size): - TD_targets[i, actions[i]] = rewards[i] + (1.0 - game_overs[i]) * self.tp.agent.discount * np.max( - q_st_plus_1[i], 0) - - result = self.main_network.train_and_sync_networks(current_states, TD_targets) - total_loss = result[0] - - return total_loss diff --git a/agents/human_agent.py b/agents/human_agent.py deleted file mode 100644 index c75c2a2..0000000 --- a/agents/human_agent.py +++ /dev/null @@ -1,67 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 agents.agent import * -import pygame - - -class HumanAgent(Agent): - def __init__(self, env, tuning_parameters, replicated_device=None, thread_id=0): - Agent.__init__(self, env, tuning_parameters, replicated_device, thread_id) - - self.clock = pygame.time.Clock() - self.max_fps = int(self.tp.visualization.max_fps_for_human_control) - - screen.log_title("Human Control Mode") - available_keys = self.env.get_available_keys() - if available_keys: - screen.log("Use keyboard keys to move. Press escape to quit. Available keys:") - screen.log("") - for action, key in self.env.get_available_keys(): - screen.log("\t- {}: {}".format(action, key)) - screen.separator() - - def train(self): - return 0 - - def choose_action(self, curr_state, phase=RunPhase.TRAIN): - action = self.env.get_action_from_user() - - # keep constant fps - self.clock.tick(self.max_fps) - - if not self.env.renderer.is_open: - self.save_replay_buffer_and_exit() - - return action, {"action_value": 0} - - def save_replay_buffer_and_exit(self): - replay_buffer_path = os.path.join(logger.experiments_path, 'replay_buffer.p') - self.memory.tp = None - to_pickle(self.memory, replay_buffer_path) - screen.log_title("Replay buffer was stored in {}".format(replay_buffer_path)) - exit() - - def log_to_screen(self, phase): - # log to screen - screen.log_dict( - OrderedDict([ - ("Episode", self.current_episode), - ("total reward", self.total_reward_in_current_episode), - ("steps", self.total_steps_counter) - ]), - prefix="Recording" - ) diff --git a/agents/imitation_agent.py b/agents/imitation_agent.py deleted file mode 100644 index f893fbe..0000000 --- a/agents/imitation_agent.py +++ /dev/null @@ -1,65 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 agents.agent import * - - -# Imitation Agent -class ImitationAgent(Agent): - def __init__(self, env, tuning_parameters, replicated_device=None, thread_id=0): - Agent.__init__(self, env, tuning_parameters, replicated_device, thread_id) - self.main_network = NetworkWrapper(tuning_parameters, False, self.has_global, 'main', - self.replicated_device, self.worker_device) - self.networks.append(self.main_network) - self.imitation = True - - def extract_action_values(self, prediction): - return prediction.squeeze() - - def choose_action(self, curr_state, phase=RunPhase.TRAIN): - # convert to batch so we can run it through the network - prediction = self.main_network.online_network.predict(self.tf_input_state(curr_state)) - - # get action values and extract the best action from it - action_values = self.extract_action_values(prediction) - if self.env.discrete_controls: - # DISCRETE - # action = np.argmax(action_values) - action = self.evaluation_exploration_policy.get_action(action_values) - action_value = {"action_probability": action_values[action]} - else: - # CONTINUOUS - action = action_values - action_value = {} - - return action, action_value - - def log_to_screen(self, phase): - # log to screen - if phase == RunPhase.TRAIN: - # for the training phase - we log during the episode to visualize the progress in training - screen.log_dict( - OrderedDict([ - ("Worker", self.task_id), - ("Episode", self.current_episode), - ("Loss", self.loss.values[-1]), - ("Training iteration", self.training_iteration) - ]), - prefix="Training" - ) - else: - # for the evaluation phase - logging as in regular RL - Agent.log_to_screen(self, phase) diff --git a/agents/mmc_agent.py b/agents/mmc_agent.py deleted file mode 100644 index 2b5a2cb..0000000 --- a/agents/mmc_agent.py +++ /dev/null @@ -1,42 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 agents.value_optimization_agent import * - - -class MixedMonteCarloAgent(ValueOptimizationAgent): - def __init__(self, env, tuning_parameters, replicated_device=None, thread_id=0): - ValueOptimizationAgent.__init__(self, env, tuning_parameters, replicated_device, thread_id) - self.mixing_rate = tuning_parameters.agent.monte_carlo_mixing_rate - - def learn_from_batch(self, batch): - current_states, next_states, actions, rewards, game_overs, total_return = self.extract_batch(batch) - - TD_targets = self.main_network.online_network.predict(current_states) - selected_actions = np.argmax(self.main_network.online_network.predict(next_states), 1) - q_st_plus_1 = self.main_network.target_network.predict(next_states) - # initialize with the current prediction so that we will - # only update the action that we have actually done in this transition - for i in range(self.tp.batch_size): - one_step_target = rewards[i] + (1.0 - game_overs[i]) * self.tp.agent.discount * q_st_plus_1[i][ - selected_actions[i]] - monte_carlo_target = total_return[i] - TD_targets[i, actions[i]] = (1 - self.mixing_rate) * one_step_target + self.mixing_rate * monte_carlo_target - - result = self.main_network.train_and_sync_networks(current_states, TD_targets) - total_loss = result[0] - - return total_loss diff --git a/agents/n_step_q_agent.py b/agents/n_step_q_agent.py deleted file mode 100644 index 5a74fb5..0000000 --- a/agents/n_step_q_agent.py +++ /dev/null @@ -1,88 +0,0 @@ -# -# Copyright (c) 2017 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -import numpy as np -import scipy.signal - -from agents.value_optimization_agent import ValueOptimizationAgent -from agents.policy_optimization_agent import PolicyOptimizationAgent -from logger import logger -from utils import Signal, last_sample - - -# N Step Q Learning Agent - https://arxiv.org/abs/1602.01783 -class NStepQAgent(ValueOptimizationAgent, PolicyOptimizationAgent): - def __init__(self, env, tuning_parameters, replicated_device=None, thread_id=0): - ValueOptimizationAgent.__init__(self, env, tuning_parameters, replicated_device, thread_id, create_target_network=True) - self.last_gradient_update_step_idx = 0 - self.q_values = Signal('Q Values') - self.unclipped_grads = Signal('Grads (unclipped)') - self.value_loss = Signal('Value Loss') - self.signals.append(self.q_values) - self.signals.append(self.unclipped_grads) - self.signals.append(self.value_loss) - - def learn_from_batch(self, batch): - # batch contains a list of episodes to learn from - current_states, next_states, actions, rewards, game_overs, _ = self.extract_batch(batch) - - # get the values for the current states - state_value_head_targets = self.main_network.online_network.predict(current_states) - - # the targets for the state value estimator - num_transitions = len(game_overs) - - if self.tp.agent.targets_horizon == '1-Step': - # 1-Step Q learning - q_st_plus_1 = self.main_network.target_network.predict(next_states) - - for i in reversed(range(num_transitions)): - state_value_head_targets[i][actions[i]] = \ - rewards[i] + (1.0 - game_overs[i]) * self.tp.agent.discount * np.max(q_st_plus_1[i], 0) - - elif self.tp.agent.targets_horizon == 'N-Step': - # N-Step Q learning - if game_overs[-1]: - R = 0 - else: - R = np.max(self.main_network.target_network.predict(last_sample(next_states))) - - for i in reversed(range(num_transitions)): - R = rewards[i] + self.tp.agent.discount * R - state_value_head_targets[i][actions[i]] = R - - else: - assert True, 'The available values for targets_horizon are: 1-Step, N-Step' - - # train - result = self.main_network.online_network.accumulate_gradients(current_states, [state_value_head_targets]) - - # logging - total_loss, losses, unclipped_grads = result[:3] - self.unclipped_grads.add_sample(unclipped_grads) - self.value_loss.add_sample(losses[0]) - - return total_loss - - def train(self): - # update the target network of every network that has a target network - if self.total_steps_counter % self.tp.agent.num_steps_between_copying_online_weights_to_target == 0: - for network in self.networks: - network.update_target_network(self.tp.agent.rate_for_copying_weights_to_target) - logger.create_signal_value('Update Target Network', 1) - else: - logger.create_signal_value('Update Target Network', 0, overwrite=False) - - return PolicyOptimizationAgent.train(self) diff --git a/agents/naf_agent.py b/agents/naf_agent.py deleted file mode 100644 index 65ca83c..0000000 --- a/agents/naf_agent.py +++ /dev/null @@ -1,81 +0,0 @@ -# -# Copyright (c) 2017 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -import numpy as np - -from agents.value_optimization_agent import ValueOptimizationAgent -from utils import RunPhase, Signal - - -# Normalized Advantage Functions - https://arxiv.org/pdf/1603.00748.pdf -class NAFAgent(ValueOptimizationAgent): - def __init__(self, env, tuning_parameters, replicated_device=None, thread_id=0): - ValueOptimizationAgent.__init__(self, env, tuning_parameters, replicated_device, thread_id) - self.l_values = Signal("L") - self.a_values = Signal("Advantage") - self.mu_values = Signal("Action") - self.v_values = Signal("V") - self.signals += [self.l_values, self.a_values, self.mu_values, self.v_values] - - def learn_from_batch(self, batch): - current_states, next_states, actions, rewards, game_overs, _ = self.extract_batch(batch) - - # TD error = r + discount*v_st_plus_1 - q_st - v_st_plus_1 = self.main_network.target_network.predict( - next_states, - self.main_network.target_network.output_heads[0].V, - squeeze_output=False, - ) - TD_targets = np.expand_dims(rewards, -1) + (1.0 - np.expand_dims(game_overs, -1)) * self.tp.agent.discount * v_st_plus_1 - - if len(actions.shape) == 1: - actions = np.expand_dims(actions, -1) - - result = self.main_network.train_and_sync_networks({**current_states, 'output_0_0': actions}, TD_targets) - total_loss = result[0] - - return total_loss - - def choose_action(self, curr_state, phase=RunPhase.TRAIN): - assert not self.env.discrete_controls, 'NAF works only for continuous control problems' - - # convert to batch so we can run it through the network - # observation = np.expand_dims(np.array(curr_state['observation']), 0) - naf_head = self.main_network.online_network.output_heads[0] - action_values = self.main_network.online_network.predict( - self.tf_input_state(curr_state), - outputs=naf_head.mu, - squeeze_output=False, - ) - if phase == RunPhase.TRAIN: - action = self.exploration_policy.get_action(action_values) - else: - action = action_values - - Q, L, A, mu, V = self.main_network.online_network.predict( - {**self.tf_input_state(curr_state), 'output_0_0': action_values}, - outputs=[naf_head.Q, naf_head.L, naf_head.A, naf_head.mu, naf_head.V], - ) - - # store the q values statistics for logging - self.q_values.add_sample(Q) - self.l_values.add_sample(L) - self.a_values.add_sample(A) - self.mu_values.add_sample(mu) - self.v_values.add_sample(V) - - action_value = {"action_value": Q} - return action, action_value diff --git a/agents/nec_agent.py b/agents/nec_agent.py deleted file mode 100644 index a327db4..0000000 --- a/agents/nec_agent.py +++ /dev/null @@ -1,96 +0,0 @@ -# -# Copyright (c) 2017 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -import numpy as np -import os, pickle -from agents.value_optimization_agent import ValueOptimizationAgent -from logger import screen -from utils import RunPhase - - -# Neural Episodic Control - https://arxiv.org/pdf/1703.01988.pdf -class NECAgent(ValueOptimizationAgent): - def __init__(self, env, tuning_parameters, replicated_device=None, thread_id=0): - ValueOptimizationAgent.__init__(self, env, tuning_parameters, replicated_device, thread_id, - create_target_network=False) - self.current_episode_state_embeddings = [] - self.training_started = False - - def learn_from_batch(self, batch): - if not self.main_network.online_network.output_heads[0].DND.has_enough_entries(self.tp.agent.number_of_knn): - return 0 - else: - if not self.training_started: - self.training_started = True - screen.log_title("Finished collecting initial entries in DND. Starting to train network...") - - current_states, next_states, actions, rewards, game_overs, total_return = self.extract_batch(batch) - - TD_targets = self.main_network.online_network.predict(current_states) - - # only update the action that we have actually done in this transition - for i in range(self.tp.batch_size): - TD_targets[i, actions[i]] = total_return[i] - - # train the neural network - result = self.main_network.train_and_sync_networks(current_states, TD_targets) - - total_loss = result[0] - - return total_loss - - def act(self, phase=RunPhase.TRAIN): - if self.in_heatup: - # get embedding in heatup (otherwise we get it through choose_action) - embedding = self.main_network.online_network.predict( - self.tf_input_state(self.curr_state), - outputs=self.main_network.online_network.state_embedding) - self.current_episode_state_embeddings.append(embedding) - - return super().act(phase) - - def get_prediction(self, curr_state): - # get the actions q values and the state embedding - embedding, actions_q_values = self.main_network.online_network.predict( - self.tf_input_state(curr_state), - outputs=[self.main_network.online_network.state_embedding, - self.main_network.online_network.output_heads[0].output] - ) - - # store the state embedding for inserting it to the DND later - self.current_episode_state_embeddings.append(embedding.squeeze()) - actions_q_values = actions_q_values[0][0] - return actions_q_values - - def reset_game(self, do_not_reset_env=False): - super().reset_game(do_not_reset_env) - - # get the last full episode that we have collected - episode = self.memory.get_last_complete_episode() - if episode is not None: - # the indexing is only necessary because the heatup can end in the middle of an episode - # this won't be required after fixing this so that when the heatup is ended, the episode is closed - returns = episode.get_transitions_attribute('total_return')[:len(self.current_episode_state_embeddings)] - actions = episode.get_transitions_attribute('action')[:len(self.current_episode_state_embeddings)] - self.main_network.online_network.output_heads[0].DND.add(self.current_episode_state_embeddings, - actions, returns) - - self.current_episode_state_embeddings = [] - - def save_model(self, model_id): - self.main_network.save_model(model_id) - with open(os.path.join(self.tp.save_model_dir, str(model_id) + '.dnd'), 'wb') as f: - pickle.dump(self.main_network.online_network.output_heads[0].DND, f, pickle.HIGHEST_PROTOCOL) diff --git a/agents/pal_agent.py b/agents/pal_agent.py deleted file mode 100644 index 68ff675..0000000 --- a/agents/pal_agent.py +++ /dev/null @@ -1,65 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 agents.value_optimization_agent import * - - -# Persistent Advantage Learning - https://arxiv.org/pdf/1512.04860.pdf -class PALAgent(ValueOptimizationAgent): - def __init__(self, env, tuning_parameters, replicated_device=None, thread_id=0): - ValueOptimizationAgent.__init__(self, env, tuning_parameters, replicated_device, thread_id) - self.alpha = tuning_parameters.agent.pal_alpha - self.persistent = tuning_parameters.agent.persistent_advantage_learning - self.monte_carlo_mixing_rate = tuning_parameters.agent.monte_carlo_mixing_rate - - def learn_from_batch(self, batch): - current_states, next_states, actions, rewards, game_overs, total_return = self.extract_batch(batch) - - selected_actions = np.argmax(self.main_network.online_network.predict(next_states), 1) - - # next state values - q_st_plus_1_target = self.main_network.target_network.predict(next_states) - v_st_plus_1_target = np.max(q_st_plus_1_target, 1) - - # current state values according to online network - q_st_online = self.main_network.online_network.predict(current_states) - - # current state values according to target network - q_st_target = self.main_network.target_network.predict(current_states) - v_st_target = np.max(q_st_target, 1) - - # calculate TD error - TD_targets = np.copy(q_st_online) - for i in range(self.tp.batch_size): - TD_targets[i, actions[i]] = rewards[i] + (1.0 - game_overs[i]) * self.tp.agent.discount * \ - q_st_plus_1_target[i][selected_actions[i]] - advantage_learning_update = v_st_target[i] - q_st_target[i, actions[i]] - next_advantage_learning_update = v_st_plus_1_target[i] - q_st_plus_1_target[i, selected_actions[i]] - # Persistent Advantage Learning or Regular Advantage Learning - if self.persistent: - TD_targets[i, actions[i]] -= self.alpha * min(advantage_learning_update, next_advantage_learning_update) - else: - TD_targets[i, actions[i]] -= self.alpha * advantage_learning_update - - # mixing monte carlo updates - monte_carlo_target = total_return[i] - TD_targets[i, actions[i]] = (1 - self.monte_carlo_mixing_rate) * TD_targets[i, actions[i]] \ - + self.monte_carlo_mixing_rate * monte_carlo_target - - result = self.main_network.train_and_sync_networks(current_states, TD_targets) - total_loss = result[0] - - return total_loss diff --git a/agents/policy_gradients_agent.py b/agents/policy_gradients_agent.py deleted file mode 100644 index 3a592d1..0000000 --- a/agents/policy_gradients_agent.py +++ /dev/null @@ -1,93 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 agents.policy_optimization_agent import * -import numpy as np -from logger import * -import tensorflow as tf -try: - import matplotlib.pyplot as plt -except: - from logger import failed_imports - failed_imports.append("matplotlib") - -from utils import * - - -class PolicyGradientsAgent(PolicyOptimizationAgent): - def __init__(self, env, tuning_parameters, replicated_device=None, thread_id=0): - PolicyOptimizationAgent.__init__(self, env, tuning_parameters, replicated_device, thread_id) - self.returns_mean = Signal('Returns Mean') - self.returns_variance = Signal('Returns Variance') - self.signals.append(self.returns_mean) - self.signals.append(self.returns_variance) - self.last_gradient_update_step_idx = 0 - - def learn_from_batch(self, batch): - # batch contains a list of episodes to learn from - current_states, next_states, actions, rewards, game_overs, total_returns = self.extract_batch(batch) - - for i in reversed(range(len(total_returns))): - if self.policy_gradient_rescaler == PolicyGradientRescaler.TOTAL_RETURN: - total_returns[i] = total_returns[0] - elif self.policy_gradient_rescaler == PolicyGradientRescaler.FUTURE_RETURN: - # just take the total return as it is - pass - elif self.policy_gradient_rescaler == PolicyGradientRescaler.FUTURE_RETURN_NORMALIZED_BY_EPISODE: - # we can get a single transition episode while playing Doom Basic, causing the std to be 0 - if self.std_discounted_return != 0: - total_returns[i] = (total_returns[i] - self.mean_discounted_return) / self.std_discounted_return - else: - total_returns[i] = 0 - elif self.policy_gradient_rescaler == PolicyGradientRescaler.FUTURE_RETURN_NORMALIZED_BY_TIMESTEP: - total_returns[i] -= self.mean_return_over_multiple_episodes[i] - else: - screen.warning("WARNING: The requested policy gradient rescaler is not available") - - targets = total_returns - if not self.env.discrete_controls and len(actions.shape) < 2: - actions = np.expand_dims(actions, -1) - - self.returns_mean.add_sample(np.mean(total_returns)) - self.returns_variance.add_sample(np.std(total_returns)) - - result = self.main_network.online_network.accumulate_gradients({**current_states, 'output_0_0': actions}, targets) - total_loss = result[0] - - return total_loss - - def choose_action(self, curr_state, phase=RunPhase.TRAIN): - # convert to batch so we can run it through the network - if self.env.discrete_controls: - # DISCRETE - action_values = self.main_network.online_network.predict(self.tf_input_state(curr_state)).squeeze() - if phase == RunPhase.TRAIN: - action = self.exploration_policy.get_action(action_values) - else: - action = np.argmax(action_values) - action_value = {"action_probability": action_values[action]} - self.entropy.add_sample(-np.sum(action_values * np.log(action_values + eps))) - else: - # CONTINUOUS - result = self.main_network.online_network.predict(self.tf_input_state(curr_state)) - action_values = result[0].squeeze() - if phase == RunPhase.TRAIN: - action = self.exploration_policy.get_action(action_values) - else: - action = action_values - action_value = {} - - return action, action_value diff --git a/agents/policy_optimization_agent.py b/agents/policy_optimization_agent.py deleted file mode 100644 index be23760..0000000 --- a/agents/policy_optimization_agent.py +++ /dev/null @@ -1,123 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 agents.agent import * -from memories.memory import Episode - - -class PolicyGradientRescaler(Enum): - TOTAL_RETURN = 0 - FUTURE_RETURN = 1 - FUTURE_RETURN_NORMALIZED_BY_EPISODE = 2 - FUTURE_RETURN_NORMALIZED_BY_TIMESTEP = 3 # baselined - Q_VALUE = 4 - A_VALUE = 5 - TD_RESIDUAL = 6 - DISCOUNTED_TD_RESIDUAL = 7 - GAE = 8 - - -class PolicyOptimizationAgent(Agent): - def __init__(self, env, tuning_parameters, replicated_device=None, thread_id=0, create_target_network=False): - Agent.__init__(self, env, tuning_parameters, replicated_device, thread_id) - self.main_network = NetworkWrapper(tuning_parameters, create_target_network, self.has_global, 'main', - self.replicated_device, self.worker_device) - self.networks.append(self.main_network) - - self.policy_gradient_rescaler = PolicyGradientRescaler().get(self.tp.agent.policy_gradient_rescaler) - - # statistics for variance reduction - self.last_gradient_update_step_idx = 0 - self.max_episode_length = 100000 - self.mean_return_over_multiple_episodes = np.zeros(self.max_episode_length) - self.num_episodes_where_step_has_been_seen = np.zeros(self.max_episode_length) - self.entropy = Signal('Entropy') - self.signals.append(self.entropy) - - self.reset_game(do_not_reset_env=True) - - def log_to_screen(self, phase): - # log to screen - if self.current_episode > 0: - screen.log_dict( - OrderedDict([ - ("Worker", self.task_id), - ("Episode", self.current_episode), - ("total reward", self.total_reward_in_current_episode), - ("steps", self.total_steps_counter), - ("training iteration", self.training_iteration) - ]), - prefix=phase - ) - - def update_episode_statistics(self, episode): - episode_discounted_returns = [] - for i in range(episode.length()): - transition = episode.get_transition(i) - episode_discounted_returns.append(transition.total_return) - self.num_episodes_where_step_has_been_seen[i] += 1 - self.mean_return_over_multiple_episodes[i] -= self.mean_return_over_multiple_episodes[i] / \ - self.num_episodes_where_step_has_been_seen[i] - self.mean_return_over_multiple_episodes[i] += transition.total_return / \ - self.num_episodes_where_step_has_been_seen[i] - self.mean_discounted_return = np.mean(episode_discounted_returns) - self.std_discounted_return = np.std(episode_discounted_returns) - - def train(self): - if self.memory.length() == 0: - return 0 - - episode = self.memory.get_episode(0) - - # check if we should calculate gradients or skip - episode_ended = self.memory.num_complete_episodes() >= 1 - num_steps_passed_since_last_update = episode.length() - self.last_gradient_update_step_idx - is_t_max_steps_passed = num_steps_passed_since_last_update >= self.tp.agent.num_steps_between_gradient_updates - if not (is_t_max_steps_passed or episode_ended): - return 0 - - total_loss = 0 - if num_steps_passed_since_last_update > 0: - - # we need to update the returns of the episode until now - episode.update_returns(self.tp.agent.discount) - - # get t_max transitions or less if the we got to a terminal state - # will be used for both actor-critic and vanilla PG. - # # In order to get full episodes, Vanilla PG will set the end_idx to a very big value. - transitions = [] - start_idx = self.last_gradient_update_step_idx - end_idx = episode.length() - - for idx in range(start_idx, end_idx): - transitions.append(episode.get_transition(idx)) - self.last_gradient_update_step_idx = end_idx - - # update the statistics for the variance reduction techniques - if self.tp.agent.type == 'PolicyGradientsAgent': - self.update_episode_statistics(episode) - - # accumulate the gradients and apply them once in every apply_gradients_every_x_episodes episodes - total_loss = self.learn_from_batch(transitions) - if self.current_episode % self.tp.agent.apply_gradients_every_x_episodes == 0: - self.main_network.apply_gradients_and_sync_networks() - - # move the pointer to the next episode start and discard the episode. we use it only once - if episode_ended: - self.memory.remove_episode(0) - self.last_gradient_update_step_idx = 0 - - return total_loss diff --git a/agents/ppo_agent.py b/agents/ppo_agent.py deleted file mode 100644 index 4a37e69..0000000 --- a/agents/ppo_agent.py +++ /dev/null @@ -1,289 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 agents.actor_critic_agent import * -from random import shuffle - - -# Proximal Policy Optimization - https://arxiv.org/pdf/1707.06347.pdf -class PPOAgent(ActorCriticAgent): - def __init__(self, env, tuning_parameters, replicated_device=None, thread_id=0): - ActorCriticAgent.__init__(self, env, tuning_parameters, replicated_device, thread_id, - create_target_network=True) - self.critic_network = self.main_network - - # define the policy network - tuning_parameters.agent.input_types = {'observation': InputTypes.Observation} - tuning_parameters.agent.output_types = [OutputTypes.PPO] - tuning_parameters.agent.optimizer_type = 'Adam' - tuning_parameters.agent.l2_regularization = 0 - self.policy_network = NetworkWrapper(tuning_parameters, True, self.has_global, 'policy', - self.replicated_device, self.worker_device) - self.networks.append(self.policy_network) - - # signals definition - self.value_loss = Signal('Value Loss') - self.signals.append(self.value_loss) - self.policy_loss = Signal('Policy Loss') - self.signals.append(self.policy_loss) - self.kl_divergence = Signal('KL Divergence') - self.signals.append(self.kl_divergence) - self.total_kl_divergence_during_training_process = 0.0 - self.unclipped_grads = Signal('Grads (unclipped)') - self.signals.append(self.unclipped_grads) - - self.reset_game(do_not_reset_env=True) - - def fill_advantages(self, batch): - current_states, next_states, actions, rewards, game_overs, total_return = self.extract_batch(batch) - - # * Found not to have any impact * - # current_states_with_timestep = self.concat_state_and_timestep(batch) - - current_state_values = self.critic_network.online_network.predict(current_states).squeeze() - - # calculate advantages - advantages = [] - if self.policy_gradient_rescaler == PolicyGradientRescaler.A_VALUE: - advantages = total_return - current_state_values - elif self.policy_gradient_rescaler == PolicyGradientRescaler.GAE: - # get bootstraps - episode_start_idx = 0 - advantages = np.array([]) - # current_state_values[game_overs] = 0 - for idx, game_over in enumerate(game_overs): - if game_over: - # get advantages for the rollout - value_bootstrapping = np.zeros((1,)) - rollout_state_values = np.append(current_state_values[episode_start_idx:idx+1], value_bootstrapping) - - rollout_advantages, _ = \ - self.get_general_advantage_estimation_values(rewards[episode_start_idx:idx+1], - rollout_state_values) - episode_start_idx = idx + 1 - advantages = np.append(advantages, rollout_advantages) - else: - screen.warning("WARNING: The requested policy gradient rescaler is not available") - - # standardize - advantages = (advantages - np.mean(advantages)) / np.std(advantages) - - for transition, advantage in zip(self.memory.transitions, advantages): - transition.info['advantage'] = advantage - - self.action_advantages.add_sample(advantages) - - def train_value_network(self, dataset, epochs): - loss = [] - current_states, _, _, _, _, total_return = self.extract_batch(dataset) - - # * Found not to have any impact * - # add a timestep to the observation - # current_states_with_timestep = self.concat_state_and_timestep(dataset) - - total_return = np.expand_dims(total_return, -1) - mix_fraction = self.tp.agent.value_targets_mix_fraction - for j in range(epochs): - batch_size = len(dataset) - if self.critic_network.online_network.optimizer_type != 'LBFGS': - batch_size = self.tp.batch_size - for i in range(len(dataset) // batch_size): - # split to batches for first order optimization techniques - current_states_batch = { - k: v[i * batch_size:(i + 1) * batch_size] - for k, v in current_states.items() - } - total_return_batch = total_return[i * batch_size:(i + 1) * batch_size] - old_policy_values = force_list(self.critic_network.target_network.predict( - current_states_batch).squeeze()) - if self.critic_network.online_network.optimizer_type != 'LBFGS': - targets = total_return_batch - else: - current_values = self.critic_network.online_network.predict(current_states_batch) - targets = current_values * (1 - mix_fraction) + total_return_batch * mix_fraction - - inputs = copy.copy(current_states_batch) - for input_index, input in enumerate(old_policy_values): - name = 'output_0_{}'.format(input_index) - if name in self.critic_network.online_network.inputs: - inputs[name] = input - - value_loss = self.critic_network.online_network.accumulate_gradients(inputs, targets) - self.critic_network.apply_gradients_to_online_network() - if self.tp.distributed: - self.critic_network.apply_gradients_to_global_network() - self.critic_network.online_network.reset_accumulated_gradients() - - loss.append([value_loss[0]]) - loss = np.mean(loss, 0) - return loss - - def concat_state_and_timestep(self, dataset): - current_states_with_timestep = [np.append(transition.state['observation'], transition.info['timestep']) - for transition in dataset] - current_states_with_timestep = np.expand_dims(current_states_with_timestep, -1) - return current_states_with_timestep - - def train_policy_network(self, dataset, epochs): - loss = [] - for j in range(epochs): - loss = { - 'total_loss': [], - 'policy_losses': [], - 'unclipped_grads': [], - 'fetch_result': [] - } - #shuffle(dataset) - for i in range(len(dataset) // self.tp.batch_size): - batch = dataset[i * self.tp.batch_size:(i + 1) * self.tp.batch_size] - current_states, _, actions, _, _, total_return = self.extract_batch(batch) - advantages = np.array([t.info['advantage'] for t in batch]) - if not self.tp.env_instance.discrete_controls and len(actions.shape) == 1: - actions = np.expand_dims(actions, -1) - - # get old policy probabilities and distribution - old_policy = force_list(self.policy_network.target_network.predict(current_states)) - - # calculate gradients and apply on both the local policy network and on the global policy network - fetches = [self.policy_network.online_network.output_heads[0].kl_divergence, - self.policy_network.online_network.output_heads[0].entropy] - - inputs = copy.copy(current_states) - # TODO: why is this output 0 and not output 1? - inputs['output_0_0'] = actions - # TODO: does old_policy_distribution really need to be represented as a list? - # A: yes it does, in the event of discrete controls, it has just a mean - # otherwise, it has both a mean and standard deviation - for input_index, input in enumerate(old_policy): - inputs['output_0_{}'.format(input_index + 1)] = input - total_loss, policy_losses, unclipped_grads, fetch_result =\ - self.policy_network.online_network.accumulate_gradients( - inputs, [advantages], additional_fetches=fetches) - - self.policy_network.apply_gradients_to_online_network() - if self.tp.distributed: - self.policy_network.apply_gradients_to_global_network() - - self.policy_network.online_network.reset_accumulated_gradients() - - loss['total_loss'].append(total_loss) - loss['policy_losses'].append(policy_losses) - loss['unclipped_grads'].append(unclipped_grads) - loss['fetch_result'].append(fetch_result) - - self.unclipped_grads.add_sample(unclipped_grads) - - for key in loss.keys(): - loss[key] = np.mean(loss[key], 0) - - if self.tp.learning_rate_decay_rate != 0: - curr_learning_rate = self.main_network.online_network.get_variable_value(self.tp.learning_rate) - self.curr_learning_rate.add_sample(curr_learning_rate) - else: - curr_learning_rate = self.tp.learning_rate - - # log training parameters - screen.log_dict( - OrderedDict([ - ("Surrogate loss", loss['policy_losses'][0]), - ("KL divergence", loss['fetch_result'][0]), - ("Entropy", loss['fetch_result'][1]), - ("training epoch", j), - ("learning_rate", curr_learning_rate) - ]), - prefix="Policy training" - ) - - self.total_kl_divergence_during_training_process = loss['fetch_result'][0] - self.entropy.add_sample(loss['fetch_result'][1]) - self.kl_divergence.add_sample(loss['fetch_result'][0]) - return loss['total_loss'] - - def update_kl_coefficient(self): - # John Schulman takes the mean kl divergence only over the last epoch which is strange but we will follow - # his implementation for now because we know it works well - screen.log_title("KL = {}".format(self.total_kl_divergence_during_training_process)) - - # update kl coefficient - kl_target = self.tp.agent.target_kl_divergence - kl_coefficient = self.policy_network.online_network.get_variable_value( - self.policy_network.online_network.output_heads[0].kl_coefficient) - new_kl_coefficient = kl_coefficient - if self.total_kl_divergence_during_training_process > 1.3 * kl_target: - # kl too high => increase regularization - new_kl_coefficient *= 1.5 - elif self.total_kl_divergence_during_training_process < 0.7 * kl_target: - # kl too low => decrease regularization - new_kl_coefficient /= 1.5 - - # update the kl coefficient variable - if kl_coefficient != new_kl_coefficient: - self.policy_network.online_network.set_variable_value( - self.policy_network.online_network.output_heads[0].assign_kl_coefficient, - new_kl_coefficient, - self.policy_network.online_network.output_heads[0].kl_coefficient_ph) - - screen.log_title("KL penalty coefficient change = {} -> {}".format(kl_coefficient, new_kl_coefficient)) - - def post_training_commands(self): - if self.tp.agent.use_kl_regularization: - self.update_kl_coefficient() - - # clean memory - self.memory.clean() - - def train(self): - self.policy_network.sync() - self.critic_network.sync() - - dataset = self.memory.transitions - - self.fill_advantages(dataset) - - # take only the requested number of steps - dataset = dataset[:self.tp.agent.num_consecutive_playing_steps] - - value_loss = self.train_value_network(dataset, 1) - policy_loss = self.train_policy_network(dataset, 10) - - self.value_loss.add_sample(value_loss) - self.policy_loss.add_sample(policy_loss) - self.update_log() # should be done in order to update the data that has been accumulated * while not playing * - return np.append(value_loss, policy_loss) - - def choose_action(self, curr_state, phase=RunPhase.TRAIN): - if self.env.discrete_controls: - # DISCRETE - action_values = self.policy_network.online_network.predict(self.tf_input_state(curr_state)).squeeze() - - if phase == RunPhase.TRAIN: - action = self.exploration_policy.get_action(action_values) - else: - action = np.argmax(action_values) - action_info = {"action_probability": action_values[action]} - # self.entropy.add_sample(-np.sum(action_values * np.log(action_values))) - else: - # CONTINUOUS - action_values_mean, action_values_std = self.policy_network.online_network.predict(self.tf_input_state(curr_state)) - action_values_mean = action_values_mean.squeeze() - action_values_std = action_values_std.squeeze() - if phase == RunPhase.TRAIN: - action = np.squeeze(np.random.randn(1, self.action_space_size) * action_values_std + action_values_mean) - else: - action = action_values_mean - action_info = {"action_probability": action_values_mean} - - return action, action_info diff --git a/agents/qr_dqn_agent.py b/agents/qr_dqn_agent.py deleted file mode 100644 index 8888d18..0000000 --- a/agents/qr_dqn_agent.py +++ /dev/null @@ -1,66 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 agents.value_optimization_agent import * - - -# Quantile Regression Deep Q Network - https://arxiv.org/pdf/1710.10044v1.pdf -class QuantileRegressionDQNAgent(ValueOptimizationAgent): - def __init__(self, env, tuning_parameters, replicated_device=None, thread_id=0): - ValueOptimizationAgent.__init__(self, env, tuning_parameters, replicated_device, thread_id) - self.quantile_probabilities = np.ones(self.tp.agent.atoms) / float(self.tp.agent.atoms) - - # prediction's format is (batch,actions,atoms) - def get_q_values(self, quantile_values): - return np.dot(quantile_values, self.quantile_probabilities) - - def learn_from_batch(self, batch): - current_states, next_states, actions, rewards, game_overs, _ = self.extract_batch(batch) - - # get the quantiles of the next states and current states - next_state_quantiles = self.main_network.target_network.predict(next_states) - current_quantiles = self.main_network.online_network.predict(current_states) - - # get the optimal actions to take for the next states - target_actions = np.argmax(self.get_q_values(next_state_quantiles), axis=1) - - # calculate the Bellman update - batch_idx = list(range(self.tp.batch_size)) - rewards = np.expand_dims(rewards, -1) - game_overs = np.expand_dims(game_overs, -1) - TD_targets = rewards + (1.0 - game_overs) * self.tp.agent.discount \ - * next_state_quantiles[batch_idx, target_actions] - - # get the locations of the selected actions within the batch for indexing purposes - actions_locations = [[b, a] for b, a in zip(batch_idx, actions)] - - # calculate the cumulative quantile probabilities and reorder them to fit the sorted quantiles order - cumulative_probabilities = np.array(range(self.tp.agent.atoms+1))/float(self.tp.agent.atoms) # tau_i - quantile_midpoints = 0.5*(cumulative_probabilities[1:] + cumulative_probabilities[:-1]) # tau^hat_i - quantile_midpoints = np.tile(quantile_midpoints, (self.tp.batch_size, 1)) - sorted_quantiles = np.argsort(current_quantiles[batch_idx, actions]) - for idx in range(self.tp.batch_size): - quantile_midpoints[idx, :] = quantile_midpoints[idx, sorted_quantiles[idx]] - - # train - result = self.main_network.train_and_sync_networks({ - **current_states, - 'output_0_0': actions_locations, - 'output_0_1': quantile_midpoints, - }, TD_targets) - total_loss = result[0] - - return total_loss diff --git a/agents/value_optimization_agent.py b/agents/value_optimization_agent.py deleted file mode 100644 index 75708d7..0000000 --- a/agents/value_optimization_agent.py +++ /dev/null @@ -1,77 +0,0 @@ -# -# Copyright (c) 2017 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -import numpy as np - -from agents.agent import Agent -from architectures.network_wrapper import NetworkWrapper -from utils import RunPhase, Signal - - -class ValueOptimizationAgent(Agent): - def __init__(self, env, tuning_parameters, replicated_device=None, thread_id=0, create_target_network=True): - Agent.__init__(self, env, tuning_parameters, replicated_device, thread_id) - self.main_network = NetworkWrapper(tuning_parameters, create_target_network, self.has_global, 'main', - self.replicated_device, self.worker_device) - self.networks.append(self.main_network) - self.q_values = Signal("Q") - self.signals.append(self.q_values) - - self.reset_game(do_not_reset_env=True) - - # Algorithms for which q_values are calculated from predictions will override this function - def get_q_values(self, prediction): - return prediction - - def get_prediction(self, curr_state): - return self.main_network.online_network.predict(self.tf_input_state(curr_state)) - - def _validate_action(self, policy, action): - if np.array(action).shape != (): - raise ValueError(( - 'The exploration_policy {} returned a vector of actions ' - 'instead of a single action. ValueOptimizationAgents ' - 'require exploration policies which return a single action.' - ).format(policy.__class__.__name__)) - - def choose_action(self, curr_state, phase=RunPhase.TRAIN): - prediction = self.get_prediction(curr_state) - actions_q_values = self.get_q_values(prediction) - - # choose action according to the exploration policy and the current phase (evaluating or training the agent) - if phase == RunPhase.TRAIN: - exploration_policy = self.exploration_policy - else: - exploration_policy = self.evaluation_exploration_policy - - action = exploration_policy.get_action(actions_q_values) - self._validate_action(exploration_policy, action) - - # this is for bootstrapped dqn - if type(actions_q_values) == list and len(actions_q_values) > 0: - actions_q_values = actions_q_values[self.exploration_policy.selected_head] - actions_q_values = actions_q_values.squeeze() - - # store the q values statistics for logging - self.q_values.add_sample(actions_q_values) - - # store information for plotting interactively (actual plotting is done in agent) - if self.tp.visualization.plot_action_values_online: - for idx, action_name in enumerate(self.env.actions_description): - self.episode_running_info[action_name].append(actions_q_values[idx]) - - action_value = {"action_value": actions_q_values[action], "max_action_value": np.max(actions_q_values)} - return action, action_value diff --git a/architectures/__init__.py b/architectures/__init__.py deleted file mode 100644 index cbf2ac5..0000000 --- a/architectures/__init__.py +++ /dev/null @@ -1,31 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 architectures.architecture import * -from logger import failed_imports -try: - from architectures.tensorflow_components.general_network import * - from architectures.tensorflow_components.architecture import * -except ImportError: - failed_imports.append("TensorFlow") - -try: - from architectures.neon_components.general_network import * - from architectures.neon_components.architecture import * -except ImportError: - failed_imports.append("Neon") - -from architectures.network_wrapper import * \ No newline at end of file diff --git a/architectures/neon_components/architecture.py b/architectures/neon_components/architecture.py deleted file mode 100644 index de600c1..0000000 --- a/architectures/neon_components/architecture.py +++ /dev/null @@ -1,129 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 sys -import copy -from ngraph.frontends.neon import * -import ngraph as ng -from architectures.architecture import * -import numpy as np -from utils import * - - -class NeonArchitecture(Architecture): - def __init__(self, tuning_parameters, name="", global_network=None, network_is_local=True): - Architecture.__init__(self, tuning_parameters, name) - assert tuning_parameters.agent.neon_support, 'Neon is not supported for this agent' - self.clip_error = tuning_parameters.clip_gradients - self.total_loss = None - self.epoch = 0 - self.inputs = [] - self.outputs = [] - self.targets = [] - self.losses = [] - - self.transformer = tuning_parameters.sess - self.network = self.get_model(tuning_parameters) - self.accumulated_gradients = [] - - # training and inference ops - train_output = ng.sequential([ - self.optimizer(self.total_loss), - self.total_loss - ]) - placeholders = self.inputs + self.targets - self.train_op = self.transformer.add_computation( - ng.computation( - train_output, *placeholders - ) - ) - self.predict_op = self.transformer.add_computation( - ng.computation( - self.outputs, self.inputs[0] - ) - ) - - # update weights from array op - self.weights = [ng.placeholder(w.axes) for w in self.total_loss.variables()] - self.set_weights_ops = [] - for target_variable, variable in zip(self.total_loss.variables(), self.weights): - self.set_weights_ops.append(self.transformer.add_computation( - ng.computation( - ng.assign(target_variable, variable), variable - ) - )) - - # get weights op - self.get_variables = self.transformer.add_computation( - ng.computation( - self.total_loss.variables() - ) - ) - - def predict(self, inputs): - batch_size = inputs.shape[0] - - # move batch axis to the end - inputs = inputs.swapaxes(0, -1) - prediction = self.predict_op(inputs) # TODO: problem with multiple inputs - - if type(prediction) != tuple: - prediction = (prediction) - - # process all the outputs from the network - output = [] - for p in prediction: - output.append(p.transpose()[:batch_size].copy()) - - # if there is only one output then we don't need a list - if len(output) == 1: - output = output[0] - return output - - def train_on_batch(self, inputs, targets): - loss = self.accumulate_gradients(inputs, targets) - self.apply_and_reset_gradients(self.accumulated_gradients) - return loss - - def get_weights(self): - return self.get_variables() - - def set_weights(self, weights, rate=1.0): - if rate != 1: - current_weights = self.get_weights() - updated_weights = [(1 - rate) * t + rate * o for t, o in zip(current_weights, weights)] - else: - updated_weights = weights - for update_function, variable in zip(self.set_weights_ops, updated_weights): - update_function(variable) - - def accumulate_gradients(self, inputs, targets): - # Neon doesn't currently allow separating the grads calculation and grad apply operations - # so this feature is not currently available. instead we do a full training iteration - inputs = force_list(inputs) - targets = force_list(targets) - - for idx, input in enumerate(inputs): - inputs[idx] = input.swapaxes(0, -1) - - for idx, target in enumerate(targets): - targets[idx] = np.rollaxis(target, 0, len(target.shape)) - - all_inputs = inputs + targets - - loss = np.mean(self.train_op(*all_inputs)) - - return [loss] diff --git a/architectures/neon_components/embedders.py b/architectures/neon_components/embedders.py deleted file mode 100644 index 5f594a3..0000000 --- a/architectures/neon_components/embedders.py +++ /dev/null @@ -1,88 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 ngraph.frontends.neon as neon -import ngraph as ng -from ngraph.util.names import name_scope - - -class InputEmbedder(object): - def __init__(self, input_size, batch_size=None, activation_function=neon.Rectlin(), name="embedder"): - self.name = name - self.input_size = input_size - self.batch_size = batch_size - self.activation_function = activation_function - self.weights_init = neon.GlorotInit() - self.biases_init = neon.ConstantInit() - self.input = None - self.output = None - - def __call__(self, prev_input_placeholder=None): - with name_scope(self.get_name()): - # create the input axes - axes = [] - if len(self.input_size) == 2: - axis_names = ['H', 'W'] - else: - axis_names = ['C', 'H', 'W'] - for axis_size, axis_name in zip(self.input_size, axis_names): - axes.append(ng.make_axis(axis_size, name=axis_name)) - batch_axis_full = ng.make_axis(self.batch_size, name='N') - input_axes = ng.make_axes(axes) - - if prev_input_placeholder is None: - self.input = ng.placeholder(input_axes + [batch_axis_full]) - else: - self.input = prev_input_placeholder - self._build_module() - - return self.input, self.output(self.input) - - def _build_module(self): - pass - - def get_name(self): - return self.name - - -class ImageEmbedder(InputEmbedder): - def __init__(self, input_size, batch_size=None, input_rescaler=255.0, activation_function=neon.Rectlin(), name="embedder"): - InputEmbedder.__init__(self, input_size, batch_size, activation_function, name) - self.input_rescaler = input_rescaler - - def _build_module(self): - # image observation - self.output = neon.Sequential([ - neon.Preprocess(functor=lambda x: x / self.input_rescaler), - neon.Convolution((8, 8, 32), strides=4, activation=self.activation_function, - filter_init=self.weights_init, bias_init=self.biases_init), - neon.Convolution((4, 4, 64), strides=2, activation=self.activation_function, - filter_init=self.weights_init, bias_init=self.biases_init), - neon.Convolution((3, 3, 64), strides=1, activation=self.activation_function, - filter_init=self.weights_init, bias_init=self.biases_init) - ]) - - -class VectorEmbedder(InputEmbedder): - def __init__(self, input_size, batch_size=None, activation_function=neon.Rectlin(), name="embedder"): - InputEmbedder.__init__(self, input_size, batch_size, activation_function, name) - - def _build_module(self): - # vector observation - self.output = neon.Sequential([ - neon.Affine(nout=256, activation=self.activation_function, - weight_init=self.weights_init, bias_init=self.biases_init) - ]) diff --git a/architectures/neon_components/general_network.py b/architectures/neon_components/general_network.py deleted file mode 100644 index 99ac6e9..0000000 --- a/architectures/neon_components/general_network.py +++ /dev/null @@ -1,192 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 architectures.neon_components.embedders import * -from architectures.neon_components.heads import * -from architectures.neon_components.middleware import * -from architectures.neon_components.architecture import * -from configurations import InputTypes, OutputTypes, MiddlewareTypes - - -class GeneralNeonNetwork(NeonArchitecture): - def __init__(self, tuning_parameters, name="", global_network=None, network_is_local=True): - self.global_network = global_network - self.network_is_local = network_is_local - self.num_heads_per_network = 1 if tuning_parameters.agent.use_separate_networks_per_head else \ - len(tuning_parameters.agent.output_types) - self.num_networks = 1 if not tuning_parameters.agent.use_separate_networks_per_head else \ - len(tuning_parameters.agent.output_types) - self.input_embedders = [] - self.output_heads = [] - self.activation_function = self.get_activation_function( - tuning_parameters.agent.hidden_layers_activation_function) - - NeonArchitecture.__init__(self, tuning_parameters, name, global_network, network_is_local) - - def get_activation_function(self, activation_function_string): - activation_functions = { - 'relu': neon.Rectlin(), - 'tanh': neon.Tanh(), - 'sigmoid': neon.Logistic(), - 'elu': neon.Explin(), - 'selu': None, - 'none': None - } - assert activation_function_string in activation_functions.keys(), \ - "Activation function must be one of the following {}".format(activation_functions.keys()) - return activation_functions[activation_function_string] - - def get_input_embedder(self, embedder_type): - # the observation can be either an image or a vector - def get_observation_embedding(with_timestep=False): - if self.input_height > 1: - return ImageEmbedder((self.input_depth, self.input_height, self.input_width), self.batch_size, - name="observation") - else: - return VectorEmbedder((self.input_depth, self.input_width + int(with_timestep)), self.batch_size, - name="observation") - - input_mapping = { - InputTypes.Observation: get_observation_embedding(), - InputTypes.Measurements: VectorEmbedder(self.measurements_size, self.batch_size, name="measurements"), - InputTypes.GoalVector: VectorEmbedder(self.measurements_size, self.batch_size, name="goal_vector"), - InputTypes.Action: VectorEmbedder((self.num_actions,), self.batch_size, name="action"), - InputTypes.TimedObservation: get_observation_embedding(with_timestep=True), - } - return input_mapping[embedder_type] - - def get_middleware_embedder(self, middleware_type): - return {MiddlewareTypes.LSTM: None, # LSTM over Neon is currently not supported in Coach - MiddlewareTypes.FC: FC_Embedder}.get(middleware_type)(self.activation_function) - - def get_output_head(self, head_type, head_idx, loss_weight=1.): - output_mapping = { - OutputTypes.Q: QHead, - OutputTypes.DuelingQ: DuelingQHead, - OutputTypes.V: None, # Policy Optimization algorithms over Neon are currently not supported in Coach - OutputTypes.Pi: None, # Policy Optimization algorithms over Neon are currently not supported in Coach - OutputTypes.MeasurementsPrediction: None, # DFP over Neon is currently not supported in Coach - OutputTypes.DNDQ: None, # NEC over Neon is currently not supported in Coach - OutputTypes.NAF: None, # NAF over Neon is currently not supported in Coach - OutputTypes.PPO: None, # PPO over Neon is currently not supported in Coach - OutputTypes.PPO_V: None # PPO over Neon is currently not supported in Coach - } - return output_mapping[head_type](self.tp, head_idx, loss_weight, self.network_is_local) - - def get_model(self, tuning_parameters): - """ - :param tuning_parameters: A Preset class instance with all the running paramaters - :type tuning_parameters: Preset - :return: A model - """ - assert len(self.tp.agent.input_types) > 0, "At least one input type should be defined" - assert len(self.tp.agent.output_types) > 0, "At least one output type should be defined" - assert self.tp.agent.middleware_type is not None, "Exactly one middleware type should be defined" - assert len(self.tp.agent.loss_weights) > 0, "At least one loss weight should be defined" - assert len(self.tp.agent.output_types) == len(self.tp.agent.loss_weights), \ - "Number of loss weights should match the number of output types" - local_network_in_distributed_training = self.global_network is not None and self.network_is_local - - tuning_parameters.activation_function = self.activation_function - done_creating_input_placeholders = False - - for network_idx in range(self.num_networks): - with name_scope('network_{}'.format(network_idx)): - #################### - # Input Embeddings # - #################### - - state_embedding = [] - for idx, input_type in enumerate(self.tp.agent.input_types): - # get the class of the input embedder - self.input_embedders.append(self.get_input_embedder(input_type)) - - # in the case each head uses a different network, we still reuse the input placeholders - prev_network_input_placeholder = self.inputs[idx] if done_creating_input_placeholders else None - - # create the input embedder instance and store the input placeholder and the embedding - input_placeholder, embedding = self.input_embedders[-1](prev_network_input_placeholder) - if len(self.inputs) < len(self.tp.agent.input_types): - self.inputs.append(input_placeholder) - state_embedding.append(embedding) - - done_creating_input_placeholders = True - - ############## - # Middleware # - ############## - - state_embedding = ng.concat_along_axis(state_embedding, state_embedding[0].axes[0]) \ - if len(state_embedding) > 1 else state_embedding[0] - self.middleware_embedder = self.get_middleware_embedder(self.tp.agent.middleware_type) - _, self.state_embedding = self.middleware_embedder(state_embedding) - - ################ - # Output Heads # - ################ - - for head_idx in range(self.num_heads_per_network): - for head_copy_idx in range(self.tp.agent.num_output_head_copies): - if self.tp.agent.use_separate_networks_per_head: - # if we use separate networks per head, then the head type corresponds top the network idx - head_type_idx = network_idx - else: - # if we use a single network with multiple heads, then the head type is the current head idx - head_type_idx = head_idx - self.output_heads.append(self.get_output_head(self.tp.agent.output_types[head_type_idx], - head_copy_idx, - self.tp.agent.loss_weights[head_type_idx])) - if self.network_is_local: - output, target_placeholder, input_placeholder = self.output_heads[-1](self.state_embedding) - self.targets.extend(target_placeholder) - else: - output, input_placeholder = self.output_heads[-1](self.state_embedding) - - self.outputs.extend(output) - self.inputs.extend(input_placeholder) - - # Losses - self.losses = [] - for output_head in self.output_heads: - self.losses += output_head.loss - self.total_loss = sum(self.losses) - - # Learning rate - if self.tp.learning_rate_decay_rate != 0: - raise Exception("learning rate decay is not supported in neon") - - # Optimizer - if local_network_in_distributed_training and \ - hasattr(self.tp.agent, "shared_optimizer") and self.tp.agent.shared_optimizer: - # distributed training and this is the local network instantiation - self.optimizer = self.global_network.optimizer - else: - if tuning_parameters.agent.optimizer_type == 'Adam': - self.optimizer = neon.Adam( - learning_rate=tuning_parameters.learning_rate, - gradient_clip_norm=tuning_parameters.clip_gradients - ) - elif tuning_parameters.agent.optimizer_type == 'RMSProp': - self.optimizer = neon.RMSProp( - learning_rate=tuning_parameters.learning_rate, - gradient_clip_norm=tuning_parameters.clip_gradients, - decay_rate=0.9, - epsilon=0.01 - ) - elif tuning_parameters.agent.optimizer_type == 'LBFGS': - raise Exception("LBFGS optimizer is not supported in neon") - else: - raise Exception("{} is not a valid optimizer type".format(tuning_parameters.agent.optimizer_type)) diff --git a/architectures/neon_components/heads.py b/architectures/neon_components/heads.py deleted file mode 100644 index df49867..0000000 --- a/architectures/neon_components/heads.py +++ /dev/null @@ -1,194 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 ngraph as ng -from ngraph.util.names import name_scope -import ngraph.frontends.neon as neon -import numpy as np -from utils import force_list -from architectures.neon_components.losses import * - - -class Head(object): - def __init__(self, tuning_parameters, head_idx=0, loss_weight=1., is_local=True): - self.head_idx = head_idx - self.name = "head" - self.output = [] - self.loss = [] - self.loss_type = [] - self.regularizations = [] - self.loss_weight = force_list(loss_weight) - self.weights_init = neon.GlorotInit() - self.biases_init = neon.ConstantInit() - self.target = [] - self.input = [] - self.is_local = is_local - self.batch_size = tuning_parameters.batch_size - - def __call__(self, input_layer): - """ - Wrapper for building the module graph including scoping and loss creation - :param input_layer: the input to the graph - :return: the output of the last layer and the target placeholder - """ - with name_scope(self.get_name()): - self._build_module(input_layer) - - self.output = force_list(self.output) - self.target = force_list(self.target) - self.input = force_list(self.input) - self.loss_type = force_list(self.loss_type) - self.loss = force_list(self.loss) - self.regularizations = force_list(self.regularizations) - if self.is_local: - self.set_loss() - - if self.is_local: - return self.output, self.target, self.input - else: - return self.output, self.input - - def _build_module(self, input_layer): - """ - Builds the graph of the module - :param input_layer: the input to the graph - :return: None - """ - pass - - def get_name(self): - """ - Get a formatted name for the module - :return: the formatted name - """ - return '{}_{}'.format(self.name, self.head_idx) - - def set_loss(self): - """ - Creates a target placeholder and loss function for each loss_type and regularization - :param loss_type: a tensorflow loss function - :param scope: the name scope to include the tensors in - :return: None - """ - # add losses and target placeholder - for idx in range(len(self.loss_type)): - # output_axis = ng.make_axis(self.num_actions, name='q_values') - batch_axis_full = ng.make_axis(self.batch_size, name='N') - target = ng.placeholder(ng.make_axes([self.output[0].axes[0], batch_axis_full])) - self.target.append(target) - loss = self.loss_type[idx](self.target[-1], self.output[idx], - weights=self.loss_weight[idx], scope=self.get_name()) - self.loss.append(loss) - - # add regularizations - for regularization in self.regularizations: - self.loss.append(regularization) - - -class QHead(Head): - def __init__(self, tuning_parameters, head_idx=0, loss_weight=1., is_local=True): - Head.__init__(self, tuning_parameters, head_idx, loss_weight, is_local) - self.name = 'q_values_head' - self.num_actions = tuning_parameters.env_instance.action_space_size - if tuning_parameters.agent.replace_mse_with_huber_loss: - raise Exception("huber loss is not supported in neon") - else: - self.loss_type = mean_squared_error - - def _build_module(self, input_layer): - # Standard Q Network - self.output = neon.Sequential([ - neon.Affine(nout=self.num_actions, - weight_init=self.weights_init, bias_init=self.biases_init) - ])(input_layer) - - -class DuelingQHead(QHead): - def __init__(self, tuning_parameters, head_idx=0, loss_weight=1., is_local=True): - QHead.__init__(self, tuning_parameters, head_idx, loss_weight, is_local) - - def _build_module(self, input_layer): - # Dueling Network - # state value tower - V - output_axis = ng.make_axis(self.num_actions, name='q_values') - - state_value = neon.Sequential([ - neon.Affine(nout=256, activation=neon.Rectlin(), - weight_init=self.weights_init, bias_init=self.biases_init), - neon.Affine(nout=1, - weight_init=self.weights_init, bias_init=self.biases_init) - ])(input_layer) - - # action advantage tower - A - action_advantage_unnormalized = neon.Sequential([ - neon.Affine(nout=256, activation=neon.Rectlin(), - weight_init=self.weights_init, bias_init=self.biases_init), - neon.Affine(axes=output_axis, - weight_init=self.weights_init, bias_init=self.biases_init) - ])(input_layer) - action_advantage = action_advantage_unnormalized - ng.mean(action_advantage_unnormalized) - - repeated_state_value = ng.expand_dims(ng.slice_along_axis(state_value, state_value.axes[0], 0), output_axis, 0) - - # merge to state-action value function Q - self.output = repeated_state_value + action_advantage - - -class MeasurementsPredictionHead(Head): - def __init__(self, tuning_parameters, head_idx=0, loss_weight=1., is_local=True): - Head.__init__(self, tuning_parameters, head_idx, loss_weight, is_local) - self.name = 'future_measurements_head' - self.num_actions = tuning_parameters.env_instance.action_space_size - self.num_measurements = tuning_parameters.env.measurements_size[0] \ - if tuning_parameters.env.measurements_size else 0 - self.num_prediction_steps = tuning_parameters.agent.num_predicted_steps_ahead - self.multi_step_measurements_size = self.num_measurements * self.num_prediction_steps - if tuning_parameters.agent.replace_mse_with_huber_loss: - raise Exception("huber loss is not supported in neon") - else: - self.loss_type = mean_squared_error - - def _build_module(self, input_layer): - # This is almost exactly the same as Dueling Network but we predict the future measurements for each action - - multistep_measurements_size = self.measurements_size[0] * self.num_predicted_steps_ahead - - # actions expectation tower (expectation stream) - E - with name_scope("expectation_stream"): - expectation_stream = neon.Sequential([ - neon.Affine(nout=256, activation=neon.Rectlin(), - weight_init=self.weights_init, bias_init=self.biases_init), - neon.Affine(nout=multistep_measurements_size, - weight_init=self.weights_init, bias_init=self.biases_init) - ])(input_layer) - - # action fine differences tower (action stream) - A - with name_scope("action_stream"): - action_stream_unnormalized = neon.Sequential([ - neon.Affine(nout=256, activation=neon.Rectlin(), - weight_init=self.weights_init, bias_init=self.biases_init), - neon.Affine(nout=self.num_actions * multistep_measurements_size, - weight_init=self.weights_init, bias_init=self.biases_init), - neon.Reshape((self.num_actions, multistep_measurements_size)) - ])(input_layer) - action_stream = action_stream_unnormalized - ng.mean(action_stream_unnormalized) - - repeated_expectation_stream = ng.slice_along_axis(expectation_stream, expectation_stream.axes[0], 0) - repeated_expectation_stream = ng.expand_dims(repeated_expectation_stream, output_axis, 0) - - # merge to future measurements predictions - self.output = repeated_expectation_stream + action_stream - diff --git a/architectures/neon_components/middleware.py b/architectures/neon_components/middleware.py deleted file mode 100644 index 2aa02fd..0000000 --- a/architectures/neon_components/middleware.py +++ /dev/null @@ -1,50 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 ngraph as ng -import ngraph.frontends.neon as neon -from ngraph.util.names import name_scope -import numpy as np - - -class MiddlewareEmbedder(object): - def __init__(self, activation_function=neon.Rectlin(), name="middleware_embedder"): - self.name = name - self.input = None - self.output = None - self.weights_init = neon.GlorotInit() - self.biases_init = neon.ConstantInit() - self.activation_function = activation_function - - def __call__(self, input_layer): - with name_scope(self.get_name()): - self.input = input_layer - self._build_module() - - return self.input, self.output(self.input) - - def _build_module(self): - pass - - def get_name(self): - return self.name - - -class FC_Embedder(MiddlewareEmbedder): - def _build_module(self): - self.output = neon.Sequential([ - neon.Affine(nout=512, activation=self.activation_function, - weight_init=self.weights_init, bias_init=self.biases_init)]) diff --git a/architectures/network_wrapper.py b/architectures/network_wrapper.py deleted file mode 100644 index 7388587..0000000 --- a/architectures/network_wrapper.py +++ /dev/null @@ -1,187 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 collections import OrderedDict -from configurations import Preset, Frameworks -from logger import * -try: - import tensorflow as tf - from architectures.tensorflow_components.general_network import GeneralTensorFlowNetwork -except ImportError: - failed_imports.append("TensorFlow") - -try: - from architectures.neon_components.general_network import GeneralNeonNetwork -except ImportError: - failed_imports.append("Neon") - - -class NetworkWrapper(object): - """ - Contains multiple networks and managers syncing and gradient updates - between them. - """ - def __init__(self, tuning_parameters, has_target, has_global, name, replicated_device=None, worker_device=None): - """ - :param tuning_parameters: - :type tuning_parameters: Preset - :param has_target: - :param has_global: - :param name: - :param replicated_device: - :param worker_device: - """ - self.tp = tuning_parameters - self.has_target = has_target - self.has_global = has_global - self.name = name - self.sess = tuning_parameters.sess - - if self.tp.framework == Frameworks.TensorFlow: - general_network = GeneralTensorFlowNetwork - elif self.tp.framework == Frameworks.Neon: - general_network = GeneralNeonNetwork - else: - raise Exception("{} Framework is not supported".format(Frameworks().to_string(self.tp.framework))) - - # Global network - the main network shared between threads - self.global_network = None - if self.has_global: - with tf.device(replicated_device): - self.global_network = general_network(tuning_parameters, '{}/global'.format(name), - network_is_local=False) - - # Online network - local copy of the main network used for playing - self.online_network = None - with tf.device(worker_device): - self.online_network = general_network(tuning_parameters, '{}/online'.format(name), - self.global_network, network_is_local=True) - - # Target network - a local, slow updating network used for stabilizing the learning - self.target_network = None - if self.has_target: - with tf.device(worker_device): - self.target_network = general_network(tuning_parameters, '{}/target'.format(name), - network_is_local=True) - - if not self.tp.distributed and self.tp.framework == Frameworks.TensorFlow: - variables_to_restore = tf.global_variables() - variables_to_restore = [v for v in variables_to_restore if '/online' in v.name] - self.model_saver = tf.train.Saver(variables_to_restore) - #, max_to_keep=None) # uncomment to unlimit number of stored checkpoints - if self.tp.sess and self.tp.checkpoint_restore_dir: - checkpoint = tf.train.latest_checkpoint(self.tp.checkpoint_restore_dir) - screen.log_title("Loading checkpoint: {}".format(checkpoint)) - self.model_saver.restore(self.tp.sess, checkpoint) - self.update_target_network() - - def sync(self): - """ - Initializes the weights of the networks to match each other - :return: - """ - self.update_online_network() - self.update_target_network() - - def update_target_network(self, rate=1.0): - """ - Copy weights: online network >>> target network - :param rate: the rate of copying the weights - 1 for copying exactly - """ - if self.target_network: - self.target_network.set_weights(self.online_network.get_weights(), rate) - - def update_online_network(self, rate=1.0): - """ - Copy weights: global network >>> online network - :param rate: the rate of copying the weights - 1 for copying exactly - """ - if self.global_network: - self.online_network.set_weights(self.global_network.get_weights(), rate) - - def apply_gradients_to_global_network(self): - """ - Apply gradients from the online network on the global network - :return: - """ - self.global_network.apply_gradients(self.online_network.accumulated_gradients) - - def apply_gradients_to_online_network(self): - """ - Apply gradients from the online network on itself - :return: - """ - self.online_network.apply_gradients(self.online_network.accumulated_gradients) - - def train_and_sync_networks(self, inputs, targets, additional_fetches=[]): - """ - A generic training function that enables multi-threading training using a global network if necessary. - :param inputs: The inputs for the network. - :param targets: The targets corresponding to the given inputs - :param additional_fetches: Any additional tensor the user wants to fetch - :return: The loss of the training iteration - """ - result = self.online_network.accumulate_gradients(inputs, targets, additional_fetches=additional_fetches) - self.apply_gradients_and_sync_networks() - return result - - def apply_gradients_and_sync_networks(self): - """ - Applies the gradients accumulated in the online network to the global network or to itself and syncs the - networks if necessary - """ - if self.global_network: - self.apply_gradients_to_global_network() - self.online_network.reset_accumulated_gradients() - self.update_online_network() - else: - self.online_network.apply_and_reset_gradients(self.online_network.accumulated_gradients) - - def get_local_variables(self): - """ - Get all the variables that are local to the thread - :return: a list of all the variables that are local to the thread - """ - local_variables = [v for v in tf.global_variables() if self.online_network.name in v.name] - if self.has_target: - local_variables += [v for v in tf.global_variables() if self.target_network.name in v.name] - return local_variables - - def get_global_variables(self): - """ - Get all the variables that are shared between threads - :return: a list of all the variables that are shared between threads - """ - global_variables = [v for v in tf.global_variables() if self.global_network.name in v.name] - return global_variables - - def set_session(self, sess): - self.sess = sess - self.online_network.sess = sess - if self.global_network: - self.global_network.sess = sess - if self.target_network: - self.target_network.sess = sess - - def save_model(self, model_id): - saved_model_path = self.model_saver.save(self.tp.sess, os.path.join(self.tp.save_model_dir, - str(model_id) + '.ckpt')) - screen.log_dict( - OrderedDict([ - ("Saving model", saved_model_path), - ]), - prefix="Checkpoint" - ) diff --git a/architectures/tensorflow_components/architecture.py b/architectures/tensorflow_components/architecture.py deleted file mode 100644 index 006ed2c..0000000 --- a/architectures/tensorflow_components/architecture.py +++ /dev/null @@ -1,367 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 time - -import numpy as np -import tensorflow as tf - -from architectures.architecture import Architecture -from utils import force_list, squeeze_list -from configurations import Preset, MiddlewareTypes - -def variable_summaries(var): - """Attach a lot of summaries to a Tensor (for TensorBoard visualization).""" - with tf.name_scope('summaries'): - layer_weight_name = '_'.join(var.name.split('/')[-3:])[:-2] - - with tf.name_scope(layer_weight_name): - mean = tf.reduce_mean(var) - tf.summary.scalar('mean', mean) - with tf.name_scope('stddev'): - stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean))) - tf.summary.scalar('stddev', stddev) - tf.summary.scalar('max', tf.reduce_max(var)) - tf.summary.scalar('min', tf.reduce_min(var)) - tf.summary.histogram('histogram', var) - -class TensorFlowArchitecture(Architecture): - def __init__(self, tuning_parameters, name="", global_network=None, network_is_local=True): - """ - :param tuning_parameters: The parameters used for running the algorithm - :type tuning_parameters: Preset - :param name: The name of the network - """ - Architecture.__init__(self, tuning_parameters, name) - self.middleware_embedder = None - self.network_is_local = network_is_local - assert tuning_parameters.agent.tensorflow_support, 'TensorFlow is not supported for this agent' - self.sess = tuning_parameters.sess - self.inputs = {} - self.outputs = [] - self.targets = [] - self.losses = [] - self.total_loss = None - self.trainable_weights = [] - self.weights_placeholders = [] - self.curr_rnn_c_in = None - self.curr_rnn_h_in = None - self.gradients_wrt_inputs = [] - self.train_writer = None - - self.optimizer_type = self.tp.agent.optimizer_type - if self.tp.seed is not None: - tf.set_random_seed(self.tp.seed) - with tf.variable_scope(self.name, initializer=tf.contrib.layers.xavier_initializer()): - self.global_step = tf.train.get_or_create_global_step() - - # build the network - self.get_model(tuning_parameters) - - # model weights - self.trainable_weights = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope=self.name) - - # locks for synchronous training - if self.tp.distributed and not self.tp.agent.async_training and not self.network_is_local: - self.lock_counter = tf.get_variable("lock_counter", [], tf.int32, - initializer=tf.constant_initializer(0, dtype=tf.int32), - trainable=False) - self.lock = self.lock_counter.assign_add(1, use_locking=True) - self.lock_init = self.lock_counter.assign(0) - - self.release_counter = tf.get_variable("release_counter", [], tf.int32, - initializer=tf.constant_initializer(0, dtype=tf.int32), - trainable=False) - self.release = self.release_counter.assign_add(1, use_locking=True) - self.release_init = self.release_counter.assign(0) - - # local network does the optimization so we need to create all the ops we are going to use to optimize - for idx, var in enumerate(self.trainable_weights): - placeholder = tf.placeholder(tf.float32, shape=var.get_shape(), name=str(idx) + '_holder') - self.weights_placeholders.append(placeholder) - if self.tp.visualization.tensorboard: - variable_summaries(var) - - self.update_weights_from_list = [weights.assign(holder) for holder, weights in - zip(self.weights_placeholders, self.trainable_weights)] - - # gradients ops - self.tensor_gradients = tf.gradients(self.total_loss, self.trainable_weights) - self.gradients_norm = tf.global_norm(self.tensor_gradients) - if self.tp.clip_gradients is not None and self.tp.clip_gradients != 0: - self.clipped_grads, self.grad_norms = tf.clip_by_global_norm(self.tensor_gradients, - tuning_parameters.clip_gradients) - - # gradients of the outputs w.r.t. the inputs - # at the moment, this is only used by ddpg - if len(self.outputs) == 1: - self.gradients_wrt_inputs = {name: tf.gradients(self.outputs[0], input_ph) for name, input_ph in self.inputs.items()} - self.gradients_weights_ph = tf.placeholder('float32', self.outputs[0].shape, 'output_gradient_weights') - self.weighted_gradients = tf.gradients(self.outputs[0], self.trainable_weights, self.gradients_weights_ph) - - # L2 regularization - if self.tp.agent.l2_regularization != 0: - self.l2_regularization = [tf.add_n([tf.nn.l2_loss(v) for v in self.trainable_weights]) - * self.tp.agent.l2_regularization] - tf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES, self.l2_regularization) - - self.inc_step = self.global_step.assign_add(1) - - # defining the optimization process (for LBFGS we have less control over the optimizer) - if self.optimizer_type != 'LBFGS': - # no global network, this is a plain simple centralized training - self.update_weights_from_batch_gradients = self.optimizer.apply_gradients( - zip(self.weights_placeholders, self.trainable_weights), global_step=self.global_step) - - if self.tp.visualization.tensorboard: - current_scope_summaries = tf.get_collection(tf.GraphKeys.SUMMARIES, - scope=tf.contrib.framework.get_name_scope()) - self.merged = tf.summary.merge(current_scope_summaries) - - # initialize or restore model - if not self.tp.distributed: - # Merge all the summaries - - self.init_op = tf.global_variables_initializer() - - if self.sess: - if self.tp.visualization.tensorboard: - # Write the merged summaries to the current experiment directory - self.train_writer = tf.summary.FileWriter(self.tp.experiment_path + '/tensorboard', - self.sess.graph) - self.sess.run(self.init_op) - - self.accumulated_gradients = None - - def reset_accumulated_gradients(self): - """ - Reset the gradients accumulation placeholder - """ - if self.accumulated_gradients is None: - self.accumulated_gradients = self.tp.sess.run(self.trainable_weights) - - for ix, grad in enumerate(self.accumulated_gradients): - self.accumulated_gradients[ix] = grad * 0 - - def accumulate_gradients(self, inputs, targets, additional_fetches=None): - """ - Runs a forward pass & backward pass, clips gradients if needed and accumulates them into the accumulation - placeholders - :param additional_fetches: Optional tensors to fetch during gradients calculation - :param inputs: The input batch for the network - :param targets: The targets corresponding to the input batch - :return: A list containing the total loss and the individual network heads losses - """ - - if self.accumulated_gradients is None: - self.reset_accumulated_gradients() - - # feed inputs - if additional_fetches is None: - additional_fetches = [] - - feed_dict = self._feed_dict(inputs) - - # feed targets - targets = force_list(targets) - for placeholder_idx, target in enumerate(targets): - feed_dict[self.targets[placeholder_idx]] = target - - if self.optimizer_type != 'LBFGS': - # set the fetches - fetches = [self.gradients_norm] - if self.tp.clip_gradients: - fetches.append(self.clipped_grads) - else: - fetches.append(self.tensor_gradients) - fetches += [self.total_loss, self.losses] - if self.tp.agent.middleware_type == MiddlewareTypes.LSTM: - fetches.append(self.middleware_embedder.state_out) - additional_fetches_start_idx = len(fetches) - fetches += additional_fetches - - # feed the lstm state if necessary - if self.tp.agent.middleware_type == MiddlewareTypes.LSTM: - # we can't always assume that we are starting from scratch here can we? - feed_dict[self.middleware_embedder.c_in] = self.middleware_embedder.c_init - feed_dict[self.middleware_embedder.h_in] = self.middleware_embedder.h_init - - if self.tp.visualization.tensorboard: - fetches += [self.merged] - - # get grads - result = self.tp.sess.run(fetches, feed_dict=feed_dict) - if hasattr(self, 'train_writer') and self.train_writer is not None: - self.train_writer.add_summary(result[-1], self.tp.current_episode) - - # extract the fetches - norm_unclipped_grads, grads, total_loss, losses = result[:4] - if self.tp.agent.middleware_type == MiddlewareTypes.LSTM: - (self.curr_rnn_c_in, self.curr_rnn_h_in) = result[4] - fetched_tensors = [] - if len(additional_fetches) > 0: - fetched_tensors = result[additional_fetches_start_idx:additional_fetches_start_idx + - len(additional_fetches)] - - # accumulate the gradients - for idx, grad in enumerate(grads): - self.accumulated_gradients[idx] += grad - - return total_loss, losses, norm_unclipped_grads, fetched_tensors - - else: - self.optimizer.minimize(session=self.tp.sess, feed_dict=feed_dict) - - return [0] - - def apply_and_reset_gradients(self, gradients, scaler=1.): - """ - Applies the given gradients to the network weights and resets the accumulation placeholder - :param gradients: The gradients to use for the update - :param scaler: A scaling factor that allows rescaling the gradients before applying them - """ - self.apply_gradients(gradients, scaler) - self.reset_accumulated_gradients() - - def apply_gradients(self, gradients, scaler=1.): - """ - Applies the given gradients to the network weights - :param gradients: The gradients to use for the update - :param scaler: A scaling factor that allows rescaling the gradients before applying them - """ - if self.tp.agent.async_training or not self.tp.distributed: - if hasattr(self, 'global_step') and not self.network_is_local: - self.tp.sess.run(self.inc_step) - - if self.optimizer_type != 'LBFGS': - - # lock barrier - if hasattr(self, 'lock_counter'): - self.tp.sess.run(self.lock) - while self.tp.sess.run(self.lock_counter) % self.tp.num_threads != 0: - time.sleep(0.00001) - # rescale the gradients so that they average out with the gradients from the other workers - scaler /= float(self.tp.num_threads) - - # apply gradients - if scaler != 1.: - for gradient in gradients: - gradient /= scaler - feed_dict = dict(zip(self.weights_placeholders, gradients)) - _ = self.tp.sess.run(self.update_weights_from_batch_gradients, feed_dict=feed_dict) - - # release barrier - if hasattr(self, 'release_counter'): - self.tp.sess.run(self.release) - while self.tp.sess.run(self.release_counter) % self.tp.num_threads != 0: - time.sleep(0.00001) - - def _feed_dict(self, inputs): - feed_dict = {} - for input_name, input_value in inputs.items(): - if isinstance(input_name, str): - if input_name not in self.inputs: - raise ValueError(( - 'input name {input_name} was provided to create a feed ' - 'dictionary, but there is no placeholder with that name. ' - 'placeholder names available include: {placeholder_names}' - ).format( - input_name=input_name, - placeholder_names=', '.join(self.inputs.keys()) - )) - - feed_dict[self.inputs[input_name]] = input_value - elif isinstance(input_name, tf.Tensor) and input_name.op.type == 'Placeholder': - feed_dict[input_name] = input_value - else: - raise ValueError(( - 'input dictionary expects strings or placeholders as keys, ' - 'but found key {key} of type {type}' - ).format( - key=input_name, - type=type(input_name), - )) - - return feed_dict - - def predict(self, inputs, outputs=None, squeeze_output=True): - """ - Run a forward pass of the network using the given input - :param inputs: The input for the network - :param outputs: The output for the network, defaults to self.outputs - :param squeeze_output: call squeeze_list on output - :return: The network output - - WARNING: must only call once per state since each call is assumed by LSTM to be a new time step. - """ - feed_dict = self._feed_dict(inputs) - if outputs is None: - outputs = self.outputs - - if self.tp.agent.middleware_type == MiddlewareTypes.LSTM: - feed_dict[self.middleware_embedder.c_in] = self.curr_rnn_c_in - feed_dict[self.middleware_embedder.h_in] = self.curr_rnn_h_in - - output, (self.curr_rnn_c_in, self.curr_rnn_h_in) = self.tp.sess.run([outputs, self.middleware_embedder.state_out], feed_dict=feed_dict) - else: - output = self.tp.sess.run(outputs, feed_dict) - - if squeeze_output: - output = squeeze_list(output) - - return output - - def get_weights(self): - """ - :return: a list of tensors containing the network weights for each layer - """ - return self.trainable_weights - - def set_weights(self, weights, new_rate=1.0): - """ - Sets the network weights from the given list of weights tensors - """ - feed_dict = {} - old_weights, new_weights = self.tp.sess.run([self.get_weights(), weights]) - for placeholder_idx, new_weight in enumerate(new_weights): - feed_dict[self.weights_placeholders[placeholder_idx]]\ - = new_rate * new_weight + (1 - new_rate) * old_weights[placeholder_idx] - self.tp.sess.run(self.update_weights_from_list, feed_dict) - - def write_graph_to_logdir(self, summary_dir): - """ - Writes the tensorflow graph to the logdir for tensorboard visualization - :param summary_dir: the path to the logdir - """ - summary_writer = tf.summary.FileWriter(summary_dir) - summary_writer.add_graph(self.sess.graph) - - def get_variable_value(self, variable): - """ - Get the value of a variable from the graph - :param variable: the variable - :return: the value of the variable - """ - return self.sess.run(variable) - - def set_variable_value(self, assign_op, value, placeholder=None): - """ - Updates the value of a variable. - This requires having an assign operation for the variable, and a placeholder which will provide the value - :param assign_op: an assign operation for the variable - :param value: a value to set the variable to - :param placeholder: a placeholder to hold the given value for injecting it into the variable - """ - self.sess.run(assign_op, feed_dict={placeholder: value}) diff --git a/architectures/tensorflow_components/embedders.py b/architectures/tensorflow_components/embedders.py deleted file mode 100644 index b3f36cb..0000000 --- a/architectures/tensorflow_components/embedders.py +++ /dev/null @@ -1,144 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 tensorflow as tf -from configurations import EmbedderDepth, EmbedderWidth - - -class InputEmbedder(object): - def __init__(self, input_size, activation_function=tf.nn.relu, - embedder_depth=EmbedderDepth.Shallow, embedder_width=EmbedderWidth.Wide, - name="embedder"): - self.name = name - self.input_size = input_size - self.activation_function = activation_function - self.input = None - self.output = None - self.embedder_depth = embedder_depth - self.embedder_width = embedder_width - - def __call__(self, prev_input_placeholder=None): - with tf.variable_scope(self.get_name()): - if prev_input_placeholder is None: - self.input = tf.placeholder("float", shape=(None,) + self.input_size, name=self.get_name()) - else: - self.input = prev_input_placeholder - self._build_module() - - return self.input, self.output - - def _build_module(self): - pass - - def get_name(self): - return self.name - - -class ImageEmbedder(InputEmbedder): - def __init__(self, input_size, input_rescaler=255.0, activation_function=tf.nn.relu, - embedder_depth=EmbedderDepth.Shallow, embedder_width=EmbedderWidth.Wide, - name="embedder"): - InputEmbedder.__init__(self, input_size, activation_function, embedder_depth, embedder_width, name) - self.input_rescaler = input_rescaler - - def _build_module(self): - # image observation - rescaled_observation_stack = self.input / self.input_rescaler - - if self.embedder_depth == EmbedderDepth.Shallow: - # same embedder as used in the original DQN paper - self.observation_conv1 = tf.layers.conv2d(rescaled_observation_stack, - filters=32, kernel_size=(8, 8), strides=(4, 4), - activation=self.activation_function, data_format='channels_last', - name='conv1') - self.observation_conv2 = tf.layers.conv2d(self.observation_conv1, - filters=64, kernel_size=(4, 4), strides=(2, 2), - activation=self.activation_function, data_format='channels_last', - name='conv2') - self.observation_conv3 = tf.layers.conv2d(self.observation_conv2, - filters=64, kernel_size=(3, 3), strides=(1, 1), - activation=self.activation_function, data_format='channels_last', - name='conv3' - ) - - self.output = tf.contrib.layers.flatten(self.observation_conv3) - - elif self.embedder_depth == EmbedderDepth.Deep: - # the embedder used in the CARLA papers - self.observation_conv1 = tf.layers.conv2d(rescaled_observation_stack, - filters=32, kernel_size=(5, 5), strides=(2, 2), - activation=self.activation_function, data_format='channels_last', - name='conv1') - self.observation_conv2 = tf.layers.conv2d(self.observation_conv1, - filters=32, kernel_size=(3, 3), strides=(1, 1), - activation=self.activation_function, data_format='channels_last', - name='conv2') - self.observation_conv3 = tf.layers.conv2d(self.observation_conv2, - filters=64, kernel_size=(3, 3), strides=(2, 2), - activation=self.activation_function, data_format='channels_last', - name='conv3') - self.observation_conv4 = tf.layers.conv2d(self.observation_conv3, - filters=64, kernel_size=(3, 3), strides=(1, 1), - activation=self.activation_function, data_format='channels_last', - name='conv4') - self.observation_conv5 = tf.layers.conv2d(self.observation_conv4, - filters=128, kernel_size=(3, 3), strides=(2, 2), - activation=self.activation_function, data_format='channels_last', - name='conv5') - self.observation_conv6 = tf.layers.conv2d(self.observation_conv5, - filters=128, kernel_size=(3, 3), strides=(1, 1), - activation=self.activation_function, data_format='channels_last', - name='conv6') - self.observation_conv7 = tf.layers.conv2d(self.observation_conv6, - filters=256, kernel_size=(3, 3), strides=(2, 2), - activation=self.activation_function, data_format='channels_last', - name='conv7') - self.observation_conv8 = tf.layers.conv2d(self.observation_conv7, - filters=256, kernel_size=(3, 3), strides=(1, 1), - activation=self.activation_function, data_format='channels_last', - name='conv8') - - self.output = tf.contrib.layers.flatten(self.observation_conv8) - else: - raise ValueError("The defined embedder complexity value is invalid") - - -class VectorEmbedder(InputEmbedder): - def __init__(self, input_size, activation_function=tf.nn.relu, - embedder_depth=EmbedderDepth.Shallow, embedder_width=EmbedderWidth.Wide, - name="embedder"): - InputEmbedder.__init__(self, input_size, activation_function, embedder_depth, embedder_width, name) - - def _build_module(self): - # vector observation - input_layer = tf.contrib.layers.flatten(self.input) - - width = 128 if self.embedder_width == EmbedderWidth.Wide else 32 - - if self.embedder_depth == EmbedderDepth.Shallow: - self.output = tf.layers.dense(input_layer, 2*width, activation=self.activation_function, - name='fc1') - - elif self.embedder_depth == EmbedderDepth.Deep: - # the embedder used in the CARLA papers - self.observation_fc1 = tf.layers.dense(input_layer, width, activation=self.activation_function, - name='fc1') - self.observation_fc2 = tf.layers.dense(self.observation_fc1, width, activation=self.activation_function, - name='fc2') - self.output = tf.layers.dense(self.observation_fc2, width, activation=self.activation_function, - name='fc3') - else: - raise ValueError("The defined embedder complexity value is invalid") diff --git a/architectures/tensorflow_components/general_network.py b/architectures/tensorflow_components/general_network.py deleted file mode 100644 index a4e69ff..0000000 --- a/architectures/tensorflow_components/general_network.py +++ /dev/null @@ -1,206 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 architectures.tensorflow_components.embedders import * -from architectures.tensorflow_components.heads import * -from architectures.tensorflow_components.middleware import * -from architectures.tensorflow_components.architecture import * -from configurations import InputTypes, OutputTypes, MiddlewareTypes - - -class GeneralTensorFlowNetwork(TensorFlowArchitecture): - """ - A generalized version of all possible networks implemented using tensorflow. - """ - def __init__(self, tuning_parameters, name="", global_network=None, network_is_local=True): - self.global_network = global_network - self.network_is_local = network_is_local - self.num_heads_per_network = 1 if tuning_parameters.agent.use_separate_networks_per_head else \ - len(tuning_parameters.agent.output_types) - self.num_networks = 1 if not tuning_parameters.agent.use_separate_networks_per_head else \ - len(tuning_parameters.agent.output_types) - self.input_embedders = [] - self.output_heads = [] - self.activation_function = self.get_activation_function( - tuning_parameters.agent.hidden_layers_activation_function) - self.embedder_width = tuning_parameters.agent.embedder_width - - TensorFlowArchitecture.__init__(self, tuning_parameters, name, global_network, network_is_local) - - def get_activation_function(self, activation_function_string): - activation_functions = { - 'relu': tf.nn.relu, - 'tanh': tf.nn.tanh, - 'sigmoid': tf.nn.sigmoid, - 'elu': tf.nn.elu, - 'selu': tf.nn.selu, - 'none': None - } - assert activation_function_string in activation_functions.keys(), \ - "Activation function must be one of the following {}".format(activation_functions.keys()) - return activation_functions[activation_function_string] - - def get_input_embedder(self, embedder_type): - # the observation can be either an image or a vector - def get_observation_embedding(with_timestep=False): - if self.input_height > 1: - return ImageEmbedder((self.input_height, self.input_width, self.input_depth), name="observation", - input_rescaler=self.tp.agent.input_rescaler, embedder_width=self.embedder_width) - else: - return VectorEmbedder((self.input_width + int(with_timestep), self.input_depth), name="observation", - embedder_width=self.embedder_width) - - input_mapping = { - InputTypes.Observation: get_observation_embedding(), - InputTypes.Measurements: VectorEmbedder(self.measurements_size, name="measurements", - embedder_width=self.embedder_width), - InputTypes.GoalVector: VectorEmbedder(self.measurements_size, name="goal_vector", - embedder_width=self.embedder_width), - InputTypes.Action: VectorEmbedder((self.num_actions,), name="action", - embedder_width=self.embedder_width), - InputTypes.TimedObservation: get_observation_embedding(with_timestep=True), - } - return input_mapping[embedder_type] - - def get_middleware_embedder(self, middleware_type): - return {MiddlewareTypes.LSTM: LSTM_Embedder, - MiddlewareTypes.FC: FC_Embedder}.get(middleware_type)(self.activation_function, self.embedder_width) - - def get_output_head(self, head_type, head_idx, loss_weight=1.): - output_mapping = { - OutputTypes.Q: QHead, - OutputTypes.DuelingQ: DuelingQHead, - OutputTypes.V: VHead, - OutputTypes.Pi: PolicyHead, - OutputTypes.MeasurementsPrediction: MeasurementsPredictionHead, - OutputTypes.DNDQ: DNDQHead, - OutputTypes.NAF: NAFHead, - OutputTypes.PPO: PPOHead, - OutputTypes.PPO_V: PPOVHead, - OutputTypes.CategoricalQ: CategoricalQHead, - OutputTypes.QuantileRegressionQ: QuantileRegressionQHead - } - return output_mapping[head_type](self.tp, head_idx, loss_weight, self.network_is_local) - - def get_model(self, tuning_parameters): - """ - :param tuning_parameters: A Preset class instance with all the running paramaters - :type tuning_parameters: Preset - :return: A model - """ - assert len(self.tp.agent.input_types) > 0, "At least one input type should be defined" - assert len(self.tp.agent.output_types) > 0, "At least one output type should be defined" - assert self.tp.agent.middleware_type is not None, "Exactly one middleware type should be defined" - assert len(self.tp.agent.loss_weights) > 0, "At least one loss weight should be defined" - assert len(self.tp.agent.output_types) == len(self.tp.agent.loss_weights), \ - "Number of loss weights should match the number of output types" - local_network_in_distributed_training = self.global_network is not None and self.network_is_local - - tuning_parameters.activation_function = self.activation_function - - for network_idx in range(self.num_networks): - with tf.variable_scope('network_{}'.format(network_idx)): - #################### - # Input Embeddings # - #################### - - state_embedding = [] - for input_name, input_type in self.tp.agent.input_types.items(): - # get the class of the input embedder - input_embedder = self.get_input_embedder(input_type) - self.input_embedders.append(input_embedder) - - # input placeholders are reused between networks. on the first network, store the placeholders - # generated by the input_embedders in self.inputs. on the rest of the networks, pass - # the existing input_placeholders into the input_embedders. - if network_idx == 0: - input_placeholder, embedding = input_embedder() - self.inputs[input_name] = input_placeholder - else: - input_placeholder, embedding = input_embedder(self.inputs[input_name]) - - state_embedding.append(embedding) - - ############## - # Middleware # - ############## - - state_embedding = tf.concat(state_embedding, axis=-1) if len(state_embedding) > 1 else state_embedding[0] - self.middleware_embedder = self.get_middleware_embedder(self.tp.agent.middleware_type) - _, self.state_embedding = self.middleware_embedder(state_embedding) - - ################ - # Output Heads # - ################ - - for head_idx in range(self.num_heads_per_network): - for head_copy_idx in range(self.tp.agent.num_output_head_copies): - if self.tp.agent.use_separate_networks_per_head: - # if we use separate networks per head, then the head type corresponds top the network idx - head_type_idx = network_idx - else: - # if we use a single network with multiple heads, then the head type is the current head idx - head_type_idx = head_idx - self.output_heads.append(self.get_output_head(self.tp.agent.output_types[head_type_idx], - head_copy_idx, - self.tp.agent.loss_weights[head_type_idx])) - - if self.tp.agent.stop_gradients_from_head[head_idx]: - head_input = tf.stop_gradient(self.state_embedding) - else: - head_input = self.state_embedding - - # build the head - if self.network_is_local: - output, target_placeholder, input_placeholders = self.output_heads[-1](head_input) - self.targets.extend(target_placeholder) - else: - output, input_placeholders = self.output_heads[-1](head_input) - - self.outputs.extend(output) - # TODO: use head names as well - for placeholder_index, input_placeholder in enumerate(input_placeholders): - self.inputs['output_{}_{}'.format(head_idx, placeholder_index)] = input_placeholder - - # Losses - self.losses = tf.losses.get_losses(self.name) - self.losses += tf.losses.get_regularization_losses(self.name) - self.total_loss = tf.losses.compute_weighted_loss(self.losses, scope=self.name) - if self.tp.visualization.tensorboard: - tf.summary.scalar('total_loss', self.total_loss) - - - # Learning rate - if self.tp.learning_rate_decay_rate != 0: - self.tp.learning_rate = tf.train.exponential_decay( - self.tp.learning_rate, self.global_step, decay_steps=self.tp.learning_rate_decay_steps, - decay_rate=self.tp.learning_rate_decay_rate, staircase=True) - - # Optimizer - if local_network_in_distributed_training and \ - hasattr(self.tp.agent, "shared_optimizer") and self.tp.agent.shared_optimizer: - # distributed training and this is the local network instantiation - self.optimizer = self.global_network.optimizer - else: - if tuning_parameters.agent.optimizer_type == 'Adam': - self.optimizer = tf.train.AdamOptimizer(learning_rate=tuning_parameters.learning_rate) - elif tuning_parameters.agent.optimizer_type == 'RMSProp': - self.optimizer = tf.train.RMSPropOptimizer(tuning_parameters.learning_rate, decay=0.9, epsilon=0.01) - elif tuning_parameters.agent.optimizer_type == 'LBFGS': - self.optimizer = tf.contrib.opt.ScipyOptimizerInterface(self.total_loss, method='L-BFGS-B', - options={'maxiter': 25}) - else: - raise Exception("{} is not a valid optimizer type".format(tuning_parameters.agent.optimizer_type)) diff --git a/architectures/tensorflow_components/heads.py b/architectures/tensorflow_components/heads.py deleted file mode 100644 index b463d7f..0000000 --- a/architectures/tensorflow_components/heads.py +++ /dev/null @@ -1,558 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 tensorflow as tf -import numpy as np -from utils import force_list - - -# Used to initialize weights for policy and value output layers -def normalized_columns_initializer(std=1.0): - def _initializer(shape, dtype=None, partition_info=None): - out = np.random.randn(*shape).astype(np.float32) - out *= std / np.sqrt(np.square(out).sum(axis=0, keepdims=True)) - return tf.constant(out) - return _initializer - - -class Head(object): - def __init__(self, tuning_parameters, head_idx=0, loss_weight=1., is_local=True): - self.head_idx = head_idx - self.name = "head" - self.output = [] - self.loss = [] - self.loss_type = [] - self.regularizations = [] - self.loss_weight = force_list(loss_weight) - self.target = [] - self.input = [] - self.is_local = is_local - - def __call__(self, input_layer): - """ - Wrapper for building the module graph including scoping and loss creation - :param input_layer: the input to the graph - :return: the output of the last layer and the target placeholder - """ - with tf.variable_scope(self.get_name(), initializer=tf.contrib.layers.xavier_initializer()): - self._build_module(input_layer) - - self.output = force_list(self.output) - self.target = force_list(self.target) - self.input = force_list(self.input) - self.loss_type = force_list(self.loss_type) - self.loss = force_list(self.loss) - self.regularizations = force_list(self.regularizations) - if self.is_local: - self.set_loss() - self._post_build() - - if self.is_local: - return self.output, self.target, self.input - else: - return self.output, self.input - - def _build_module(self, input_layer): - """ - Builds the graph of the module - - This method is called early on from __call__. It is expected to store the graph - in self.output. - - :param input_layer: the input to the graph - :return: None - """ - pass - - def _post_build(self): - """ - Optional function that allows adding any extra definitions after the head has been fully defined - For example, this allows doing additional calculations that are based on the loss - :return: None - """ - pass - - def get_name(self): - """ - Get a formatted name for the module - :return: the formatted name - """ - return '{}_{}'.format(self.name, self.head_idx) - - def set_loss(self): - """ - Creates a target placeholder and loss function for each loss_type and regularization - :param loss_type: a tensorflow loss function - :param scope: the name scope to include the tensors in - :return: None - """ - # add losses and target placeholder - for idx in range(len(self.loss_type)): - target = tf.placeholder('float', self.output[idx].shape, '{}_target'.format(self.get_name())) - self.target.append(target) - loss = self.loss_type[idx](self.target[-1], self.output[idx], - weights=self.loss_weight[idx], scope=self.get_name()) - self.loss.append(loss) - - # add regularizations - for regularization in self.regularizations: - self.loss.append(regularization) - - -class QHead(Head): - def __init__(self, tuning_parameters, head_idx=0, loss_weight=1., is_local=True): - Head.__init__(self, tuning_parameters, head_idx, loss_weight, is_local) - self.name = 'q_values_head' - self.num_actions = tuning_parameters.env_instance.action_space_size - if tuning_parameters.agent.replace_mse_with_huber_loss: - self.loss_type = tf.losses.huber_loss - else: - self.loss_type = tf.losses.mean_squared_error - - def _build_module(self, input_layer): - # Standard Q Network - self.output = tf.layers.dense(input_layer, self.num_actions, name='output') - - -class DuelingQHead(QHead): - def __init__(self, tuning_parameters, head_idx=0, loss_weight=1., is_local=True): - QHead.__init__(self, tuning_parameters, head_idx, loss_weight, is_local) - - def _build_module(self, input_layer): - # state value tower - V - with tf.variable_scope("state_value"): - state_value = tf.layers.dense(input_layer, 256, activation=tf.nn.relu, name='fc1') - state_value = tf.layers.dense(state_value, 1, name='fc2') - # state_value = tf.expand_dims(state_value, axis=-1) - - # action advantage tower - A - with tf.variable_scope("action_advantage"): - action_advantage = tf.layers.dense(input_layer, 256, activation=tf.nn.relu, name='fc1') - action_advantage = tf.layers.dense(action_advantage, self.num_actions, name='fc2') - action_advantage = action_advantage - tf.reduce_mean(action_advantage) - - # merge to state-action value function Q - self.output = tf.add(state_value, action_advantage, name='output') - - -class VHead(Head): - def __init__(self, tuning_parameters, head_idx=0, loss_weight=1., is_local=True): - Head.__init__(self, tuning_parameters, head_idx, loss_weight, is_local) - self.name = 'v_values_head' - if tuning_parameters.agent.replace_mse_with_huber_loss: - self.loss_type = tf.losses.huber_loss - else: - self.loss_type = tf.losses.mean_squared_error - - def _build_module(self, input_layer): - # Standard V Network - self.output = tf.layers.dense(input_layer, 1, name='output', - kernel_initializer=normalized_columns_initializer(1.0)) - - -class PolicyHead(Head): - def __init__(self, tuning_parameters, head_idx=0, loss_weight=1., is_local=True): - Head.__init__(self, tuning_parameters, head_idx, loss_weight, is_local) - self.name = 'policy_values_head' - self.num_actions = tuning_parameters.env_instance.action_space_size - self.output_scale = np.max(tuning_parameters.env_instance.action_space_abs_range) - self.discrete_controls = tuning_parameters.env_instance.discrete_controls - self.exploration_policy = tuning_parameters.exploration.policy - self.exploration_variance = 2*self.output_scale*tuning_parameters.exploration.initial_noise_variance_percentage - if not self.discrete_controls and not self.output_scale: - raise ValueError("For continuous controls, an output scale for the network must be specified") - self.beta = tuning_parameters.agent.beta_entropy - - def _build_module(self, input_layer): - eps = 1e-15 - if self.discrete_controls: - self.actions = tf.placeholder(tf.int32, [None], name="actions") - else: - self.actions = tf.placeholder(tf.float32, [None, self.num_actions], name="actions") - self.input = [self.actions] - - # Policy Head - if self.discrete_controls: - policy_values = tf.layers.dense(input_layer, self.num_actions, name='fc') - self.policy_mean = tf.nn.softmax(policy_values, name="policy") - - # define the distributions for the policy and the old policy - # (the + eps is to prevent probability 0 which will cause the log later on to be -inf) - self.policy_distribution = tf.contrib.distributions.Categorical(probs=(self.policy_mean + eps)) - self.output = self.policy_mean - else: - # mean - policy_values_mean = tf.layers.dense(input_layer, self.num_actions, activation=tf.nn.tanh, name='fc_mean') - self.policy_mean = tf.multiply(policy_values_mean, self.output_scale, name='output_mean') - - self.output = [self.policy_mean] - - # std - if self.exploration_policy == 'ContinuousEntropy': - policy_values_std = tf.layers.dense(input_layer, self.num_actions, - kernel_initializer=normalized_columns_initializer(0.01), name='fc_std') - self.policy_std = tf.nn.softplus(policy_values_std, name='output_variance') + eps - - self.output.append(self.policy_std) - - else: - self.policy_std = tf.constant(self.exploration_variance, dtype='float32', shape=(self.num_actions,)) - - # define the distributions for the policy and the old policy - self.policy_distribution = tf.contrib.distributions.MultivariateNormalDiag(self.policy_mean, - self.policy_std) - - if self.is_local: - # add entropy regularization - if self.beta: - self.entropy = tf.reduce_mean(self.policy_distribution.entropy()) - self.regularizations = -tf.multiply(self.beta, self.entropy, name='entropy_regularization') - tf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES, self.regularizations) - - # calculate loss - self.action_log_probs_wrt_policy = self.policy_distribution.log_prob(self.actions) - self.advantages = tf.placeholder(tf.float32, [None], name="advantages") - self.target = self.advantages - self.loss = -tf.reduce_mean(self.action_log_probs_wrt_policy * self.advantages) - tf.losses.add_loss(self.loss_weight[0] * self.loss) - - -class MeasurementsPredictionHead(Head): - def __init__(self, tuning_parameters, head_idx=0, loss_weight=1., is_local=True): - Head.__init__(self, tuning_parameters, head_idx, loss_weight, is_local) - self.name = 'future_measurements_head' - self.num_actions = tuning_parameters.env_instance.action_space_size - self.num_measurements = tuning_parameters.env.measurements_size[0] \ - if tuning_parameters.env.measurements_size else 0 - self.num_prediction_steps = tuning_parameters.agent.num_predicted_steps_ahead - self.multi_step_measurements_size = self.num_measurements * self.num_prediction_steps - if tuning_parameters.agent.replace_mse_with_huber_loss: - self.loss_type = tf.losses.huber_loss - else: - self.loss_type = tf.losses.mean_squared_error - - def _build_module(self, input_layer): - # This is almost exactly the same as Dueling Network but we predict the future measurements for each action - # actions expectation tower (expectation stream) - E - with tf.variable_scope("expectation_stream"): - expectation_stream = tf.layers.dense(input_layer, 256, activation=tf.nn.elu, name='fc1') - expectation_stream = tf.layers.dense(expectation_stream, self.multi_step_measurements_size, name='output') - expectation_stream = tf.expand_dims(expectation_stream, axis=1) - - # action fine differences tower (action stream) - A - with tf.variable_scope("action_stream"): - action_stream = tf.layers.dense(input_layer, 256, activation=tf.nn.elu, name='fc1') - action_stream = tf.layers.dense(action_stream, self.num_actions * self.multi_step_measurements_size, - name='output') - action_stream = tf.reshape(action_stream, - (tf.shape(action_stream)[0], self.num_actions, self.multi_step_measurements_size)) - action_stream = action_stream - tf.reduce_mean(action_stream, reduction_indices=1, keep_dims=True) - - # merge to future measurements predictions - self.output = tf.add(expectation_stream, action_stream, name='output') - - -class DNDQHead(Head): - def __init__(self, tuning_parameters, head_idx=0, loss_weight=1., is_local=True): - Head.__init__(self, tuning_parameters, head_idx, loss_weight, is_local) - self.name = 'dnd_q_values_head' - self.num_actions = tuning_parameters.env_instance.action_space_size - self.DND_size = tuning_parameters.agent.dnd_size - self.DND_key_error_threshold = tuning_parameters.agent.DND_key_error_threshold - self.l2_norm_added_delta = tuning_parameters.agent.l2_norm_added_delta - self.new_value_shift_coefficient = tuning_parameters.agent.new_value_shift_coefficient - self.number_of_nn = tuning_parameters.agent.number_of_knn - if tuning_parameters.agent.replace_mse_with_huber_loss: - self.loss_type = tf.losses.huber_loss - else: - self.loss_type = tf.losses.mean_squared_error - self.tp = tuning_parameters - self.dnd_embeddings = [None]*self.num_actions - self.dnd_values = [None]*self.num_actions - self.dnd_indices = [None]*self.num_actions - - def _build_module(self, input_layer): - # DND based Q head - from memories import differentiable_neural_dictionary - - if self.tp.checkpoint_restore_dir: - self.DND = differentiable_neural_dictionary.load_dnd(self.tp.checkpoint_restore_dir) - else: - self.DND = differentiable_neural_dictionary.QDND( - self.DND_size, input_layer.get_shape()[-1], self.num_actions, self.new_value_shift_coefficient, - key_error_threshold=self.DND_key_error_threshold, learning_rate=self.tp.learning_rate) - - # Retrieve info from DND dictionary - # We assume that all actions have enough entries in the DND - self.output = tf.transpose([ - self._q_value(input_layer, action) - for action in range(self.num_actions) - ]) - - def _q_value(self, input_layer, action): - result = tf.py_func(self.DND.query, - [input_layer, action, self.number_of_nn], - [tf.float64, tf.float64, tf.int64]) - self.dnd_embeddings[action] = tf.to_float(result[0]) - self.dnd_values[action] = tf.to_float(result[1]) - self.dnd_indices[action] = result[2] - - # DND calculation - square_diff = tf.square(self.dnd_embeddings[action] - tf.expand_dims(input_layer, 1)) - distances = tf.reduce_sum(square_diff, axis=2) + [self.l2_norm_added_delta] - weights = 1.0 / distances - normalised_weights = weights / tf.reduce_sum(weights, axis=1, keep_dims=True) - return tf.reduce_sum(self.dnd_values[action] * normalised_weights, axis=1) - - -class NAFHead(Head): - def __init__(self, tuning_parameters, head_idx=0, loss_weight=1., is_local=True): - Head.__init__(self, tuning_parameters, head_idx, loss_weight, is_local) - self.name = 'naf_q_values_head' - self.num_actions = tuning_parameters.env_instance.action_space_size - self.output_scale = np.max(tuning_parameters.env_instance.action_space_abs_range) - if tuning_parameters.agent.replace_mse_with_huber_loss: - self.loss_type = tf.losses.huber_loss - else: - self.loss_type = tf.losses.mean_squared_error - - def _build_module(self, input_layer): - # NAF - self.action = tf.placeholder(tf.float32, [None, self.num_actions], name="action") - self.input = self.action - - # V Head - self.V = tf.layers.dense(input_layer, 1, name='V') - - # mu Head - mu_unscaled = tf.layers.dense(input_layer, self.num_actions, activation=tf.nn.tanh, name='mu_unscaled') - self.mu = tf.multiply(mu_unscaled, self.output_scale, name='mu') - - # A Head - # l_vector is a vector that includes a lower-triangular matrix values - self.l_vector = tf.layers.dense(input_layer, (self.num_actions * (self.num_actions + 1)) / 2, name='l_vector') - - # Convert l to a lower triangular matrix and exponentiate its diagonal - - i = 0 - columns = [] - for col in range(self.num_actions): - start_row = col - num_non_zero_elements = self.num_actions - start_row - zeros_column_part = tf.zeros_like(self.l_vector[:, 0:start_row]) - diag_element = tf.expand_dims(tf.exp(self.l_vector[:, i]), 1) - non_zeros_non_diag_column_part = self.l_vector[:, (i + 1):(i + num_non_zero_elements)] - columns.append(tf.concat([zeros_column_part, diag_element, non_zeros_non_diag_column_part], axis=1)) - i += num_non_zero_elements - self.L = tf.transpose(tf.stack(columns, axis=1), (0, 2, 1)) - - # P = L*L^T - self.P = tf.matmul(self.L, tf.transpose(self.L, (0, 2, 1))) - - # A = -1/2 * (u - mu)^T * P * (u - mu) - action_diff = tf.expand_dims(self.action - self.mu, -1) - a_matrix_form = -0.5 * tf.matmul(tf.transpose(action_diff, (0, 2, 1)), tf.matmul(self.P, action_diff)) - self.A = tf.reshape(a_matrix_form, [-1, 1]) - - # Q Head - self.Q = tf.add(self.V, self.A, name='Q') - - self.output = self.Q - - -class PPOHead(Head): - def __init__(self, tuning_parameters, head_idx=0, loss_weight=1., is_local=True): - Head.__init__(self, tuning_parameters, head_idx, loss_weight, is_local) - self.name = 'ppo_head' - self.num_actions = tuning_parameters.env_instance.action_space_size - self.discrete_controls = tuning_parameters.env_instance.discrete_controls - self.output_scale = np.max(tuning_parameters.env_instance.action_space_abs_range) - - # kl coefficient and its corresponding assignment operation and placeholder - self.kl_coefficient = tf.Variable(tuning_parameters.agent.initial_kl_coefficient, - trainable=False, name='kl_coefficient') - self.kl_coefficient_ph = tf.placeholder('float', name='kl_coefficient_ph') - self.assign_kl_coefficient = tf.assign(self.kl_coefficient, self.kl_coefficient_ph) - - self.kl_cutoff = 2*tuning_parameters.agent.target_kl_divergence - self.high_kl_penalty_coefficient = tuning_parameters.agent.high_kl_penalty_coefficient - self.clip_likelihood_ratio_using_epsilon = tuning_parameters.agent.clip_likelihood_ratio_using_epsilon - self.use_kl_regularization = tuning_parameters.agent.use_kl_regularization - self.beta = tuning_parameters.agent.beta_entropy - - def _build_module(self, input_layer): - eps = 1e-15 - if self.discrete_controls: - self.actions = tf.placeholder(tf.int32, [None], name="actions") - else: - self.actions = tf.placeholder(tf.float32, [None, self.num_actions], name="actions") - self.old_policy_mean = tf.placeholder(tf.float32, [None, self.num_actions], "old_policy_mean") - self.old_policy_std = tf.placeholder(tf.float32, [None, self.num_actions], "old_policy_std") - - # Policy Head - if self.discrete_controls: - self.input = [self.actions, self.old_policy_mean] - policy_values = tf.layers.dense(input_layer, self.num_actions, name='policy_fc') - self.policy_mean = tf.nn.softmax(policy_values, name="policy") - - # define the distributions for the policy and the old policy - self.policy_distribution = tf.contrib.distributions.Categorical(probs=(self.policy_mean + eps)) - self.old_policy_distribution = tf.contrib.distributions.Categorical(probs=self.old_policy_mean) - - self.output = self.policy_mean - else: - self.input = [self.actions, self.old_policy_mean, self.old_policy_std] - self.policy_mean = tf.layers.dense(input_layer, self.num_actions, name='policy_mean') - self.policy_logstd = tf.Variable(np.zeros((1, self.num_actions)), dtype='float32') - self.policy_std = tf.tile(tf.exp(self.policy_logstd), [tf.shape(input_layer)[0], 1], name='policy_std') - - # define the distributions for the policy and the old policy - self.policy_distribution = tf.contrib.distributions.MultivariateNormalDiag(self.policy_mean, - self.policy_std) - self.old_policy_distribution = tf.contrib.distributions.MultivariateNormalDiag(self.old_policy_mean, - self.old_policy_std) - - self.output = [self.policy_mean, self.policy_std] - - self.action_probs_wrt_policy = tf.exp(self.policy_distribution.log_prob(self.actions)) - self.action_probs_wrt_old_policy = tf.exp(self.old_policy_distribution.log_prob(self.actions)) - self.entropy = tf.reduce_mean(self.policy_distribution.entropy()) - - # add kl divergence regularization - self.kl_divergence = tf.reduce_mean(tf.contrib.distributions.kl_divergence(self.old_policy_distribution, - self.policy_distribution)) - if self.use_kl_regularization: - # no clipping => use kl regularization - self.weighted_kl_divergence = tf.multiply(self.kl_coefficient, self.kl_divergence) - self.regularizations = self.weighted_kl_divergence + self.high_kl_penalty_coefficient * \ - tf.square(tf.maximum(0.0, self.kl_divergence - self.kl_cutoff)) - tf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES, self.regularizations) - - # calculate surrogate loss - self.advantages = tf.placeholder(tf.float32, [None], name="advantages") - self.target = self.advantages - self.likelihood_ratio = self.action_probs_wrt_policy / (self.action_probs_wrt_old_policy + eps) - if self.clip_likelihood_ratio_using_epsilon is not None: - max_value = 1 + self.clip_likelihood_ratio_using_epsilon - min_value = 1 - self.clip_likelihood_ratio_using_epsilon - self.clipped_likelihood_ratio = tf.clip_by_value(self.likelihood_ratio, min_value, max_value) - self.scaled_advantages = tf.minimum(self.likelihood_ratio * self.advantages, - self.clipped_likelihood_ratio * self.advantages) - else: - self.scaled_advantages = self.likelihood_ratio * self.advantages - # minus sign is in order to set an objective to minimize (we actually strive for maximizing the surrogate loss) - self.surrogate_loss = -tf.reduce_mean(self.scaled_advantages) - if self.is_local: - # add entropy regularization - if self.beta: - self.entropy = tf.reduce_mean(self.policy_distribution.entropy()) - self.regularizations = -tf.multiply(self.beta, self.entropy, name='entropy_regularization') - tf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES, self.regularizations) - - self.loss = self.surrogate_loss - tf.losses.add_loss(self.loss) - - -class PPOVHead(Head): - def __init__(self, tuning_parameters, head_idx=0, loss_weight=1., is_local=True): - Head.__init__(self, tuning_parameters, head_idx, loss_weight, is_local) - self.name = 'ppo_v_head' - self.clip_likelihood_ratio_using_epsilon = tuning_parameters.agent.clip_likelihood_ratio_using_epsilon - - def _build_module(self, input_layer): - self.old_policy_value = tf.placeholder(tf.float32, [None], "old_policy_values") - self.input = [self.old_policy_value] - self.output = tf.layers.dense(input_layer, 1, name='output', - kernel_initializer=normalized_columns_initializer(1.0)) - self.target = self.total_return = tf.placeholder(tf.float32, [None], name="total_return") - - value_loss_1 = tf.square(self.output - self.target) - value_loss_2 = tf.square(self.old_policy_value + - tf.clip_by_value(self.output - self.old_policy_value, - -self.clip_likelihood_ratio_using_epsilon, - self.clip_likelihood_ratio_using_epsilon) - self.target) - self.vf_loss = tf.reduce_mean(tf.maximum(value_loss_1, value_loss_2)) - self.loss = self.vf_loss - tf.losses.add_loss(self.loss) - - -class CategoricalQHead(Head): - def __init__(self, tuning_parameters, head_idx=0, loss_weight=1., is_local=True): - Head.__init__(self, tuning_parameters, head_idx, loss_weight, is_local) - self.name = 'categorical_dqn_head' - self.num_actions = tuning_parameters.env_instance.action_space_size - self.num_atoms = tuning_parameters.agent.atoms - - def _build_module(self, input_layer): - self.actions = tf.placeholder(tf.int32, [None], name="actions") - self.input = [self.actions] - - values_distribution = tf.layers.dense(input_layer, self.num_actions * self.num_atoms, name='output') - values_distribution = tf.reshape(values_distribution, (tf.shape(values_distribution)[0], self.num_actions, self.num_atoms)) - # softmax on atoms dimension - self.output = tf.nn.softmax(values_distribution) - - # calculate cross entropy loss - self.distributions = tf.placeholder(tf.float32, shape=(None, self.num_actions, self.num_atoms), name="distributions") - self.target = self.distributions - self.loss = tf.nn.softmax_cross_entropy_with_logits(labels=self.target, logits=values_distribution) - tf.losses.add_loss(self.loss) - - -class QuantileRegressionQHead(Head): - def __init__(self, tuning_parameters, head_idx=0, loss_weight=1., is_local=True): - Head.__init__(self, tuning_parameters, head_idx, loss_weight, is_local) - self.name = 'quantile_regression_dqn_head' - self.num_actions = tuning_parameters.env_instance.action_space_size - self.num_atoms = tuning_parameters.agent.atoms # we use atom / quantile interchangeably - self.huber_loss_interval = 1 # k - - def _build_module(self, input_layer): - self.actions = tf.placeholder(tf.int32, [None, 2], name="actions") - self.quantile_midpoints = tf.placeholder(tf.float32, [None, self.num_atoms], name="quantile_midpoints") - self.input = [self.actions, self.quantile_midpoints] - - # the output of the head is the N unordered quantile locations {theta_1, ..., theta_N} - quantiles_locations = tf.layers.dense(input_layer, self.num_actions * self.num_atoms, name='output') - quantiles_locations = tf.reshape(quantiles_locations, (tf.shape(quantiles_locations)[0], self.num_actions, self.num_atoms)) - self.output = quantiles_locations - - self.quantiles = tf.placeholder(tf.float32, shape=(None, self.num_atoms), name="quantiles") - self.target = self.quantiles - - # only the quantiles of the taken action are taken into account - quantiles_for_used_actions = tf.gather_nd(quantiles_locations, self.actions) - - # reorder the output quantiles and the target quantiles as a preparation step for calculating the loss - # the output quantiles vector and the quantile midpoints are tiled as rows of a NxN matrix (N = num quantiles) - # the target quantiles vector is tiled as column of a NxN matrix - theta_i = tf.tile(tf.expand_dims(quantiles_for_used_actions, -1), [1, 1, self.num_atoms]) - T_theta_j = tf.tile(tf.expand_dims(self.target, -2), [1, self.num_atoms, 1]) - tau_i = tf.tile(tf.expand_dims(self.quantile_midpoints, -1), [1, 1, self.num_atoms]) - - # Huber loss of T(theta_j) - theta_i - error = T_theta_j - theta_i - abs_error = tf.abs(error) - quadratic = tf.minimum(abs_error, self.huber_loss_interval) - huber_loss = self.huber_loss_interval * (abs_error - quadratic) + 0.5 * quadratic ** 2 - - # Quantile Huber loss - quantile_huber_loss = tf.abs(tau_i - tf.cast(error < 0, dtype=tf.float32)) * huber_loss - - # Quantile regression loss (the probability for each quantile is 1/num_quantiles) - quantile_regression_loss = tf.reduce_sum(quantile_huber_loss) / float(self.num_atoms) - self.loss = quantile_regression_loss - tf.losses.add_loss(self.loss) diff --git a/architectures/tensorflow_components/middleware.py b/architectures/tensorflow_components/middleware.py deleted file mode 100644 index eee5925..0000000 --- a/architectures/tensorflow_components/middleware.py +++ /dev/null @@ -1,77 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 tensorflow as tf -import numpy as np -from configurations import EmbedderWidth - - -class MiddlewareEmbedder(object): - def __init__(self, activation_function=tf.nn.relu, embedder_width=EmbedderWidth.Wide, name="middleware_embedder"): - self.name = name - self.input = None - self.output = None - self.embedder_width = embedder_width - self.activation_function = activation_function - - def __call__(self, input_layer): - with tf.variable_scope(self.get_name()): - self.input = input_layer - self._build_module() - - return self.input, self.output - - def _build_module(self): - pass - - def get_name(self): - return self.name - - -class LSTM_Embedder(MiddlewareEmbedder): - def _build_module(self): - """ - self.state_in: tuple of placeholders containing the initial state - self.state_out: tuple of output state - - todo: it appears that the shape of the output is batch, feature - the code here seems to be slicing off the first element in the batch - which would definitely be wrong. need to double check the shape - """ - - middleware = tf.layers.dense(self.input, 512, activation=self.activation_function, name='fc1') - lstm_cell = tf.contrib.rnn.BasicLSTMCell(256, state_is_tuple=True) - self.c_init = np.zeros((1, lstm_cell.state_size.c), np.float32) - self.h_init = np.zeros((1, lstm_cell.state_size.h), np.float32) - self.state_init = [self.c_init, self.h_init] - self.c_in = tf.placeholder(tf.float32, [1, lstm_cell.state_size.c]) - self.h_in = tf.placeholder(tf.float32, [1, lstm_cell.state_size.h]) - self.state_in = (self.c_in, self.h_in) - rnn_in = tf.expand_dims(middleware, [0]) - step_size = tf.shape(middleware)[:1] - state_in = tf.contrib.rnn.LSTMStateTuple(self.c_in, self.h_in) - lstm_outputs, lstm_state = tf.nn.dynamic_rnn( - lstm_cell, rnn_in, initial_state=state_in, sequence_length=step_size, time_major=False) - lstm_c, lstm_h = lstm_state - self.state_out = (lstm_c[:1, :], lstm_h[:1, :]) - self.output = tf.reshape(lstm_outputs, [-1, 256]) - - -class FC_Embedder(MiddlewareEmbedder): - def _build_module(self): - width = 512 if self.embedder_width == EmbedderWidth.Wide else 64 - self.output = tf.layers.dense(self.input, width, activation=self.activation_function, name='fc1') - diff --git a/architectures/tensorflow_components/shared_variables.py b/architectures/tensorflow_components/shared_variables.py deleted file mode 100644 index 2775251..0000000 --- a/architectures/tensorflow_components/shared_variables.py +++ /dev/null @@ -1,82 +0,0 @@ -# -# Copyright (c) 2017 Intel 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 tensorflow as tf -import numpy as np - - -class SharedRunningStats(object): - def __init__(self, tuning_parameters, replicated_device, epsilon=1e-2, shape=(), name=""): - self.tp = tuning_parameters - with tf.device(replicated_device): - with tf.variable_scope(name): - self._sum = tf.get_variable( - dtype=tf.float64, - shape=shape, - initializer=tf.constant_initializer(0.0), - name="running_sum", trainable=False) - self._sum_squared = tf.get_variable( - dtype=tf.float64, - shape=shape, - initializer=tf.constant_initializer(epsilon), - name="running_sum_squared", trainable=False) - self._count = tf.get_variable( - dtype=tf.float64, - shape=(), - initializer=tf.constant_initializer(epsilon), - name="count", trainable=False) - - self._shape = shape - self._mean = self._sum / self._count - self._std = tf.sqrt(tf.maximum((self._sum_squared - self._count*tf.square(self._mean)) - / tf.maximum(self._count-1, 1), epsilon)) - - self.new_sum = tf.placeholder(shape=self.shape, dtype=tf.float64, name='sum') - self.new_sum_squared = tf.placeholder(shape=self.shape, dtype=tf.float64, name='var') - self.newcount = tf.placeholder(shape=[], dtype=tf.float64, name='count') - - self._inc_sum = tf.assign_add(self._sum, self.new_sum, use_locking=True) - self._inc_sum_squared = tf.assign_add(self._sum_squared, self.new_sum_squared, use_locking=True) - self._inc_count = tf.assign_add(self._count, self.newcount, use_locking=True) - - def push(self, x): - x = x.astype('float64') - self.tp.sess.run([self._inc_sum, self._inc_sum_squared, self._inc_count], - feed_dict={ - self.new_sum: x.sum(axis=0).ravel(), - self.new_sum_squared: np.square(x).sum(axis=0).ravel(), - self.newcount: np.array(len(x), dtype='float64') - }) - - @property - def n(self): - return self.tp.sess.run(self._count) - - @property - def mean(self): - return self.tp.sess.run(self._mean) - - @property - def var(self): - return self.std ** 2 - - @property - def std(self): - return self.tp.sess.run(self._std) - - @property - def shape(self): - return self._shape \ No newline at end of file diff --git a/benchmarks/README.md b/benchmarks/README.md index ba237e7..0c00442 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -1,172 +1,44 @@ # Coach Benchmarks -The following figures are training curves of some of the presets available through Coach. -The X axis in all the figures is the total steps (for multi-threaded runs, this is the accumulated number of steps over all the workers). -The Y axis in all the figures is the average episode reward with an averaging window of 11 episodes. +The following table represents the current status of algorithms implemented in Coach relative to the results reported in the original papers. The detailed results for each algorithm can be seen by clicking on its name. + +The X axis in all the figures is the total steps (for multi-threaded runs, this is the number of steps per worker). +The Y axis in all the figures is the average episode reward with an averaging window of 100 timesteps. + +For each algorithm, there is a command line for reproducing the results of each graph. These are the results you can expect to get when running the pre-defined presets in Coach. +The environments that were used for testing include: +* **Atari** - Breakout, Pong and Space Invaders +* **Mujoco** - Inverted Pendulum, Inverted Double Pendulum, Reacher, Hopper, Half Cheetah, Walker 2D, Ant, Swimmer and Humanoid. +* **Doom** - Basic, Health Gathering (D1: Basic), Health Gathering Supreme (D2: Navigation), Battle (D3: Battle) +* **Fetch** - Reach, Slide, Push, Pick-and-Place -## A3C +## Summary -### Breakout_A3C with 16 workers +![#2E8B57](https://placehold.it/15/2E8B57/000000?text=+) *Reproducing paper's results* -```bash -python3 coach.py -p Breakout_A3C -n 16 -r -``` +![#ceffad](https://placehold.it/15/ceffad/000000?text=+) *Reproducing paper's results for some of the environments* -Breakout_A3C_16_workers +![#FFA500](https://placehold.it/15/FFA500/000000?text=+) *Training but not reproducing paper's results* -### InvertedPendulum_A3C with 16 workers +![#FF4040](https://placehold.it/15/FF4040/000000?text=+) *Not training* -```bash -python3 coach.py -p InvertedPendulum_A3C -n 16 -r -``` -Inverted_Pendulum_A3C_16_workers +| |**Status** |**Environments**|**Comments**| +| ----------------------- |:--------------------------------------------------------:|:--------------:|:--------:| +|**[DQN](dqn)** | ![#ceffad](https://placehold.it/15/ceffad/000000?text=+) |Atari | Pong is not training | +|**[Dueling DDQN](dueling_ddqn)**| ![#ceffad](https://placehold.it/15/ceffad/000000?text=+) |Atari | Pong is not training | +|**[Dueling DDQN with PER](dueling_ddqn_with_per)**| ![#2E8B57](https://placehold.it/15/2E8B57/000000?text=+) |Atari | | +|**[Bootstrapped DQN](bootstrapped_dqn)**| ![#2E8B57](https://placehold.it/15/2E8B57/000000?text=+) |Atari | | +|**[QR-DQN](qr_dqn)** | ![#2E8B57](https://placehold.it/15/2E8B57/000000?text=+) |Atari | | +|**[A3C](a3c)** | ![#2E8B57](https://placehold.it/15/2E8B57/000000?text=+) |Atari, Mujoco | | +|**[Clipped PPO](clipped_ppo)** | ![#2E8B57](https://placehold.it/15/2E8B57/000000?text=+) |Mujoco | | +|**[DDPG](ddpg)** | ![#2E8B57](https://placehold.it/15/2E8B57/000000?text=+) |Mujoco | | +|**[NEC](nec)** | ![#2E8B57](https://placehold.it/15/2E8B57/000000?text=+) |Atari | | +|**[HER](ddpg_her)** | ![#2E8B57](https://placehold.it/15/2E8B57/000000?text=+) |Fetch | | +|**[HAC](hac)** | ![#969696](https://placehold.it/15/969696/000000?text=+) |Pendulum | | +|**[DFP](dfp)** | ![#ceffad](https://placehold.it/15/ceffad/000000?text=+) |Doom | Doom Battle was not verified | -### Hopper_A3C with 16 workers -```bash -python3 coach.py -p Hopper_A3C -n 16 -r -``` - -Hopper_A3C_16_workers - -### Ant_A3C with 16 workers - -```bash -python3 coach.py -p Ant_A3C -n 16 -r -``` - -Ant_A3C_16_workers - -## Clipped PPO - -### InvertedPendulum_ClippedPPO with 16 workers - -```bash -python3 coach.py -p InvertedPendulum_ClippedPPO -n 16 -r -``` - -InvertedPendulum_ClippedPPO_16_workers - -### Hopper_ClippedPPO with 16 workers - -```bash -python3 coach.py -p Hopper_ClippedPPO -n 16 -r -``` - -Hopper_Clipped_PPO_16_workers - -### Humanoid_ClippedPPO with 16 workers - -```bash -python3 coach.py -p Humanoid_ClippedPPO -n 16 -r -``` - -Humanoid_ClippedPPO_16_workers - -## DQN - -### Pong_DQN - -```bash -python3 coach.py -p Pong_DQN -r -``` - -Pong_DQN - -### Doom_Basic_DQN - -```bash -python3 coach.py -p Doom_Basic_DQN -r -``` - -Doom_Basic_DQN - -## Dueling DDQN - -### Doom_Basic_Dueling_DDQN - -```bash -python3 coach.py -p Doom_Basic_Dueling_DDQN -r -``` - -Doom_Basic_Dueling_DDQN - -## DFP - -### Doom_Health_DFP - -```bash -python3 coach.py -p Doom_Health_DFP -r -``` - -Doom_Health_DFP - -## MMC - -### Doom_Health_MMC - -```bash -python3 coach.py -p Doom_Health_MMC -r -``` - -Doom_Health_MMC - -## NEC - -## Pong_NEC - -```bash -python3 coach.py -p Pong_NEC -r -``` - -Pong_NEC - -## Doom_Basic_NEC - -```bash -python3 coach.py -p Doom_Basic_NEC -r -``` - -Doom_Basic_NEC - -## PG - -### CartPole_PG - -```bash -python3 coach.py -p CartPole_PG -r -``` - -CartPole_PG - -## DDPG - -### Pendulum_DDPG - -```bash -python3 coach.py -p Pendulum_DDPG -r -``` - -Pendulum_DDPG - - -## NAF - -### InvertedPendulum_NAF - -```bash -python3 coach.py -p InvertedPendulum_NAF -r -``` - -InvertedPendulum_NAF - -### Pendulum_NAF - -```bash -python3 coach.py -p Pendulum_NAF -r -``` - -Pendulum_NAF +**Click on each algorithm to see detailed benchmarking results** diff --git a/benchmarks/a3c/README.md b/benchmarks/a3c/README.md new file mode 100644 index 0000000..8fde621 --- /dev/null +++ b/benchmarks/a3c/README.md @@ -0,0 +1,43 @@ +# A3C + +Each experiment uses 3 seeds. +The parameters used for Clipped PPO are the same parameters as described in the [original paper](https://arxiv.org/abs/1707.06347). + +### Inverted Pendulum A3C - 1/2/4/8/16 workers + +```bash +python3 coach.py -p Mujoco_A3C -lvl inverted_pendulum -n 1 +python3 coach.py -p Mujoco_A3C -lvl inverted_pendulum -n 2 +python3 coach.py -p Mujoco_A3C -lvl inverted_pendulum -n 4 +python3 coach.py -p Mujoco_A3C -lvl inverted_pendulum -n 8 +python3 coach.py -p Mujoco_A3C -lvl inverted_pendulum -n 16 +``` + +Inverted Pendulum A3C + + +### Hopper A3C - 16 workers + +```bash +python3 coach.py -p Mujoco_A3C -lvl hopper -n 16 +``` + +Hopper A3C 16 workers + + +### Walker2D A3C - 16 workers + +```bash +python3 coach.py -p Mujoco_A3C -lvl walker2d -n 16 +``` + +Walker2D A3C 16 workers + + +### Space Invaders A3C - 16 workers + +```bash +python3 coach.py -p Atari_A3C -lvl space_invaders -n 16 +``` + +Space Invaders A3C 16 workers diff --git a/benchmarks/a3c/hopper_a3c_16_workers.png b/benchmarks/a3c/hopper_a3c_16_workers.png new file mode 100644 index 0000000000000000000000000000000000000000..4607f6a91910c8a6d4d92ac1fbd95198826e9954 GIT binary patch literal 118324 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 y-q@pse8t9Jb0huQDk{e5yi-Plpczfe2L}J$wcN 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

R+TbrZ2r#s>GgiMKZAO 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
+k6;RX5~F zr0<^?2>^C&xwU(fru%K5>2qYg2Ye10K>)j~x1t)U&w9*ngvpNAUjz-NP6O-A*m5Y; z*|XP!2$MZStd-o?)CBf9YSLO;I)^Wg6hj5}k6&MCQA`O}mqd4)&h+Tzs{s#umRx%> zy5=^C-OQcw0@v_ZxEPdawc=JY$KdxcRTwNzO-=REMK-KI<}t{)%;qQxpYt0a^p>jC zNM;ZakVOVD>iRX0ou3>=o;Y8k(j^J6cTy6)--h?G$MKf5Tlq?DWUiz3$|olu#X@Hm ziX5L!Vj~Z|v5)X;yTw^LO|cj(cqFZoBXj$pb)y;V%%8*5OHc+JQ_4 zC~UZ&EzYO!9S`PPnPS*p&!?6@p#GZqxjyrdLW{2TKvMiUBgk6Y1AehuoUGn~e99}E?yJOnU_b2>}!T(usqUpFFQF! za4aQ$l;2(p>yhKtrRkMS_0PmnTmRrhgNqj7iY8{?5o}LfXZjLNisa3{4F6R6Ep!XKhFSJofO)aRm zS41-LJ#h;4u|@!9|JiVJqH2}7CGqU6kC-X9n=<9{He)T179mgk9k<^OXNEuJ`!hIn zl)jyYZNuUi`3$EDZ*qy-=;OuwJ!KZeQGsSLb!u4Aw}HWGjqF18aY-!EgxMs6KX3O5 zB-7c)*~cwlB;s=jo!6qC?^3_kJY^78W}ufGWde{$Tbw#RU2jQ@;Cw5_v~# z;OVC4K~tUq>|4zF5?{a>Xdb&s>8Jw=o0+ZK-RahOqy2%_ff0ONdlnP{iCoo&_W}~g z-Ki)3O+wwcY*u!!HTyIPCGkM!Pl~!`#7*EHd~#l!Cn`br@IyH;boudleGdJ@K5IB zOmv-lU!7DoaiJ|$A&uD|&NNF9BbR=d$lpE}R-p5nQ1JpxNRH?GJz?GNdZ3B! z*T{QxnU;$;6OwEf8?VSz_5?QfJ=uqUl`wDp|-#Ptmy+0Jy{@%Zw-B9&|`A z7lDU-jD6@Ye=QLohv9RM(@724Z4)lV8j?9qXT&B*cj@LfssDb9R_r*8R)GivBlJ??hYkj zLg17iXjb3>N)3G8U}Sp75f}dEC_8+C;7q!3y!or@KFcz3;VQY@4d-D@l<0UGTMXz8 z+thsN#Y8B=@9KOw;tL*O6(iF>a`h53pyd(kNI^;=_wmqv=kRdqTZyqiRl$$?P`rH< zmQ+2;GHr>dYxIedhSoQcr4CUE+pFFM(Z{}zq;~5KSx(iWI4PsaI5*Zg3YG-Pq8&U& z*o4&c_!UT~=nz4V5L!bVV0kOuhlV=jm@_BZn_0KRMzW0e z2BD2to0ZCO#8dM@N6drhx6^R2(y5{T+HP3sHvB8i4}MqW>`|e8zhA=Xe(VyfWg&g< zQJrM{W#1CbQqxP|yQ{3+<#RFzi;q@AVyZcKURTm~b@qDqKXJIe^NPewV+t3WLGOr$ z_g;aRy$wf6<`&Ixg9gJrjBUTXPo?&JCg!yKExWau>iUy%j@jzqk^Q09`b!eGEoZSw z>95$qBo50UF%ZlzIuu491CXzx5Ez5U+4f!7be?tq9V^y^m;*s9`@9~(Icvq*U2<~r z;>KRmqH;OsO5h%@+Dit;s_}qs3TugvYVvNqaG$GM_5 zi|Ht1A7xZHjKoP3HjVQ2ja<^P5s2$9429XsM;gw%`1B__vc2PqmYoP70Z634B0%ic z!z!&{&hCkbTfh8tH|4^3hbQYfmmtS}ODopa`V#(X>>+2EX7I=i*VaT?f@B%ghr*U`waQiIFu+7_iRZi%lhDuorYo&pm`$(*jNhUICr`SXtpr zoWj`;hkT9!oFK%a zM+s9sj$ps4of8wx{lbWO?~@RJ;(y4W+pnsq{NxTLPml6`Idh&Hy^1a+U7_KdP7xc6DgXEi85x4!2qn;+0 zzJqqy_jsv#8a;hOf^KJ}1gA9V!gf2iI!f%HnTH}bQ9f&dt0lKTkxQW75^jqe$m>#Q z%j?E3stOe6|{gok|JHUaDl7cLk zi>U7Kh|MgK-h+*eo!_@AFsg|xjCss~L8~ob*LO4YJL_@$D%M=+Losm12sn34hP$T4lP~=Ulz1% z51>TA>{HBmYB)2~2jHm6SH2HkVtEwoW354i^UI0RP<>i48D%B_%bCCXsJH;>qMvhG9O@=>5}&Hq4Orec{r!*ypTAxqX-gF zjhHP3nD?Ewch}vveLayY$aEN*rAj&T=zeY4GiUTlcXNvjm(PJt1fLzZD0~wgUii1^ zH8b?$DT12(m=J-aQ0fI~gXwA1={5bYW54yS_`c95~6^OgAmU zyj|!#@<%_o608MBW0Crlio3$)1uod)7kdQ`)_@}we8vwNaVPo9>NK7sMrpugi$yQ zJC=PuX|WGa_q2$!;0GRc60*f9Z#1b6DRP6SM=W$iXT`p{lLE)v1f0>_M8g!nQ2{B%on;Q3Mea97@Ls6eHigpiR;&$D z2jKCEageKg=S1Bx;Mh(WX)THw2Txgv?7T|rclEz&eu=i&0$qs#Ls|eBlPQPi8)r+1 zHCerZlsPdMFOgSn8v96Z4oE^1t=XXUDY9?FUbVF5ASs*B3`p}l!>K_~{sMBo}mr(ONaK@YqWTxqTV8{Ty*h<@v>!nkBcZ)U}1q~+mRY=y_Gc!t1oeR|OW6%<-DFULU)#ddDO z#mRJ<0%;lSfiie#F%l@k_?!H!*&555^J<-EZ&@eMQ#lssHt`Bol$scC1hz^_N{F>> z3?_C>3R!O4_=XZ0bEb!IckbkGIG1AMzyly?lSW)jBJielskejfGgh@=U}-@O^r z#Jlv9258{VqkEc@5s2n5a{%Ud7ub+ zkadOYMqjKTOuC}@FMaYqDI1g8o)UeSn$YyEwV=)Nftd{xfT4v|e=Tjo5=|kCt@K`;m*&2YL<_Y=0b4YiD_A%i*V2-| zpAHqNKroVCku+wZ5a~)T!R&jMX2>w_TrUBf>5!tpO~I{bXF_21Nm;-$sQ1U4FWu26 zIX`g4b>beMsp)(v=d8?AKk-{~eJa?-`Nm>dg*k{*hZjO9z?(yg-I7U3-Gleiw_^wx# zQD-i#k#FJiFz6NnByhVT@YqpuM8a_E8iMWh+o)+@ZI8F1+RM*f(<+}$f~v$4F5C-a z((lN-be#m>3NRrqZGrOACZUBZKtP(5`k4s|2tr)SAtgfV;tAAWb?ut|F58BD473I9RyAI@N;$&#w2C62e6^L2c z8nH2bboEbSRi?A|jv}6UFY~e7rD%(0>N78I7Y#9ql0lbbLl>R6bc^CcmsmI@XG>_8 z>B#0=euiYsayaF)Bblc zI8(Hg8xOkx!I?Vql-VqqaO)fqJ^4NiqBsGAfm?6!qHf%)qXP{;onIzSg2bwwh{7U- zFp5)9-z(`DaKn;C_Vjy08K;yi*viLeS5laI+Pi}VbEL7zg{-M2gI3n45W~3SVv%~X zzKjD!DXfCftSEq0d$~N>IMsdSg555XU76~0%Pyv|@-s;|==H=`pS%q!ahp;2QNgi( z!A|&{BcD~*zXh`6BavYQ;yW>w2H!v#Z7(#wI!YjBCGpMQjel7nfOfK=g$mbK;zj^_7zT)9~rj#1p>&%=cJR2@Few?sn+J6VEieH9hLLX*a+~ zL!QtH7Irsg2I_DXqiBp<0SX&SQDdfS0A5{P3??Kh4yOBJE2sIi>?oz*G87 zM+YK4S|Nfuy+yhv2c8{n^`m4*wkF!X)vJ@KBj*9MB#&2J6MRUFKDjg?q|9REif6ys z6s5Td;uKK&0?|oBlgRvKmvUNL-vTc_vv0)X$k_B>u4ynv=B^Yy62nE)Etr~_3ESJB z^YJHebazA>23JqY^d4?)ZL#K#hyCoi!_XH$Ab&hC)dRQpG(d9%X!RzP}#58byTEm zDy&`61BZF!5!a_P{qwHgGjO=K9!=0T*-||Tu_~CXMTu2ySdyl;`+acV>ek-gS3|W8 z;P&=(xMNmU)_vh0q~(rGJp6yo~$s1TvA_P`{Aric*`FeO?~*lSU-ANy>k) z+s;c^0Zx7PbBN=r@)j=M?|^@ekGUY^WjQb(v+MR*JZ(*Aly_R5 z@&Ihl$DAkqM2lIsfgIU^+%qF_$RHP(l?xph-*^V9Hh|6s@VTjvdBY!a6^TN z7WaQI+NZr+bRyjtO47$|lwc?Y@{21wB^4tOxw2F;y?QBQkVn88i4N7~Jo-6gCGAhtz>3Q@V_load1clC*I2j}PKS3m39{D2vTe$R!(sQOh$!nmrF0wS52390rI6vR^5$DUZ}tRISje|O1{}9 zpUMuIqk~10Jj5TaP#{~CLu^im9dL&ZnBS~<_{_}zIm~2`Z;a{cWFaP=E|(J(M8!jV z6-J66u1TO1h}mg4R^}}`0?Z++`E!_PE^CE4+YDO!Xl`zH&7vp!i-F@%f!JSV3P8`B zgXTC02pp+`sryke++|Vzp}hG$HBVOEs}^r zApRtyT>dfQ>;6=eWc>(oKP^=FeerrRQV!=Qjb99T|~QF@Y$=d@j^T9K-|d zQ3${cT4b|@_XU(eR`cgD!Ccl>Hs-0g_Ijj}FHrNIWMnnK$@+v*9Kgmr7froIzN#FC ztme;Q` zs|r2eH((qhBMy%BR9uLRuz+r(QXkThdpNh54ajQ#9Ht19-H`jTQJ%7~#&#m^Nd?)B zy==)L^tKt$hU%2Uu+?K-Q^;!m941>DKUD*-KqPGjqS#MHgP&?69R`sRqO=#Bawqzx z2MnK?Eo3!+4l^0_cl&u#!4#H`MhHB4EdbguD>d1Bd{y}kvYJ1K`O|(_An1uA%~>D< z!Mx`He<@iGv~7nXtb1C`pTqorWu}GiD>wdf2nVccgVl(9&ijD*D7*UGb&IBL_4{5> z6=Lqc8Am6y&n88k%gL0kH4+nbd)nT&v$|MMCXoD8D;sm>A^6b&eO38xSi4wHR4NTC z#mRUvf{S{%1)JMsCwHb>;?!djWV}%}BWDURgy6InixH4bP8Eja+09OLOE@_HJ@1vJ z435d6VtLx&Y%E5sCnMl|qQ9Z2pL)P@Sh)7tRBwWXvZS#nMdiLs24x#iq4;shrQ(0g zdeSJYyud6#i6aHTPc6cRZZkB};n_b5F+YN3@e%E_|1q)@#LTm)J|g)+rYIf`Ng7bE zepj}(!SWMHqZ0RDkuAjh=g3cz`ADrt^&}aaCwBIRu7{uVI& zhv5Dg`AOM><-28pb%|xJ!T;!xPi5jW!~Tch{untQfqo1X>w7>mc<_b_m=(l zmi@Pt{hwIb-+=b{Xmx3{ud!nXz~!VSlUC&@M}|rkYO=2E zH=LgE#OQNM4G9DpR?uX1bR^ra)%LnqgfauKdNKBQXn1ty>aqTFfG;v zE(DX`ULJoW&*L=&GbM^P7_QX8{fD|BXriuep)g>GlWvd52%-!K4OX zaDn^=ZgnO<+>WqkIE%1Y+LwNx2b@C8d(LsREQ+)r9pjnsy-%^*HNg1d_`myvEgw7S zs3~{$Zgz|i0jUMj2*32__VQo4MsPB?tVIZ3^1j^3{qZ%8u?_OyZT#~&UP9cgtg%k( zWh>AQ%h1}r2l1eP{|IQowjKE~m^Gh{aQAJn!ZSQ|Xkg$tK+_{t9=}ZOEPDFG$25b;J349V&j-QI3_D~m(G9Fj z7;ROCT;(X=knx8o1Sd7?Ee>vTfk}FJo>;e7hX}wMs=c}h#@8sEcU z1y}Iu=@0hNA5LmG@)8?qH(Cp0=!7Hx-B1O)WFc6miVz7ALE$09ws^BzF7nJ^ zdE-{7w^%ZR>d~mpxCu;!)7_%SO=xGWMUL{KH54dS3`SQ_<^dCX9Fe00vXQWbjlyp7y0f7T_DmAHU#uYVEZbqO2-9@A3e8;@n|7mNyv`5}nqkSQNvv+_)vb z)BO=VqF+1-A~@E@#A;OZW8l@=R|GG9f}+#)r&x%yC z`ppEpym159FN%qb8=>@5J&NO!J39>xjn$-_=s8fJ+U_hr{KfeqT*(Rga?zDx<(PxM zd5_6#v1PV}jpyu#P^AQ_+dZ`#N{Ds9?LjlDeqVUcc0oq?#>Qv2Z3*qJoCrSgG%Oeo zghk-y?suQ+mhVnS*$;WIT;zQ~bUOVfbHshmUu#rO18xFZaP!Asy9)#Ofjmi^c*7)i z_z0d8_!cdOrsihr|HwkgzM}qKl_Eff@j*@PjmN`jhW=cwac>8%Bx?KP{oxBh)3Rvl^u7-2ECzgoR)4EMbohOk&6$h{IB|>NUb-Lj4pb? zmz2c{y~_~O=%|9QX^Ao%g)x%|bgeu+V5CXUfYPtHQ`k7-!!408t*_ndi~E5JQA#-XK_9;Ye!>UXBv zx47Cewd5hk5Zw0q4zc1y9W}u#;5FN>!^@nqGV=^nd_&raIutzqApDD}V;W zd+Fh#ex|{iwCy;|GI1JVCs%A)Vv7xU0lpi!vQ|!0(>yy~y!6m*lRMvNPGIzPTY9Xl zjXBb}LdFdiE-vm+;5e;RJi5pApf;O7C6LDW5`auD($Eqg7zM=tbd9Mf5Zs}HG`Hyb zShO6AoKDLcuhF+w)>$kBmsGT=>*gXAp~2qZ{beDq^-%C@tYBZgQ#a6hZBQ@19h1Pf zHx8riiI~u=7f#2mB%RJPdnWd)(YC;Nh2GuF0=O*zDucmcyCBhat#yw)vb-aj;=p0s zyMpp!<4c1`41o*eQ1BR}p?EQ7p!_TUHCX1#g-HYS+x;oymIu)`$(B28MLxHFo35K1 zmx+w*x;kZGT3~7DQQphcYl+XMrnEktnMJ9QZLE6oNVx%>cG3Hn`>8N}G(6rwd*kAs zq`H#Qlxt0jMHBcgg^QZ!QNB?~LgJ-G^FG_DOSB|~^>NSZl!f(bclZ8_JNe(=IWEb6 zOm_^h9nPl9Jmh^8pz*M5zjvsy4x}T$+cV-1!Ib6zR*)AbBJy-fGMos=A)y5Y0Bse`jf(jj82=rlHvyPfpP#q+{BL~%*)lu;c=%Bw z(tn+bcyeEVpF*kx0Q|PLgGrE_;6FcJq(JOxBaF+5@b@wQ>uW1|Afg=^erNQQmHFos z{x2@x3I=Mh+UlTjlLQ|Hl|%D-Hlh7){ev9O<-9G&aW|%%k`gOfd4>DF=~c%IKChZl zKG%NR3Cg{hDwq=GvaVE4Tc)<&a7=|FEC^bD-#q<2KwD9(-=7^$Tq*-8BiR2`<6Ke! zUXBI;yXUpGhTQ|_i{Y0LJ^RlO(aR@Z(xU+RTY;C}PCOPvc^P+Wl!=_S8gra; zB^Y`DxJRs*ZeBX=K|*Ji>`iAgpNrHlkh$t%@bHcz6 zTlCiW=M!iwd%xJge&ByNM!mbJZ|`}$8+}}3MfnfT_Ad} z(X_`V@Vv8*O-M+oVKLf{$D}kip@0B=H*e!cK@A^CiBrD`{M1J!>p7NuI zi5zP`o@+y(lJgR%aD_va z8V<9DS7!zMVay{OFrz%Dq1R2T;oKKpjdt7e^G>T_8|l?Z)&QmIecuce(T47OYHwBv zAHR4|RDnX}-;!UV=YU4AVI)zC2x1Iv_25AtXQbE{43O}GM2p)k06bE-C$9qGzt*tw zX0*B?IH{3wTfy9T(1Q&^XP;@X$++(!V+;f;jZcnaJ((R zS6^0!eB#de^_$ge-=i1&S5Ovh*Pj*Srsn5E2N~Mu-DGIiZu%cWL0tL3XyQ?v1Di%kv{d(9k z)S03;y4&IIxG&`vRQh;f`S|nJ_RTHemABunrn??^E5-#yohOaD^`2Q{OqiT)jrmd> z9C|)-LmcG_AfU9OlW3Fb&R%ThFP@B`=QBq9w`vN*tPXoK?g!Uv zU7(RT@e=#ppKnOF7hMl~>f7(l@jb47_p(S5>Ir}j8LxLdQFY&OM$&L5mEbt(r3376 z2uDT!w~~T_zJK%pJ>vy|(=yZ@V0lc_LDoMnBj-~+AFes}YbR34okslsrkow;04y|W zLBj$xS2h^d0JH#X+8dVFSkIn4uLcQ!Q2bEyRR)DIGZ%3iP$Z{AyWA>g6_o@=!CWQ~ zQa&h#;=_$@&^D=ml;XRfC~}HWMXt9t{lvYQ7^h;rhn{rWZS#tc{TOUT${64Cs;kEn z+4ZbIhU46aExr|Q>$JCtGS#`#BbcNj@qFTL+pB&24^>4>O&iIkM8nHZBnmicoCtJ| zwcSirBsbg=>ix`1pcojlUU!6fThVe7TvUgVBR(_etcMsJ zMb+AFu$`q?k%!#zhWYau3h9)2H0AHfM}jW(c)0;$391SIj6_8n3wL+-Lk{2p6h?~q z-0_2G3HnYDWm>IDLo|Dl7&kx=CFFjFCjCuhUa)ZFKvc8>0akAeQli$Z-03JB4oKV3 zSO}O@Np4$9;)IuxGZ%L=(-(z_B0iD3T2Xq4zUTsU*%G}&$ax8-%wTCP9CweU01nAe zyj(Zrl7EI9z;ak6I*-`Ljzdo?P6MK1j%h>~yis z-PO`hb15;GAyI=8+rho0hm11XGsw`hk(RNMS>x|!i18j!CAp{53bJ~zxvyjB)-i>| zi(S?tgEO&dl@rM=s%s@_5)EckSY9QpyUP!g<_F@-=aGMoQbY>cCRP%zzLR$O1RiHC zT8{FNtEOXc|0+nV&kU_(&UGx{rq%#O-qwek-CnmH&wd*o#>Mgc@rT|x zxV_sD5YSCPC81J#-kxw)jS(X|L>|;!UOs~3Z6nrRRBKHo^)v4Vq!*JH3-ox{kgZ;} z2UNxv(d`0(O0^2WujyU!%5P{;ps#`MVQ9S&HAlg#RhHCTpU+(uW zNfiJ^iuKx18%XOzI3-b7drzSlo;;Io(ExhQ>VEwa8%2oXGcX2wQEjy5^B&+uv5!Mx zueF>y6}QD~?TaSSVZ=h?Uoy1(ILpO2&9!7GW07S{UX!@d2UiPipOalu(b6(cfyQIR zn($AKx*OC zNNbTMY_m~vNDN@#L_NJ%h&2zFXz>^^ELI6ZS3#T1_W`r;2F$`J z@xuQkh)-WslK{O{v>H5rBF%q&cjgRWUDzochySZYO(eGW;|pR~$@2uNx& zh)8InWa)-x?~m`jacti1R&CW*ZPi*#4gUUp!wKK{&N=sXfSQUt83`Q;0RaIS?5>Ok z0l~jY2nbI8d72nJ5%`ioNI>u>0ZitWmPg|9#E83=YvZ9GE@Z8k7rQZ@95h9QK>AU0 z+X_C~dK^kdIB{d<^J$yPWS#yHuXvA9e>v<&HI~1m6wFG9D4v{EU_D9vI71_xdrBY1$awS5yK`Lb>-+d+iD*7-|tJ&ll%~|3nZ~ybZ zH;$h$Q->$O+Q6ST7l^2S{$>zDNc!`)A~}DepTFrkoBLPVPt;m@d)FO}@#^Ek>guYi z7d`a1=_JSP#lc(IhY6<$u89_LmsoVg&u+24xeea#PXI%Y5ZIcXED0wwn~^+0FnPy+ z_5pXnqYzsH;j$CMABoG>lL-jcQk$KwQ|UCz2@}vCy*}chO7Lh`&7_8gl*@#f{^#rd zw)JcT&ED)K2Ek7$!GJ$szbQOHCY1)R6_9SIol=j(scubmQCmHz7g&bHdIKaQKOz^Z)PVDsM@yT_RIvK%%XZ z3~Nn?xWDGiz*I9Pq<=4~Dxi^V(r2^FyY4cd25>_tymBBqCQ5ojWAB;6F7xslN8uez^fmY5dE#K zu?EhP&_osRJ})H^HT+rbhJWlPR`vX+;;KymnY;lUGYM-9_tTU4^ELY z4n(R-<(^{lQ45p8q#j-ddO$oSUh$Wrmd~*H4`GTik-1g%+wHbS$LW3vjLOb`h2IOr$_hx z{Zub6uT^Z-@>sPhn`-i>;i~p}-?q?8{nIVa*D!U)zI&P7iJ}6lGnyuQ1gG?W@sqvM zW(C$r%v^%Qz{rT_5K{VZzdVNfUfOJDtmVFZo?s%6jB$g)&_&?>(k)TuTlc<)p~8`+1S`@B~0zhVRu#%26k$D&330<#@7h* z!Kc?6u|;#A;v&@_WoU3n9&Gh<^6(5+B8Ils+n5j&wXVB%b@tAR{;uD@+~P5+hfn!p z3&q66T^9#93XPkL@^uO|xT)$K#?FVx0qhXF8VQ4GdLKL}eT6DAOu*4sH*9u`UyL_q zFY$Twgy$E>-`6sk;4RWAfTxN&&*kLiqKl^XzD25TwX>zLQ;_7Alw3n%xr*!4z`t6d z`!eYm8BuSaoT{`P;qOWi;hR|wjESKtG_2DRcV8X2s48(CUH)9od%wF|MfS@1Obre) zGBWG2D!b8=`%hS`O-yc*QgN#}J3F^di8+0HK|<1cs5&fjC6!$2$4ydd-hnjPAT14z zD=;yiA0;@fvNPtOx^OmLe0LgXVhcNUXq1_m2`pi#%)C=eU!MzxX<@>>K6&a~#^FSfVO@pq z0miY~b*d5R^(|a}>mzg6!e)&l?6r(Vum{_qm_!}65k)C_2#fx16^@)aYeEu-Eh3krCT)cn22->SW#Ye z^^lK|I~AOo&q&MHx3N1(+}(Jm%kJdKlO3I%nx>|vtt;(j8V(KHG4b*7t6rZfvW5?z{iS z7dtkUS6;3;-;**_@3}cJIa$>5oE)(_UW3`_T*p?P&G@Ub3MO77qA$i5c zy7KbRlRf8Xk=uj1i)(8`kR@nqXZrh}K>nD1?uE{bZJlUbCgkGdQ%&*3i zLh^8bGr}JEuchrFW7WetU?sO^XJ<|AmqyAhx4*ZL=NA>JOiWBbAMYbV!N(E~#KNk` z**K-8rPB#S0ai?U%#bzgPI~LrIAsDv9T*%GTAdoH_bjinpWuXXva_oh86^WvWqU{z z)z?e7y1VCt-9e_BtC=l$?b_>i@7}re#vat$Q^R$OjRqkryLZoXYPYLBlC9Efd-1v- z8}@peSLh5SJiTH5Dtb`YSSV<%z0o&YH3c>1(3FJR`##-*Mv8;b$@JwP@hpzFgi}0W zd#L~U_VW5+Z-+y*s;7kazTXyjqCFytxyO-Cshds-ukK;5u^Y_O&I53J=u_7mD3^{t zq`3qfl`X|5LY?3f@KZwx5Lz$$D zfG5^3rE86pkrohG*@4!2t+a-U4Ex_bC8Z3JYa2%a=w~kg~)jU&|##;t8M;$mVI z52xR4fz8YthKZt_8H$_fRwVgg5PFBui>!{e0__+Y8q$W9-)|uf2@Y1W@>BagICQ!A zLyDn1O|CRB__ z_QQD&4h$?b`=3M;nikj@Hu*N3W0ZJ>+pP{NUau0tx-!}^sc5;K*Z@Md0{DkcN$<^> z>rTpVY;3%K*!}%`2^6WTs)QvsKM4TS{G8y>nA_mJo2B>x#KW97Z*I&?0bfOrRwCRb zi}Uh0yW#}o{SL8H{gw|Wf{^77Q;jZ{w}D?d9>n*&H)yuZKi*c4Dw zSjdCCg)J)LmBcQWgHb;kTBfsHICHS5+tddrM%(x)Sy@>OfY$!QqQ*ueb8~adVtz4y zQ9D3zpcui`9dl~9`|8wkiZpgv;9$kUuRp)IF)u!z4o2s!FOB;#6D&{yoVov3+^ZwV z&CBaxzX@moq^h@X-#Q+m;)M_u*8QwdkV7JodSzw-sAA(3sRW0fWJ%f~-KCWk<)-TL z6kXs^nB_(Qcw0?%DcCH)$3WPA4W(!(sGII5+e zZBMvQ!89<^H+NUYvZ;-I)R~!?7gtsW%X_2}8h84%NDI~(n*i&CO!>~8Cm0N-;(p6B zmov;TC{FlpCQRj|rQHVp4B6n<4?)`_mMJ0FVZaLX8oVlb4c@#4Tm`Z&NW3mTzTb!J z5WBmkYiyhXfRRnw%hstQCJA!D7o!ayy?;=;RlT~sySp?KCf&_0)2d-$PyhnYB`Ke!<@eh8I@Z(gp3>3L zMYwSFLsZJnu8^3R80?t%V6VqdIAth_+Hq}l6*zUWFK%xhTkDXaZ|MWU0>l@K3~JJ{ zvRE6oQTlqN51!sL3E5`gGpx-3P?(pS3j-*lSLbFY=PxwsZ501Q{&bu7!Rr3$Y45d$ zSYJEV$G;~6T}wnLJMagPyE}5>u9p6l&^iv*{F;`gkXya-XaQwlNyWhQ^C9vM!VVRW zUIrATfhpZEBnfw5 zpt~Bt$RGfKunPq9!NGi8wykP_7lHsNwpwuN3)t+M%bGe(ZTMX$-r`V{ltc)LsCJwl4&-G{p>;5cdu+x4( zt5X3)@g5-@pYr~d)xP24sW<^ki0yKP-!=15^1Omi>@`d#P$*Q^;eOAdQi{KS@5G+E z_@C6lyUB-NgZQ@g=2KL$j)8%JeU=}Usfc38|B)XiOpz3f>FMkDTbhlN1ET0PpXB~& z9qg@UqjXKzfA(8rP3-E2&5fl-r=a!8O%U9dP=yJf<3iE{K0JVo2$LYl7KCRo#Y9xC zZM5)@LKi)I)_!JWi5sR2;%>Gbmc}p&c;o+_+bX;#+T;SWcw|ETRd`5Q>NOWlu>D;>I4@ySS z*MY3B(H+%%fY>hkjpf_eaBlt-Rz{nuI=RH^}_hVdfsNd+|I?6YA4f8;n zXOZad3dlgAL5&7LzavU9IcWp~oaLBY4%%>R}wX7_Z1 zIN(~VHU?NH#2jVQ)nR?Lu1i`vI>K|#2y5$Jz)&ik=T#)v-(QT#Kw@{$;qr{V%wZB~ zJ<^AXgru)n@vNzd3Jw((jQkF^w|e;Mzdr_E3=*qMV~|S$-mD2i3kfOdHgG3cyobLK zYU<^3*dK0gZZ-hi#atJo0HkZd;jefHcmX&AWg;=?Y$)*taJap{*^|)2Ro4uZ+e`0I zpX#?i!xWJL6vd-gaTkCG9SzOr=S;piu|{67hzgJ+*-g}H_Z6z*z5&1*uW<&U2ue5I z-FIL06lP}1Lb(iB7xmMY`$>}CI#755U^Xx@Q3yr|ICgu*)NoHvPbhcv`ZhnWSgXAZ z#^#_4Sp<>-Pg6k_41Q{BYgu3|EiD*OP3V*DlOZiA#XU2lhG=W=Gcx+VrhbqOo?`U4 z3HU3h@brN+IqEJ8%LHd2ltjk&h=L^TAd#9I{u-pN3z@M-8l2G)EXd6+5lnvyE(&)r zJ$+yD$CoFdNF(OCk%20>mk#Phz!Gd`T0=nXL>st;PNAOA>X8zGl~DwJV1YsWtoDz{ z4B$HICMWu3@VN+KKHv*UNl9o&0N+~&K*{xhkhpwl_IL3F3#>q5-3pBw^gwn}X5_t6 zd4>`WalDi^41I*5iQPzawy=L1j~UWui_u zLD-INx2Ce9!fJ107HxO$KeT+$P5rdVA|46?{|nhUe;bBbF7Mf@ZaPqgN@!p^EHL>{ zhNI*FWZ1Ai5JlyAN>=NA2iIrXAjar-hwk8PfjD2qP+kmiH&`52_da2u0fq9d^m z5-CYUbxj$ci}RHfI9#qjIA4uI=>Qz#0*JHjVbE6?6x#ITYY-hRtvX2Vl94+jTa^$? zgnZ+l#HF^GZpq4Go6)6iG!IAjPon14KXyL)Kw=vcb3u>p}m zSYMuYKFAkugXA~_I}Wm2U^r+%_E4b0FxcOp9&79y_rILPdG1pUVw~49L!YP%yVjI~ z^R%+Mdpr%|KPsszCkS(ZR9RJG{jWysYMsjwG}t36>~Z^h?nu&UD1Cs+uHdgw&6B_J z=|eFh9aq;%Dn6q`-c*%jiQG0uZzWKwdWkC3&khX@-C9Ep4qAf>rwsxT$pTe6XsLsl zmTK+|&DH*w=BQ!l%m}ic;YI6C(4_c5_B%D82T$Le`v0H)KbOOp%+y8D%xHvs8|oB| zw?Lf^RV$S&(49F~_3zfq|89-^pLBBGq&0)$)#rkH<^05Oxc}b`f}hQsBKDFpb(4vA z|8F#K{!do<&wf*}8FRS8jfOL#EnJ|N)ZFyXe-*J{j#FA(uB_VXp(ggy8X5Wag=&^c zq>+t)z%>0I-7Nc0a?ZwKRfD<SsM!DL?-k6(iqC%ozI!yTY8Bdt#_{!^<^=!8JO7R z^9?=qx0kOH8oFjo_QcXL|8jR>sg zyQ5Wp25(57 z@wZtwHFCqJ=DxyDwY5aoUi&OCHx+jEqL{}z8%cq+N#nnMZ>sJJ(2LAmKS*DH&Or^A zC5sm8M|ys0qX|BT80yJpFUj)XyYPDxbfU*raMxJdDv*h(UNW>&uGJ?vtI;0mhGQW@ z3F0fX3L6*Vz&oUxU(Xq!we;m_N|e%7d9aZk))jk9I3a@W72k>9+P7l|9dc72OWfpa zvJ6dD?4$~<`gpT1^85;3m1irt2t)a$dMG-O_R8u-A)MWmz2mT+@7U?_a7O_Oduf_ zJrRoM?;bVylN(&hbU!hbf8CzfpAN5T#^Z%+hA z>7pI3*dhd(@|T_9SHo?9ZtQ5!-u};7fCtCuiJw09nODWqJ_n`Hr%!FC9K!sn61A_y z?J57&D|6dB0SLu{;24Y09ia&bvr^qe)AAJcrB9!l2sStRh`dHM7=v*lDWGk}x9e4H z;rLUvl`DRvnQ@F`?`9Wi7CSxaKW=l8Jmq3PeiG`DyO|p3CH09Qb%tD>uIM1zFweAf z4x}^@YU>z-@D2|Nmr=@8mYysp%m>E(gxXg_qq^t`r7G)oPmCB?)-eFGDl6~T-@E-QMrJdg22r$!b8nZ==M}3d`c<>!dV8pi zEkfHkjW4SNwC#8;PP;{tr`SI1;)=9l#9}QU!uw4GA>!FFyNK(C5Y2F2bt0B9KciHy zrF7VkIyk#Io)O=jh5JWnUQ7(29)39BD7i8y_Hdf*Ky?NNc6tm1S%}exPjc<aDeEtU#21SlYdHiwK(Q2X#x{KQTkzA* zUYf6LnO-thH&JFfW`bN`#%B)7XM<;EDS?8o<3V^;T!&m+h?Je<+qP4{SHtijq)SV9 z$N0vQha*^{z%l;sQhuGEKkeeB`EB%GWGJ;R1zg|>{wT_9^dgb!l!M~NaCMU|ZbLySQ1G-kVjx*1^yuG2%Cy6@CfkLfbtxGP*fCqYe zQ>XUlL_j+$vJv@?Ue^C=z*9;ZvY*FWl!fTA@haj*T7bsTAL)YjhzWzPXl&yq=x%&Y zz4II-Z6`o;TndR@9L(3&*B3{RvDK?nz$5;qL}OZIz5JgGSIDA6skJHKyTp)MdUA%E zYadQOjsaB%P@T(r^9Bxz@o22D?eJ@6`A{Xy&KZZ_HW_Uj3-qg1R#sMyjvob!f&&l?Q^erl zP)e`MUYb;aREDy&&&+7)%7A*MLF2a{jT@i{y6_5pSVTxLZc0mps-E)Ampl=m(D*X)VgOa22p4dMK@xN*yuJpoX=!Rk;!Z|3AaDP!VPSf<(H?OlH6T*` zBax;Xy`KO@!s?R$o+V095(dEwhu-*~E~O-F|6Z=5ytH-waUkK+a=Cav_oUHOhX>WpCtL~v7XEKwcUrsd-TV6 zw3V<%Zd3=a$PFX45D}fIrxd4&L{A z<=6k9??pYVnIQrw(QpjXu*Qe9E+rK;J@N)5)4B1-O@B2ttbX_8jO4uWF}RgBa-(;r zd}ek)rgeGZDcF(NByLl3(i!&wAH-NALOl3$L4 z{s8C_cMN>bn48{UbghqyUl@kFYk^%ivE!JJ=T7Toy%L`R4J2vn1nc~%NlX(sV{trh z@))_{BD(BxUDn^#?-;u%Eprs0(uTE=hf-?-6rsj91$r)eo`VSzA&;4vCxDj}vXgTB zL9$rN`~eW5W4MA`ryOUrM%;5Lsk{C{&c{f?YUIuNusn8+Sq~1dro&^_)LZ6QRi`W) zuF$5K+a4@x?DP62dyX#Wj)sZyN&NMdmxZg{KD3pZ@whBBa^2fK6{roTfh9Xudcs`v zb|RRH%Es~a+ku3gwD?BV)zSKvR9e(XPT71PTjc&9dK1P)Qt369NpgJXd}&u<17Ivb398PZ?1eZ~n!L5KdF>lkw89>jKW6gT78)|nkgQ|?X;+%@m@909Nr{5`nS2Zk&ZN1wXH zmjcA_6pv=S85>#Eu`9rhu5Sbob{gVs?2%HgmV$X~%ji~%NNB98z;zsQNF2b^sM?WP z;!ha&%=G$-?fzR4BAq`ew7?H6BmOvvJyKe^gB+zQdfoi)xLJh^skO(|VE#|*@X6_6 zgwoaR!Axh6abeS%M}I|`v-mQ_&06fEwu|>QOehB!)PRWrd_B}RNz#cTM0DWq*Uy@1 zd9dnXO&Do`-iL@Y+3w|*_?tX*TEggRH}aIYi5%p}aH6;Dca8|!KhEBMiHXwStYc7# zmG)&XLHQWx0sE;xNYJ{Ft1~iN5|JC#UpHEgzX1Jb7q72~`E}?Lp#sZZ0wV{;1U`c* zt&+=>@fXs@^Ydn&C#5-6s8}q>=||}ty+pj}@SN?T;y17C+tVadAiMY<8Qhy$8SGy0 zMjJS>Hi=UPD)w3&mev|q%bc+bQCYK4HN|7<88ZC2PpJJi4E=?EVik$axttpsneklI zNt1)gtx)6wsFDAZ5_Qm++$WN|b9CA{W7-4CkTA8)oHjWcKfJPmDEf~?VW9rAgZ1CT z&eng574WzlG*6@u>119RD!$Q>FByVo#xM0Sb(MvUSJL;_@Az-8)lEWJ@@&+hLee0$ z)d=Jn_;!&|n_tLjp95A8P7r|~P&v_I2X9aEX1iBrM+o>;NQ z)9XjqJL@^ZLn+@4{k7GcA^re-9fD?_c@-;mMprNQV-)RVhz*f?`i|0_@@6Af$s$Nl zg7Ab@!`nBOoAyj$iW;7UCS)V01rzzI&X}ed|?n z0M_H3po(C*~yWtPgFtdW>AnCtB_Rn?&Vkan5e>?jB*>u3 z84)ULUdK2>=gqL&;ri5q(jL=nSABf5R3xGYRjmSU!~-1@N!Mj2 z$Y!>O68ftzS=&AIs>TxjZi;gDh;kgzSKy!0lyI^kP`kz#^D3rh zE${Yyte%>2#Q;b6#+1l;R!xpe4u~z+fAbLtNulP;q*^X0PXntwZmrWxNt}VhOqpY2 zKBKWyGBm2J6?M77AmEHiJCN(4a?iw4+HKkjJl-#Gkd!`RmEeF zx|1rE?cTtLKX(?KKULB+F@ShCNCij=e3@dx zRq(Z=4Ej0If}uu#Q3z?}PRAcM*4SSYPAlBr5#hsBHg7DAxE%MPC+np_iI>7{qN_zj z8{!0tkWk)-<0-+Z)vOf}A{3z=G5=S@pl++JruOF zN5I3ORSOw4rKueZ_l$M^!qY*aEtQ4{rF67zFidm^;S$wKwEv5L()&7CE!hef>?T}5#yn!cg?S{W6KU3-(z*-ytCKPF;K7y%ZPw5 zb|&Vses|L6*I`9TQ5p(uqjX3^ldefas6GH{HtrPgY+&MeEeE;P0M?n&F(0pSe#m4n zrod!YgJCR@n6z1?Zb~@B4&Pf^_KD&prOdnIFJvnPHd@}8e+1Y^=M6}IjR0%>3v1Q> zA0Lup0U-P=X#uP2VlPPp_4CKSlU(NAv#n{P8h#JP`7?4-HNuyYpxJ3vl$JjUfa81s zP5jla%~VM$S2otsG-=|4sp^0;Z)i|6Ax}=G8cE7)@8jQtO{put3(vzb(ES4r+r}3fC8Qdp)m-&&J$F)(^JG-=6 zajYd8M2$;`5cW)vcOJKBMgHhMP%ct_Low3tqoE@1@Ofko!7D3n#@t@N= zYs}dh2V-D97pI^ueXCsJw=+O1^?`ZM*-QoJR z&!1QDNUS@29n&!`+M!3PIP6qh)qt(ogEQD{4e(#=J&uS9$eadW<`-%};CvQf{Lu$Q zt)onJq@PNewW4~@1(-W<^Smb1^w#Pw*)bn&M5U&I^&6|-$plq1v4)X;HvvXX>;AAt z-V)!^nJ{28qdsl&GC_2CKI@noBK*iJI!f0Y3Jn1^*&!YeiGV(s454`NURn(OfspH{ zs*5Rm`CxC!*3yG{V11B|%q?@E3|9$yjZC@KcwW~6bCbDCS6g&EdQB8X7& zYl@&;08&TI)|Ih$lo(JDY(4Vead7Wf%vAyOo2=#h2Zx7qpq@>bH0}*J0+|V};3-C& zW4Q4eoX5-da{#xE@(K$tZU5HA3K>7@E5M9C*0VS*oh>+Wq?8!b!f=?h10N-vtK&8> z1>j2^+$D>hgOU>8{%cU1%zsIPYrJy)pvjg`MlZb38bS|FoN0nF4uz zINGsNPIE^UxVHiw?FHRAPF`M>DI7SN2lQw=@Oz)nNxr30g;Gds>}}bj|C|L-u4Nbj z2~X-UI2j}jiUJx?QNZ;Vre;P3-=3x0`i__vJ_?N&IZMEOvq2Op2DjIAh;4FR_glRR(zLD0;Y^q^zvc0|>I zhf812nBvUg!Ll^8`HfOT+Umo~jn}@7E^pU|n)%Yx(@nE*-XsJMQ-BP_z^zN@uwQ}* zbi-7)2|KaoGTTAv>gtLHCp8DbJ**<5hCFaAHjD48{e;wX$k(&nuzl$}%~nTO_iJY0 zV?CN;b(Z>XZi91GiIe*rfLU2v&X6}so&4#zHqOX7SxogqVpQ-^`z%iF=oTrs#A!8B zX0BIh6Ac|!+(JSZyTPrMBIw49kdV;Kq*Q81T64tv|C|R2r~jFZs^l_^Fczsn`E<&= zC;*uiS0(m>hP+FgI~tL|>s9^s`|XYb+b6tFhPa`rT^_Z7u^TNI=P3bGOgCfoAQ zEA2?Ai+2_Lq2?WM`-8FW$93S4CYuYh)Vivmi7h^-xz8?~#r-3W-63Ok)Nbk-c2M zIBLJ)?g~PxaQa_>n&EYb@66Egxr7zs6VI=MEVf_U4C7yb#UmnmW@1< zZA>_Y&q>KFi@?-kHsyyZ{4S1JTIWu+%8o1(?dwS)E^x z&M=EGBs~al_FlHn)0UWRxWW>rfd2BK8~{J)Za@X}TV4J@oLPFZ7ag;WiSg(E-ekrJ z>af1?I4thk@naaTL!hZ=;XuRp?{Z>1lPtUw$i_z0jUAr>6K|ez{%|#USYP64uEO+-3Dd2 zepU0nXJ45C1AA9ZgaVaVkRxxer8JmM9?EvoUe%bacZ;LPD=Yk%y6FN3)uDb)1yImN zToeAfr5RU&vzBn@qk#M6jA#E$54x~n)k2(c3Ze)6KaLIy{QB({&kjMYE)FH~M+~SZ z7B(74wumJ9az;|sOy+*3NU5VHDFC%bh!U`q#_cj85LyaAD|j5V<H{W*J6-bO-%uP$xU3I|F<*!6myO zr9Dwl2O8~F`#=j92>zY^woLu(BG`<|!XVb;S#UOh4PxHGfY1RUf}gHd5uVi-THdQd z&f>pQ0y01P;1Das!B(UH_nq&fBN9-lP-tGx-+ZE)*=b4t^mS+a#TJ^s_U@Q^XGsY+ z!pPO7!nI^I>v7RQ-XX5?5QqkSm5$$~7STd0RaZ;xpxyAT(5-CgYgE%yzMsAj_YlLO zJbcr|Ll4{*)Hbmzl1`N#WVjnfR=L}>{CBR{g$<(Pq->l-Z*_j*I%dp@%KNP(k$~t2 zvVK*O&OC!yUg_JhPDENzLe+0894@SnX`;?~|3Mp5NNF+NarNczrps` zFKYQ-3?;B#l>$1imLW(1L^oULKG~3Xw(HJ4x1&OR)9`wm%YCRI-^+hQRw3Hy<0`d9PF39=W-vN6F#IuK{BC@H^G0pQGSv5A3OH!K?j4SJ$4&{CaZiXGl6Qs5?RpG6IwkqAdwc;lC+N@XBFZ*#?Q=T! z*3CxtT}l4DuoL3+R@KE9kztG!917Z1nq{+9X4P788ZjK|vF1gl3_Ak3v2?$=C zqCUE}fn5JUo&B$CrG#oE?}-Uo{}j%PtjN12qWrk;+6U>vJtQLQ)revCqn3?!1YbO7 zyv(yTtPrA8sXf&Yof$Y=bXlW4`|kl!_e@NZ9{nOum8wwkTv6fo1A=E@>KOB@)4PRn z4{VYCxBE)Kf>Wjs&AB2MyFJ!mBlod9V6_u0btr0fgh@c3i!sG_>;(dX_a}*|+Dsl0 zHPifOdG2GKO7w4*7L8*L8ih2s_{5hEGh-JFZSt$PaigDM=;?!8U){3>3T%J8Yj!$y zybQlJNxwI^u0pJHA*yHops}HhJznmT^GxXKX8t@mr^Ssp&%2ztSibKt@Q= zOe12-oYE6nu^Em!w;ShUB&W%-;rJ|#9>$uYTWFgdmg6`&a>gffATIHBL6#WZ)Gc9U z)%on4%fdJP6zWq;Lx{vahq6cZeEujGQ9GBNgP6Y5o`SNQ^y^SRET-?x*1DLJ-ehz5 z#5ppzvcCPBnNM_lr-+jL!f9eE&5{`KeO3Q7Ir|TCQYqQVPu(eEC7(6ZrJ$JN5#FXOEmk`W-2qpbz)bD| z6##<;V_e_#f^(7EM0)(qOUT{D>-{PIlg$l%=ohLH7o*%>@tjh5QVHDd#i?I4?Z_;w zqv<^$Cg5d%N3vGRVQI53@AmY2bPs7qi(utb?t=0R?Wd#PHm4-Hgj%mu(Lc$id^*bF zZR%Y^Bj8FVRIL8|3C`HP)tfY%T#9DJb;}SPr!iG;Yl0ETIWwTH{5q8GL3kjs4)Ooc z!28x_g?A6{OeE7}7G&MS)wg$%Q$%&gzTfuoP!)BWRI87Ni;t#T#CDv59R0&7YiWcO zecr2Ylf*;}TUo$UIE|Py&2q2XHysWEyUsf^(5u_SbVImgv8`5lJFo0Y!{OlU^J=cf zDrb8JVk*;Plu%$gbGKbhO?Xv$fPp^keNkoWxQ$At<)-Gd6nCc%I;`fhjKxD9Sm8O0 zw6?~d!gm8Md3OzBV-llEpgVi}6}7swqugODTkncw}1Zg-i{eb@qlaz58Om;p)z! zUOR{xpXz}NVG*{yf3aLq$mdMB{wetL^Cw9WLuma#am@ZGD&cACk_uTt$$m{ZHpy{5 zg)&BZw<(Wlsp!XO_qQ8oxm!(mz!$oGJ#jL~6o8`1*#{>HOyRB1;x%&-zGcfWdzkX`v6B|QQ2z}_>m37K9kx;lO>=nktV5|N}-Fl|wJw0&6Zo?UP zm&P@FX>7rpLtv%%ADE!o=!}@GES=W8o_Gp8gSU;}$ff%9K#jHlAoEQL6BEa?tU3_B z5HQ}&?yqq5xob_zmRCd8IebHlf8d7Uiu0ql*;Lcc`wzsJXQ+}8})o6`a%u& z#@koSNut@O%rbSXUxDZYXVf=yjX~dF>~2hL`Gj6u-)~j~Hc5|81wMX^(!8pV0!iTRF`E$`lIPle5pGia*yX7B%$MI9Jt<@47ts4Gv)nXrd7CO*V?j2X=(Zd`*(|p9 zGi@o_n;DDT*2Rv-xq&- z`mdUZ5=&Ce43dYVdTY;za~(z6h^=R>de-OXHblMF-zIFlE%E7d=Pu;TY7==QtXp+n znw)=8`$I=FNoR^G`Tm^wla-#5(LanROm$iC{CMBQ*DvT@z(%Gf&&HpylzlFLQ%d?L z`LiLljtz^52K5OJ%dAeXgGae>QH(~?9SD;kTf z34i>iE*QetmE5DlnR(Oa1y*jguUr03WUi>x-LZ3@M2b64skTbUY@V7^=`~PZahy8L zixPc53MnImKc8%3o6*oh_0O}gmMv01U+`efqy4k|=E$8|u}B9P^BVR>=?gMX%LyG~ zwR}M(2Vv<%Y<+Z#p-oId9OKDO9|sgR*1W|rMXn zMF@`4)VVcy^kT8~+9z0Wk6jcqu+(&hY__6Y&k(VQRyOr#v*#D}BWzQsL@H+|&`&L+(gmP3yaLPK8?LRFkr6MA0X}AVIg_+vBotb5Q%o=(B0KeTtJxOO% za&Wd6b|TK4D=BS`pN&&kS$?6}OmpkOx#-||upST{BV#(FFHO1ayok4b6>gM2fcCYg zh3nR>LL{TndwY1x+eY6(kH6uuMidJT{L@=K@SUo^a_ol*s%Q$LtCkkG)#%bnLu6Ik zRs@CTcB|Q&Z-u4L{rIymbB6}WWgG4$rJ)#S$@~XX+Fv28IL$FGiWhtRe;&Y`63g`V zlI=7TI+K$_t#mV0cAYz$`&60t7x$h-6xRq$DjK`_s6zkwZRSs#SNVIxrO<_}SeI)u zLU_dMi?9mjCS^XtH_%B-s{H9y6;o4N({Mdx2ccNy{n#H9CFDh2>N$^VL`!T6r`>pC z)2V}SQRK-!Q!Or9tTQ|*J(^SehX=(SNvrcQ{@T(gWe6Ph7pkWHngk~GKfd9Ni4HD| z`SHiq8`5!_GI)?R{!Nor_HsbiT-9}|)H@%%MB@w--#?2P0x`^cO8G^J#O=b3)3PWF zT3-R%kMo;XRsZBhmG8kcoaaGMvG7M@SNo0 z_Up#*V;q1Sj6Z$`^dk#_Jkj4!>{9tY{aT5^zdeTcYyk%2g#lmfqH+eLK(8rYkbPl2 z$#uqpek{f#Dyu3+lD;l-_%4E^@@lJ($YmF@f{#_Io6e+Hv(+u*E}nKJ%Cs5@&ML3p zEcLm@eWmrA%yP!z4W8ZDry9 zWYF}iFA*MG@W`R4Upd&1S;(P>(=To(zHc2sT_6(W=KwiCGBowatlVBR*1j)`iMc)F z?Tnh~PnH>U0PQ7f%bxqe!Bd#g8D_5u9AGs#MI?V*umm{5D^L$`sa!HjC66s~FcQ9j z+n@XK$I94^kqc3$@D@N8T25;dDHrEppD=T$;-M8UeH(|$gY?~##>%w`51zQdv-l#J z3NqZ3V==B*ySCrbxxN*wOb@Mb)HthhMM9&T;@j)eCfevF+1V_AS5!rw3ukH)e0aAc zc2f2P{$$^h!Uit5vz@el=-L|TT|!TPPdT%@rlTRLUd!3`g-+NGjo+Q_m)sJ}A^qpY z3SJ6D4hniDeoGhiQVZ-W%}b;=-7rZYbUeg3$7xRsHa~C8K2d9J@^rRmHVDJ<0uYHf zq;Qypz0jlI)12mb0}xS3*9^wSr4mwDx}Nx|xS7tVwX4lk9GcsHunCZdjqZK?LGRT1 zWs$p5VXiD31TL>?!$$w6`f`;nDPad`L<9}(vy)uWs)pZgeK7ZtJDjiswjM?k!&~;b z-8$=92^`PIo8#|XRlXeA`q!n(yDcsSHB&w9_O>7EmWs?%Mzrq+#;-EZQXX`oRC1Q} zBNTjNvaAQnn^hfh0n^sh=gMw<)l1SEZfkteS()_hd+%5kU`$+^ln$VHe76OG9t#kX{+xns4B2g zHD%8Y|8doAs0Rsly(K7$#_oFS*ln<9R`wuEuH*|ehP4-TB;BNmArdLcVs?2y5|B7Z z@H-bJP}Hz__Lw(@e9=pA_gPuZrgB-=cVkO_Ki|Zp*S0(R&rmA185F*%ao%FmFk0ox z?WEGVyIrGRDn{J(%qySJzJ1xQHUVT9+(EK-kf2gP(!~~@LUvHa+C(Z@Xs`b3T?u!U zKjjPZ-cpM-_fza-`14QN@oENr^NrKew0&76ARp5vQo=&(Yh>oSGmcn!-?~37EY!9q zp!seCww6M{*5G$8N>FIzM>3u1lZtrEI0I6|S?Rv#!0uXAR5B~u!jB)Xt{}=A!#)(O z2Jcd-9CB^b0qFyRuHgLOo6bdi;e*7_yX*{Ed&`!EX>Z@~9C=kvri`1`UAojHfoHFh zhF=tHAhZNQaZDho%tzI}@m_q4~Hdsg$)j? zIW5*~$Rty|AP?V1r)PRQky_8Er$^F>N6rjf*Tv1B8PUuHCe44A`ynG9dDJPmwC3q` z!C(e^8p(f8j^-XrYrh`gtaw}xt%8o}%(aBnXYlvCWL`B``tnzmb5tN>rTAK*J1jc{ zQhzmIx<%v_u|6RmiFGWU9+!zaw~AaN$5S4ckpr*B$0s=5+Q)r=G)(TRIT~zY^#>S4 zEV*TM=1JDd>F6W%J44F?>pwRKmiN=&>uuu3;tX%L*8W{_-4MD>4|kr)Xl{OR4sQZd zr#*%S_*Ns6dfW014s#Xeaow;SZT_imbv)M<+M1H@T3r=(s$n>|N1!>^Hd38|srT%e zb>5mcpRvHaJj}CefI%T06j3*XuF%6TwV#I=bYvH*tkn8ec znJIIjx1ciFAk`zv$RW|p^D4=S0+Uls+LFo0JJyvI)AK}uSx3IPM#!%NBnCo; zxiNE@|MpDcA*;R6V>|$TJUGB8gw>K7YWR*D_u!8^D_Qipq9Ka0yFL}vZ307{KC!de zDLITa1Vtj395Xm>fhQ70;YD~dND)E3_Id~dhU`EA!8lTxt za#4i!y>HdH&wXly*(<)nkIv-CJINGFd+R7Rk*4-?UF+{8zo zNmGT=NB~|j$fS?NC_b(;9kZK_tvB&E^Cb%KYCofm>g?W@xS_57JQ>p^QVNxNw|&n` zn-?o8YPI&}0v6z1YS`dCDScl~c3BV|7B()bCqJ=`kN^6l(U1E7VC$-*qTIf=imk|1 zLPEi!5u~LB5u_Uik&terb3jy3q@=sM8zg2xB_xLKlxCizz>OXaS` zIcJ}Jc0Bvp`|WfFDe1AQ;m))mW%coLJa~ki|KF%nQcNj3KSM#u{Jpnfdjt*n?Uh^w z-**`-ynSGc5ee_tnE<46tKFk=_6d~jWr9NtoEvUM%9`W(28KM$!T%;YU|)>48iG$U|+-{tG#5{Q-Vmoz0p5 zm5zy|FSb9zO93gcMRlem(=O^tYav9O|@A)6TwqE+|)Hm4W@~)>K)J-V>U4ZmjTfjs9c(=mzl525+ zNdCRP|CpRtgu#0nM1K|fwfl*VrN$^g*xSxJEmPI!py0G{Cmc>H=j{K~mI0~SJ9u95 z>%GtaNcGbLXa*}94DNnN4Qd^)0NVMAP;B5j-943gADd*$ZW)W2X$9W(q@X?Fau@bZ z(Sg2vS4g7(^bQVeYF=8Oat{+Oq)s%5_w)KeoL^E`$9wW`^hk3(Gy|FT2@|7Oac_}k z%r6?moYBJ@`%&sLD+;%?;>cW+mn54sfeaN6V2%v~AIK^010*ZRbN1qY+@C|U@kM)@ zoD$FKZ!vc47bQWwwgP8gst4L$pTn*vXV+Igo(lXKXZ@XDdkcN^|3y!O)G7`5qff?D zW5THXN2e3|>FB-!!2=Zm`-pPM%PhM3o&X5x!hck+n(2n6QsRda6G+@D^P{KfdHQ;c z40Wi5^R7jI+DQLf9RU6;gV5?7G!7u>`trFvqhtU7iH(_+Vx)+&b=gIFWvbLUrN!ye z^!ee2yK4Fq7z$pNu{z*(26~sC`1{Wd-dZv0i5J|s{@=GyeVIwEg6uXBZ7x)oo0wQ% zcJ2btBRTJQUm@bqjZxe`NyM7$T zjc(y*#ay!wu~Y@`8$TcAve~B3S(Y7h=$i`?JV@)ykgxvvt=NZ4Ka&3whL^WtEV^Yk zJNsSrMsj+iNs~dI3A|K13o^q^u*2!C`9sx`-a9H*M~p$-XjQEF;Z2juSlSNhXG#lA z4BP@w`u?YG=~^tN<{S-Y1z2JbbbmguH#a-3XJnczvh?1oP1aV;GbqnZcgRwq6sVZo zb#C4ZnQAKxlTfgA`}XThPr$1Zm+TKQnuCH12Ej5#eGmpgRssY?TsRj6y_BnDuzb%y z-6Ge%GrfapN-qO`PyO77tgY;50FE|B(cdF{IhsA}U z%7?TP8w<~jvC9ETA-}WXwQ35YznIK0?M^K4J*AKC*PWO5V57=EU3|JWB(&pt*nhK# zuVj*1Nwn0(8DG}VA3XnjqchWn9ZO;o8Nlhzr3nF&moV@NzpDER;A(Kjo16xmeYkm= zL-gIU`UZ52gGYAl$0+^Tw}M@EMm11L8kA}+dN5acxB^rfa7G7r{u5Ie)o5v_%16mK z%af-Aj1*WLgpBEjunx%!l3%fwBhPt~uj?y&fe2#_es{54bUal)+IpjK%U2|;D_)J5@(GQojqD+|+GPG3<-D>4Zc31nRmAw1Z zAGc!Gib5^hAyC{sFtezOhg+6RU#IfapRahir-CVJ{9###U)SiN;Ut2cFNTQgg**CU zy|=NA*-%sULE94Q%teW*(APs@K!x}&wminVk09oynpIYDjUoRlCE9K{AX0yT^I@iK zr?sp^6QX}DEEy0e-EaE0wf`UGVDq6Wv1vpTlSO>=L~ZhQs_`ygf*w#}$(%*0b$oGc zncr}q;KgTBJG$`pj#c+cwyovs&>Fs3m8e)rxsVX#M2b2Zz~Lo%APJ4<;PcQ&4pp9q zETD}C3wVp{7w}r|{~5Ks2%H(GDT94W)J-anQjjz|+_VB9Gp}JobE@?n=o0(x;0I$( zP+{{R3sjW z$}E+)L!S)~gMPVCJA(Q?0bVQq&l7y_uG?LzJv6h+xt9#atk=FfaU$XtS1uT61G4|d z2>ij$;n;#Lq|GNORMDcPjdE5qCk=x4< z*c~6NyS}_%vkdQe$j25Eq?}(b&w)PM4;)(BmJd0_LF;m>-scN{TINDAF(vqtN7~Z7 zL34zw96g!oi_j;wzz*tYp;5)Sxgp>_nAwWJu}XSVhFDt|+M}!H*PR#D-RAcYkwJ%- z!&{$brwhVB$};?cTR{)+Y`E*6p6n|*q)W1UuF=mxE=z>k6NG^*l}M-ey#@;fzuBpU zvmzEtGN$jJxE;hl0Sl>4D2{g7rp$0G>PJ@2r?=^=q2YzhWfSZ08rd`onAicbMWTMt zIP9H?4)y1SirWt_{b@9Eg9gVEU(H}lO#O?_rzvChbU<=kml_xp|5=fOjVlW)Q`T2Z z(|^r6WYs%b_i?F>@zJZI(sX$Z-QKOe2ProAqrNH>yv>w={)5?zjLTH4El|A1$|chM z;NTQqE9c)j|D_ImMI{5wIGzeU0iak(&%r_fz2#ykiU9nZ8fPzu;gbWBa>6(*gL-rb|OSpk};a%N3^{#c8)3KE9Uf4VwY1t~WU)eje91sY8^|Yq1;S+Aci{HZsLu*XI?Pg-U)d z0#H*FmF0+w1HdISdFHH!^2pGQ=(O_P4+Ui-`?0i9CNOQuJB?yb$Lg1h+2mExdD$0xNII!ekX}N24w%#KKjwM5QL4??ri0PtlCYAYhR+s7Chd zM_34boM_UPP>n8`crRFHarooT0p&7B%5_$*WAYN*ZnEO;tuN3s6FvP8iOAdeO6X-y z>tKm)B42q)dk5ZF;&F>S`OX(djAOSRRHFx4OQAAJ1O`?QuwByt{H~0)qFE!Om-YeA zct|~{)tj@sDJlob$FcBHtx=4+4=Du*i@L8|W~%tli*~-oN0sFzOlV7D8kBs`wf7t& zs7PQGN7o{8XNL^&>BoLR#R!&(qU$kO4ZSgBLb>siH#zL#32~lbZ!yzccXQx*qE<7O zbM+01*ShM~*B$4c{PBuK1N_|tF=*V`fw{~uLI`V>2MdJkwP!LMEEFE8B(b`Fd)D~D z^4cibmiyP`IhuoNwZKcWp??Rsn2r##GHNk;P|{7f$r%Ab))P$@ViChu>TIcC>HNT2 zMV^8nQI0|oDMJ|s`JDnlQTUz=Ad6#ugkNUS+Pr}eZ!jS?qKr%f?wlLkI-g}U8Hb4} z)P-=Ap;$!7WNu*`kIi%59YFTb5c5Ao7Q_qv*x$1^3&}SMhw5aYpzd{afZL#Q^GIi) z|0}TjHK16S_{(f~R2a;Q3U*OcE}hMeyUeD5pIg7`?ORLF!j+s4?c)yKuYJ4+c8)1w zB$n>OPVQfPseMcW(atM-G`TR;+U;jN!zFf9QPPd;h(Pz}sUN?#u?ti;n9_uen}Ni6 z-Z?9dA_lvsbZ}<+5ldPPR2kwR{CpXG@E7~R@(l(u(`$*M-R(YZveAhfw{pBSi-0&l zPR3Dk4meoR=b*A&_vG9!1?$qCR@#kxz3$9D3oKsW5~U$~@3%=Ye%)kR1;AADK~XPC z%69h*SuZ||Os)^8^ncErkP`1@BCglldXA;6Z^WfmYf(Q#Es(IXNMc~`N*t$v9bQ9$ zjRd1{X>#7ryqJkk;bfa?HAiI_tvd7jj+QSO?Tsh+Sre0Rn0$g^}I`u z*U-7y1zD~WAh^PZYB^W$b7@&IDSp#=d?Q%gm@m#|rK-lVo(cuvsb^Jw5AqnW_jsIF z;hzTq*7rQqX`(4wWW|S7T(49^FjK0-Zf%%O2O+`IPQ%VH(k<1!Z~Dwi^}bE$H5ztx zzyYEE_F^XmJ9!%Rl3VW5wx4k)QSA&h)n3MB<6NMX;9*_NUo@HsOS2KJSk z@muPOmxs%=!LAt3#T0JD6a#GDg3Lo3#GUiw;cixs0y_6U8xHNo1ONSsf5zC)WhXJt zu*<8%IA^Qo1=o^{OPaeDuzr(*&Med%uCMCqiea>WJ%fwIafoaw$?iG&80$b)`dcyO z`_)vDk5i$IydwM+ZeFG5Qj`oA@##iH4jXCp6dC51HeUqvk=^iVq*a|Hy5Zf{Jo(W4 zhOTf{wOj1kQT5H{L!SOSFxbwz?lI#+^@FG}_o*;6ca zFmhNcDV%Ngsjx{Thzz2%xnq>j&7*HI6orZx>+jCX4v@oG6Lz|5V;|ID^zKWo6ql?E z^C7(aX2jVY!(*@_WT`%aI#re5o0@$MiQkKx9M(PDkfY7Z0@ytco*On(uiwWWwH)5G zn+B?5d@VN!yXs5Z#Unt>!Q^YA15gFPgbX)(Ukr)h z2idQ1UDU@PLU&^x1Oe|NW68{l*vtu2pWxQE%uyjv_wnzTjaZ8Vr4qhY-kuUAW+8pO zhX7PjrqDHduW~I%rbfw)71p)JE4ZjSFfb>!FaPf<8atbKOgW=aT_xM`HauJgZ%t)W^1UR$ zR$6b~`jf%|S^A4XVcGGLzYf_5G%)Gx-UxtrE| z{a(gFA}mgHyZW2n?q){f5-mBefae2976MT*iFQ$b!rw3dc_rtIlIA!Tqq%Fzt~9=j z3j2^6dfDqV-5cGsxvhds>&5Fd329c#AO&Kh(7qkh{Dw_L6~Ip!1mqHL2`^BgkV$^o z@xC#4sikf=AFV|N^|;Gd37ZW31wyooG|~A52}j?D4~iG4X;VGJViWxw4%N??|MdbQ z=6&b*MYDSU7X>X%@Q%Nv?+t1|Dh)BC-QsGEcRL>zu90zeky=9)|8|aUk%Z&0)%z`` zT!07VrEa!2p&;A&o`U2c5j$?~Am_gig6l7&NarDWC*&Ag(K2~<1Mswq(g8|b8D#t6 z=a~MVWqro*FV^RBDiqj>M62InWJg-nh=#@?*je# z_#LY4+PVPJ_(}&I)}G^;x2!ryQN7PYu;7Ud z&%cS^Vs8fv`!4gcN}9asreV~#We|wAAHTGCr^Q5Fg@?G?(X<#QBb?xZdMt6RiHY3n30-evpT9slT8u6F*5vOC>TtTgvJ{4bgXT8()hz zWLzFIeYrQ1_R))Yiu=-1M40Gp%PA23P|q!&mMW;vmKy>1-u)OEmra$d^(SMek-hG| zLmgu#Vu{RG@pGx>#{pOS>i7WUtlEFQ`^%Uj>rDO3<~c*Bm-o>N!v*q!#!|U{F*e=o zMzNOlt<7i}O>Vl_&`@{vo?mD=rYrtFZCB6(K`j=J8z||&@9G5neeg&46x`dE?9F-@k_9H z*gQ*DmIc*zO|xqSt!SFKF!jWVg7NFks9bj1i;doy*3qa7;aX2UyiFf--}DH#%#2=X zRi)o+S(tDCQq#+RH!hs|gR#y*ad6^ufckl#;;n%quM@HJv7W?N-l4&VA6Dq`%=Gl$ zK;Oga{QUVO_^w{p#KG8v0#{7gJ|_L#89d+j$GrY=y|1cAIof?hRH-Z2pu8m-hk>ji z-D#%F7A9?I%cqFf_S+^cp zy2w8$e19I`+iBldxFsR~>el6y-&HOR?%!v!@cc0d}fsI{J6x5Z}9bSZ=;^jXU z5vd+bWc%=74{U~xC|TzLZ2QP@bu=l#<8WxbHiq(l*B9XbnEJ7QPkYN(z!p_%*Cm^D zn0rsoV-b$3u37LSG#N*z3cP(S)<34HJ6+T^$>*8s<&|2s~D; z4}0({hE-ir`|9Kl4+`tlowOj6{h%?_llbykdZLTOhesa!O&;>#3mUT?+yZo@FwwVA z;o!#&ieOM%Jwq)WImrg({TX)vA_7!73W7 zZgMMgGa~9k`fzPnep{F1)WhdPCX4Nh^$mqg@t%DQ1U+>ZCC`t&oj(q^^rXpP9SK4i z9tQ&+_rZpLwH7=G1XGU44z;~7sFnG7@Grid)z`H~n^6N=91tb#5d5+TH9FKX#M?&5Ia5^9(!z!az&N^3iE zmc5%>xl&(cT}g&Uz?Z{S!@A!nxNapH4Lx^v8o{{^v|eBlvN?KYDan%4)A|Dzz8U6f z2#XKR+7igI;1ulZTyB07mMWyJI^~Bu81~1nB?|U7F}7%LAiMOV3JM$K$(7EMTvd>h zBRKdfw2yZH^{M;&`wtyDD!qB_`9u`-^U$3sD6-C_CkpkBGS{L+A(G5xS?$L@mw}K% zBYE*q*&~U+Wyx%5Rsrf0*o<=EM(@)5F*PYl0&Vz=-PzqCKnmeGD4Q>H)Zg(sd|}Bs zPta<vC=)QQ9D_{`txa1;_p+jg_Nt|LocR z3s7^B_rM^GXEg0mtPG8^62GJdTDif@kORV%H{m7J*)^-+ISA}|8O#NY$yBLjJRq5< zwhVZ0tV@Qw)PpaiFifr>xB#gw(nH*Z24mB zYKuERw6=({6@8G)V`4tCE8+2gQL@(1Tq2IRx|om`fhpqn_`zeYERVa@J>MOkk>=ZQ zt)uP(a4Te5$8JUPAGZ=%6x1=FWkug^hu6a?^u$z_(REBMhmOkbPQN;(Lu!mMQ?cW+ zdAB_wDv*g|3~SA9+nmQr0oQi%zPcpMHKwm?vOtvcDHhl6WObW)^nn9zxeO$pd=YsL@`JCR0fQd{VawV;_bJ znUjnRTt%^=?}vs`DZ;)w(~te78|F1v-U3!0(gXyJ0K1SN-25T~vr*q{e;EK6ueXT% z`yr<;bB8w;zdWnTFX=O8PheE!doJ+!f@gmP5Z+CoZ=k#P0jj)|761fC@0^;=@+nt9 zwY_u8KRnZBgs6~VtR9dlOh)R9t0Y)duFMZ0d|$G?sLVx(@EH0i9W1w83Rwfl0Vp1X z0L{|0nk(S8<7TMnJ)&6hdjt;sibIsWnu4-j_c{UPvAA3QC2rQ*+9xRM>uss^=Wphy ze>J<3-@b!vzNYSOL`jzQkZ@^fUa0fvCR`GjH*`OYTa(H-!^-1gcZJXyH1xlqKOKXb zGW>{gV(f%k&-tpjvE5!$+Jv=8_m6|HB8ppMKB+gX44dFsq^|lL`K{`*(nCDP^8=6O ze{lh>;I&#fL7DmqI)Y!i$A7GQUa2qCxY$xCHs-B{Wt@}uxkin@Yvq>L)1|54dO6h;t9x%Wq2D+(RMWro$W8#X zoE}gbKLf|@p9IB=&NAc)s7V9-m8kfe-9aDKkxo^h@+6igP>za;RshdGqPSggnsMNH z&9<@-$-qn=w4s>o>urPYDm3Yhh*5Q>AMm?90jwzFqyb4F^Pg0rrolVeq&G@`r0yWs zTQwvjf2aabN8V5uXQPO=K^;XzB7Dejp^9wUq4q9gx9iijXs4@8nllunw=#v*I`;Z28rk_f^AO z8i0ilC~@$wcu|BHu;-@}sY|qzWH>?w%Xn0BJqo|lIygZ|{XSn`>-o6R$DD>2cd5bq z@J6fI<gARO`#j~`hxO^ONmbMC>iFy ze!?0oxoM;0n>5~*E;>VE81Zh(UB?pVRrT~5stzz`7hqnVvotk%P<*KTPxKzI`?z%; zqBCM*ZhouDCBJ$n%PD01FW*i`y9h57sAuFEh>fOT=t@Elu#)JnxC<^JQkfj1Vr*)D{Gh|CWtcXyC=ZqLP8^V za7Fv!X!@(R398!w@RmT$yG0K%pZ#<1TDqVQv4~lUw_yf+ar4t#8=gkoA{CoGuFWv4;lN;T)K4;X;F&(dHs+9&h zl8}K#FuYc_*$ZdGWB$8+{{z4`({nrMqhz>0_NcI@=_!#)is!5&xPUW;xYHtcL9^8T zP(qR=MGXW7j?7j^72PI}@(nwHAG+uTy}n`a0>{!yiPFD*UF)Zo|MFaZA%mov2^oVK zoHWxP9S5?g+qE~ezrp&(j~JNLGN2V+9Kg6Y+7O^vW|znE2-MvkTXqY2fqm?|pL#4}5<+9#o!ul}{tH}_AsdD?URY(M{B zw|H)2<8YTCC&j)B0&WO^FTXt2RL(H>Sc)xp3SLytlLZgr@SFkA*>ngMpff-L8Z&WH zU(-V?T)KmTOePJKvL~8ugeJGSaK7%=iNpU_1E*gfVECd)Ew6zBhUBuvAo*9&EiE(H zc`?bi8`^h;XWCZsda+;O#~tGJ3{UHCVI;}-X0;Q{{~hJPKtzNrlAoUGqRG0SihUpt!>Y(f&Mo>;qT*HcaB5 zhaQ^;{9K?g@ex<6tWVvZiGz5~ae~DhR(^Rbia8zAmVjnIu35p!eRAWElY|XEUCvXw zrPXLG=_mh8<$mA`8`~(*Nspo65W` zl7F=&@v}?e=GMTI`*ARSd&%YDo_BGyuE{t|VkJC*onQVIm#B}X>(J*q{y$Wfi;F`h zCE`-gEcZoFQ+c?r?|k{7^*ZMC7jPV`LDSZm5~#-=aDkZh_0~*v!Ofi= zJxKxw0Fnf-tjVdvB>5utnsElxR8u) zeA>Iv2@0n-2AQj}q@II35X_^&$OCDMDG+pg*>nE( ztP*G~RFf0KW~FqP1bIsg)594CJ6eM=Tjb#^-k!4tWRp*L5XIzx-h^*Z+TjsdSezd0 z&`-aRLO%wq3SPs0?CIsdANjAh5~llDMFpU$G2=``RArXlGlwLcm)uT)Q4NP8hRvWQ z{p-MjcX%9A#NRBrS@8;RF{-m~0*xl*RrwO&X(b^N3i9hhmzM63!nDG!PMsDh>f5?4 zw&OOAtx;$LxJ@+Nd}bW1|Cn0OrKXPZcimN@2VKe$_pL}>gz9CqJxtA_VuD%ux=Vtg zGRz9OOH@Px{+N0=L4YNbsvGmJ+P>AY$5r6Qmu1M3v~*jic06lT9#E!bp?W+*!Et#3 z0}oVDEcWq12M%a9S^E8@N>>gJ%1|l!`b$Sb-GV6$>G?vpeq4C#;?N5U;1yeFU^pxj^`uR7uJFzv^B%Bc& zWkIfbOd|B0X8+G2nYpwg%}3oWzYkpDnubH zoZxWa3!h?Xi_BqJjhN=fVf<4k1<*IyQPH>4Q4#v`RMIDxNYa#2n_YryssqYGEIV88 zK6s5o4F+?|J9;SPfW2Ux74d!Y`v#m24*3Y7s;;;i%W)s&Mc%==kfx8S_M#a zUF@*^he00=yk+(6+p#4)MU|qrhiccmeRV-!($y*uw&WOO?_P+7j*E*&d#G5B(>2V@ zv7MQHq1|}ow26N+rtSRM&7Z#M@5rvNCCNcrsNmkh(DG@2^EM6lS_Si1ER(e%lRY)< z)7A*fUKvrSa~>7!gg=T?I%fvb*84Y^!V_q(EzZ5^S>kFsXR?xMV;CHI?UjF-u~SO3Q|nI z!`%3Wt(*ld`vI6<4LVWL^a1 zplut1xaJEj09g4=733}a;Lqt0#tApm8xG{s1v4IU89H#&w-w4Y`+9AKwvthhfbQD% zRB#!HRk*#XOO~2N&fcuAi!CPlQQWkd*USqS1X5>*N2t4)2#Yp?gQRK7aFr?H{urs= zi`OFK*{+jgm4|9Z^Z4w?Ty{51tAJgbf5N1c9 zc1H>yG2U@C%l@`_qfBy~+vc6;EdIZ(QDQVHj8)BL>mH9pwBhJe_^eK#OGG;Q-K3yt z=qRh6$ohF1i#$>-?P1LflF#IyO8EUde4t(@wiL;*YwmkWg`GW_FrY*-Wa{`u=ljZw z&B&?VKS2-9DQp7#$27qCDEGN2o)k-vL6n!**;QQz(4*TIx|Vdwp&xWPh-;HqZZRQg zA#R;TVf)#Cro9N46#^6c?TdDiD@nQ>!UJpzgnJq3S+(*o2ak|(P9YN~@)v+PwS^z8 zQpD>Y=!Hd!7|B4H`r+IFQl)Ch;qGoIgkAth=F*WnpurVyB^hZKnbwSj#opsoJ5+8_ z)aUdczLpa2(R95FcsTQtLc0>&`eV!$%2$J#qsKcOiMneV;F@61R~VbfAII|MwE6F^ z{>#(KaW!hJx%=z0g7sPRU-?X<4_mX2<~C^%Jc6PlQN3BN-;6JMQDg8g(CRvqQ!%0u zUUrWqF&$|UJmh4`paJHR|97dd+r`ITlB1A`&t+A7AXjKh)*ck&MMzW^(x(Y8bk%7- z$AzL_7#qoiDHbC`{RwjKUEXs#S^jTB|Jw9cN_MZ{*Z%D_-4MaT;D`29>+Mx6Y4>DP zW1hHkTCt>Iv;+jz7`6fVme~KCz*kA`+EqUf_bb@T`5+L8^kW4#Q@>i3V&tL5ll*aJ z#nBaPp>Ti4`KWl>l_ud0xIB6=Zv+kKzD!xRne0f`?TY!O?1#yIKXJKz%YdFZJNp-W&v4B#|o+@F=oN25^*W_Vo za{|6Jty{|t1-jKSdPA@%m|7rpVI@46tNxDhcjnCD89+`=)9YW2Hr3&oM8n^vzSuo; zHk|g~$3E4?qu8C#QM_prG9DFcr+ms8z-N~J_O9_LYurF?swwju&>1EN(lR@EV%!kg zwkjS~3y9bzk*aHKt{Bj~_hP4{(qvv)1Yva}=go;*7(j18norPGn`HwW-W2yk5Eu&l zJk-#EJs#7me_LKrBhWDuhE%v?-i?vNC78&O7zq*SqDYOQSuvL1MtX*C;&O#}L@Lglky0Hnx?aUU5qecj_&1y&$OoO$p#s z1x2=h`Po~%@YZ0)OK#)bXb`-49V&tPv0d7AT|QZvz}T(fz=o5577c=rWJxo zt!^P&zDx;l)hJpEF)>;vf>AH_!PGPUpe?I3nqlnd!?(j|hRWK8nm|3C&volpey;UL zW6OI~P;gS>vMh!wo*NC7s^|JZ=O7VVBE;-gPZ)O_^=)J+)Ipk@6>EZsuK*Dd#y~zdI^ev!t$J*f( z!-I4EL(mwN|Mi~VVhaJ?9(L%0{u;|}UsQ^sI@JWi<@unpw!2eIrBB+{kuU+(9_TPa zM+)O@m0+1ZC3rQMnQv1cJiudDSJ^cya2VTwkACFDfk6__nbo)sm-Dj%IK7_T!$_Xj zm{O2j{!+Jo>NhzvJkv^PAF>`G*#=A2x*XPpIzuT2vk*VMO4a`RI3JbKy^BL?n|)ES zx2V+wW4>O=dFPtH^<|2aYd>@-ebvP~b%YxEmxkBORq~w9pK{JI0j#RYp@Y*?fHGG7 z!YsFr{NL{2k#abgdcv_XE*94$;{qCblJ>tzr)&a_W{FP&9ifyJdEmHOdv66(B?*Oq zFXs8pYPF&+qPHZ)%?YX18^d)X4KiZ@1y9(+&`}Yo zS@a42uW|+!G=3xCU zMNG^*NZGu`HGsW_9|?-8+PZxNLnxm6U*+chYS|>#@kP0LZy0q$NourOOIX$Z?ry2R z&q~^+23T8p%ojr^xAVbzUSEc@3i;^vP>fMEfQ-)#`K=V4`aP+>N;U?wgL`(wcpA{| zWy2aW(%>7#pEq$q0#ncZ!RQ7%=Z#PHc29*RY6y9c%nmghT=$};nQ{RN10hyWAFyey z%7Yl(aswb>BLfMF(^Z`#8@WiN8{$GZ!%8>0*lo)pv>KSM>%W_>Z*$6~QZ)`>?GR6U zpkfl}_(LAml1K8q-&6^Vw3Wp4Ch88D#+Y$mY#6yfEIQ01nC+yUlcj0;p>ia1JPYgB z1QOPZ-Xz7>8MwkBkNCxw zRhD&UwnA*kxfOlcxUlhe8OjOqB_ilsuAsp#_=MT+R486jp3ajXftYa}AhZ zxMYkK!vSdBE^!x@g-{MCbp=Kc8F;2RqkTq0(e~NwyWrTotbkAmW8|;QXezN<7)+%< z_j{}?I)w_~0|PeJ!0@eE*IfKm(2eI64+A_{sEK&ukceO9&Ng76UWB`XD-Z*7#hUr3 z1bm~4{0Z9pDYrBE;PyMwfif?J~e0@sjpk{@gHpC>H+hM-@wq6ZNMpuY?I?{leg>S7!xd($;fal=b zCyrOX^Y>kQKE_2-QcpNlSxi{OofhmmU zV*{q9fzi~VS4CE{s0BsEKRACKLPwhdzO{%SJB@!YE4OU6SFolI7zFme)#~_;`*k~W zhpg~g{pVIb9xZB1I8i>1iWLC^5=vZk$S6Fw{{rpLLsbQOoUK^ot%clNashCJ?hI(S z#zd$9&jn75ac

G;06w))_^uk{OtrQTzo=92F$ZCzp0JgvO)e*Q2|4Lh3{HM}6IGHR^bk z6QSIpaOcG}uEBwp)!OklVj(@mbh}+s3Oag|)q*aDyjH#TBu?t{vw$5-In2TdPv#Mx zfY~k4C_`Ti0!DKx_VYPsK!GqA^dN@?{##B|)0k5$Qlk-8 zAR#+92Y&8G4v@OxPrTP-gLXkHG+Zde*i5}nXRm?0-m0-Q#-jr<0LH8e{A&jA7NWbv zA^*@_4AAis>v?I>#YibX4IJ=~#ZCIL1!zy5NVSVzylyZI^4YB0b;;0s{64Nb(`F+F zkFc9i1C4P&X4gL`uf0+zRM-|X?Cu8QE42q5KLk-@l~O%wh?}W5H6yFOG(1+MpojY< z&ja=I!j%Ud;;4zfite!qV48d`kf@Gig1afXtonnd zM|`tVWA}@k5JNS-+wOVm``q^o_tsl)ZAMeYgO9Xi?#BhSjNBX)2f8Or-kBGCCieY) z$~Vaf@tX)|e3yj&{6>mdasR0`FyxI&p!g8Jmnq)se!q}MqOHgnq@F_Uw|XzJZWf!a zX4M%ThD*<%7i-R4>?lkwfx9ZA0*3;selj;fvx3 zjBvR(v>eDCvWE1hOF7AS5f??>aMxV;-kKU6HSHoVzG{5czp>+IbK%(8BktwJDSTvq zGLT_aLjrWM_s{e|3dFCO7YTm*{=YB!zF z_lKUh0SiC*#|xmF1|2=En7>Dl#>E5|b__?%Uggcj{9_0%H8xUklU^wethLH6geAre z7#npu#Hfix*&U(a>v@t(8yds3jRPu)v2R#rk|Bz66kwBSkMgz*povjKp>r_#KRQb! zj*?w#uXg9wolzrG#dr}-#HOQq(NYj4cw}h)lGG=A@sf!C;}itS<1MFb^GcvAgybG5 zA2@V*RuBQtBA=spQ?m!7WL4sNGA4P75`a|8`!9~nN2H3i1}`oO!>S&1fA;jcM+Y5n zo`CC;3jq-dB2R_U8FfCGZ`}zDKg9at*XGsCX3$LbgW?JHIqcCxZpAF)m zKXd4FhA8n+DV`_dw`TfxhoGHI46`xiNBn$Q1rablbLkVn%u^8n%`h8}7AXvIE-891 z2$_u|nL`^PirC@}vg>BK#3m5U~W2o_rC3m(ozrgRLC?jb>MFmQp-a_1ksVL z2|4V^fRsx5;PgOX;4vjYn%2e`qLH!$Yn8b$rC#O0zFcRv>IuG=8rE_++eErWx?BwG0 z-zGOY7h5K^^IA!~KDV?-N=R_v^5j`@=*ZJtl~@;vgo8%oL-XdPN0F-1o5KTE3K=ii zZW{$ru|0T`b(c|GL>ucPY8zDN)qPm=APG8iU$47oY5r_M-%)bR?L(VO)cBvi%tZ3r zt~kgI>2fC9QDD@Aj`{-~s4T;KL10Sjv(E{07Da9?p4uGZkx!6aFCGPLzI2YQbUj#X zf*BnxHHMP?W<0q?$>DQ1fC#^>ue|lW>poK1m3IZsOC{O=yRIaTT#OMzPU(LmO18V& zMy%FKl6f&^;`nyF{%}0quRj;=&xC@>XUh(u>`j#E+Qf^Xmk@N#ORGA7cJ*Z)$1&br z<+m0|ez`D}<_7$_g&m9etg&}s9yGdNXx{M)6H3HdA2DsY8eV#J+)^EW)+(q>uT#kJ zg%RS_ra%=R#rldJ-5MktFgy7%fH(w2QA3OndgfxIcyU? zD9}P4-dqACk>%NcF+D6hD;Jom&%b&l@#uCN(Ld7ze)kHFQ>gCB;p=@|KeP%6_xGc0 zmdLsaU4{pf-2xpmbuh`@Lu;nu!%VUuuW}J231l;yUx)Lo2^a4(d^OxFd`x>Y@sUQP z=tm|SZ~<5-ZY1je4w{%g`dvq#q(9N;XBmc|kT2*FL29+RsA*_Y-iSH1y#cN`ZPTh| zAJLKH198Xc6-0?U#|m3hffr03u&df-actg0x~9eG)>FO0ki%)^F3KrAA*DLs-PDa) za{lV9?-j4>P)bGu>XNv0xzQiu_GSLmHHM7Hx=QbRuZuIXkR{Pb;}7^v2H(LXZgu7Z z&MqpJ291v+wY#Bb1&P$aM!-7lI%G6UcN(2NIi>fwx4R8SMQk)%o87TM_%q+Z%o_cJ z8m?M4aoG5{lz{Pw#@8o_&%uxtjZnXep~Cmg7|>EM*6vBa2Ku!!Y#ONziWR!zc@JWt zYhro56u*C$LJK*Seh~P!>RqXnT-{nUDKGnhHX6qY{@gdx3h%As8J-g`|J{ytJu>qh zx2a?Cd~b)|*Nox6${hW?nhG}UiWAg6RCKT(D1_hS$k5LC)+Mp+WdLHym=rmU{U~7p znpT3|Hxr0eB?o?%y=DVOP`J>i_%~eG%S}sJ4)i4B5SMFa_nwz$*&MXh1MLAEIpJp! z)774Of#s}=Oe{xB<`xk2mWD5kapr?&mV$(oYM)+T0mOOm^PTegY< z0j)rx#Zm;%#|l65{~-xaZ6$Y6P6q%pf-empyngyWJE(_pZwh9#78ExjK3!#Xhznc< zrbb1dBG$z1FX8^Pi%NJOZSB5+fKg19d?n!fIn*&h5;3+8w00kRPN_ddvqJxPdEQD^ zR7#%UZay`slW<+GXL)&#{W^I>fD(vlthEu?5;EVhh!ygxTV0lCZ8< z1)!29@?i34(2XdtxHLPks>A6hGwUxxUdXe98NWRyeyu)a)tlBR{b^cbjORltsqUw= ze^9Oy@iaMURH&s9#u7|-yNl}GaTAv-U&3|^+5J0eRIy4Ul&b15J$@1L-u zi`6hk`m>~zqU12Lymm%L0`p+12P#Q(Y_~zcN3WHUx(@h{>mQ^*Cm9Agdn!o&3HV#d z1=ZgQZNA+%5&fwq{6mpyHHc)ZeL`b~qxf;5@}J2@PdZxOf?+dt&eCFnY0@*xPI!%9 ztmR4)Vp0d5jwBcc;Dz&zw!{%MuFmX}1ZFk#Lk%tt_@8WJt%Em>{=cJbtoOM~7Z{JF zJvZFv50wA5d~)x{Jnw@u9C$xOf%yRJxm}fkyCWUwsfJC(#U$@yq^_uaFk~vXX+Fmo*(qL zpui^*->U-v$wy$A1+XjQpTJjwaU`5~sMjn5AIZW$%r(JP0UjHFj!T8+Nf`NVOJMwPV8j7@5tlym$d-hI8bThGeU9Gghx!7m7VwK9#*^;W-YJqc2Kt z=3PWMH(jIkaK+_1=fg?ATmmhoCU9lob7tepIWW2Ug2AJN8)ep&-Up5j&ueF^NZ?&; zvBb{hQi1?@feK_X8EySTXRXHq&sg+8M-35n3B0sf+I^rWw6_s|=#-zh*uk>x73hi{ zpS22<9cbQnl?r9k#ctKQOfCKy)+XO{gd|MW;TUvM-!FGEKakMzGLb4?pDf?tQc(Jl zZ#@CKE8G($pPk1m8p}LVyz0=1P3hSB7Qj$C@AS+lAPlupkdSnZp`JrQu>|X%pjgEi z4+7q}4=TeCF@Nu!8)D+{iSs{wa~$xd4-1NyGwaRdf>(-BE7&e{7fE_FuEM;<8Iuj9 zr#U;x#dtcwS3lj*v4waVlicN-;8^b#?e5f3%)gnzxW_m7Q;;k9DN^4^z?=zbi#_;S zOQCw!2+(?Z!V)on|17436PjW)R`w(U)Ek=FcxCSSph*>LWZa0-EPi`*TCYQ3&lj|~ zoFPTJkNG6*X)I$6ueNa3Y5i(B0o@D6TzRuIxe2b$$R!r%%^FtuuuLfjgf^C9+7qFz3cg~Z9Pz(g8h z9l*r*g%4SYQov^(y**mR^25m0H36mB=hH6_nd# zpnY;^yB93!^h?7cB$2B74#<2rY=W2!tZ6hN9?2il)h*efi)N%hEvoG^!)rbppgrla zxpb(a>P7rv@TefvaRPIb5qn)??D!T?X%t zFR1)G^<ahwwOieoHlHy5-wKD;&1 z=gx`xA_X;zYO*8~mM>HCkjA=_h$b%ua`}g7jbqZ!1OM9Ys3;q%nrvM23o~(pO`K;)iEWN95DmiI}1Np#HR7 z$Wwt8`{JtK8t!d=wZ5J~dz6`>)9?%G&8%+tA}9tK-kBizh!^;=u7yEx3+*~&dQ&5_CI`0(r zSpr!pF2;QWDw*-dhr7cyJ%=ofCcYb5KIGqM#T((<0!pF9Q}WbXM}ssU`L<=D_-gFt zU>2GtsrGiGh{w+$aE7Cx5ZI_D?U+MX~o1OG$WCh*AL`M>rZizH3->hoIhLsZ93jzbCw`xS0_ zYZVGI`B;YS zYB>a%q9PJiPrB?k-c2VS%x?mKvbPU3Ltz|-;joije$A~7O_7PiJ%@{mk$?rIkr9-_ zki2>8uvX~3@6tYIRDhxl?=|ri{s#w@CO?eITqJMyPhI1nH>~%w{S6d-I#iWNFOBnP zcvf`pDznxoG&Ulhre6~I@7UDUA8ZmK9GIAUm-vM_{?qoRN9 z5$=7zy8q=cy-w!;%oNct4)cUvl2ZrI3wp>tUV};A8wQgZnr)P2K+|Ml1XO8l+dB{m zi73YpPscQkpOrb>7nxD{ zIvOLiw;UdB)F=U7&RzfKna6r-X+pWM&AOjEiHa{sCI9+mpa;_Y`#}5qeob1`!K(+j zaU4_PB)@$~HSg%`X#*Z9jgq6&2hZn=PWW%iHPGNRMm=O9?7O$~F}57nlCrndeei4N z%dG;mT8&S~o`q=ZelSfZ?A?Rb0W=6=e_*_RIdbZ<>oFg78U$)PPjAn7!gkZWu*)5N z&;LxNQDUKUhfGaG=CiQRSr`goRJUv3NS|Xap6h%mxVG`~rZ(su4RTiS?Z}IKaPxCg zdF4Kc(Tmy#R4N(98^q}8>X2LYPp6=$J|#2`)S;NsUhbH#dgT|M@U+A})Pr}Yj^~eg zmVpRgDhFThL`EDByF<&6o?>E;V)5~S5yidxIPZHj$-=?WB=H~nk_OHQyEU?U4%Ibt zfllU2b~}|?A zAUJglf16mv4wUNrx;+!!+scplC{XPV4bS-%t!+Q5`!MNH&FGPl`Tphuk%!2<7`x|w zNTmPe+f`RGa#4TsJ8XT4*J$8cZ$@|Ds?aq2J4p1Gd+g|D&XT+f2mop0rP~o*5F91F z9A(TUtX!SBK+lxNySxVy6VfL$mw1cdd+(mIZe+!tR;s>48bK!Fx)wY^JAN6Wx9G_! zz>_q7W4EE`?X=J~3PtZ~%~5IiqQtwIX#|;=h($sfi5GLFyV9~2bV<{fH|?2lv1(p^ zMch86c$RUB^eK&iXQ?3f(YC4$?Ryt)S&oyN?frJT^&>C76}fW?+rbLtecdxT&5a%* zSEKI=&9hNf&YA^53`qAi1bV8i#^>SZI~?={aKDY?|HIx}M^)K%>%#~rC@3W$qI62P zh@0+Iq#J1@1O;T%QUW4wQbJ0Q?ru;4>2BB{NH=V{zIF4&`@UzK?|07mjq#0f#&^!2 z&+uX2Yt1#|n%A6jElOd%seEt5uDzVn?HiY6T17CwRtvl+_wEBFsqWfcFsacEI{h9t z-v1+Pa9OTh`}T`Stymk|$NQ`6$cw>nc%}gJdA%{eJlhcy|43+%)nN2@6u*`L~E{8oK< zz65K&*Z{>cGrnCXMd>$4CvPe({(!#5yiBYwugou209%!9!gS?7@Bn3T47anq2jhEE zIA0diaB=mAj=m-4vuZzLRV}!#ZLo}V1nfDbd z;%gVDI-rIkuia#|PA0kHDFe82Mld=C4)I_4aUCThM{~5Zc+VS6nn#_C%t=`6pN zTj zENrljjDuSq+*nPb1QJzfupae=KARu~Fj~pV)99OjIy$gT$G`)cx`PAnR^6yi0{#BI zr^NVmQ4>F7F9+spGn5MdN{%k;-Sfk0;#zil_;=WPj#ADO(Kid+hYVerqwLdecR(o* z&El31@U^3^XE0FZu#=;&-L{iln8HjL+cRsUV!(vH#c39hDF(jv_%F+VZj+>jw59i7 zZ<8FB2lbWj)OIdHzt)n3Tfge_Z;)*3LT(T@I8%Lo zvHlq=K~H_`A}RLsSmKoFfLsbg3L`<9q$o9$RIvY7wJ1&Iw>S8M!%qorW3F+GB1kc> zJPp2mRgDT2?p;dv@gs6#c+Bde=hYm0O*~r(&tf-hvHQUDH|-j7_i@jWa6>HYWa3p% zVQ*oj;FYL_aE9@i+6QbnNzt;eCtA_nnn`m$9%Bg8_BU^}n{)T?tk8y!mv)l(m(N&@ zJzgZq`oyUo(EWHMhW&?ifLs@r@Yw3y`+7Q7s!RnqlTjRQ7Xl6blRzzKGJrxptp!d#n<;Z!Y4t;qy$`B!p8c^9r~<0EYCv1$ylk<=&d;?HkR z)QK>Bj%4e(&@K*=-h81{Fv-!id(Oc3Or(CVla(@mhd@YvC^7H^f6QGr24&>AFS#a% z21^dg$Lz&`&%jdcZ*CpW>|MEnE!wDren*SsAe1tnM1V25KcP=jJ~X3-egYXOlx3sQ z-n!1F9x*NQ7&d`?pqp5ozB_;>0CWCA7u_9k44!O_iZK68Av7XXLY9@_Ua0nd0yaY6 zgIs)1fu64RsI5<88TBY8HZ@R>DQXyIIeX^$J+-v7$A%isXA8fvvA8nk^kvzlgo7E% z@2XS;OJZSV=Q>xasR${j7JU-noET@)U6`aHWH~r@`z|q};JAlw^>BwKC@l7I<&5Cu zXE}PapIGoU^bTXaCl!^cfysxFItHjG*7rBP>X)v-P;}l5oP}@HMbXglUw%dd(fp1x@_^tb+!9_{*uP0-ndLz() zw$7?ws*V$+IxZjm1Dd<8XY!KrBIHWt21+Uv_~YBdRGaa$rZ+JWiaOSbBdTRLmgkbP0?2ya;`MxsHQCwVB-d@TpNLp}m{{PO& zT~$h}$c^~AxOqFMc{g>?;Uk>RfLf{NEQ?2ZfaO48x3)p9YcNb<9c8i`JhhpuD4p#* zZrJYf$y~Txg+Ra8SLGR_4F@oT;>JdCj5}IYR^A64lMfw8F{#k5Okf)sjSVB%_qM(d z%`RZ7#o@%svd1!Z;UpnsU%$kvbdkE7L(YMqmPq$#dmMCnKy}F0GsT=|FT4@&6V;WL zZeAflFYGKYI(6S&hZMzmsLe%Vh`vN^==keiAjP+_5pi>W24n_Shwhre`IZj3sgvs-@>%;e1nZqB~momQjzW(XL>lq#AEv zIM<|tYv1iztE*Y z*!DD7>mI%@Wp$Tsw+>X;W5>F+!qqq!kY0RVpF^iJKt-!kJ08<5&0?MI+(1OHO0r8| zPbp?QQaJm9`LA98U&>bu=F>nsR+i*}E(RuI_F`TmDYyacE1w85FJD$(Ry$?U^s)S) zg^R}zvYaLoy@s~0ztt}q@>;^pO5mks3~y84HT(WuK-L{aXZ3JpHlYP~|7-EFgR0Ov z6GGOsPy(Z7+8KsWcgg{2yrnA`INy^ruK+FdDZI4fFRa3B(1*11uEQ=? z{6!S_`_4{tZtcn;ZXV49gVa1@c=qO0h0e4Lms(}kn1P@BsU& zn>L4G-uNmR@h|(r2>JK+HI^F$9IZTXw1mr!0cx!qImqsO9k-G6a4TeQ*XRn)YCvFq z%#WDrdl?FP!+arO$Z!)`K1e9=%bP~Hmh=AMuWZlFjvBTsKU~2j)*y}Hh5Iz`eE3(Xu_@9MiC~e{=+!-x|EEvoF{mkc|sln>5HWpU^e!qU6}A z7dXz1cc-QdRhL^oXOyQyo^8t*hLho1=TYExBc4k z=9$v(Q_yy8s6nJrV1#G+{u#$@hWs`@jPLxu2#Tz`xbAs>QA2&h-FuMIT_b5BQds_z zQu*G|8zU}ZA5M)SD!vm>@w8mlF#yERax_o`*TiSB0v5bVF@KYj%h4!zl z_Tk7|_M3TP_pz!+{xHQa6Kv;R=*IHdE-E*8t;C0ssYm@q=zE*oc15st3;J3_C0Tphp4KqhKuUh>F=)o{q7P$k8jDhtaZ0a zZ4zH86x0-+o@0KqdBEa?^_iis-L_}xMrM~_Mwu#}pk`0#S73Srl2ac7DJD0PD2KjW z$7L0HEu{##lV;${)D_2lJDbH#J~qnFIFs`sZ0#f1dXVhla<2D#B}PV&9%IQOe1!%2 zS~>Q@tsyUt(GJvTsEdMc1cgq@S?|Bx+!ix?{)Iw*#>{g4cAsxq-t{z26h5|dPDCpB zP|j6(2S_&@sl0unFw&Ckj8h11ySnX;X9oRVaY;WC@rwEBg(tc>szgi)le_z&`k}?A z`*Y84&Y2xL#JJ5py7e;bCOPBxunXnxqHEP$I@*kU10vMRQ8;wvQ|yGy1@|o9MNL;c z#nX8E0Fl}&5ybnb)hadco>)|`El`&nzu( znzS72XU4kE7JT^Sd=(yL6O4q;30~@D6UM3)7jhUkHxEvRqpRdeb^_!54-$tvOiWc$Cv}7z{6K^$?mG|5D*y*BK1jG0UYgG9N zMYPS>$*z^_8JCs&FZMrk4wqh{z3!gsRaJXZjpiR&NJjF7W4Qni`VP7X)soe~boXx* zzWJ^DSNNBkoHf#)P{Nt~*%yUnP#=YIRI7-TjEtg!hhrHrsqhWZ1=AbQ`z*y;43_j@-Y zIA~yJ!{PNPCK>nM&)U|B$Gs%5(ay|BYYDvc!F8X-V2W$zYSu2v*Ku=I2OjVG13xcA z#fY&Qt!sxMpq2jFCqoHtm<7XQ4>CSG$F0?$0M8Dl!t|=Zow2`J43B~*!TcODKX+ll zT<~PAWPX3bz9*LA8p$<{?&r)!)$6adrHs82&5*9>0%{Z@2?q2%hx1O`0 zaP+AS#MseVlV#=ZV+>`4thzpu%Z9=-gu=#LO};E8P<3U$@s$)F2G4^sA;_s@StTBc zqoMzz{TSinG#4rW7s^E;#LoPo=Z_}8(xPG6L7JF2NYN}S7yFi4>n%AW+e0L)P zRr8AOkufFnbVVV?h*H-h9U+a>n)}ud?m0kK0elWV_LVF8-{0RC;>YAMz5zK0`4Ca% zYs0m!yL1t4Z@xy|)t&}pX|+5>gGMXXM#~#4d^w&w5lOFk3O@*KJgfpEX^spXw{r6` z4;8fkIM-gu)d>~(llF>gu7mFU>J#p^@{0C9u%q9MTeyrLP)%iElfx5LKH%D%EM`^39DmeC};i~4hO0;M~2cvjf7oqDOP)TvFAV- zu_e%O6zcNn1xTO1Qt5;Ux1rjadS_H zzRN<#>5Tugtx>1?b=Ks|?>EC`>1t)J_dHr<6`b+L07sbLa1Ph5eN$91Aukg8vOSWy z*u3j*PiH^IWZ+G5hUxSDiu8Q;1BpmTYHM#?M>VB-Lwbf?5+nBMcO|P6ywb7q1%OK& zEj@Xl!=q<)UuR{AinMN?MOFhCIY zIU!it19P!B91I+coYA;f^oC%}Nbv!E7snJw?6A}4%5jp%Z1Ibevu71-H3i(UnS<-E zzz9^Bb9$cZ2w57%4ttzWJ%K1*eTow|C;VlxZ9PdSaIx;hcbcF)=C%*oH4Or)#rU`W z()GW;39-v6r41K+Y|%WY>C>uON?BKWMfovWfa1VNbKUvV;JSS)BVP1SXv8?)z550P zuVb}8!kMl&eo!KWJsjpt>X5<{#&G6*3=oIolk!MhU@OVwS8!QFt~QB(hw?z3k8z_r z?GoWrwTi0X?eB$*bE>SH9glASzJKh>=Tw)y9Z)P5k$KJ=5Y+<%RL|OSGk?@yJW~w=;dLv+3cc`97WxQ9 zSv49O?K4C1e)4Ge!cah<{YQXLe*}a^r111a6p#P9(l^R)o0h7)vM(f-mfIN@cgp(1 z1$Ll(1p23`hX$u|tv}>k5`d!^nA8h!r2~-(nQxf8i;@i?Fqe z+#lMMJ!v5hM^-AP*{lk_hH-ezX$ z?(>+MytOk-ads}__rq^z6Q{ktCu;I8*OpRVyG>7Y_F=%6XkZYVE*^wjFP(FVow98*my!>uZQBZAm z&L#SHwR*VT#fMThT`Ds(ITN}s64J8kSi%IyDimusI@2iLgNJZ^fX?`&RB&^_3yax& zNc@4$pc7NIK{|5>;2<-!R6}Yl%R{N*sY-uqn$OA#rFl|>EXeS3GkaOOe&lrtk*9_8 zpDpOCtUZ&wQAJH+o3(_9!%X=43K?e&(GVDU=waFZ{x6YZd1=e33U#5ap{v!;7(y!K0yw}B69Z&lpC zW!+O+@y4(KIWL-(FgWGc?r&A=oS?Qj(VBs7Ueb@6tqZp^h*!w8-E51N+q-q5;NA+` zA>TaAOxT+_e9SB&04NCo<#b0e9E!nc?Md$2pxKvvxXtP5M5|D9O|n)gV*da@lN$P*d)8RSg5=i*%5Y z&avRhuEvMCc#43$TjJ||TH*;6^2sp`k0M!ybQ@H@YR!T1S%16D7+ri~gF^dr-@v<+ zRS{~NT(7n;B)H!my!*)8-^<(UOZ}1hx-W%zzpU?oDA3|-^O8)EKBJfTzAd03JNxHzl5DM zw<>ls=Wdj@FMY_Nf0gd^iwEhd0f+J&r4pld?f9coC_!VYd zRlE+njmF_8(IpPRpi@x9HW${2@7e_b?kYYwe+#&QQ>SH z({SuJ<$BpJNSRrp16E}MSaF(0Et`_PFfHPO!ZCm0ndAIKf9Z;T5Pt#U^<1@G*y-|^ zTGWJBGLL+=Lta|EfNZtZXVW;O7jNN;#=QAZ~fLA@3w*l!xpO9ShA)c)Jk532o zwl4<4=p%ou(1+`72d7Q&AN0_%sg|6`(DOS7iWR-k*?OB6)6?auNM}Irbn=;waML43 zyW8hpJ>md6Fn&>Dd8r92^H!iF-YtQijD9EpsPxmYLc2=^9L9sYD@}~gQ@Gxk``$-P z7K-aEz~~6uY=n5pqo_~3bW(>Tu*ms0PX@?G$$=Zq%Gq3`=Z$?>P; zyPm|Gl!*php4Dm_#rDd4d$r7EOX^m7sA9=47+#Nz$9e$|lNVM}w$r|Wq(ah8uEr)2 zf58%2t|ldiRgUm9ut)<%^L+9C5OSBN41jPF_=P@O(#wQqz%H?ewyjC=5f!cOfz%fU z>lp92;E67deNTti$_P>JhWubjckjF{rx_Mmeg7cZa(%1&^Rq;( zGShsz5svi)nbKOF+3$=tuM8`Kz7`Ww^2yE4ImaAs^;O~TZnW_V$UCkJ0dwN$3n(I# zV@%&(XQZ#$*AEJfrQ>@R_ES*9Ucfw_JbgYdgKnrYck^LvsoLiD)1WY9RkB__-U95~ z-mSPiO4z6QWjHTt29DJ=5(ZphXHM|D%P61#qCjOWR#d2eOY+N`#|w&c(qpK#bybqE z13`Ym(2kE7%F(i}L&d$v!RU~|?eW!17XtaL>@KY`cj@$u=3Jzd-m>8i!^&2DrP zt#iTSG1VB#1k44zh_10awK5MU9vR+{!K*iN;%9=tEO)9W{s2XMB2u5rh#v$ZK0_?u0qplJHK)~oRg z!c=VbHfL(0uq5lBD3dzhp*H2gj{684#8?S$(a%CVe4k`<+7_gBXk3$ z+G#~nX^M10X?8h+F(h(QlG%Zwd*^jFKOP1R;{UvdOn5#vcK^|> zT4!;QWOv7Aueq(;P150EP54z%7&Y^ zsOVXm<2SXS;bFPbTt#_#qUBOvVYdp?aNX)6l?+1FhMw!H{J9-syDimo8p+}PzPf-Q z(18eo7ZIsgFLa5tj3GF}xsA93xqfPNaDO*QG@`Xj%$?#@`Q!O`rCh!j_HGrq1Zj*N z4(1WEkv|MPs2umnc=rRxOOLJSIij@Qv4FSkT);~IP%*Tfj)+L=^j{cruFlK1Q_6x zE&sJT1r`PClcFJLYMhOECSs@xSpT&3&lZyH*PIL0LO@)J$^I;?^+Ybq%wBGH_2T1R zm>y%+OHHYHo?#1%ghfTQPu+?Mb`aW&%ehUe2e0&)sNo3uL8EFQB$mAo zD^3>nvwF$ALalhl10zKl#br)x_xetp?S6stZVRhx9j0(T2e};nRubS%FW&EVH{y-d z_U(y0p;U5PHfSr&?Gg0ZxX7B8agiBXd@OC>xkSCb8m-{i_9A?;SeF0s>$)_4_Jj91 z$G$z`fL2FHKF^8ebGOJst|xo;WIRw;T4E$x$zY9Ene=#a`rY$Y)(Z8SN0*D|zo{Mo zlA{mL1Tu(GQNVBpu%n)0;N0|zix?|ZEw6P9lWcFtilWjHQ4UZPd9=vYc7P0zK0tm{ zJF!Nvv6#)x3BZ%sGZ)mq%W#AjJJiUVojHf+WkwtpauH_TJ0y_eMev-5R}#P?CF5Tu z(!qa{smo2iqmWPS@{OZ|s+5sNm1K~v_yd^0Y9lWr$I5$ZrQDGdChzz?RSc^qO_kg9 z*nyB-IDfh*c0t<8<3L+3&#<;D11H;+?{rj~+jR2_{iEkwfgisFiB+%-V)RO6P6#cv zr38x6;_RWJ@K^R1_yi$967%v7CRCoJfoe>AUo4nec{>Fd<1M2AK}H>}G*4Wc>s&gx z;ii{l!V^E-29Q5{k!(q6?e-_$E|28hMl7WzBm!?A5&>?Ym;du!KyjOz!0s?l`-R2A;_>5^T3vFNwDmHt+#q~pWd zx{)<)1og>hroOn833pu)W6td)89LhQV~2-I;d*@2H8LXlPkL&Chu_B>pNUW-R>o@? z!AGS@+kKX(BW=6fRF|mjU#HxAM1N#hhdXECRyxm~oQ{5C29yr<)bq6HT6(t4PQ>q) z15;3ScvF*4vn}6Knf>XZQmQ&_x_QBOdL3`q^y^sZL2u35j7YJQu}G`cYVY<*Y-`ng zybi1EO`jcp2Nn~Y^RQS9s5qwzSj^*RCIqi^Ea?dQA75C>lGZ z#xrgAO(@u`nFdMHgezyz$1BQePd(XeP*`uL(@8ICo%0>rC$Tc*GlUTRqdwLw@Gy&x z0sXuQgTfFymV8<*oLq5CQ7vH2H8L`ETsf^yUk8~;+qQ>8UuJBT;W~eR&~vbvFi1mg zPZ_}1j4bJwi)q(sW3gw^ub^hcV}dnl;Y<`SNV!v>txVnp$V0<{ScV_Mh6?~!#adXi z&WeIgoGLtplQ?=+4PkGxC|Ozl_$g~0DH_6@JGAOp_t^S^ADEO?<1^LSRq=M$sL+@d z+1}FJ%sZELjRG}L>1>yzs;&y!u}sMTm5+nt#Dr`Lc6^?144NNEU1+3C`eK<0`W4AtCiC9N%TDtLSVxl_I*ty34+A?;9)o<-Yt;3M&mtE z@?W!0LFkmo#u>QLZI&c(FI$trXST0?ZZ)+|Yz`jS872zX+bg%=xAk1X3m-4+RM6)# z&i-+?#s2J|=o#HqrLqo*Fm2lqPHlnuhGX&||B2H=DwN+H6Wd*nZ%y z9|&!>C>orVra;X|Ck3n1!s$?grlWPy;ac39{35O; z6*&)t&5H-uJU_YE1LWq?aMw5wR8T=WK5hN_%wh(8o0Gr+Dise9pZdH-au;;1I4!+)fi{LH(#Y7y5x5!1L?|KU7Ln1 z%-#)dczpVCSDN@<#{ycGQ-|3=gBLY9<&o8*au$e1D|_#A@^_bxEseZ(b7GGjvOas} z{s{aKwPMwJ81S|^!`|{U?t6*^n|OPvFIdyPkI3%89**%FhCnE={>J;6OSlBAGY9+Q zu2SEkIPDO7ykVsbUEe4BCA&EqD@5_r8d>+wd{u)HDs6(zBugoO#34VXmFJOxw#TYJ z(!}@p=S*+x;(}f@1qyk3Y=Si2T>iQTid-|Hp~Jjy0_$=d=GSNMKGIn6;4R=~4CzUj z&>$2@4Ggz@)g2*;C-~(-5P6@3T&e4m2uZLeUqV~~37|!VAAuJ6D=jl+75Gb+=SlIy zwsnJ|HE(6Z`JO-O_UQLH*3zqBL3}KIC;7Y#07*u~v9W5+ZarZZ8F%L6@~O#scv0^0 z&@!lK4D=r@d)K*F8&NySShvVdVTG~LNh+IYyD#`Rw5YUPk!mUN4I*>1AMZVaBJ3pHUcSYJ!Z?>D$Pt_W5 zE9tu2a;kg4pd6L0e=8D@z3|ZVni5c(XNa0RAaQsp6YaS(6Kt47pJy+^j(C#}wF)ef zX-MlNb-s}{+A|2edtKlOK1mV=!GpZbFM<6l2cji_ZvE@OT-ZyXbyY3-xj}sAD5wH- z%x<8{dSzJ?S!_3j8MBl+>UI+z7t^FcYcNEGeuZB)k!{gV2058cNtv;P5^;&&!@=x%eSlw zT2cZ(4`e(Q7?qQpby9_y3ow%lXwyXbPFxol)zja!*w)6b+X|J!`?YFC%_ENI--|P? zg~G2-BzZ&&0-kziz#TlOyk-fN*Ibg5PJuXe3{L`c-L`bBJYKD4Oz+jAY`(@#S;)H| z4y$wwaodb$OLjTy|EWN4L0 zu*A2?c6gmruWnRJ5-KdZ4rE>QlBo(>1t9D!RB0qc-hi~*tcZgoshPpfMHpq|;uWla zAI`+@P_vtYRdYfl>0~+Uu~LXF?(-XplTRLA!Oi_fc1)5oLYbcxY2&$Lu6-8B;p!^n zthU_HdY3`Ad9=-Som-WMrE14k4md3dSfQSX4@bPsYC=++HsVcGOh#^M%S8ITM;<8g z#8&=jQ4Eh;KOg~*kjT=_lE<8*SJd%n@(aHV<*oBzTB5G4>vA!NfUe;>=Pd}l zumSL5vnrar-3a_BCwB@(Y8Tdb{Iys z&sAl$qtM|+py4^m^XQ3e%?!@@74c)P382VRGSj%!QbbE_KM*kumV z7=fqT$DS0LYI1Zoe3eyPxpn$p@|vr6eHKO0A+HqoJ%?V2hsT!IBuh=V+g|<F&m?wd{o}hL{rNq_M_F*|0Jov~qRRksosRHRN*Lb-CB`khk(cNquUgua&f;RT*(u zxUDMeTpW3GLVK2$LEim0UC@U+v_%wLuO#~xZS!ypK6YKyKD}#r_$|+c)6Ltg{vB`pH#nHY8Nzy;4TjEd(cZpR~Bh-xP zgge_^zzH5b;Cu^tF(&jYEV#L2B^DjI+9lOW0`XlW#>dVXOSUO}^`}bO=L0ITj(guu z@#se|#$=Sj$C-Jm*CpH2R0)-GLZYI61VjNW#Ih_|@)LMeOMQ+a8<1VjPf_3vexKQM z_+Ean5bSwuJR)-|%5L%37Oivmj>C!U{O_~$V$Xyh(zYDot-ltRU+aY9Bu2H6ZX&*F zoBo@_Y$1sV#SR95>;|=;wKB43s0gbCbRXspQoLD7rnsrd z23LxkcH?KfHMS3ewUEy2mvT>elP9DhJ;^^OVo716V=>9u;&@_+3LXx4VF`zr283td z4pLS@G2s)$wZ2VN;VRd*H03Uy51MYvj&JyVUs-r%kn$j2@Ux=4>pW8s?tOM*ClmUG z5m&V!Ke`DWx?-!c(z4tbn^ki}i-ufz0g;s+8#ocVB0$Fm42vGV&ewNwmU{p7yA+IX$_F zK{=C10w5n%)~IoXsCnkX698Dj6<>(Z9Jh~tE+8K!YPsfS+k(Fa1WL?3g5v%lZa`2j} z;;cxuO((y|Fl3unw>WyyA?x3O=p$K5;6Jd^X9A#H57Z>y2LfM=&kKBUvQV$exh-z4 zWJ&Jnm|Xv9(v@2;d(=8UdVGkqJbM{pVWDjm}+A z6(<(e@PFk1e0=5u^WR;EN<*K35Q630K2}w;^P)JnoxJK5`GsG9cJV&>RAL{UEr*56 zO;b^$?A@HPdY@NU1kTwpuxGi{^cN#X7GMcQBiu*kw}3>gF1yMurbzC#`Q;uqxApTL zcxH{QGLbnQ_s|Jj%Y@`)@QPp;9-@4+YqbZ4iL7InkgC^GjOp(-kw{B3C5oqHv)ormlGt5(+}D?y z9zTnrO~s0-v8Z=O86{?|5fNuN5a=&DJqmlQPkL90 z<4j%SbZr26Wn-?vF-dJ*kSFXNuES@v5S0-j%W_YYQFO*?U$5_9(&NGHgNXAxuRHI7 zaM%whSu=+VA=0~Jxw#h|E@o#QnhNeH_TnjjFGR3IjjoXJ1k8&$Mx~p^L-^N*vR)LvHt(O)eHm zm~+SzEz|<46v6LxOz{{B!8v;d=ie_=}7S&a`)YMgf zq|FD#i)V&EE?b^(f%uz~6D&S_@RzQ3sH=6`mINx>XK|*wf_GFa%NzH9u`b?*^Gw!@ zUj&fk**&#DU)1PqHglH>w5GIG0~^$gLCo0$;+ z)JVg1Qv3#!l%iigIiQPX8gZDZZ~AS7GI})gKF+)LCo#YfUst&;ypX|Lh^@Xy0IQsY z?UsGP+EvsKgGdIw5zaj*@`J7*Eexc%$(ok7>%emV;pDn%-3S5q`P&+)_8hkSxc*Z* zV2&!)8_m*q8+)BS!F|3-uctynDF9(VO$;?sHSkHhU#6|Vf_CCxUfFg^;d1_s?Ydbr zknSrsj} zIJWUKoCHG1%|8*xy>#;s0I;xm^-#L~xKB$|p=oP25S`9bZ6mdSn*XH8F122($R@V*VzaNme%8tA@UX({M@GSI;8^oN^`AnH^{-WQ zY+CpEPWw#-hfz$fXmVvk8C!ENnIPn(59NT9R;j+)Vo+pS#Or0R0u+9o{jdZ8=^%7k z?nx)0r}~@8W5<2I+KKrx5_tJ8y*6h{O{_hfk`mx|jC;9Wft|_6Ln}Hn+;4A4pJxno z#j4yq^gRNkWcRE!bKV``vPgW3g#>$jh3Xzir!S@4iJWTlp_p7&FM4pfn*O`4m#dKi ztKlfVHd}uX^McM{GhLO-I8L$h6kvKavUl>>|0PY|JYABM>#30mSaT_UFSw`?^zuBa zdFp|(6{~Q__pvC}rKTul;tXZflY8Cyreb*cue0AcL8mpF6{>i7TA;ym9#50@DX9U! zK6i&<6qm)R_{uGzR$0Zjl}f-nO`P%Q!{D4sgX?dWn%2)_^C@7T7*;$VL*A)AI2JS( zKUo1jm{p_kw4}Xu#rYJuN=Vs|(;TI$Qv~VX-<(kHgFcBO*%|~Etg|cei;V_EM9b5@sAPC}X_j#~DFe(KUq4wm38OOPVv`PZq_ERA(J^FOw2(*x% z=l$g(r0~K9ndV%4*zJh&v#MU-GuQ)Xe-LIt9}6ud$jGh?06{7e@!hc>QwZyDu32a4 zTY2RB^!ogNC9Zn^*_y~pfd58eAQel2oal-65;fIU^j9goXnuyqVkqW$@6hr=U!(;sx0ax0?1|cnb58N{M+rA_!K?AL6ja#D)E&|YN^IZK?T!pt zz~kUW3S_;$3R61`8mJi&lM!wxqaNW^sDrjyz8zdVmTTux{f&Y5j+Sl>=<;DuAAgDy zSNH|5T+N5VX4&t)Q!8}p7;4~zWb~IjUOctv0a5Wy#$~}$8)(qdwl{J{vn$O zI5131WPj;WQ-2Gl776&&jVGRI5C|}W5)y*<=a|MRzwk6;zNB9N8>w{=^!fgcNcP@A zDA4KVGZ9ExfOYXT{?TW1Hx3)SHr=YvH$C)vCMyd6Z(TFehA^n;5dvy)^CkdTLz?rL z$j?6j$o@kx!`~XkE+dKeH&h&_xFyZsikn>AEAh9kd7D8b zF50||H53k|fl87!EvbN$K7Z*X_#o~d8ucFlg+JSeQ-c0hT<>;qynpCg^kt(@BxM$) z_jjOXc+4*%VxZCI`_O!*<+s1lnxiCY=5LjT(Ew39>VF@EcsJ;9ZvOA#{1*>rtGQ99 z%sNW%RTp3X`1k`SCnv`?`k0@E#@`*k-Vc(bi|<-+_tLUAO(7WWUJ&8nMTpdJevrg7 zUb8-bC60Ggf-@(J!f(kZ;b#QyS^d-7J2xQ%dxKtoM@v)B!M`&>@YyZF-}qJFU23zY zw^tqeq)6u<>*9h2R4vQjtg+!$1WJ*LIj`cF;6JZFYn$|=kpDU)sB|0l+b=844)SdD z^lunI0^%3$?SP@+qWt;gx9g50`Yv+3cccEf37CxP?K(1t`z{HSpy67OwCA7uYx^YIN*`qer3NN& zMs+GJrI_k`9+2#lQ2r#p!oa)jS!4WEwcnx`q<-(P?+6q|h6;Et;aYM;^Qjt?!hAf z;yf=D0w*p0dxk*ZaImGl-h%#$z?_b!eSUvC^Zy{dH2PzL^`_E4Vul(C{2y+&1O24&b@ky2`q*J`E( zqe_p5eY<~%oAmw^7eQ0hR25|o024Ns5GSTtBP~?B1$p7NR|DGT| zm$T5kCy@;dA*~FD+VJb{Oc|#<-60&kh88DE^f&(b_u{*ezt0fSb2>r-Tvh^-yZH^Z zouI|^-zJKGz zfB2U0N-~f&M)~!|(t#R>HN;0(#QcxWoBtcfC8${N|0~cSA>oLQhDMqvCn=`(UnV&I zn;+E7s^LYop39UIiKeVoGlMrnu+rp)`%=@!`R$rVs3$hF&WjRw&IgR|Rv;D%znT`z zgrZ%EfOxNd-h1Fa3eZc(cQ5KCJCW#r3Q=m@)xx^}`eSD-PvFL78U)CVKQkgudFZJ% zZD>C70~cs8g{Q@NyP055l`wr~H<2|)(}4(sp_KKuumy8Y|y{`?o{|NsB^Z}G=S z4c>@(o=i;3^T$UqKl}Pqv*B1B%ur9IPJ5oL@AP<`51fn_wNk8}ebKZxRAGp4TrV4G z?@w2#d${=7C2_54G0|0hLK9j0mW#;(9X#}wHVI$NL!QmGghtqVolK}27*JF)L~|Ij zFDAVD@SXxzT@r10I!mhh^eJL@vXaXSy<*Ba{y=yue)`lro=U7%COPobP5b9hFyz^O z&~V`~R%{lcnDFo^dmTzOD>wJ|SqgsUtuPNTGCEIraTs_YoD1Ft6{x4?jOB49Y>1v1{QT23`9@*aFC#c^2Mg7}es3q&9SVLL(^ zP4xBLzMpa?>11;8clB!iuA)y)ezp9qhcjrgg0IXM8(omDGSKYjQJabm8<^~&DrtA$R2v*w+*IP4##LP*-8G!2-+lbV~?a`($d3?hn5THD_d(AK)0v`-Ax z-r-~tz>O2t)s0VZXdy$Q7o?i#Uh|NsOu480 z6EdJ8qJMtaDkA@w;=t1m7hDji{CHaug>Px`R_Xi;<(VvlO5)mbssIK{W)fNU2#5PG zoYcK6<%Wa0%{I;Y9b&RauPqB3f8M%eSm+^|RWyDYzRFg0v=9%A5HGMubd^5eEARr$ zlwLpCnTpqOgef=KQKyCQoQD!==CS5MOG}GE!};Jdl{Tx4&kSI3H7*xGVOU}eJ*zAN zPQlvt-*cR;PG$)2F~@S5NLx@$4W%q-x7y{^?@)N4`mUKPzpKZ#EO4@rYJIERC3E)T z7)&kSt7KT{if23?InO^%i#R8GqLgWsQZqeRyHN$Ua)6DR@!E7Vx3scCfafD8PMS*# zaA3C^IK<2bMXZ-8n>^2VliWmjP+`Vk#5v+So=8FxsTg1L+uFRmynZBdW4&>+tMSGP zY!<9EqLtDsfzR*i-4skHVM_;7o*kkiNuI}6Prok%jr~e$dwzPflVf<+uIuNlCxCqO zWvz5T+3^Q~%o{_XL^YBZ!RgX!_J$+(wf-7NKge-)>X&0|3*o3|`XU{=qq3pWi)@bRM22%@oss zd49Sm;$~h}@9bn@rt;_J?Wf&B>fdZXulf~0UMs@8L@A0Qm;+Pa4HL9}ODTsQ*SY5! zF3#-j1NQ-)SSzBo+!K=Dik}=vRYRn=(G@RnU}bbQJqUU<6zOrGzZsSZ9^%|Oe+O@8 z&cMV9>b&%VPgFt3!Y!@I@Yw^i{%#Ek=UagyYXiBJyWK){4Y|v=a`Ufgw2lnnuUZ@F zJCB(m(ZyVLGPl+B_1BvX8a(R`e$E&Ha9feP62&!KYY{Ne%c$P%(>H&oYkj(jR`g|{;sd(tt4B6Xne)*H`!_mB+#4Ty(Z;%Y~42=5ECq-^nEmGJw z6$J9Eva|AW?oWGp^-Qi+_JVtRZ9{S!(6W8f!xC5bPIr4crZ3K2>@z@-C{Oo%WOpT} z08Y7(8b-33z8V-v>8X`pIeP=tY&>&#P!>j4_jn{O8nZXGk6StFUZ3Tt;JkL{L=1^C zL#;w+mQD9uJ$&7dcNOge{m=0)x?Sq$V9`!LsRQ3kvvsf3?YZ>;E4zD%hQed4Pqf_T!!3|p(1D=6#g>e@M(zCfOI*tQN0G_J7N zw^DCj`>OIz7~66ar5BO!6*Z`mg{wn!ET?(gga*ZkI=tJxDxHH~7FZe%X}LAXN6tnm zfwPm9 zV(QlW+`zN*r=7iJ8Ry2z7x=pB>hwSXN9t6lCxNEhw#s>2>NP$(NQMI94tF{@+`Rnz zoBb1Cq&9rY6ioI)z<(oTYFUp*iox{+gC{Oi>-~F=a}y0mijK4Vtwo!kb8V6uOckZ$ zVDZ)S+ld^Xn_76abX?coW2>lyY$s~Sha<>tyGHIau) zyGa+dQMk;|j68I~2e`|{9cCtdx$i$Q<6pRgN)4E|_>eLK#-Hr^zd)1!p?@m+^SWt? zw&3~UTzXkq*+}flLH+4G$AR20a63vA2HxW**4Eb7==RDAJd|z;t#JzOkD6fBR?Gze z57++oDvl|5H&!r=%fW;p0+Doax~Qt5!LXR*RUh;Kc% z*+(UvrE%P*Gge#5He=(g`PSItWT{gwl`mKurlI+6>!^Ua=9*Z!D9C_NmMafe z4BBxE_*g84$L`&HQCQ`k`QBo{Z=rtl$_xpM)ShkOKPAAlpzx+Lw~%fcRp*A>`2kQs zSqb{cGjUArPchkd{mW9f z{rS1}nXy!tH`O=5l9~#uZAK4hFPdd5kQvJ;hX_PMMzj39UaP6azOzM4c6p^uORt{83iVi z;Ymo~C+>87%;ZQGPX*1IOuC57l@p%+yxF_MwE!5Ajyz2M{859_yqaw2%c71_(CVyn z=PGRrr$4M+{s%Ex=;(J~HE~0Oa#cgbd~bovTeohFJr$Vl#nTqkfRxc3Surs1LVgpL zp~R5Jul75g9@^ZPGSZ4GjI(?2KSK}!h9GzG>syu~7z;YwS0?~dabZ|#lC>8A@@9~< zUwh|2@+p;m8zY(ia=mS-kh*xc?n2nvvyDU=Mrr6Lo?4!J$shsV@iJ=%g*j`e1*ub$cV&)q ztzRzvumo?LsLAYbIsx(=%Dk!b#fqo+29(gT+hB1Cx{!G-X+0k`9q9fm$Tq8Ejez>w zuU7>cG4{-vidi78q=@iKGnh?Eb2)rz9gG=Tc@<8tQT9s_lsfYJI<-gsqFhYv@JH;Su%7@PStMsmzs{)c)q z{x#MJx=BMP5p<%Eyx?y%%PJB>dMB-?109Dwud-!w(=$}uT`;x*c!ISqzCN7zz~bDm>Ov>NRtnkR|7r67WazukipW z@t=qa`>xm21h@qep`1s5!o3O-X`7|G=+0wAPfi&VdP#$?*_T$79>pQm&*x#X`1;BR zZ$eyBB=S&fYg~MM-b9H5isz#$IiM(Q${*i7TpejVMprZhUkWs`^#s(R5g%0>Itj~!O7t!Y>pON4uu4+u8 zyjdU3DpSnuUI#9_ttA9}l$?f^BU0iW5 zTiW%3KHsYmkyo$9@X3Tp+jcHY)ppV^g7}Oe_hi9ErcBROJr|GJ)ob@o-)sSW^W(tL zwKTV#>)^#mm+@FcC{aJf^gpklzBxO)^#G;iIPo)8Y8JVR7eoZ(d1f2DwD=naou3d3${+v^y`BuiYZMU0s@x~i|VU1WU`7`6`mwCVQjhHV-|iFs(d(m#IJmagM{%>L8{x7;YGQ9x`@ zUxwh*HvhM$tlmojSvuP)BlbbSM*Y~vsYgm|9RA~&-yJ57v!Blc@aXbMz;7rGe8uu_ z)WyC(cqUqMw66p#fVB!QCpZdCoMx}95AONKoiRm6GAEEv@3#0^-4@lGrwpGPpMA&B z*ZX>Scy!2-Wa!nv4;rj{L6l);T#OFJvYm2z_tGayYl3*0VKxV0mAbvYu#5MV)Vx_o zZ4uk)Djo`Zkx>-`iN3cJkCV8s{U^lw%Nbs(rB&I@Qx4M`H7GJaF+=S{JT zb-6ALvk9P}VqCi7tjVf#`&Wa4VI3_HY!N4c-AkT`s!S|*e!;C;h|M`J+$xEzjFZgI z7MR=ZLm)2zepj;{Fhe&PEXF=*KHA02v(0|PhnDQGx3Ig>3Bc6Ay^2ki6wKz@FCF~B z6baA_G-XBb%nVR+Mxa{gY$U#h2m%lUaZw~_0 z1pL;zcN%K-9tp_CbZ_2X`0KO(`Ut;VR0JZBw?D7{`Tx?sYpMNLX2_MI1v^@scb^sb NAdf}_agUrl{~x01iSGaa literal 0 HcmV?d00001 diff --git a/benchmarks/bootstrapped_dqn/README.md b/benchmarks/bootstrapped_dqn/README.md new file mode 100644 index 0000000..8a5f059 --- /dev/null +++ b/benchmarks/bootstrapped_dqn/README.md @@ -0,0 +1,31 @@ +# Bootstrapped DQN + +Each experiment uses 3 seeds. +The parameters used for Bootstrapped DQN are the same parameters as described in the [original paper](https://arxiv.org/abs/1602.04621.pdf). + +### Breakout Bootstrapped DQN - single worker + +```bash +python3 coach.py -p Atari_Bootstrapped_DQN -lvl breakout +``` + +Breakout Bootstrapped DQN + + +### Pong Bootstrapped DQN - single worker + +```bash +python3 coach.py -p Atari_Bootstrapped_DQN -lvl pong +``` + +Pong Bootstrapped DQN + + +### Space Invaders Bootstrapped DQN - single worker + +```bash +python3 coach.py -p Atari_Bootstrapped_DQN -lvl space_invaders +``` + +Space Invaders Bootstrapped DQN + diff --git a/benchmarks/bootstrapped_dqn/breakout_bootstrapped_dqn.png b/benchmarks/bootstrapped_dqn/breakout_bootstrapped_dqn.png new file mode 100644 index 0000000000000000000000000000000000000000..b38b6fc3bafe07140fedc5a584b1d9b4b8449069 GIT binary patch literal 93194 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 M)mF*BZ292-0J5)WHvj+t literal 0 HcmV?d00001 diff --git a/benchmarks/a3c/walker2d_a3c_16_workers.png b/benchmarks/a3c/walker2d_a3c_16_workers.png new file mode 100644 index 0000000000000000000000000000000000000000..a003359c0a91311ec3b2357d4a778539580c73f7 GIT binary patch literal 120974 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