From 34f84b3a65c0dab36fc632d2f41ce21dcef65355 Mon Sep 17 00:00:00 2001 From: Benjamin Beyret Date: Wed, 29 May 2019 15:46:51 +0100 Subject: [PATCH 01/23] add animalai_packages for upload to PyPi --- .gitignore | 9 +- {animalai => animalai_bkp}/__init__.py | 0 .../communicator_objects/__init__.py | 0 .../agent_action_proto_pb2.py | 0 .../agent_info_proto_pb2.py | 0 .../arena_parameters_proto_pb2.py | 0 .../brain_parameters_proto_pb2.py | 0 .../communicator_objects/command_proto_pb2.py | 0 .../demonstration_meta_proto_pb2.py | 0 .../engine_configuration_proto_pb2.py | 0 .../communicator_objects/header_pb2.py | 0 .../resolution_proto_pb2.py | 0 .../space_type_proto_pb2.py | 0 .../communicator_objects/unity_input_pb2.py | 0 .../communicator_objects/unity_message_pb2.py | 0 .../communicator_objects/unity_output_pb2.py | 0 .../unity_rl_initialization_input_pb2.py | 0 .../unity_rl_initialization_output_pb2.py | 0 .../unity_rl_input_pb2.py | 0 .../unity_rl_output_pb2.py | 0 .../unity_rl_reset_input_pb2.py | 0 .../unity_rl_reset_output_pb2.py | 0 .../unity_to_external_pb2.py | 0 .../unity_to_external_pb2_grpc.py | 0 {animalai => animalai_bkp}/envs/__init__.py | 0 .../envs/arena_config.py | 0 {animalai => animalai_bkp}/envs/brain.py | 0 .../envs/communicator.py | 0 .../envs/environment.py | 0 {animalai => animalai_bkp}/envs/exception.py | 0 .../envs/rpc_communicator.py | 0 .../envs/socket_communicator.py | 0 .../trainers/__init__.py | 0 .../trainers/barracuda.py | 0 .../trainers/bc/__init__.py | 0 .../trainers/bc/models.py | 0 .../trainers/bc/offline_trainer.py | 0 .../trainers/bc/online_trainer.py | 0 .../trainers/bc/policy.py | 0 .../trainers/bc/trainer.py | 0 {animalai => animalai_bkp}/trainers/buffer.py | 0 .../trainers/curriculum.py | 0 .../trainers/demo_loader.py | 0 .../trainers/exception.py | 0 {animalai => animalai_bkp}/trainers/learn.py | 0 .../trainers/meta_curriculum.py | 0 {animalai => animalai_bkp}/trainers/models.py | 0 {animalai => animalai_bkp}/trainers/policy.py | 0 .../trainers/ppo/__init__.py | 0 .../trainers/ppo/models.py | 0 .../trainers/ppo/policy.py | 0 .../trainers/ppo/trainer.py | 0 .../trainers/tensorflow_to_barracuda.py | 0 .../trainers/trainer.py | 0 .../trainers/trainer_controller.py | 0 animalai_packages/animalai_envs/LICENSE | 201 ++++ animalai_packages/animalai_envs/README.md | 5 + .../animalai_envs/animalai/__init__.py | 1 + .../animalai/communicator_objects/__init__.py | 22 + .../agent_action_proto_pb2.py | 92 ++ .../agent_info_proto_pb2.py | 141 +++ .../arena_parameters_proto_pb2.py | 209 ++++ .../brain_parameters_proto_pb2.py | 125 ++ .../communicator_objects/command_proto_pb2.py | 64 + .../demonstration_meta_proto_pb2.py | 99 ++ .../engine_configuration_proto_pb2.py | 106 ++ .../communicator_objects/header_pb2.py | 78 ++ .../resolution_proto_pb2.py | 85 ++ .../space_type_proto_pb2.py | 61 + .../communicator_objects/unity_input_pb2.py | 92 ++ .../communicator_objects/unity_message_pb2.py | 92 ++ .../communicator_objects/unity_output_pb2.py | 83 ++ .../unity_rl_initialization_input_pb2.py | 71 ++ .../unity_rl_initialization_output_pb2.py | 95 ++ .../unity_rl_input_pb2.py | 178 +++ .../unity_rl_output_pb2.py | 169 +++ .../unity_rl_reset_input_pb2.py | 122 ++ .../unity_rl_reset_output_pb2.py | 71 ++ .../unity_to_external_pb2.py | 57 + .../unity_to_external_pb2_grpc.py | 46 + .../animalai_envs/animalai/envs/__init__.py | 3 + .../animalai/envs/arena_config.py | 115 ++ .../animalai_envs/animalai/envs/brain.py | 149 +++ .../animalai/envs/communicator.py | 35 + .../animalai/envs/environment.py | 491 ++++++++ .../animalai_envs/animalai/envs/exception.py | 63 + .../animalai/envs/rpc_communicator.py | 115 ++ .../animalai/envs/socket_communicator.py | 98 ++ animalai_packages/animalai_envs/setup.py | 29 + animalai_packages/animalai_train/LICENSE | 201 ++++ animalai_packages/animalai_train/README.md | 5 + .../animalai_train/animalai_train/__init__.py | 1 + .../animalai_train/trainers/__init__.py | 15 + .../animalai_train/trainers/barracuda.py | 491 ++++++++ .../animalai_train/trainers/bc/__init__.py | 4 + .../animalai_train/trainers/bc/models.py | 55 + .../trainers/bc/offline_trainer.py | 56 + .../trainers/bc/online_trainer.py | 116 ++ .../animalai_train/trainers/bc/policy.py | 93 ++ .../animalai_train/trainers/bc/trainer.py | 190 +++ .../animalai_train/trainers/buffer.py | 255 ++++ .../animalai_train/trainers/curriculum.py | 112 ++ .../animalai_train/trainers/demo_loader.py | 94 ++ .../animalai_train/trainers/exception.py | 20 + .../animalai_train/trainers/learn.py | 249 ++++ .../trainers/meta_curriculum.py | 147 +++ .../animalai_train/trainers/models.py | 380 ++++++ .../animalai_train/trainers/policy.py | 212 ++++ .../animalai_train/trainers/ppo/__init__.py | 3 + .../animalai_train/trainers/ppo/models.py | 195 ++++ .../animalai_train/trainers/ppo/policy.py | 214 ++++ .../animalai_train/trainers/ppo/trainer.py | 386 ++++++ .../trainers/tensorflow_to_barracuda.py | 1034 +++++++++++++++++ .../animalai_train/trainers/trainer.py | 198 ++++ .../trainers/trainer_controller.py | 301 +++++ animalai_packages/animalai_train/setup.py | 33 + train.py | 2 +- 117 files changed, 8531 insertions(+), 3 deletions(-) rename {animalai => animalai_bkp}/__init__.py (100%) rename {animalai => animalai_bkp}/communicator_objects/__init__.py (100%) rename {animalai => animalai_bkp}/communicator_objects/agent_action_proto_pb2.py (100%) rename {animalai => animalai_bkp}/communicator_objects/agent_info_proto_pb2.py (100%) rename {animalai => animalai_bkp}/communicator_objects/arena_parameters_proto_pb2.py (100%) rename {animalai => animalai_bkp}/communicator_objects/brain_parameters_proto_pb2.py (100%) rename {animalai => animalai_bkp}/communicator_objects/command_proto_pb2.py (100%) rename {animalai => animalai_bkp}/communicator_objects/demonstration_meta_proto_pb2.py (100%) rename {animalai => animalai_bkp}/communicator_objects/engine_configuration_proto_pb2.py (100%) rename {animalai => animalai_bkp}/communicator_objects/header_pb2.py (100%) rename {animalai => animalai_bkp}/communicator_objects/resolution_proto_pb2.py (100%) rename {animalai => animalai_bkp}/communicator_objects/space_type_proto_pb2.py (100%) rename {animalai => animalai_bkp}/communicator_objects/unity_input_pb2.py (100%) rename {animalai => animalai_bkp}/communicator_objects/unity_message_pb2.py (100%) rename {animalai => animalai_bkp}/communicator_objects/unity_output_pb2.py (100%) rename {animalai => animalai_bkp}/communicator_objects/unity_rl_initialization_input_pb2.py (100%) rename {animalai => animalai_bkp}/communicator_objects/unity_rl_initialization_output_pb2.py (100%) rename {animalai => animalai_bkp}/communicator_objects/unity_rl_input_pb2.py (100%) rename {animalai => animalai_bkp}/communicator_objects/unity_rl_output_pb2.py (100%) rename {animalai => animalai_bkp}/communicator_objects/unity_rl_reset_input_pb2.py (100%) rename {animalai => animalai_bkp}/communicator_objects/unity_rl_reset_output_pb2.py (100%) rename {animalai => animalai_bkp}/communicator_objects/unity_to_external_pb2.py (100%) rename {animalai => animalai_bkp}/communicator_objects/unity_to_external_pb2_grpc.py (100%) rename {animalai => animalai_bkp}/envs/__init__.py (100%) rename {animalai => animalai_bkp}/envs/arena_config.py (100%) rename {animalai => animalai_bkp}/envs/brain.py (100%) rename {animalai => animalai_bkp}/envs/communicator.py (100%) rename {animalai => animalai_bkp}/envs/environment.py (100%) rename {animalai => animalai_bkp}/envs/exception.py (100%) rename {animalai => animalai_bkp}/envs/rpc_communicator.py (100%) rename {animalai => animalai_bkp}/envs/socket_communicator.py (100%) rename {animalai => animalai_bkp}/trainers/__init__.py (100%) rename {animalai => animalai_bkp}/trainers/barracuda.py (100%) rename {animalai => animalai_bkp}/trainers/bc/__init__.py (100%) rename {animalai => animalai_bkp}/trainers/bc/models.py (100%) rename {animalai => animalai_bkp}/trainers/bc/offline_trainer.py (100%) rename {animalai => animalai_bkp}/trainers/bc/online_trainer.py (100%) rename {animalai => animalai_bkp}/trainers/bc/policy.py (100%) rename {animalai => animalai_bkp}/trainers/bc/trainer.py (100%) rename {animalai => animalai_bkp}/trainers/buffer.py (100%) rename {animalai => animalai_bkp}/trainers/curriculum.py (100%) rename {animalai => animalai_bkp}/trainers/demo_loader.py (100%) rename {animalai => animalai_bkp}/trainers/exception.py (100%) rename {animalai => animalai_bkp}/trainers/learn.py (100%) rename {animalai => animalai_bkp}/trainers/meta_curriculum.py (100%) rename {animalai => animalai_bkp}/trainers/models.py (100%) rename {animalai => animalai_bkp}/trainers/policy.py (100%) rename {animalai => animalai_bkp}/trainers/ppo/__init__.py (100%) rename {animalai => animalai_bkp}/trainers/ppo/models.py (100%) rename {animalai => animalai_bkp}/trainers/ppo/policy.py (100%) rename {animalai => animalai_bkp}/trainers/ppo/trainer.py (100%) rename {animalai => animalai_bkp}/trainers/tensorflow_to_barracuda.py (100%) rename {animalai => animalai_bkp}/trainers/trainer.py (100%) rename {animalai => animalai_bkp}/trainers/trainer_controller.py (100%) create mode 100644 animalai_packages/animalai_envs/LICENSE create mode 100644 animalai_packages/animalai_envs/README.md create mode 100644 animalai_packages/animalai_envs/animalai/__init__.py create mode 100644 animalai_packages/animalai_envs/animalai/communicator_objects/__init__.py create mode 100644 animalai_packages/animalai_envs/animalai/communicator_objects/agent_action_proto_pb2.py create mode 100644 animalai_packages/animalai_envs/animalai/communicator_objects/agent_info_proto_pb2.py create mode 100644 animalai_packages/animalai_envs/animalai/communicator_objects/arena_parameters_proto_pb2.py create mode 100644 animalai_packages/animalai_envs/animalai/communicator_objects/brain_parameters_proto_pb2.py create mode 100644 animalai_packages/animalai_envs/animalai/communicator_objects/command_proto_pb2.py create mode 100644 animalai_packages/animalai_envs/animalai/communicator_objects/demonstration_meta_proto_pb2.py create mode 100644 animalai_packages/animalai_envs/animalai/communicator_objects/engine_configuration_proto_pb2.py create mode 100644 animalai_packages/animalai_envs/animalai/communicator_objects/header_pb2.py create mode 100644 animalai_packages/animalai_envs/animalai/communicator_objects/resolution_proto_pb2.py create mode 100644 animalai_packages/animalai_envs/animalai/communicator_objects/space_type_proto_pb2.py create mode 100644 animalai_packages/animalai_envs/animalai/communicator_objects/unity_input_pb2.py create mode 100644 animalai_packages/animalai_envs/animalai/communicator_objects/unity_message_pb2.py create mode 100644 animalai_packages/animalai_envs/animalai/communicator_objects/unity_output_pb2.py create mode 100644 animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_initialization_input_pb2.py create mode 100644 animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_initialization_output_pb2.py create mode 100644 animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_input_pb2.py create mode 100644 animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_output_pb2.py create mode 100644 animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_reset_input_pb2.py create mode 100644 animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_reset_output_pb2.py create mode 100644 animalai_packages/animalai_envs/animalai/communicator_objects/unity_to_external_pb2.py create mode 100644 animalai_packages/animalai_envs/animalai/communicator_objects/unity_to_external_pb2_grpc.py create mode 100644 animalai_packages/animalai_envs/animalai/envs/__init__.py create mode 100644 animalai_packages/animalai_envs/animalai/envs/arena_config.py create mode 100644 animalai_packages/animalai_envs/animalai/envs/brain.py create mode 100644 animalai_packages/animalai_envs/animalai/envs/communicator.py create mode 100644 animalai_packages/animalai_envs/animalai/envs/environment.py create mode 100644 animalai_packages/animalai_envs/animalai/envs/exception.py create mode 100644 animalai_packages/animalai_envs/animalai/envs/rpc_communicator.py create mode 100644 animalai_packages/animalai_envs/animalai/envs/socket_communicator.py create mode 100644 animalai_packages/animalai_envs/setup.py create mode 100644 animalai_packages/animalai_train/LICENSE create mode 100644 animalai_packages/animalai_train/README.md create mode 100644 animalai_packages/animalai_train/animalai_train/__init__.py create mode 100644 animalai_packages/animalai_train/animalai_train/trainers/__init__.py create mode 100644 animalai_packages/animalai_train/animalai_train/trainers/barracuda.py create mode 100644 animalai_packages/animalai_train/animalai_train/trainers/bc/__init__.py create mode 100644 animalai_packages/animalai_train/animalai_train/trainers/bc/models.py create mode 100644 animalai_packages/animalai_train/animalai_train/trainers/bc/offline_trainer.py create mode 100644 animalai_packages/animalai_train/animalai_train/trainers/bc/online_trainer.py create mode 100644 animalai_packages/animalai_train/animalai_train/trainers/bc/policy.py create mode 100644 animalai_packages/animalai_train/animalai_train/trainers/bc/trainer.py create mode 100644 animalai_packages/animalai_train/animalai_train/trainers/buffer.py create mode 100644 animalai_packages/animalai_train/animalai_train/trainers/curriculum.py create mode 100644 animalai_packages/animalai_train/animalai_train/trainers/demo_loader.py create mode 100644 animalai_packages/animalai_train/animalai_train/trainers/exception.py create mode 100644 animalai_packages/animalai_train/animalai_train/trainers/learn.py create mode 100644 animalai_packages/animalai_train/animalai_train/trainers/meta_curriculum.py create mode 100644 animalai_packages/animalai_train/animalai_train/trainers/models.py create mode 100644 animalai_packages/animalai_train/animalai_train/trainers/policy.py create mode 100644 animalai_packages/animalai_train/animalai_train/trainers/ppo/__init__.py create mode 100644 animalai_packages/animalai_train/animalai_train/trainers/ppo/models.py create mode 100644 animalai_packages/animalai_train/animalai_train/trainers/ppo/policy.py create mode 100644 animalai_packages/animalai_train/animalai_train/trainers/ppo/trainer.py create mode 100644 animalai_packages/animalai_train/animalai_train/trainers/tensorflow_to_barracuda.py create mode 100644 animalai_packages/animalai_train/animalai_train/trainers/trainer.py create mode 100644 animalai_packages/animalai_train/animalai_train/trainers/trainer_controller.py create mode 100644 animalai_packages/animalai_train/setup.py diff --git a/.gitignore b/.gitignore index dfd1107a..82fde7b4 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,10 @@ env/* /.idea __pycache__/ UnitySDK.log -/venv -/dev \ No newline at end of file +venv/ +*/venv +/dev +build/ +dist/ +*.egg-info* +*.eggs* \ No newline at end of file diff --git a/animalai/__init__.py b/animalai_bkp/__init__.py similarity index 100% rename from animalai/__init__.py rename to animalai_bkp/__init__.py diff --git a/animalai/communicator_objects/__init__.py b/animalai_bkp/communicator_objects/__init__.py similarity index 100% rename from animalai/communicator_objects/__init__.py rename to animalai_bkp/communicator_objects/__init__.py diff --git a/animalai/communicator_objects/agent_action_proto_pb2.py b/animalai_bkp/communicator_objects/agent_action_proto_pb2.py similarity index 100% rename from animalai/communicator_objects/agent_action_proto_pb2.py rename to animalai_bkp/communicator_objects/agent_action_proto_pb2.py diff --git a/animalai/communicator_objects/agent_info_proto_pb2.py b/animalai_bkp/communicator_objects/agent_info_proto_pb2.py similarity index 100% rename from animalai/communicator_objects/agent_info_proto_pb2.py rename to animalai_bkp/communicator_objects/agent_info_proto_pb2.py diff --git a/animalai/communicator_objects/arena_parameters_proto_pb2.py b/animalai_bkp/communicator_objects/arena_parameters_proto_pb2.py similarity index 100% rename from animalai/communicator_objects/arena_parameters_proto_pb2.py rename to animalai_bkp/communicator_objects/arena_parameters_proto_pb2.py diff --git a/animalai/communicator_objects/brain_parameters_proto_pb2.py b/animalai_bkp/communicator_objects/brain_parameters_proto_pb2.py similarity index 100% rename from animalai/communicator_objects/brain_parameters_proto_pb2.py rename to animalai_bkp/communicator_objects/brain_parameters_proto_pb2.py diff --git a/animalai/communicator_objects/command_proto_pb2.py b/animalai_bkp/communicator_objects/command_proto_pb2.py similarity index 100% rename from animalai/communicator_objects/command_proto_pb2.py rename to animalai_bkp/communicator_objects/command_proto_pb2.py diff --git a/animalai/communicator_objects/demonstration_meta_proto_pb2.py b/animalai_bkp/communicator_objects/demonstration_meta_proto_pb2.py similarity index 100% rename from animalai/communicator_objects/demonstration_meta_proto_pb2.py rename to animalai_bkp/communicator_objects/demonstration_meta_proto_pb2.py diff --git a/animalai/communicator_objects/engine_configuration_proto_pb2.py b/animalai_bkp/communicator_objects/engine_configuration_proto_pb2.py similarity index 100% rename from animalai/communicator_objects/engine_configuration_proto_pb2.py rename to animalai_bkp/communicator_objects/engine_configuration_proto_pb2.py diff --git a/animalai/communicator_objects/header_pb2.py b/animalai_bkp/communicator_objects/header_pb2.py similarity index 100% rename from animalai/communicator_objects/header_pb2.py rename to animalai_bkp/communicator_objects/header_pb2.py diff --git a/animalai/communicator_objects/resolution_proto_pb2.py b/animalai_bkp/communicator_objects/resolution_proto_pb2.py similarity index 100% rename from animalai/communicator_objects/resolution_proto_pb2.py rename to animalai_bkp/communicator_objects/resolution_proto_pb2.py diff --git a/animalai/communicator_objects/space_type_proto_pb2.py b/animalai_bkp/communicator_objects/space_type_proto_pb2.py similarity index 100% rename from animalai/communicator_objects/space_type_proto_pb2.py rename to animalai_bkp/communicator_objects/space_type_proto_pb2.py diff --git a/animalai/communicator_objects/unity_input_pb2.py b/animalai_bkp/communicator_objects/unity_input_pb2.py similarity index 100% rename from animalai/communicator_objects/unity_input_pb2.py rename to animalai_bkp/communicator_objects/unity_input_pb2.py diff --git a/animalai/communicator_objects/unity_message_pb2.py b/animalai_bkp/communicator_objects/unity_message_pb2.py similarity index 100% rename from animalai/communicator_objects/unity_message_pb2.py rename to animalai_bkp/communicator_objects/unity_message_pb2.py diff --git a/animalai/communicator_objects/unity_output_pb2.py b/animalai_bkp/communicator_objects/unity_output_pb2.py similarity index 100% rename from animalai/communicator_objects/unity_output_pb2.py rename to animalai_bkp/communicator_objects/unity_output_pb2.py diff --git a/animalai/communicator_objects/unity_rl_initialization_input_pb2.py b/animalai_bkp/communicator_objects/unity_rl_initialization_input_pb2.py similarity index 100% rename from animalai/communicator_objects/unity_rl_initialization_input_pb2.py rename to animalai_bkp/communicator_objects/unity_rl_initialization_input_pb2.py diff --git a/animalai/communicator_objects/unity_rl_initialization_output_pb2.py b/animalai_bkp/communicator_objects/unity_rl_initialization_output_pb2.py similarity index 100% rename from animalai/communicator_objects/unity_rl_initialization_output_pb2.py rename to animalai_bkp/communicator_objects/unity_rl_initialization_output_pb2.py diff --git a/animalai/communicator_objects/unity_rl_input_pb2.py b/animalai_bkp/communicator_objects/unity_rl_input_pb2.py similarity index 100% rename from animalai/communicator_objects/unity_rl_input_pb2.py rename to animalai_bkp/communicator_objects/unity_rl_input_pb2.py diff --git a/animalai/communicator_objects/unity_rl_output_pb2.py b/animalai_bkp/communicator_objects/unity_rl_output_pb2.py similarity index 100% rename from animalai/communicator_objects/unity_rl_output_pb2.py rename to animalai_bkp/communicator_objects/unity_rl_output_pb2.py diff --git a/animalai/communicator_objects/unity_rl_reset_input_pb2.py b/animalai_bkp/communicator_objects/unity_rl_reset_input_pb2.py similarity index 100% rename from animalai/communicator_objects/unity_rl_reset_input_pb2.py rename to animalai_bkp/communicator_objects/unity_rl_reset_input_pb2.py diff --git a/animalai/communicator_objects/unity_rl_reset_output_pb2.py b/animalai_bkp/communicator_objects/unity_rl_reset_output_pb2.py similarity index 100% rename from animalai/communicator_objects/unity_rl_reset_output_pb2.py rename to animalai_bkp/communicator_objects/unity_rl_reset_output_pb2.py diff --git a/animalai/communicator_objects/unity_to_external_pb2.py b/animalai_bkp/communicator_objects/unity_to_external_pb2.py similarity index 100% rename from animalai/communicator_objects/unity_to_external_pb2.py rename to animalai_bkp/communicator_objects/unity_to_external_pb2.py diff --git a/animalai/communicator_objects/unity_to_external_pb2_grpc.py b/animalai_bkp/communicator_objects/unity_to_external_pb2_grpc.py similarity index 100% rename from animalai/communicator_objects/unity_to_external_pb2_grpc.py rename to animalai_bkp/communicator_objects/unity_to_external_pb2_grpc.py diff --git a/animalai/envs/__init__.py b/animalai_bkp/envs/__init__.py similarity index 100% rename from animalai/envs/__init__.py rename to animalai_bkp/envs/__init__.py diff --git a/animalai/envs/arena_config.py b/animalai_bkp/envs/arena_config.py similarity index 100% rename from animalai/envs/arena_config.py rename to animalai_bkp/envs/arena_config.py diff --git a/animalai/envs/brain.py b/animalai_bkp/envs/brain.py similarity index 100% rename from animalai/envs/brain.py rename to animalai_bkp/envs/brain.py diff --git a/animalai/envs/communicator.py b/animalai_bkp/envs/communicator.py similarity index 100% rename from animalai/envs/communicator.py rename to animalai_bkp/envs/communicator.py diff --git a/animalai/envs/environment.py b/animalai_bkp/envs/environment.py similarity index 100% rename from animalai/envs/environment.py rename to animalai_bkp/envs/environment.py diff --git a/animalai/envs/exception.py b/animalai_bkp/envs/exception.py similarity index 100% rename from animalai/envs/exception.py rename to animalai_bkp/envs/exception.py diff --git a/animalai/envs/rpc_communicator.py b/animalai_bkp/envs/rpc_communicator.py similarity index 100% rename from animalai/envs/rpc_communicator.py rename to animalai_bkp/envs/rpc_communicator.py diff --git a/animalai/envs/socket_communicator.py b/animalai_bkp/envs/socket_communicator.py similarity index 100% rename from animalai/envs/socket_communicator.py rename to animalai_bkp/envs/socket_communicator.py diff --git a/animalai/trainers/__init__.py b/animalai_bkp/trainers/__init__.py similarity index 100% rename from animalai/trainers/__init__.py rename to animalai_bkp/trainers/__init__.py diff --git a/animalai/trainers/barracuda.py b/animalai_bkp/trainers/barracuda.py similarity index 100% rename from animalai/trainers/barracuda.py rename to animalai_bkp/trainers/barracuda.py diff --git a/animalai/trainers/bc/__init__.py b/animalai_bkp/trainers/bc/__init__.py similarity index 100% rename from animalai/trainers/bc/__init__.py rename to animalai_bkp/trainers/bc/__init__.py diff --git a/animalai/trainers/bc/models.py b/animalai_bkp/trainers/bc/models.py similarity index 100% rename from animalai/trainers/bc/models.py rename to animalai_bkp/trainers/bc/models.py diff --git a/animalai/trainers/bc/offline_trainer.py b/animalai_bkp/trainers/bc/offline_trainer.py similarity index 100% rename from animalai/trainers/bc/offline_trainer.py rename to animalai_bkp/trainers/bc/offline_trainer.py diff --git a/animalai/trainers/bc/online_trainer.py b/animalai_bkp/trainers/bc/online_trainer.py similarity index 100% rename from animalai/trainers/bc/online_trainer.py rename to animalai_bkp/trainers/bc/online_trainer.py diff --git a/animalai/trainers/bc/policy.py b/animalai_bkp/trainers/bc/policy.py similarity index 100% rename from animalai/trainers/bc/policy.py rename to animalai_bkp/trainers/bc/policy.py diff --git a/animalai/trainers/bc/trainer.py b/animalai_bkp/trainers/bc/trainer.py similarity index 100% rename from animalai/trainers/bc/trainer.py rename to animalai_bkp/trainers/bc/trainer.py diff --git a/animalai/trainers/buffer.py b/animalai_bkp/trainers/buffer.py similarity index 100% rename from animalai/trainers/buffer.py rename to animalai_bkp/trainers/buffer.py diff --git a/animalai/trainers/curriculum.py b/animalai_bkp/trainers/curriculum.py similarity index 100% rename from animalai/trainers/curriculum.py rename to animalai_bkp/trainers/curriculum.py diff --git a/animalai/trainers/demo_loader.py b/animalai_bkp/trainers/demo_loader.py similarity index 100% rename from animalai/trainers/demo_loader.py rename to animalai_bkp/trainers/demo_loader.py diff --git a/animalai/trainers/exception.py b/animalai_bkp/trainers/exception.py similarity index 100% rename from animalai/trainers/exception.py rename to animalai_bkp/trainers/exception.py diff --git a/animalai/trainers/learn.py b/animalai_bkp/trainers/learn.py similarity index 100% rename from animalai/trainers/learn.py rename to animalai_bkp/trainers/learn.py diff --git a/animalai/trainers/meta_curriculum.py b/animalai_bkp/trainers/meta_curriculum.py similarity index 100% rename from animalai/trainers/meta_curriculum.py rename to animalai_bkp/trainers/meta_curriculum.py diff --git a/animalai/trainers/models.py b/animalai_bkp/trainers/models.py similarity index 100% rename from animalai/trainers/models.py rename to animalai_bkp/trainers/models.py diff --git a/animalai/trainers/policy.py b/animalai_bkp/trainers/policy.py similarity index 100% rename from animalai/trainers/policy.py rename to animalai_bkp/trainers/policy.py diff --git a/animalai/trainers/ppo/__init__.py b/animalai_bkp/trainers/ppo/__init__.py similarity index 100% rename from animalai/trainers/ppo/__init__.py rename to animalai_bkp/trainers/ppo/__init__.py diff --git a/animalai/trainers/ppo/models.py b/animalai_bkp/trainers/ppo/models.py similarity index 100% rename from animalai/trainers/ppo/models.py rename to animalai_bkp/trainers/ppo/models.py diff --git a/animalai/trainers/ppo/policy.py b/animalai_bkp/trainers/ppo/policy.py similarity index 100% rename from animalai/trainers/ppo/policy.py rename to animalai_bkp/trainers/ppo/policy.py diff --git a/animalai/trainers/ppo/trainer.py b/animalai_bkp/trainers/ppo/trainer.py similarity index 100% rename from animalai/trainers/ppo/trainer.py rename to animalai_bkp/trainers/ppo/trainer.py diff --git a/animalai/trainers/tensorflow_to_barracuda.py b/animalai_bkp/trainers/tensorflow_to_barracuda.py similarity index 100% rename from animalai/trainers/tensorflow_to_barracuda.py rename to animalai_bkp/trainers/tensorflow_to_barracuda.py diff --git a/animalai/trainers/trainer.py b/animalai_bkp/trainers/trainer.py similarity index 100% rename from animalai/trainers/trainer.py rename to animalai_bkp/trainers/trainer.py diff --git a/animalai/trainers/trainer_controller.py b/animalai_bkp/trainers/trainer_controller.py similarity index 100% rename from animalai/trainers/trainer_controller.py rename to animalai_bkp/trainers/trainer_controller.py diff --git a/animalai_packages/animalai_envs/LICENSE b/animalai_packages/animalai_envs/LICENSE new file mode 100644 index 00000000..7ff5035e --- /dev/null +++ b/animalai_packages/animalai_envs/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2017 Unity Technologies + + 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. \ No newline at end of file diff --git a/animalai_packages/animalai_envs/README.md b/animalai_packages/animalai_envs/README.md new file mode 100644 index 00000000..1dd411bf --- /dev/null +++ b/animalai_packages/animalai_envs/README.md @@ -0,0 +1,5 @@ +# AnimalAI Python API + +This package provides the Python API used for training agents for the Animal AI Olympics competition. + +This library is mostly the same as [Unity's MLAgents](https://github.com/Unity-Technologies/ml-agents). \ No newline at end of file diff --git a/animalai_packages/animalai_envs/animalai/__init__.py b/animalai_packages/animalai_envs/animalai/__init__.py new file mode 100644 index 00000000..c088da9f --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/__init__.py @@ -0,0 +1 @@ +name= "animalai" diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/__init__.py b/animalai_packages/animalai_envs/animalai/communicator_objects/__init__.py new file mode 100644 index 00000000..571ec13b --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/communicator_objects/__init__.py @@ -0,0 +1,22 @@ +from .agent_action_proto_pb2 import * +from .agent_info_proto_pb2 import * +from .arena_parameters_proto_pb2 import * +from .brain_parameters_proto_pb2 import * +from .command_proto_pb2 import * +from .demonstration_meta_proto_pb2 import * +from .engine_configuration_proto_pb2 import * +from .header_pb2 import * +from .__init__ import * +from .resolution_proto_pb2 import * +from .space_type_proto_pb2 import * +from .unity_input_pb2 import * +from .unity_message_pb2 import * +from .unity_output_pb2 import * +from .unity_rl_initialization_input_pb2 import * +from .unity_rl_initialization_output_pb2 import * +from .unity_rl_input_pb2 import * +from .unity_rl_output_pb2 import * +from .unity_rl_reset_input_pb2 import * +from .unity_rl_reset_output_pb2 import * +from .unity_to_external_pb2_grpc import * +from .unity_to_external_pb2 import * diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/agent_action_proto_pb2.py b/animalai_packages/animalai_envs/animalai/communicator_objects/agent_action_proto_pb2.py new file mode 100644 index 00000000..8d19593e --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/communicator_objects/agent_action_proto_pb2.py @@ -0,0 +1,92 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: animalai/communicator_objects/agent_action_proto.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='animalai/communicator_objects/agent_action_proto.proto', + package='communicator_objects', + syntax='proto3', + serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), + serialized_pb=_b('\n6animalai/communicator_objects/agent_action_proto.proto\x12\x14\x63ommunicator_objects\"a\n\x10\x41gentActionProto\x12\x16\n\x0evector_actions\x18\x01 \x03(\x02\x12\x14\n\x0ctext_actions\x18\x02 \x01(\t\x12\x10\n\x08memories\x18\x03 \x03(\x02\x12\r\n\x05value\x18\x04 \x01(\x02\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') +) + + + + +_AGENTACTIONPROTO = _descriptor.Descriptor( + name='AgentActionProto', + full_name='communicator_objects.AgentActionProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='vector_actions', full_name='communicator_objects.AgentActionProto.vector_actions', index=0, + number=1, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='text_actions', full_name='communicator_objects.AgentActionProto.text_actions', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='memories', full_name='communicator_objects.AgentActionProto.memories', index=2, + number=3, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='value', full_name='communicator_objects.AgentActionProto.value', index=3, + number=4, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=80, + serialized_end=177, +) + +DESCRIPTOR.message_types_by_name['AgentActionProto'] = _AGENTACTIONPROTO +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +AgentActionProto = _reflection.GeneratedProtocolMessageType('AgentActionProto', (_message.Message,), { + 'DESCRIPTOR' : _AGENTACTIONPROTO, + '__module__' : 'animalai.communicator_objects.agent_action_proto_pb2' + # @@protoc_insertion_point(class_scope:communicator_objects.AgentActionProto) + }) +_sym_db.RegisterMessage(AgentActionProto) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/agent_info_proto_pb2.py b/animalai_packages/animalai_envs/animalai/communicator_objects/agent_info_proto_pb2.py new file mode 100644 index 00000000..0dad7e85 --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/communicator_objects/agent_info_proto_pb2.py @@ -0,0 +1,141 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: animalai/communicator_objects/agent_info_proto.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='animalai/communicator_objects/agent_info_proto.proto', + package='communicator_objects', + syntax='proto3', + serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), + serialized_pb=_b('\n4animalai/communicator_objects/agent_info_proto.proto\x12\x14\x63ommunicator_objects\"\x92\x02\n\x0e\x41gentInfoProto\x12\"\n\x1astacked_vector_observation\x18\x01 \x03(\x02\x12\x1b\n\x13visual_observations\x18\x02 \x03(\x0c\x12\x18\n\x10text_observation\x18\x03 \x01(\t\x12\x1d\n\x15stored_vector_actions\x18\x04 \x03(\x02\x12\x1b\n\x13stored_text_actions\x18\x05 \x01(\t\x12\x10\n\x08memories\x18\x06 \x03(\x02\x12\x0e\n\x06reward\x18\x07 \x01(\x02\x12\x0c\n\x04\x64one\x18\x08 \x01(\x08\x12\x18\n\x10max_step_reached\x18\t \x01(\x08\x12\n\n\x02id\x18\n \x01(\x05\x12\x13\n\x0b\x61\x63tion_mask\x18\x0b \x03(\x08\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') +) + + + + +_AGENTINFOPROTO = _descriptor.Descriptor( + name='AgentInfoProto', + full_name='communicator_objects.AgentInfoProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='stacked_vector_observation', full_name='communicator_objects.AgentInfoProto.stacked_vector_observation', index=0, + number=1, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='visual_observations', full_name='communicator_objects.AgentInfoProto.visual_observations', index=1, + number=2, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='text_observation', full_name='communicator_objects.AgentInfoProto.text_observation', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='stored_vector_actions', full_name='communicator_objects.AgentInfoProto.stored_vector_actions', index=3, + number=4, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='stored_text_actions', full_name='communicator_objects.AgentInfoProto.stored_text_actions', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='memories', full_name='communicator_objects.AgentInfoProto.memories', index=5, + number=6, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='reward', full_name='communicator_objects.AgentInfoProto.reward', index=6, + number=7, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='done', full_name='communicator_objects.AgentInfoProto.done', index=7, + number=8, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='max_step_reached', full_name='communicator_objects.AgentInfoProto.max_step_reached', index=8, + number=9, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='id', full_name='communicator_objects.AgentInfoProto.id', index=9, + number=10, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='action_mask', full_name='communicator_objects.AgentInfoProto.action_mask', index=10, + number=11, type=8, cpp_type=7, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=79, + serialized_end=353, +) + +DESCRIPTOR.message_types_by_name['AgentInfoProto'] = _AGENTINFOPROTO +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +AgentInfoProto = _reflection.GeneratedProtocolMessageType('AgentInfoProto', (_message.Message,), { + 'DESCRIPTOR' : _AGENTINFOPROTO, + '__module__' : 'animalai.communicator_objects.agent_info_proto_pb2' + # @@protoc_insertion_point(class_scope:communicator_objects.AgentInfoProto) + }) +_sym_db.RegisterMessage(AgentInfoProto) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/arena_parameters_proto_pb2.py b/animalai_packages/animalai_envs/animalai/communicator_objects/arena_parameters_proto_pb2.py new file mode 100644 index 00000000..930b300c --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/communicator_objects/arena_parameters_proto_pb2.py @@ -0,0 +1,209 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: animalai/communicator_objects/arena_parameters_proto.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='animalai/communicator_objects/arena_parameters_proto.proto', + package='communicator_objects', + syntax='proto3', + serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), + serialized_pb=_b('\n:animalai/communicator_objects/arena_parameters_proto.proto\x12\x14\x63ommunicator_objects\"\xcf\x03\n\x14\x41renaParametersProto\x12\t\n\x01t\x18\x01 \x01(\x05\x12\x46\n\x05items\x18\x02 \x03(\x0b\x32\x37.communicator_objects.ArenaParametersProto.ItemsToSpawn\x12\x11\n\tblackouts\x18\x03 \x03(\x05\x1a\xd0\x02\n\x0cItemsToSpawn\x12\x0c\n\x04name\x18\x01 \x01(\t\x12R\n\tpositions\x18\x03 \x03(\x0b\x32?.communicator_objects.ArenaParametersProto.ItemsToSpawn.Vector3\x12\x11\n\trotations\x18\x04 \x03(\x02\x12N\n\x05sizes\x18\x05 \x03(\x0b\x32?.communicator_objects.ArenaParametersProto.ItemsToSpawn.Vector3\x12O\n\x06\x63olors\x18\x06 \x03(\x0b\x32?.communicator_objects.ArenaParametersProto.ItemsToSpawn.Vector3\x1a*\n\x07Vector3\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02\x12\t\n\x01z\x18\x03 \x01(\x02\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') +) + + + + +_ARENAPARAMETERSPROTO_ITEMSTOSPAWN_VECTOR3 = _descriptor.Descriptor( + name='Vector3', + full_name='communicator_objects.ArenaParametersProto.ItemsToSpawn.Vector3', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='x', full_name='communicator_objects.ArenaParametersProto.ItemsToSpawn.Vector3.x', index=0, + number=1, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='y', full_name='communicator_objects.ArenaParametersProto.ItemsToSpawn.Vector3.y', index=1, + number=2, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='z', full_name='communicator_objects.ArenaParametersProto.ItemsToSpawn.Vector3.z', index=2, + number=3, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=506, + serialized_end=548, +) + +_ARENAPARAMETERSPROTO_ITEMSTOSPAWN = _descriptor.Descriptor( + name='ItemsToSpawn', + full_name='communicator_objects.ArenaParametersProto.ItemsToSpawn', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='communicator_objects.ArenaParametersProto.ItemsToSpawn.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='positions', full_name='communicator_objects.ArenaParametersProto.ItemsToSpawn.positions', index=1, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='rotations', full_name='communicator_objects.ArenaParametersProto.ItemsToSpawn.rotations', index=2, + number=4, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='sizes', full_name='communicator_objects.ArenaParametersProto.ItemsToSpawn.sizes', index=3, + number=5, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='colors', full_name='communicator_objects.ArenaParametersProto.ItemsToSpawn.colors', index=4, + number=6, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_ARENAPARAMETERSPROTO_ITEMSTOSPAWN_VECTOR3, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=212, + serialized_end=548, +) + +_ARENAPARAMETERSPROTO = _descriptor.Descriptor( + name='ArenaParametersProto', + full_name='communicator_objects.ArenaParametersProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='t', full_name='communicator_objects.ArenaParametersProto.t', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='items', full_name='communicator_objects.ArenaParametersProto.items', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='blackouts', full_name='communicator_objects.ArenaParametersProto.blackouts', index=2, + number=3, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_ARENAPARAMETERSPROTO_ITEMSTOSPAWN, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=85, + serialized_end=548, +) + +_ARENAPARAMETERSPROTO_ITEMSTOSPAWN_VECTOR3.containing_type = _ARENAPARAMETERSPROTO_ITEMSTOSPAWN +_ARENAPARAMETERSPROTO_ITEMSTOSPAWN.fields_by_name['positions'].message_type = _ARENAPARAMETERSPROTO_ITEMSTOSPAWN_VECTOR3 +_ARENAPARAMETERSPROTO_ITEMSTOSPAWN.fields_by_name['sizes'].message_type = _ARENAPARAMETERSPROTO_ITEMSTOSPAWN_VECTOR3 +_ARENAPARAMETERSPROTO_ITEMSTOSPAWN.fields_by_name['colors'].message_type = _ARENAPARAMETERSPROTO_ITEMSTOSPAWN_VECTOR3 +_ARENAPARAMETERSPROTO_ITEMSTOSPAWN.containing_type = _ARENAPARAMETERSPROTO +_ARENAPARAMETERSPROTO.fields_by_name['items'].message_type = _ARENAPARAMETERSPROTO_ITEMSTOSPAWN +DESCRIPTOR.message_types_by_name['ArenaParametersProto'] = _ARENAPARAMETERSPROTO +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +ArenaParametersProto = _reflection.GeneratedProtocolMessageType('ArenaParametersProto', (_message.Message,), { + + 'ItemsToSpawn' : _reflection.GeneratedProtocolMessageType('ItemsToSpawn', (_message.Message,), { + + 'Vector3' : _reflection.GeneratedProtocolMessageType('Vector3', (_message.Message,), { + 'DESCRIPTOR' : _ARENAPARAMETERSPROTO_ITEMSTOSPAWN_VECTOR3, + '__module__' : 'animalai.communicator_objects.arena_parameters_proto_pb2' + # @@protoc_insertion_point(class_scope:communicator_objects.ArenaParametersProto.ItemsToSpawn.Vector3) + }) + , + 'DESCRIPTOR' : _ARENAPARAMETERSPROTO_ITEMSTOSPAWN, + '__module__' : 'animalai.communicator_objects.arena_parameters_proto_pb2' + # @@protoc_insertion_point(class_scope:communicator_objects.ArenaParametersProto.ItemsToSpawn) + }) + , + 'DESCRIPTOR' : _ARENAPARAMETERSPROTO, + '__module__' : 'animalai.communicator_objects.arena_parameters_proto_pb2' + # @@protoc_insertion_point(class_scope:communicator_objects.ArenaParametersProto) + }) +_sym_db.RegisterMessage(ArenaParametersProto) +_sym_db.RegisterMessage(ArenaParametersProto.ItemsToSpawn) +_sym_db.RegisterMessage(ArenaParametersProto.ItemsToSpawn.Vector3) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/brain_parameters_proto_pb2.py b/animalai_packages/animalai_envs/animalai/communicator_objects/brain_parameters_proto_pb2.py new file mode 100644 index 00000000..07091b4f --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/communicator_objects/brain_parameters_proto_pb2.py @@ -0,0 +1,125 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: animalai/communicator_objects/brain_parameters_proto.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from animalai.communicator_objects import resolution_proto_pb2 as animalai_dot_communicator__objects_dot_resolution__proto__pb2 +from animalai.communicator_objects import space_type_proto_pb2 as animalai_dot_communicator__objects_dot_space__type__proto__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='animalai/communicator_objects/brain_parameters_proto.proto', + package='communicator_objects', + syntax='proto3', + serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), + serialized_pb=_b('\n:animalai/communicator_objects/brain_parameters_proto.proto\x12\x14\x63ommunicator_objects\x1a\x34\x61nimalai/communicator_objects/resolution_proto.proto\x1a\x34\x61nimalai/communicator_objects/space_type_proto.proto\"\xd4\x02\n\x14\x42rainParametersProto\x12\x1f\n\x17vector_observation_size\x18\x01 \x01(\x05\x12\'\n\x1fnum_stacked_vector_observations\x18\x02 \x01(\x05\x12\x1a\n\x12vector_action_size\x18\x03 \x03(\x05\x12\x41\n\x12\x63\x61mera_resolutions\x18\x04 \x03(\x0b\x32%.communicator_objects.ResolutionProto\x12\"\n\x1avector_action_descriptions\x18\x05 \x03(\t\x12\x46\n\x18vector_action_space_type\x18\x06 \x01(\x0e\x32$.communicator_objects.SpaceTypeProto\x12\x12\n\nbrain_name\x18\x07 \x01(\t\x12\x13\n\x0bis_training\x18\x08 \x01(\x08\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') + , + dependencies=[animalai_dot_communicator__objects_dot_resolution__proto__pb2.DESCRIPTOR,animalai_dot_communicator__objects_dot_space__type__proto__pb2.DESCRIPTOR,]) + + + + +_BRAINPARAMETERSPROTO = _descriptor.Descriptor( + name='BrainParametersProto', + full_name='communicator_objects.BrainParametersProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='vector_observation_size', full_name='communicator_objects.BrainParametersProto.vector_observation_size', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='num_stacked_vector_observations', full_name='communicator_objects.BrainParametersProto.num_stacked_vector_observations', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='vector_action_size', full_name='communicator_objects.BrainParametersProto.vector_action_size', index=2, + number=3, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='camera_resolutions', full_name='communicator_objects.BrainParametersProto.camera_resolutions', index=3, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='vector_action_descriptions', full_name='communicator_objects.BrainParametersProto.vector_action_descriptions', index=4, + number=5, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='vector_action_space_type', full_name='communicator_objects.BrainParametersProto.vector_action_space_type', index=5, + number=6, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='brain_name', full_name='communicator_objects.BrainParametersProto.brain_name', index=6, + number=7, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='is_training', full_name='communicator_objects.BrainParametersProto.is_training', index=7, + number=8, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=193, + serialized_end=533, +) + +_BRAINPARAMETERSPROTO.fields_by_name['camera_resolutions'].message_type = animalai_dot_communicator__objects_dot_resolution__proto__pb2._RESOLUTIONPROTO +_BRAINPARAMETERSPROTO.fields_by_name['vector_action_space_type'].enum_type = animalai_dot_communicator__objects_dot_space__type__proto__pb2._SPACETYPEPROTO +DESCRIPTOR.message_types_by_name['BrainParametersProto'] = _BRAINPARAMETERSPROTO +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +BrainParametersProto = _reflection.GeneratedProtocolMessageType('BrainParametersProto', (_message.Message,), { + 'DESCRIPTOR' : _BRAINPARAMETERSPROTO, + '__module__' : 'animalai.communicator_objects.brain_parameters_proto_pb2' + # @@protoc_insertion_point(class_scope:communicator_objects.BrainParametersProto) + }) +_sym_db.RegisterMessage(BrainParametersProto) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/command_proto_pb2.py b/animalai_packages/animalai_envs/animalai/communicator_objects/command_proto_pb2.py new file mode 100644 index 00000000..4912301f --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/communicator_objects/command_proto_pb2.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: animalai/communicator_objects/command_proto.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='animalai/communicator_objects/command_proto.proto', + package='communicator_objects', + syntax='proto3', + serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), + serialized_pb=_b('\n1animalai/communicator_objects/command_proto.proto\x12\x14\x63ommunicator_objects*-\n\x0c\x43ommandProto\x12\x08\n\x04STEP\x10\x00\x12\t\n\x05RESET\x10\x01\x12\x08\n\x04QUIT\x10\x02\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') +) + +_COMMANDPROTO = _descriptor.EnumDescriptor( + name='CommandProto', + full_name='communicator_objects.CommandProto', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='STEP', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RESET', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='QUIT', index=2, number=2, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=75, + serialized_end=120, +) +_sym_db.RegisterEnumDescriptor(_COMMANDPROTO) + +CommandProto = enum_type_wrapper.EnumTypeWrapper(_COMMANDPROTO) +STEP = 0 +RESET = 1 +QUIT = 2 + + +DESCRIPTOR.enum_types_by_name['CommandProto'] = _COMMANDPROTO +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/demonstration_meta_proto_pb2.py b/animalai_packages/animalai_envs/animalai/communicator_objects/demonstration_meta_proto_pb2.py new file mode 100644 index 00000000..107b1335 --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/communicator_objects/demonstration_meta_proto_pb2.py @@ -0,0 +1,99 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: animalai/communicator_objects/demonstration_meta_proto.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='animalai/communicator_objects/demonstration_meta_proto.proto', + package='communicator_objects', + syntax='proto3', + serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), + serialized_pb=_b('\nanimalai/communicator_objects/engine_configuration_proto.proto\x12\x14\x63ommunicator_objects\"\x95\x01\n\x18\x45ngineConfigurationProto\x12\r\n\x05width\x18\x01 \x01(\x05\x12\x0e\n\x06height\x18\x02 \x01(\x05\x12\x15\n\rquality_level\x18\x03 \x01(\x05\x12\x12\n\ntime_scale\x18\x04 \x01(\x02\x12\x19\n\x11target_frame_rate\x18\x05 \x01(\x05\x12\x14\n\x0cshow_monitor\x18\x06 \x01(\x08\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') +) + + + + +_ENGINECONFIGURATIONPROTO = _descriptor.Descriptor( + name='EngineConfigurationProto', + full_name='communicator_objects.EngineConfigurationProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='width', full_name='communicator_objects.EngineConfigurationProto.width', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='height', full_name='communicator_objects.EngineConfigurationProto.height', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='quality_level', full_name='communicator_objects.EngineConfigurationProto.quality_level', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='time_scale', full_name='communicator_objects.EngineConfigurationProto.time_scale', index=3, + number=4, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='target_frame_rate', full_name='communicator_objects.EngineConfigurationProto.target_frame_rate', index=4, + number=5, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='show_monitor', full_name='communicator_objects.EngineConfigurationProto.show_monitor', index=5, + number=6, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=89, + serialized_end=238, +) + +DESCRIPTOR.message_types_by_name['EngineConfigurationProto'] = _ENGINECONFIGURATIONPROTO +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +EngineConfigurationProto = _reflection.GeneratedProtocolMessageType('EngineConfigurationProto', (_message.Message,), { + 'DESCRIPTOR' : _ENGINECONFIGURATIONPROTO, + '__module__' : 'animalai.communicator_objects.engine_configuration_proto_pb2' + # @@protoc_insertion_point(class_scope:communicator_objects.EngineConfigurationProto) + }) +_sym_db.RegisterMessage(EngineConfigurationProto) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/header_pb2.py b/animalai_packages/animalai_envs/animalai/communicator_objects/header_pb2.py new file mode 100644 index 00000000..6c40f6cc --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/communicator_objects/header_pb2.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: animalai/communicator_objects/header.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='animalai/communicator_objects/header.proto', + package='communicator_objects', + syntax='proto3', + serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), + serialized_pb=_b('\n*animalai/communicator_objects/header.proto\x12\x14\x63ommunicator_objects\")\n\x06Header\x12\x0e\n\x06status\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\tB\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') +) + + + + +_HEADER = _descriptor.Descriptor( + name='Header', + full_name='communicator_objects.Header', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='status', full_name='communicator_objects.Header.status', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='message', full_name='communicator_objects.Header.message', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=68, + serialized_end=109, +) + +DESCRIPTOR.message_types_by_name['Header'] = _HEADER +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Header = _reflection.GeneratedProtocolMessageType('Header', (_message.Message,), { + 'DESCRIPTOR' : _HEADER, + '__module__' : 'animalai.communicator_objects.header_pb2' + # @@protoc_insertion_point(class_scope:communicator_objects.Header) + }) +_sym_db.RegisterMessage(Header) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/resolution_proto_pb2.py b/animalai_packages/animalai_envs/animalai/communicator_objects/resolution_proto_pb2.py new file mode 100644 index 00000000..cade7d49 --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/communicator_objects/resolution_proto_pb2.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: animalai/communicator_objects/resolution_proto.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='animalai/communicator_objects/resolution_proto.proto', + package='communicator_objects', + syntax='proto3', + serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), + serialized_pb=_b('\n4animalai/communicator_objects/resolution_proto.proto\x12\x14\x63ommunicator_objects\"D\n\x0fResolutionProto\x12\r\n\x05width\x18\x01 \x01(\x05\x12\x0e\n\x06height\x18\x02 \x01(\x05\x12\x12\n\ngray_scale\x18\x03 \x01(\x08\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') +) + + + + +_RESOLUTIONPROTO = _descriptor.Descriptor( + name='ResolutionProto', + full_name='communicator_objects.ResolutionProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='width', full_name='communicator_objects.ResolutionProto.width', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='height', full_name='communicator_objects.ResolutionProto.height', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='gray_scale', full_name='communicator_objects.ResolutionProto.gray_scale', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=78, + serialized_end=146, +) + +DESCRIPTOR.message_types_by_name['ResolutionProto'] = _RESOLUTIONPROTO +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +ResolutionProto = _reflection.GeneratedProtocolMessageType('ResolutionProto', (_message.Message,), { + 'DESCRIPTOR' : _RESOLUTIONPROTO, + '__module__' : 'animalai.communicator_objects.resolution_proto_pb2' + # @@protoc_insertion_point(class_scope:communicator_objects.ResolutionProto) + }) +_sym_db.RegisterMessage(ResolutionProto) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/space_type_proto_pb2.py b/animalai_packages/animalai_envs/animalai/communicator_objects/space_type_proto_pb2.py new file mode 100644 index 00000000..02a9b16e --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/communicator_objects/space_type_proto_pb2.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: animalai/communicator_objects/space_type_proto.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from animalai.communicator_objects import resolution_proto_pb2 as animalai_dot_communicator__objects_dot_resolution__proto__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='animalai/communicator_objects/space_type_proto.proto', + package='communicator_objects', + syntax='proto3', + serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), + serialized_pb=_b('\n4animalai/communicator_objects/space_type_proto.proto\x12\x14\x63ommunicator_objects\x1a\x34\x61nimalai/communicator_objects/resolution_proto.proto*.\n\x0eSpaceTypeProto\x12\x0c\n\x08\x64iscrete\x10\x00\x12\x0e\n\ncontinuous\x10\x01\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') + , + dependencies=[animalai_dot_communicator__objects_dot_resolution__proto__pb2.DESCRIPTOR,]) + +_SPACETYPEPROTO = _descriptor.EnumDescriptor( + name='SpaceTypeProto', + full_name='communicator_objects.SpaceTypeProto', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='discrete', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='continuous', index=1, number=1, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=132, + serialized_end=178, +) +_sym_db.RegisterEnumDescriptor(_SPACETYPEPROTO) + +SpaceTypeProto = enum_type_wrapper.EnumTypeWrapper(_SPACETYPEPROTO) +discrete = 0 +continuous = 1 + + +DESCRIPTOR.enum_types_by_name['SpaceTypeProto'] = _SPACETYPEPROTO +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/unity_input_pb2.py b/animalai_packages/animalai_envs/animalai/communicator_objects/unity_input_pb2.py new file mode 100644 index 00000000..a3f9d1c1 --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/communicator_objects/unity_input_pb2.py @@ -0,0 +1,92 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: animalai/communicator_objects/unity_input.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from animalai.communicator_objects import unity_rl_input_pb2 as animalai_dot_communicator__objects_dot_unity__rl__input__pb2 +from animalai.communicator_objects import unity_rl_initialization_input_pb2 as animalai_dot_communicator__objects_dot_unity__rl__initialization__input__pb2 +from animalai.communicator_objects import unity_rl_reset_input_pb2 as animalai_dot_communicator__objects_dot_unity__rl__reset__input__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='animalai/communicator_objects/unity_input.proto', + package='communicator_objects', + syntax='proto3', + serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), + serialized_pb=_b('\n/animalai/communicator_objects/unity_input.proto\x12\x14\x63ommunicator_objects\x1a\x32\x61nimalai/communicator_objects/unity_rl_input.proto\x1a\x41\x61nimalai/communicator_objects/unity_rl_initialization_input.proto\x1a\x38\x61nimalai/communicator_objects/unity_rl_reset_input.proto\"\xd6\x01\n\nUnityInput\x12\x34\n\x08rl_input\x18\x01 \x01(\x0b\x32\".communicator_objects.UnityRLInput\x12Q\n\x17rl_initialization_input\x18\x02 \x01(\x0b\x32\x30.communicator_objects.UnityRLInitializationInput\x12?\n\x0erl_reset_input\x18\x03 \x01(\x0b\x32\'.communicator_objects.UnityRLResetInputB\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') + , + dependencies=[animalai_dot_communicator__objects_dot_unity__rl__input__pb2.DESCRIPTOR,animalai_dot_communicator__objects_dot_unity__rl__initialization__input__pb2.DESCRIPTOR,animalai_dot_communicator__objects_dot_unity__rl__reset__input__pb2.DESCRIPTOR,]) + + + + +_UNITYINPUT = _descriptor.Descriptor( + name='UnityInput', + full_name='communicator_objects.UnityInput', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='rl_input', full_name='communicator_objects.UnityInput.rl_input', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='rl_initialization_input', full_name='communicator_objects.UnityInput.rl_initialization_input', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='rl_reset_input', full_name='communicator_objects.UnityInput.rl_reset_input', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=251, + serialized_end=465, +) + +_UNITYINPUT.fields_by_name['rl_input'].message_type = animalai_dot_communicator__objects_dot_unity__rl__input__pb2._UNITYRLINPUT +_UNITYINPUT.fields_by_name['rl_initialization_input'].message_type = animalai_dot_communicator__objects_dot_unity__rl__initialization__input__pb2._UNITYRLINITIALIZATIONINPUT +_UNITYINPUT.fields_by_name['rl_reset_input'].message_type = animalai_dot_communicator__objects_dot_unity__rl__reset__input__pb2._UNITYRLRESETINPUT +DESCRIPTOR.message_types_by_name['UnityInput'] = _UNITYINPUT +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +UnityInput = _reflection.GeneratedProtocolMessageType('UnityInput', (_message.Message,), { + 'DESCRIPTOR' : _UNITYINPUT, + '__module__' : 'animalai.communicator_objects.unity_input_pb2' + # @@protoc_insertion_point(class_scope:communicator_objects.UnityInput) + }) +_sym_db.RegisterMessage(UnityInput) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/unity_message_pb2.py b/animalai_packages/animalai_envs/animalai/communicator_objects/unity_message_pb2.py new file mode 100644 index 00000000..47deefdc --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/communicator_objects/unity_message_pb2.py @@ -0,0 +1,92 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: animalai/communicator_objects/unity_message.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from animalai.communicator_objects import unity_output_pb2 as animalai_dot_communicator__objects_dot_unity__output__pb2 +from animalai.communicator_objects import unity_input_pb2 as animalai_dot_communicator__objects_dot_unity__input__pb2 +from animalai.communicator_objects import header_pb2 as animalai_dot_communicator__objects_dot_header__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='animalai/communicator_objects/unity_message.proto', + package='communicator_objects', + syntax='proto3', + serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), + serialized_pb=_b('\n1animalai/communicator_objects/unity_message.proto\x12\x14\x63ommunicator_objects\x1a\x30\x61nimalai/communicator_objects/unity_output.proto\x1a/animalai/communicator_objects/unity_input.proto\x1a*animalai/communicator_objects/header.proto\"\xac\x01\n\x0cUnityMessage\x12,\n\x06header\x18\x01 \x01(\x0b\x32\x1c.communicator_objects.Header\x12\x37\n\x0cunity_output\x18\x02 \x01(\x0b\x32!.communicator_objects.UnityOutput\x12\x35\n\x0bunity_input\x18\x03 \x01(\x0b\x32 .communicator_objects.UnityInputB\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') + , + dependencies=[animalai_dot_communicator__objects_dot_unity__output__pb2.DESCRIPTOR,animalai_dot_communicator__objects_dot_unity__input__pb2.DESCRIPTOR,animalai_dot_communicator__objects_dot_header__pb2.DESCRIPTOR,]) + + + + +_UNITYMESSAGE = _descriptor.Descriptor( + name='UnityMessage', + full_name='communicator_objects.UnityMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='header', full_name='communicator_objects.UnityMessage.header', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='unity_output', full_name='communicator_objects.UnityMessage.unity_output', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='unity_input', full_name='communicator_objects.UnityMessage.unity_input', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=219, + serialized_end=391, +) + +_UNITYMESSAGE.fields_by_name['header'].message_type = animalai_dot_communicator__objects_dot_header__pb2._HEADER +_UNITYMESSAGE.fields_by_name['unity_output'].message_type = animalai_dot_communicator__objects_dot_unity__output__pb2._UNITYOUTPUT +_UNITYMESSAGE.fields_by_name['unity_input'].message_type = animalai_dot_communicator__objects_dot_unity__input__pb2._UNITYINPUT +DESCRIPTOR.message_types_by_name['UnityMessage'] = _UNITYMESSAGE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +UnityMessage = _reflection.GeneratedProtocolMessageType('UnityMessage', (_message.Message,), { + 'DESCRIPTOR' : _UNITYMESSAGE, + '__module__' : 'animalai.communicator_objects.unity_message_pb2' + # @@protoc_insertion_point(class_scope:communicator_objects.UnityMessage) + }) +_sym_db.RegisterMessage(UnityMessage) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/unity_output_pb2.py b/animalai_packages/animalai_envs/animalai/communicator_objects/unity_output_pb2.py new file mode 100644 index 00000000..5beed76e --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/communicator_objects/unity_output_pb2.py @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: animalai/communicator_objects/unity_output.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from animalai.communicator_objects import unity_rl_output_pb2 as animalai_dot_communicator__objects_dot_unity__rl__output__pb2 +from animalai.communicator_objects import unity_rl_initialization_output_pb2 as animalai_dot_communicator__objects_dot_unity__rl__initialization__output__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='animalai/communicator_objects/unity_output.proto', + package='communicator_objects', + syntax='proto3', + serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), + serialized_pb=_b('\n0animalai/communicator_objects/unity_output.proto\x12\x14\x63ommunicator_objects\x1a\x33\x61nimalai/communicator_objects/unity_rl_output.proto\x1a\x42\x61nimalai/communicator_objects/unity_rl_initialization_output.proto\"\x9a\x01\n\x0bUnityOutput\x12\x36\n\trl_output\x18\x01 \x01(\x0b\x32#.communicator_objects.UnityRLOutput\x12S\n\x18rl_initialization_output\x18\x02 \x01(\x0b\x32\x31.communicator_objects.UnityRLInitializationOutputB\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') + , + dependencies=[animalai_dot_communicator__objects_dot_unity__rl__output__pb2.DESCRIPTOR,animalai_dot_communicator__objects_dot_unity__rl__initialization__output__pb2.DESCRIPTOR,]) + + + + +_UNITYOUTPUT = _descriptor.Descriptor( + name='UnityOutput', + full_name='communicator_objects.UnityOutput', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='rl_output', full_name='communicator_objects.UnityOutput.rl_output', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='rl_initialization_output', full_name='communicator_objects.UnityOutput.rl_initialization_output', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=196, + serialized_end=350, +) + +_UNITYOUTPUT.fields_by_name['rl_output'].message_type = animalai_dot_communicator__objects_dot_unity__rl__output__pb2._UNITYRLOUTPUT +_UNITYOUTPUT.fields_by_name['rl_initialization_output'].message_type = animalai_dot_communicator__objects_dot_unity__rl__initialization__output__pb2._UNITYRLINITIALIZATIONOUTPUT +DESCRIPTOR.message_types_by_name['UnityOutput'] = _UNITYOUTPUT +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +UnityOutput = _reflection.GeneratedProtocolMessageType('UnityOutput', (_message.Message,), { + 'DESCRIPTOR' : _UNITYOUTPUT, + '__module__' : 'animalai.communicator_objects.unity_output_pb2' + # @@protoc_insertion_point(class_scope:communicator_objects.UnityOutput) + }) +_sym_db.RegisterMessage(UnityOutput) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_initialization_input_pb2.py b/animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_initialization_input_pb2.py new file mode 100644 index 00000000..9b16381b --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_initialization_input_pb2.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: animalai/communicator_objects/unity_rl_initialization_input.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='animalai/communicator_objects/unity_rl_initialization_input.proto', + package='communicator_objects', + syntax='proto3', + serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), + serialized_pb=_b('\nAanimalai/communicator_objects/unity_rl_initialization_input.proto\x12\x14\x63ommunicator_objects\"*\n\x1aUnityRLInitializationInput\x12\x0c\n\x04seed\x18\x01 \x01(\x05\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') +) + + + + +_UNITYRLINITIALIZATIONINPUT = _descriptor.Descriptor( + name='UnityRLInitializationInput', + full_name='communicator_objects.UnityRLInitializationInput', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='seed', full_name='communicator_objects.UnityRLInitializationInput.seed', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=91, + serialized_end=133, +) + +DESCRIPTOR.message_types_by_name['UnityRLInitializationInput'] = _UNITYRLINITIALIZATIONINPUT +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +UnityRLInitializationInput = _reflection.GeneratedProtocolMessageType('UnityRLInitializationInput', (_message.Message,), { + 'DESCRIPTOR' : _UNITYRLINITIALIZATIONINPUT, + '__module__' : 'animalai.communicator_objects.unity_rl_initialization_input_pb2' + # @@protoc_insertion_point(class_scope:communicator_objects.UnityRLInitializationInput) + }) +_sym_db.RegisterMessage(UnityRLInitializationInput) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_initialization_output_pb2.py b/animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_initialization_output_pb2.py new file mode 100644 index 00000000..1042578f --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_initialization_output_pb2.py @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: animalai/communicator_objects/unity_rl_initialization_output.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from animalai.communicator_objects import brain_parameters_proto_pb2 as animalai_dot_communicator__objects_dot_brain__parameters__proto__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='animalai/communicator_objects/unity_rl_initialization_output.proto', + package='communicator_objects', + syntax='proto3', + serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), + serialized_pb=_b('\nBanimalai/communicator_objects/unity_rl_initialization_output.proto\x12\x14\x63ommunicator_objects\x1a:animalai/communicator_objects/brain_parameters_proto.proto\"\x94\x01\n\x1bUnityRLInitializationOutput\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\t\x12\x10\n\x08log_path\x18\x03 \x01(\t\x12\x44\n\x10\x62rain_parameters\x18\x05 \x03(\x0b\x32*.communicator_objects.BrainParametersProtoB\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') + , + dependencies=[animalai_dot_communicator__objects_dot_brain__parameters__proto__pb2.DESCRIPTOR,]) + + + + +_UNITYRLINITIALIZATIONOUTPUT = _descriptor.Descriptor( + name='UnityRLInitializationOutput', + full_name='communicator_objects.UnityRLInitializationOutput', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='communicator_objects.UnityRLInitializationOutput.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='version', full_name='communicator_objects.UnityRLInitializationOutput.version', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='log_path', full_name='communicator_objects.UnityRLInitializationOutput.log_path', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='brain_parameters', full_name='communicator_objects.UnityRLInitializationOutput.brain_parameters', index=3, + number=5, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=153, + serialized_end=301, +) + +_UNITYRLINITIALIZATIONOUTPUT.fields_by_name['brain_parameters'].message_type = animalai_dot_communicator__objects_dot_brain__parameters__proto__pb2._BRAINPARAMETERSPROTO +DESCRIPTOR.message_types_by_name['UnityRLInitializationOutput'] = _UNITYRLINITIALIZATIONOUTPUT +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +UnityRLInitializationOutput = _reflection.GeneratedProtocolMessageType('UnityRLInitializationOutput', (_message.Message,), { + 'DESCRIPTOR' : _UNITYRLINITIALIZATIONOUTPUT, + '__module__' : 'animalai.communicator_objects.unity_rl_initialization_output_pb2' + # @@protoc_insertion_point(class_scope:communicator_objects.UnityRLInitializationOutput) + }) +_sym_db.RegisterMessage(UnityRLInitializationOutput) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_input_pb2.py b/animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_input_pb2.py new file mode 100644 index 00000000..29225764 --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_input_pb2.py @@ -0,0 +1,178 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: animalai/communicator_objects/unity_rl_input.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from animalai.communicator_objects import agent_action_proto_pb2 as animalai_dot_communicator__objects_dot_agent__action__proto__pb2 +from animalai.communicator_objects import command_proto_pb2 as animalai_dot_communicator__objects_dot_command__proto__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='animalai/communicator_objects/unity_rl_input.proto', + package='communicator_objects', + syntax='proto3', + serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), + serialized_pb=_b('\n2animalai/communicator_objects/unity_rl_input.proto\x12\x14\x63ommunicator_objects\x1a\x36\x61nimalai/communicator_objects/agent_action_proto.proto\x1a\x31\x61nimalai/communicator_objects/command_proto.proto\"\xe2\x02\n\x0cUnityRLInput\x12K\n\ragent_actions\x18\x01 \x03(\x0b\x32\x34.communicator_objects.UnityRLInput.AgentActionsEntry\x12\x13\n\x0bis_training\x18\x02 \x01(\x08\x12\x33\n\x07\x63ommand\x18\x03 \x01(\x0e\x32\".communicator_objects.CommandProto\x1aM\n\x14ListAgentActionProto\x12\x35\n\x05value\x18\x01 \x03(\x0b\x32&.communicator_objects.AgentActionProto\x1al\n\x11\x41gentActionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x46\n\x05value\x18\x02 \x01(\x0b\x32\x37.communicator_objects.UnityRLInput.ListAgentActionProto:\x02\x38\x01\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') + , + dependencies=[animalai_dot_communicator__objects_dot_agent__action__proto__pb2.DESCRIPTOR,animalai_dot_communicator__objects_dot_command__proto__pb2.DESCRIPTOR,]) + + + + +_UNITYRLINPUT_LISTAGENTACTIONPROTO = _descriptor.Descriptor( + name='ListAgentActionProto', + full_name='communicator_objects.UnityRLInput.ListAgentActionProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='value', full_name='communicator_objects.UnityRLInput.ListAgentActionProto.value', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=351, + serialized_end=428, +) + +_UNITYRLINPUT_AGENTACTIONSENTRY = _descriptor.Descriptor( + name='AgentActionsEntry', + full_name='communicator_objects.UnityRLInput.AgentActionsEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='communicator_objects.UnityRLInput.AgentActionsEntry.key', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='value', full_name='communicator_objects.UnityRLInput.AgentActionsEntry.value', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=_b('8\001'), + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=430, + serialized_end=538, +) + +_UNITYRLINPUT = _descriptor.Descriptor( + name='UnityRLInput', + full_name='communicator_objects.UnityRLInput', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='agent_actions', full_name='communicator_objects.UnityRLInput.agent_actions', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='is_training', full_name='communicator_objects.UnityRLInput.is_training', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='command', full_name='communicator_objects.UnityRLInput.command', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_UNITYRLINPUT_LISTAGENTACTIONPROTO, _UNITYRLINPUT_AGENTACTIONSENTRY, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=184, + serialized_end=538, +) + +_UNITYRLINPUT_LISTAGENTACTIONPROTO.fields_by_name['value'].message_type = animalai_dot_communicator__objects_dot_agent__action__proto__pb2._AGENTACTIONPROTO +_UNITYRLINPUT_LISTAGENTACTIONPROTO.containing_type = _UNITYRLINPUT +_UNITYRLINPUT_AGENTACTIONSENTRY.fields_by_name['value'].message_type = _UNITYRLINPUT_LISTAGENTACTIONPROTO +_UNITYRLINPUT_AGENTACTIONSENTRY.containing_type = _UNITYRLINPUT +_UNITYRLINPUT.fields_by_name['agent_actions'].message_type = _UNITYRLINPUT_AGENTACTIONSENTRY +_UNITYRLINPUT.fields_by_name['command'].enum_type = animalai_dot_communicator__objects_dot_command__proto__pb2._COMMANDPROTO +DESCRIPTOR.message_types_by_name['UnityRLInput'] = _UNITYRLINPUT +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +UnityRLInput = _reflection.GeneratedProtocolMessageType('UnityRLInput', (_message.Message,), { + + 'ListAgentActionProto' : _reflection.GeneratedProtocolMessageType('ListAgentActionProto', (_message.Message,), { + 'DESCRIPTOR' : _UNITYRLINPUT_LISTAGENTACTIONPROTO, + '__module__' : 'animalai.communicator_objects.unity_rl_input_pb2' + # @@protoc_insertion_point(class_scope:communicator_objects.UnityRLInput.ListAgentActionProto) + }) + , + + 'AgentActionsEntry' : _reflection.GeneratedProtocolMessageType('AgentActionsEntry', (_message.Message,), { + 'DESCRIPTOR' : _UNITYRLINPUT_AGENTACTIONSENTRY, + '__module__' : 'animalai.communicator_objects.unity_rl_input_pb2' + # @@protoc_insertion_point(class_scope:communicator_objects.UnityRLInput.AgentActionsEntry) + }) + , + 'DESCRIPTOR' : _UNITYRLINPUT, + '__module__' : 'animalai.communicator_objects.unity_rl_input_pb2' + # @@protoc_insertion_point(class_scope:communicator_objects.UnityRLInput) + }) +_sym_db.RegisterMessage(UnityRLInput) +_sym_db.RegisterMessage(UnityRLInput.ListAgentActionProto) +_sym_db.RegisterMessage(UnityRLInput.AgentActionsEntry) + + +DESCRIPTOR._options = None +_UNITYRLINPUT_AGENTACTIONSENTRY._options = None +# @@protoc_insertion_point(module_scope) diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_output_pb2.py b/animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_output_pb2.py new file mode 100644 index 00000000..a35cdd20 --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_output_pb2.py @@ -0,0 +1,169 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: animalai/communicator_objects/unity_rl_output.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from animalai.communicator_objects import agent_info_proto_pb2 as animalai_dot_communicator__objects_dot_agent__info__proto__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='animalai/communicator_objects/unity_rl_output.proto', + package='communicator_objects', + syntax='proto3', + serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), + serialized_pb=_b('\n3animalai/communicator_objects/unity_rl_output.proto\x12\x14\x63ommunicator_objects\x1a\x34\x61nimalai/communicator_objects/agent_info_proto.proto\"\xa3\x02\n\rUnityRLOutput\x12\x13\n\x0bglobal_done\x18\x01 \x01(\x08\x12G\n\nagentInfos\x18\x02 \x03(\x0b\x32\x33.communicator_objects.UnityRLOutput.AgentInfosEntry\x1aI\n\x12ListAgentInfoProto\x12\x33\n\x05value\x18\x01 \x03(\x0b\x32$.communicator_objects.AgentInfoProto\x1ai\n\x0f\x41gentInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x45\n\x05value\x18\x02 \x01(\x0b\x32\x36.communicator_objects.UnityRLOutput.ListAgentInfoProto:\x02\x38\x01\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') + , + dependencies=[animalai_dot_communicator__objects_dot_agent__info__proto__pb2.DESCRIPTOR,]) + + + + +_UNITYRLOUTPUT_LISTAGENTINFOPROTO = _descriptor.Descriptor( + name='ListAgentInfoProto', + full_name='communicator_objects.UnityRLOutput.ListAgentInfoProto', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='value', full_name='communicator_objects.UnityRLOutput.ListAgentInfoProto.value', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=243, + serialized_end=316, +) + +_UNITYRLOUTPUT_AGENTINFOSENTRY = _descriptor.Descriptor( + name='AgentInfosEntry', + full_name='communicator_objects.UnityRLOutput.AgentInfosEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='communicator_objects.UnityRLOutput.AgentInfosEntry.key', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='value', full_name='communicator_objects.UnityRLOutput.AgentInfosEntry.value', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=_b('8\001'), + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=318, + serialized_end=423, +) + +_UNITYRLOUTPUT = _descriptor.Descriptor( + name='UnityRLOutput', + full_name='communicator_objects.UnityRLOutput', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='global_done', full_name='communicator_objects.UnityRLOutput.global_done', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='agentInfos', full_name='communicator_objects.UnityRLOutput.agentInfos', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_UNITYRLOUTPUT_LISTAGENTINFOPROTO, _UNITYRLOUTPUT_AGENTINFOSENTRY, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=132, + serialized_end=423, +) + +_UNITYRLOUTPUT_LISTAGENTINFOPROTO.fields_by_name['value'].message_type = animalai_dot_communicator__objects_dot_agent__info__proto__pb2._AGENTINFOPROTO +_UNITYRLOUTPUT_LISTAGENTINFOPROTO.containing_type = _UNITYRLOUTPUT +_UNITYRLOUTPUT_AGENTINFOSENTRY.fields_by_name['value'].message_type = _UNITYRLOUTPUT_LISTAGENTINFOPROTO +_UNITYRLOUTPUT_AGENTINFOSENTRY.containing_type = _UNITYRLOUTPUT +_UNITYRLOUTPUT.fields_by_name['agentInfos'].message_type = _UNITYRLOUTPUT_AGENTINFOSENTRY +DESCRIPTOR.message_types_by_name['UnityRLOutput'] = _UNITYRLOUTPUT +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +UnityRLOutput = _reflection.GeneratedProtocolMessageType('UnityRLOutput', (_message.Message,), { + + 'ListAgentInfoProto' : _reflection.GeneratedProtocolMessageType('ListAgentInfoProto', (_message.Message,), { + 'DESCRIPTOR' : _UNITYRLOUTPUT_LISTAGENTINFOPROTO, + '__module__' : 'animalai.communicator_objects.unity_rl_output_pb2' + # @@protoc_insertion_point(class_scope:communicator_objects.UnityRLOutput.ListAgentInfoProto) + }) + , + + 'AgentInfosEntry' : _reflection.GeneratedProtocolMessageType('AgentInfosEntry', (_message.Message,), { + 'DESCRIPTOR' : _UNITYRLOUTPUT_AGENTINFOSENTRY, + '__module__' : 'animalai.communicator_objects.unity_rl_output_pb2' + # @@protoc_insertion_point(class_scope:communicator_objects.UnityRLOutput.AgentInfosEntry) + }) + , + 'DESCRIPTOR' : _UNITYRLOUTPUT, + '__module__' : 'animalai.communicator_objects.unity_rl_output_pb2' + # @@protoc_insertion_point(class_scope:communicator_objects.UnityRLOutput) + }) +_sym_db.RegisterMessage(UnityRLOutput) +_sym_db.RegisterMessage(UnityRLOutput.ListAgentInfoProto) +_sym_db.RegisterMessage(UnityRLOutput.AgentInfosEntry) + + +DESCRIPTOR._options = None +_UNITYRLOUTPUT_AGENTINFOSENTRY._options = None +# @@protoc_insertion_point(module_scope) diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_reset_input_pb2.py b/animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_reset_input_pb2.py new file mode 100644 index 00000000..e07a7286 --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_reset_input_pb2.py @@ -0,0 +1,122 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: animalai/communicator_objects/unity_rl_reset_input.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from animalai.communicator_objects import arena_parameters_proto_pb2 as animalai_dot_communicator__objects_dot_arena__parameters__proto__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='animalai/communicator_objects/unity_rl_reset_input.proto', + package='communicator_objects', + syntax='proto3', + serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), + serialized_pb=_b('\n8animalai/communicator_objects/unity_rl_reset_input.proto\x12\x14\x63ommunicator_objects\x1a:animalai/communicator_objects/arena_parameters_proto.proto\"\xb3\x01\n\x11UnityRLResetInput\x12\x43\n\x06\x61renas\x18\x01 \x03(\x0b\x32\x33.communicator_objects.UnityRLResetInput.ArenasEntry\x1aY\n\x0b\x41renasEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.communicator_objects.ArenaParametersProto:\x02\x38\x01\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') + , + dependencies=[animalai_dot_communicator__objects_dot_arena__parameters__proto__pb2.DESCRIPTOR,]) + + + + +_UNITYRLRESETINPUT_ARENASENTRY = _descriptor.Descriptor( + name='ArenasEntry', + full_name='communicator_objects.UnityRLResetInput.ArenasEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='communicator_objects.UnityRLResetInput.ArenasEntry.key', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='value', full_name='communicator_objects.UnityRLResetInput.ArenasEntry.value', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=_b('8\001'), + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=233, + serialized_end=322, +) + +_UNITYRLRESETINPUT = _descriptor.Descriptor( + name='UnityRLResetInput', + full_name='communicator_objects.UnityRLResetInput', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='arenas', full_name='communicator_objects.UnityRLResetInput.arenas', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_UNITYRLRESETINPUT_ARENASENTRY, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=143, + serialized_end=322, +) + +_UNITYRLRESETINPUT_ARENASENTRY.fields_by_name['value'].message_type = animalai_dot_communicator__objects_dot_arena__parameters__proto__pb2._ARENAPARAMETERSPROTO +_UNITYRLRESETINPUT_ARENASENTRY.containing_type = _UNITYRLRESETINPUT +_UNITYRLRESETINPUT.fields_by_name['arenas'].message_type = _UNITYRLRESETINPUT_ARENASENTRY +DESCRIPTOR.message_types_by_name['UnityRLResetInput'] = _UNITYRLRESETINPUT +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +UnityRLResetInput = _reflection.GeneratedProtocolMessageType('UnityRLResetInput', (_message.Message,), { + + 'ArenasEntry' : _reflection.GeneratedProtocolMessageType('ArenasEntry', (_message.Message,), { + 'DESCRIPTOR' : _UNITYRLRESETINPUT_ARENASENTRY, + '__module__' : 'animalai.communicator_objects.unity_rl_reset_input_pb2' + # @@protoc_insertion_point(class_scope:communicator_objects.UnityRLResetInput.ArenasEntry) + }) + , + 'DESCRIPTOR' : _UNITYRLRESETINPUT, + '__module__' : 'animalai.communicator_objects.unity_rl_reset_input_pb2' + # @@protoc_insertion_point(class_scope:communicator_objects.UnityRLResetInput) + }) +_sym_db.RegisterMessage(UnityRLResetInput) +_sym_db.RegisterMessage(UnityRLResetInput.ArenasEntry) + + +DESCRIPTOR._options = None +_UNITYRLRESETINPUT_ARENASENTRY._options = None +# @@protoc_insertion_point(module_scope) diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_reset_output_pb2.py b/animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_reset_output_pb2.py new file mode 100644 index 00000000..4b5a24c2 --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_reset_output_pb2.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: animalai/communicator_objects/unity_rl_reset_output.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='animalai/communicator_objects/unity_rl_reset_output.proto', + package='communicator_objects', + syntax='proto3', + serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), + serialized_pb=_b('\n9animalai/communicator_objects/unity_rl_reset_output.proto\x12\x14\x63ommunicator_objects\"1\n\x12UnityRLResetOutput\x12\x1b\n\x13\x61renas_instanciated\x18\x01 \x03(\x08\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') +) + + + + +_UNITYRLRESETOUTPUT = _descriptor.Descriptor( + name='UnityRLResetOutput', + full_name='communicator_objects.UnityRLResetOutput', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='arenas_instanciated', full_name='communicator_objects.UnityRLResetOutput.arenas_instanciated', index=0, + number=1, type=8, cpp_type=7, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=83, + serialized_end=132, +) + +DESCRIPTOR.message_types_by_name['UnityRLResetOutput'] = _UNITYRLRESETOUTPUT +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +UnityRLResetOutput = _reflection.GeneratedProtocolMessageType('UnityRLResetOutput', (_message.Message,), { + 'DESCRIPTOR' : _UNITYRLRESETOUTPUT, + '__module__' : 'animalai.communicator_objects.unity_rl_reset_output_pb2' + # @@protoc_insertion_point(class_scope:communicator_objects.UnityRLResetOutput) + }) +_sym_db.RegisterMessage(UnityRLResetOutput) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/unity_to_external_pb2.py b/animalai_packages/animalai_envs/animalai/communicator_objects/unity_to_external_pb2.py new file mode 100644 index 00000000..852b3813 --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/communicator_objects/unity_to_external_pb2.py @@ -0,0 +1,57 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: animalai/communicator_objects/unity_to_external.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from animalai.communicator_objects import unity_message_pb2 as animalai_dot_communicator__objects_dot_unity__message__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='animalai/communicator_objects/unity_to_external.proto', + package='communicator_objects', + syntax='proto3', + serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), + serialized_pb=_b('\n5animalai/communicator_objects/unity_to_external.proto\x12\x14\x63ommunicator_objects\x1a\x31\x61nimalai/communicator_objects/unity_message.proto2g\n\x0fUnityToExternal\x12T\n\x08\x45xchange\x12\".communicator_objects.UnityMessage\x1a\".communicator_objects.UnityMessage\"\x00\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') + , + dependencies=[animalai_dot_communicator__objects_dot_unity__message__pb2.DESCRIPTOR,]) + + + +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + + +DESCRIPTOR._options = None + +_UNITYTOEXTERNAL = _descriptor.ServiceDescriptor( + name='UnityToExternal', + full_name='communicator_objects.UnityToExternal', + file=DESCRIPTOR, + index=0, + serialized_options=None, + serialized_start=130, + serialized_end=233, + methods=[ + _descriptor.MethodDescriptor( + name='Exchange', + full_name='communicator_objects.UnityToExternal.Exchange', + index=0, + containing_service=None, + input_type=animalai_dot_communicator__objects_dot_unity__message__pb2._UNITYMESSAGE, + output_type=animalai_dot_communicator__objects_dot_unity__message__pb2._UNITYMESSAGE, + serialized_options=None, + ), +]) +_sym_db.RegisterServiceDescriptor(_UNITYTOEXTERNAL) + +DESCRIPTOR.services_by_name['UnityToExternal'] = _UNITYTOEXTERNAL + +# @@protoc_insertion_point(module_scope) diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/unity_to_external_pb2_grpc.py b/animalai_packages/animalai_envs/animalai/communicator_objects/unity_to_external_pb2_grpc.py new file mode 100644 index 00000000..f1406fa1 --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/communicator_objects/unity_to_external_pb2_grpc.py @@ -0,0 +1,46 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +import grpc + +from animalai.communicator_objects import unity_message_pb2 as animalai_dot_communicator__objects_dot_unity__message__pb2 + + +class UnityToExternalStub(object): + # missing associated documentation comment in .proto file + pass + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.Exchange = channel.unary_unary( + '/communicator_objects.UnityToExternal/Exchange', + request_serializer=animalai_dot_communicator__objects_dot_unity__message__pb2.UnityMessage.SerializeToString, + response_deserializer=animalai_dot_communicator__objects_dot_unity__message__pb2.UnityMessage.FromString, + ) + + +class UnityToExternalServicer(object): + # missing associated documentation comment in .proto file + pass + + def Exchange(self, request, context): + """Sends the academy parameters + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_UnityToExternalServicer_to_server(servicer, server): + rpc_method_handlers = { + 'Exchange': grpc.unary_unary_rpc_method_handler( + servicer.Exchange, + request_deserializer=animalai_dot_communicator__objects_dot_unity__message__pb2.UnityMessage.FromString, + response_serializer=animalai_dot_communicator__objects_dot_unity__message__pb2.UnityMessage.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'communicator_objects.UnityToExternal', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) diff --git a/animalai_packages/animalai_envs/animalai/envs/__init__.py b/animalai_packages/animalai_envs/animalai/envs/__init__.py new file mode 100644 index 00000000..93960d2f --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/envs/__init__.py @@ -0,0 +1,3 @@ +from .environment import * +from .brain import * +from .exception import * diff --git a/animalai_packages/animalai_envs/animalai/envs/arena_config.py b/animalai_packages/animalai_envs/animalai/envs/arena_config.py new file mode 100644 index 00000000..8e48b1a0 --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/envs/arena_config.py @@ -0,0 +1,115 @@ +import json +import jsonpickle +import yaml +import copy + +from animalai.communicator_objects import UnityRLResetInput, ArenaParametersProto + +yaml.Dumper.ignore_aliases = lambda *args: True + + +class Vector3(yaml.YAMLObject): + yaml_tag = u'!Vector3' + + def __init__(self, x=0, y=0, z=0): + self.x = x + self.y = y + self.z = z + + def to_proto(self): + res = ArenaParametersProto.ItemsToSpawn.Vector3() + res.x = self.x + res.y = self.y + res.z = self.z + + return res + + +class RGB(yaml.YAMLObject): + yaml_tag = u'!RGB' + + def __init__(self, r=0, g=0, b=0): + self.r = r + self.g = g + self.b = b + + def to_proto(self): + res = ArenaParametersProto.ItemsToSpawn.Vector3() + res.x = self.r + res.y = self.g + res.z = self.b + + return res + + +class Item(yaml.YAMLObject): + yaml_tag = u'!Item' + + def __init__(self, name='', positions=None, rotations=None, sizes=None, colors=None): + self.name = name + self.positions = positions if positions is not None else [] + self.rotations = rotations if rotations is not None else [] + self.sizes = sizes if sizes is not None else [] + self.colors = colors if colors is not None else [] + + +class Arena(yaml.YAMLObject): + yaml_tag = u'!Arena' + + def __init__(self, t=1000, items=None, blackouts=None): + self.t = t + self.items = items if items is not None else {} + self.blackouts = blackouts if blackouts is not None else [] + + +class ArenaConfig(yaml.YAMLObject): + yaml_tag = u'!ArenaConfig' + + def __init__(self, yaml_path=None): + + if yaml_path is not None: + self.arenas = yaml.load(open(yaml_path, 'r'), Loader=yaml.Loader).arenas + else: + self.arenas = {} + + def save_config(self, json_path): + out = jsonpickle.encode(self.arenas) + out = json.loads(out) + json.dump(out, open(json_path, 'w'), indent=4) + + def dict_to_arena_config(self) -> UnityRLResetInput: + config_out = UnityRLResetInput() + + for k in self.arenas: + config_out.arenas[k].CopyFrom(ArenaParametersProto()) + config_out.arenas[k].t = self.arenas[k].t + config_out.arenas[k].blackouts.extend(self.arenas[k].blackouts) + for item in self.arenas[k].items: + to_spawn = config_out.arenas[k].items.add() + to_spawn.name = item.name + to_spawn.positions.extend([v.to_proto() for v in item.positions]) + to_spawn.rotations.extend(item.rotations) + to_spawn.sizes.extend([v.to_proto() for v in item.sizes]) + to_spawn.colors.extend([v.to_proto() for v in item.colors]) + + return config_out + + def update(self, arenas_configurations_input): + + if arenas_configurations_input is not None: + for arena_i in arenas_configurations_input.arenas: + self.arenas[arena_i] = copy.copy(arenas_configurations_input.arenas[arena_i]) + + +def constructor_arena(loader, node): + fields = loader.construct_mapping(node) + return Arena(**fields) + + +def constructor_item(loader, node): + fields = loader.construct_mapping(node) + return Item(**fields) + + +yaml.add_constructor(u'!Arena', constructor_arena) +yaml.add_constructor(u'!Item', constructor_item) diff --git a/animalai_packages/animalai_envs/animalai/envs/brain.py b/animalai_packages/animalai_envs/animalai/envs/brain.py new file mode 100644 index 00000000..06940fd2 --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/envs/brain.py @@ -0,0 +1,149 @@ +import logging +import numpy as np +import io + +from typing import Dict +from PIL import Image + +logger = logging.getLogger("mlagents.envs") + + +class BrainInfo: + def __init__(self, visual_observation, vector_observation, text_observations, memory=None, + reward=None, agents=None, local_done=None, + vector_action=None, text_action=None, max_reached=None, action_mask=None): + """ + Describes experience at current step of all agents linked to a brain. + """ + self.visual_observations = visual_observation + self.vector_observations = vector_observation + self.text_observations = text_observations + self.memories = memory + self.rewards = reward + self.local_done = local_done + self.max_reached = max_reached + self.agents = agents + self.previous_vector_actions = vector_action + self.previous_text_actions = text_action + self.action_masks = action_mask + + @staticmethod + def process_pixels(image_bytes, gray_scale): + """ + Converts byte array observation image into numpy array, re-sizes it, + and optionally converts it to grey scale + :param gray_scale: Whether to convert the image to grayscale. + :param image_bytes: input byte array corresponding to image + :return: processed numpy array of observation from environment + """ + s = bytearray(image_bytes) + image = Image.open(io.BytesIO(s)) + s = np.array(image) / 255.0 + if gray_scale: + s = np.mean(s, axis=2) + s = np.reshape(s, [s.shape[0], s.shape[1], 1]) + return s + + @staticmethod + def from_agent_proto(agent_info_list, brain_params): + """ + Converts list of agent infos to BrainInfo. + """ + vis_obs = [] + for i in range(brain_params.number_visual_observations): + obs = [BrainInfo.process_pixels(x.visual_observations[i], + brain_params.camera_resolutions[i]['blackAndWhite']) + for x in agent_info_list] + vis_obs += [np.array(obs)] + if len(agent_info_list) == 0: + memory_size = 0 + else: + memory_size = max([len(x.memories) for x in agent_info_list]) + if memory_size == 0: + memory = np.zeros((0, 0)) + else: + [x.memories.extend([0] * (memory_size - len(x.memories))) for x in agent_info_list] + memory = np.array([x.memories for x in agent_info_list]) + total_num_actions = sum(brain_params.vector_action_space_size) + mask_actions = np.ones((len(agent_info_list), total_num_actions)) + for agent_index, agent_info in enumerate(agent_info_list): + if agent_info.action_mask is not None: + if len(agent_info.action_mask) == total_num_actions: + mask_actions[agent_index, :] = [ + 0 if agent_info.action_mask[k] else 1 for k in range(total_num_actions)] + if any([np.isnan(x.reward) for x in agent_info_list]): + logger.warning("An agent had a NaN reward for brain " + brain_params.brain_name) + if any([np.isnan(x.stacked_vector_observation).any() for x in agent_info_list]): + logger.warning("An agent had a NaN observation for brain " + brain_params.brain_name) + brain_info = BrainInfo( + visual_observation=vis_obs, + vector_observation=np.nan_to_num( + np.array([x.stacked_vector_observation for x in agent_info_list])), + text_observations=[x.text_observation for x in agent_info_list], + memory=memory, + reward=[x.reward if not np.isnan(x.reward) else 0 for x in agent_info_list], + agents=[x.id for x in agent_info_list], + local_done=[x.done for x in agent_info_list], + vector_action=np.array([x.stored_vector_actions for x in agent_info_list]), + text_action=[x.stored_text_actions for x in agent_info_list], + max_reached=[x.max_step_reached for x in agent_info_list], + action_mask=mask_actions + ) + return brain_info + + +# Renaming of dictionary of brain name to BrainInfo for clarity +AllBrainInfo = Dict[str, BrainInfo] + + +class BrainParameters: + def __init__(self, brain_name, vector_observation_space_size, num_stacked_vector_observations, + camera_resolutions, vector_action_space_size, + vector_action_descriptions, vector_action_space_type): + """ + Contains all brain-specific parameters. + """ + self.brain_name = brain_name + self.vector_observation_space_size = vector_observation_space_size + self.num_stacked_vector_observations = num_stacked_vector_observations + self.number_visual_observations = len(camera_resolutions) + self.camera_resolutions = camera_resolutions + self.vector_action_space_size = vector_action_space_size + self.vector_action_descriptions = vector_action_descriptions + self.vector_action_space_type = ["discrete", "continuous"][vector_action_space_type] + + def __str__(self): + return '''Unity brain name: {} + Number of Visual Observations (per agent): {} + Vector Observation space size (per agent): {} + Number of stacked Vector Observation: {} + Vector Action space type: {} + Vector Action space size (per agent): {} + Vector Action descriptions: {}'''.format(self.brain_name, + str(self.number_visual_observations), + str(self.vector_observation_space_size), + str(self.num_stacked_vector_observations), + self.vector_action_space_type, + str(self.vector_action_space_size), + ', '.join(self.vector_action_descriptions)) + + @staticmethod + def from_proto(brain_param_proto): + """ + Converts brain parameter proto to BrainParameter object. + :param brain_param_proto: protobuf object. + :return: BrainParameter object. + """ + resolution = [{ + "height": x.height, + "width": x.width, + "blackAndWhite": x.gray_scale + } for x in brain_param_proto.camera_resolutions] + brain_params = BrainParameters(brain_param_proto.brain_name, + brain_param_proto.vector_observation_size, + brain_param_proto.num_stacked_vector_observations, + resolution, + brain_param_proto.vector_action_size, + brain_param_proto.vector_action_descriptions, + brain_param_proto.vector_action_space_type) + return brain_params diff --git a/animalai_packages/animalai_envs/animalai/envs/communicator.py b/animalai_packages/animalai_envs/animalai/envs/communicator.py new file mode 100644 index 00000000..85b56db1 --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/envs/communicator.py @@ -0,0 +1,35 @@ +import logging + +from animalai.communicator_objects import UnityOutput, UnityInput + +logger = logging.getLogger("mlagents.envs") + + +class Communicator(object): + def __init__(self, worker_id=0, base_port=5005): + """ + Python side of the communication. Must be used in pair with the right Unity Communicator equivalent. + + :int base_port: Baseline port number to connect to Unity environment over. worker_id increments over this. + :int worker_id: Number to add to communication port (5005) [0]. Used for asynchronous agent scenarios. + """ + + def initialize(self, inputs: UnityInput) -> UnityOutput: + """ + Used to exchange initialization parameters between Python and the Environment + :param inputs: The initialization input that will be sent to the environment. + :return: UnityOutput: The initialization output sent by Unity + """ + + def exchange(self, inputs: UnityInput) -> UnityOutput: + """ + Used to send an input and receive an output from the Environment + :param inputs: The UnityInput that needs to be sent the Environment + :return: The UnityOutputs generated by the Environment + """ + + def close(self): + """ + Sends a shutdown signal to the unity environment, and closes the connection. + """ + diff --git a/animalai_packages/animalai_envs/animalai/envs/environment.py b/animalai_packages/animalai_envs/animalai/envs/environment.py new file mode 100644 index 00000000..6c7fc0ae --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/envs/environment.py @@ -0,0 +1,491 @@ +import atexit +import glob +import logging +import numpy as np +import os +import subprocess + +from .brain import AllBrainInfo, BrainInfo, BrainParameters +from .exception import UnityEnvironmentException, UnityActionException, UnityTimeOutException + +from animalai.communicator_objects import UnityRLInput, UnityRLOutput, AgentActionProto, \ + UnityRLInitializationInput, UnityRLInitializationOutput, \ + UnityRLResetInput, UnityInput, UnityOutput + +from .rpc_communicator import RpcCommunicator +from sys import platform +from .arena_config import ArenaConfig + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger("mlagents.envs") + + +class UnityEnvironment(object): + SCALAR_ACTION_TYPES = (int, np.int32, np.int64, float, np.float32, np.float64) + SINGLE_BRAIN_ACTION_TYPES = SCALAR_ACTION_TYPES + (list, np.ndarray) + SINGLE_BRAIN_TEXT_TYPES = (str, list, np.ndarray) + + def __init__(self, file_name=None, + worker_id=0, + base_port=5005, + seed=0, + docker_training=False, + n_arenas=1, + play=False, + arenas_configurations=None): + """ + Starts a new unity environment and establishes a connection with the environment. + Notice: Currently communication between Unity and Python takes place over an open socket without authentication. + Ensure that the network where training takes place is secure. + + :string file_name: Name of Unity environment binary. + :int base_port: Baseline port number to connect to Unity environment over. worker_id increments over this. + :int worker_id: Number to add to communication port (5005) [0]. Used for asynchronous agent scenarios. + :param docker_training: Informs this class whether the process is being run within a container. + """ + + atexit.register(self._close) + self.n_arenas = n_arenas + self.play = play + self.port = base_port + worker_id + self._buffer_size = 12000 + self._version_ = "API-7" + self._loaded = False # If true, this means the environment was successfully loaded + self.proc1 = None # The process that is started. If None, no process was started + self.communicator = self.get_communicator(worker_id, base_port) + self.arenas_configurations = arenas_configurations if arenas_configurations is not None else ArenaConfig() + + if file_name is not None: + self.executable_launcher(file_name, docker_training) + else: + logger.info("Start training by pressing the Play button in the Unity Editor.") + self._loaded = True + + rl_init_parameters_in = UnityRLInitializationInput( + seed=seed + ) + try: + aca_params = self.send_academy_parameters(rl_init_parameters_in) + except UnityTimeOutException: + self._close() + raise + # TODO : think of a better way to expose the academyParameters + self._unity_version = aca_params.version + if self._unity_version != self._version_: + raise UnityEnvironmentException( + "The API number is not compatible between Unity and python. Python API : {0}, Unity API : " + "{1}.\nPlease go to https://github.com/Unity-Technologies/ml-agents to download the latest version " + "of ML-Agents.".format(self._version_, self._unity_version)) + self._n_agents = {} + self._global_done = None + self._academy_name = aca_params.name + self._log_path = aca_params.log_path + self._brains = {} + self._brain_names = [] + self._external_brain_names = [] + for brain_param in aca_params.brain_parameters: + self._brain_names += [brain_param.brain_name] + self._brains[brain_param.brain_name] = BrainParameters.from_proto(brain_param) + if brain_param.is_training: + self._external_brain_names += [brain_param.brain_name] + self._num_brains = len(self._brain_names) + self._num_external_brains = len(self._external_brain_names) + logger.info("\n'{0}' started successfully!\n{1}".format(self._academy_name, str(self))) + if self._num_external_brains == 0: + logger.warning(" No Learning Brains set to train found in the Unity Environment. " + "You will not be able to pass actions to your agent(s).") + + @property + def logfile_path(self): + return self._log_path + + @property + def brains(self): + return self._brains + + @property + def global_done(self): + return self._global_done + + @property + def academy_name(self): + return self._academy_name + + @property + def number_brains(self): + return self._num_brains + + @property + def number_external_brains(self): + return self._num_external_brains + + @property + def brain_names(self): + return self._brain_names + + @property + def external_brain_names(self): + return self._external_brain_names + + def executable_launcher(self, file_name, docker_training): + cwd = os.getcwd() + file_name = (file_name.strip() + .replace('.app', '').replace('.exe', '').replace('.x86_64', '').replace('.x86', + '')) + true_filename = os.path.basename(os.path.normpath(file_name)) + logger.debug('The true file name is {}'.format(true_filename)) + launch_string = None + if platform == "linux" or platform == "linux2": + candidates = glob.glob(os.path.join(cwd, file_name) + '.x86_64') + if len(candidates) == 0: + candidates = glob.glob(os.path.join(cwd, file_name) + '.x86') + if len(candidates) == 0: + candidates = glob.glob(file_name + '.x86_64') + if len(candidates) == 0: + candidates = glob.glob(file_name + '.x86') + if len(candidates) > 0: + launch_string = candidates[0] + + elif platform == 'darwin': + candidates = glob.glob( + os.path.join(cwd, file_name + '.app', 'Contents', 'MacOS', true_filename)) + if len(candidates) == 0: + candidates = glob.glob( + os.path.join(file_name + '.app', 'Contents', 'MacOS', true_filename)) + if len(candidates) == 0: + candidates = glob.glob( + os.path.join(cwd, file_name + '.app', 'Contents', 'MacOS', '*')) + if len(candidates) == 0: + candidates = glob.glob(os.path.join(file_name + '.app', 'Contents', 'MacOS', '*')) + if len(candidates) > 0: + launch_string = candidates[0] + elif platform == 'win32': + candidates = glob.glob(os.path.join(cwd, file_name + '.exe')) + if len(candidates) == 0: + candidates = glob.glob(file_name + '.exe') + if len(candidates) > 0: + launch_string = candidates[0] + if launch_string is None: + self._close() + raise UnityEnvironmentException("Couldn't launch the {0} environment. " + "Provided filename does not match any environments." + .format(true_filename)) + else: + logger.debug("This is the launch string {}".format(launch_string)) + # Launch Unity environment + if not docker_training: + if not self.play: + self.proc1 = subprocess.Popen( + [launch_string, '--port', str(self.port), '--nArenas', str(self.n_arenas)]) + else: + self.proc1 = subprocess.Popen( + [launch_string, '--port', str(self.port)]) + + else: + """ + Comments for future maintenance: + xvfb-run is a wrapper around Xvfb, a virtual xserver where all + rendering is done to virtual memory. It automatically creates a + new virtual server automatically picking a server number `auto-servernum`. + The server is passed the arguments using `server-args`, we are telling + Xvfb to create Screen number 0 with width 640, height 480 and depth 24 bits. + Note that 640 X 480 are the default width and height. The main reason for + us to add this is because we'd like to change the depth from the default + of 8 bits to 24. + Unfortunately, this means that we will need to pass the arguments through + a shell which is why we set `shell=True`. Now, this adds its own + complications. E.g SIGINT can bounce off the shell and not get propagated + to the child processes. This is why we add `exec`, so that the shell gets + launched, the arguments are passed to `xvfb-run`. `exec` replaces the shell + we created with `xvfb`. + """ + docker_ls = ("exec xvfb-run --auto-servernum" + " --server-args='-screen 0 640x480x24'" + " {0} --port {1} --nArenas {2}").format(launch_string, str(self.port), str(self.n_arenas)) + self.proc1 = subprocess.Popen(docker_ls, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + shell=True) + + def get_communicator(self, worker_id, base_port): + return RpcCommunicator(worker_id, base_port) + # return SocketCommunicator(worker_id, base_port) + + def __str__(self): + return '''Unity Academy name: {0} + Number of Brains: {1} + Number of Training Brains : {2}'''.format(self._academy_name, str(self._num_brains), + str(self._num_external_brains)) + + def reset(self, arenas_configurations_input=None, train_mode=True) -> AllBrainInfo: + """ + Sends a signal to reset the unity environment. + :return: AllBrainInfo : A data structure corresponding to the initial reset state of the environment. + """ + if self._loaded: + self.arenas_configurations.update(arenas_configurations_input) + + outputs = self.communicator.exchange( + self._generate_reset_input(train_mode, arenas_configurations_input) + ) + if outputs is None: + raise KeyboardInterrupt + rl_output = outputs.rl_output + s = self._get_state(rl_output) + self._global_done = s[1] + for _b in self._external_brain_names: + self._n_agents[_b] = len(s[0][_b].agents) + return s[0] + else: + raise UnityEnvironmentException("No Unity environment is loaded.") + + def step(self, vector_action=None, memory=None, text_action=None, value=None, step_number=0) -> AllBrainInfo: + """ + Provides the environment with an action, moves the environment dynamics forward accordingly, + and returns observation, state, and reward information to the agent. + :param value: Value estimates provided by agents. + :param vector_action: Agent's vector action. Can be a scalar or vector of int/floats. + :param memory: Vector corresponding to memory used for recurrent policies. + :param text_action: Text action to send to environment for. + :return: AllBrainInfo : A Data structure corresponding to the new state of the environment. + """ + vector_action = {} if vector_action is None else vector_action + memory = {} if memory is None else memory + text_action = {} if text_action is None else text_action + value = {} if value is None else value + + # Check that environment is loaded, and episode is currently running. + if self._loaded and not self._global_done and self._global_done is not None: + if isinstance(vector_action, self.SINGLE_BRAIN_ACTION_TYPES): + if self._num_external_brains == 1: + vector_action = {self._external_brain_names[0]: vector_action} + elif self._num_external_brains > 1: + raise UnityActionException( + "You have {0} brains, you need to feed a dictionary of brain names a keys, " + "and vector_actions as values".format(self._num_brains)) + else: + raise UnityActionException( + "There are no external brains in the environment, " + "step cannot take a vector_action input") + + if isinstance(memory, self.SINGLE_BRAIN_ACTION_TYPES): + if self._num_external_brains == 1: + memory = {self._external_brain_names[0]: memory} + elif self._num_external_brains > 1: + raise UnityActionException( + "You have {0} brains, you need to feed a dictionary of brain names as keys " + "and memories as values".format(self._num_brains)) + else: + raise UnityActionException( + "There are no external brains in the environment, " + "step cannot take a memory input") + + if isinstance(text_action, self.SINGLE_BRAIN_TEXT_TYPES): + if self._num_external_brains == 1: + text_action = {self._external_brain_names[0]: text_action} + elif self._num_external_brains > 1: + raise UnityActionException( + "You have {0} brains, you need to feed a dictionary of brain names as keys " + "and text_actions as values".format(self._num_brains)) + else: + raise UnityActionException( + "There are no external brains in the environment, " + "step cannot take a value input") + + if isinstance(value, self.SINGLE_BRAIN_ACTION_TYPES): + if self._num_external_brains == 1: + value = {self._external_brain_names[0]: value} + elif self._num_external_brains > 1: + raise UnityActionException( + "You have {0} brains, you need to feed a dictionary of brain names as keys " + "and state/action value estimates as values".format(self._num_brains)) + else: + raise UnityActionException( + "There are no external brains in the environment, " + "step cannot take a value input") + + for brain_name in list(vector_action.keys()) + list(memory.keys()) + list( + text_action.keys()): + if brain_name not in self._external_brain_names: + raise UnityActionException( + "The name {0} does not correspond to an external brain " + "in the environment".format(brain_name)) + + for brain_name in self._external_brain_names: + n_agent = self._n_agents[brain_name] + if brain_name not in vector_action: + if self._brains[brain_name].vector_action_space_type == "discrete": + vector_action[brain_name] = [0.0] * n_agent * len( + self._brains[brain_name].vector_action_space_size) + else: + vector_action[brain_name] = [0.0] * n_agent * \ + self._brains[ + brain_name].vector_action_space_size[0] + else: + vector_action[brain_name] = self._flatten(vector_action[brain_name]) + if brain_name not in memory: + memory[brain_name] = [] + else: + if memory[brain_name] is None: + memory[brain_name] = [] + else: + memory[brain_name] = self._flatten(memory[brain_name]) + if brain_name not in text_action: + text_action[brain_name] = [""] * n_agent + else: + if text_action[brain_name] is None: + text_action[brain_name] = [""] * n_agent + if isinstance(text_action[brain_name], str): + text_action[brain_name] = [text_action[brain_name]] * n_agent + + number_text_actions = len(text_action[brain_name]) + if not ((number_text_actions == n_agent) or number_text_actions == 0): + raise UnityActionException( + "There was a mismatch between the provided text_action and " + "the environment's expectation: " + "The brain {0} expected {1} text_action but was given {2}".format( + brain_name, n_agent, number_text_actions)) + + discrete_check = self._brains[brain_name].vector_action_space_type == "discrete" + + expected_discrete_size = n_agent * len( + self._brains[brain_name].vector_action_space_size) + + continuous_check = self._brains[brain_name].vector_action_space_type == "continuous" + + expected_continuous_size = self._brains[brain_name].vector_action_space_size[ + 0] * n_agent + + if not ((discrete_check and len( + vector_action[brain_name]) == expected_discrete_size) or + (continuous_check and len( + vector_action[brain_name]) == expected_continuous_size)): + raise UnityActionException( + "There was a mismatch between the provided action and " + "the environment's expectation: " + "The brain {0} expected {1} {2} action(s), but was provided: {3}" + .format(brain_name, str(expected_discrete_size) + if discrete_check + else str(expected_continuous_size), + self._brains[brain_name].vector_action_space_type, + str(vector_action[brain_name]))) + + outputs = self.communicator.exchange( + self._generate_step_input(vector_action, memory, text_action, value)) + if outputs is None: + raise KeyboardInterrupt + rl_output = outputs.rl_output + state = self._get_state(rl_output) + self._global_done = state[1] + for _b in self._external_brain_names: + self._n_agents[_b] = len(state[0][_b].agents) + return state[0] + elif not self._loaded: + raise UnityEnvironmentException("No Unity environment is loaded.") + elif self._global_done: + raise UnityActionException( + "The episode is completed. Reset the environment with 'reset()'") + elif self.global_done is None: + raise UnityActionException( + "You cannot conduct step without first calling reset. " + "Reset the environment with 'reset()'") + + def close(self): + """ + Sends a shutdown signal to the unity environment, and closes the socket connection. + """ + if self._loaded: + self._close() + else: + raise UnityEnvironmentException("No Unity environment is loaded.") + + def _close(self): + self._loaded = False + self.communicator.close() + if self.proc1 is not None: + self.proc1.kill() + + @classmethod + def _flatten(cls, arr): + """ + Converts arrays to list. + :param arr: numpy vector. + :return: flattened list. + """ + if isinstance(arr, cls.SCALAR_ACTION_TYPES): + arr = [float(arr)] + if isinstance(arr, np.ndarray): + arr = arr.tolist() + if len(arr) == 0: + return arr + if isinstance(arr[0], np.ndarray): + arr = [item for sublist in arr for item in sublist.tolist()] + if isinstance(arr[0], list): + arr = [item for sublist in arr for item in sublist] + arr = [float(x) for x in arr] + return arr + + def _get_state(self, output: UnityRLOutput) -> (AllBrainInfo, bool): + """ + Collects experience information from all external brains in environment at current step. + :return: a dictionary of BrainInfo objects. + """ + _data = {} + global_done = output.global_done + for brain_name in output.agentInfos: + agent_info_list = output.agentInfos[brain_name].value + _data[brain_name] = BrainInfo.from_agent_proto(agent_info_list, + self.brains[brain_name]) + return _data, global_done + + def _generate_step_input(self, vector_action, memory, text_action, value) -> UnityRLInput: + rl_in = UnityRLInput() + for b in vector_action: + n_agents = self._n_agents[b] + if n_agents == 0: + continue + _a_s = len(vector_action[b]) // n_agents + _m_s = len(memory[b]) // n_agents + for i in range(n_agents): + action = AgentActionProto( + vector_actions=vector_action[b][i * _a_s: (i + 1) * _a_s], + memories=memory[b][i * _m_s: (i + 1) * _m_s], + text_actions=text_action[b][i], + ) + if b in value: + if value[b] is not None: + action.value = float(value[b][i]) + rl_in.agent_actions[b].value.extend([action]) + rl_in.command = 0 + return self.wrap_unity_input(rl_in) + + def _generate_reset_input(self, training, config: ArenaConfig) -> UnityRLInput: + rl_in = UnityRLInput() + rl_in.is_training = training + rl_in.command = 1 + rl_reset = UnityRLResetInput() + if (config is not None): + rl_reset.CopyFrom(config.dict_to_arena_config()) + result = UnityInput() + result.rl_input.CopyFrom(rl_in) + result.rl_reset_input.CopyFrom(rl_reset) + return result + + # return self.wrap_unity_input(rl_in) + + def send_academy_parameters(self, + init_parameters: UnityRLInitializationInput) -> UnityRLInitializationOutput: + inputs = UnityInput() + inputs.rl_initialization_input.CopyFrom(init_parameters) + return self.communicator.initialize(inputs).rl_initialization_output + + def wrap_unity_input(self, rl_input: UnityRLInput) -> UnityOutput: + result = UnityInput() + result.rl_input.CopyFrom(rl_input) + return result + + # def send_update_arena_parameters(self, arena_parameters : ArenaConfigInput) -> None: + # + # # TODO: add return status ==> create new proto for ArenaParametersOutput + # + # self.communicator.exchange_arena_update(arena_parameters) diff --git a/animalai_packages/animalai_envs/animalai/envs/exception.py b/animalai_packages/animalai_envs/animalai/envs/exception.py new file mode 100644 index 00000000..edf16ff4 --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/envs/exception.py @@ -0,0 +1,63 @@ +import logging +logger = logging.getLogger("mlagents.envs") + +class UnityException(Exception): + """ + Any error related to ml-agents environment. + """ + pass + +class UnityEnvironmentException(UnityException): + """ + Related to errors starting and closing environment. + """ + pass + + +class UnityActionException(UnityException): + """ + Related to errors with sending actions. + """ + pass + +class UnityTimeOutException(UnityException): + """ + Related to errors with communication timeouts. + """ + def __init__(self, message, log_file_path = None): + if log_file_path is not None: + try: + with open(log_file_path, "r") as f: + printing = False + unity_error = '\n' + for l in f: + l=l.strip() + if (l == 'Exception') or (l=='Error'): + printing = True + unity_error += '----------------------\n' + if (l == ''): + printing = False + if printing: + unity_error += l + '\n' + logger.info(unity_error) + logger.error("An error might have occured in the environment. " + "You can check the logfile for more information at {}".format(log_file_path)) + except: + logger.error("An error might have occured in the environment. " + "No UnitySDK.log file could be found.") + super(UnityTimeOutException, self).__init__(message) + + +class UnityWorkerInUseException(UnityException): + """ + This error occurs when the port for a certain worker ID is already reserved. + """ + + MESSAGE_TEMPLATE = ( + "Couldn't start socket communication because worker number {} is still in use. " + "You may need to manually close a previously opened environment " + "or use a different worker number.") + + def __init__(self, worker_id): + message = self.MESSAGE_TEMPLATE.format(str(worker_id)) + super(UnityWorkerInUseException, self).__init__(message) diff --git a/animalai_packages/animalai_envs/animalai/envs/rpc_communicator.py b/animalai_packages/animalai_envs/animalai/envs/rpc_communicator.py new file mode 100644 index 00000000..aa082305 --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/envs/rpc_communicator.py @@ -0,0 +1,115 @@ +import logging +import grpc + +import socket +from multiprocessing import Pipe +from concurrent.futures import ThreadPoolExecutor + +from .communicator import Communicator +from animalai.communicator_objects import UnityToExternalServicer, add_UnityToExternalServicer_to_server +from animalai.communicator_objects import UnityMessage, UnityInput, UnityOutput #, ArenaConfigInput +from .exception import UnityTimeOutException, UnityWorkerInUseException + +logger = logging.getLogger("mlagents.envs") + + +class UnityToExternalServicerImplementation(UnityToExternalServicer): + def __init__(self): + self.parent_conn, self.child_conn = Pipe() + + def Initialize(self, request, context): + self.child_conn.send(request) + return self.child_conn.recv() + + def Exchange(self, request, context): + self.child_conn.send(request) + return self.child_conn.recv() + + +class RpcCommunicator(Communicator): + def __init__(self, worker_id=0, base_port=5005): + """ + Python side of the grpc communication. Python is the server and Unity the client + + + :int base_port: Baseline port number to connect to Unity environment over. worker_id increments over this. + :int worker_id: Number to add to communication port (5005) [0]. Used for asynchronous agent scenarios. + """ + self.port = base_port + worker_id + self.worker_id = worker_id + self.server = None + self.unity_to_external = None + self.is_open = False + self.create_server() + + def create_server(self): + """ + Creates the GRPC server. + """ + self.check_port(self.port) + + try: + # Establish communication grpc + self.server = grpc.server(ThreadPoolExecutor(max_workers=10)) + self.unity_to_external = UnityToExternalServicerImplementation() + add_UnityToExternalServicer_to_server(self.unity_to_external, self.server) + # Using unspecified address, which means that grpc is communicating on all IPs + # This is so that the docker container can connect. + self.server.add_insecure_port('[::]:' + str(self.port)) + self.server.start() + self.is_open = True + except: + raise UnityWorkerInUseException(self.worker_id) + + def check_port(self, port): + """ + Attempts to bind to the requested communicator port, checking if it is already in use. + """ + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + s.bind(("localhost", port)) + except socket.error: + raise UnityWorkerInUseException(self.worker_id) + finally: + s.close() + + def initialize(self, inputs: UnityInput) -> UnityOutput: + if not self.unity_to_external.parent_conn.poll(3000): + raise UnityTimeOutException( + "The Unity environment took too long to respond. Make sure that :\n" + "\t The environment does not need user interaction to launch\n" + "\t The Academy's Broadcast Hub is configured correctly\n" + "\t The Agents are linked to the appropriate Brains\n" + "\t The environment and the Python interface have compatible versions.") + aca_param = self.unity_to_external.parent_conn.recv().unity_output + message = UnityMessage() + message.header.status = 200 + message.unity_input.CopyFrom(inputs) + self.unity_to_external.parent_conn.send(message) + self.unity_to_external.parent_conn.recv() + return aca_param + + def exchange(self, inputs: UnityInput) -> UnityOutput: + message = UnityMessage() + message.header.status = 200 + message.unity_input.CopyFrom(inputs) + self.unity_to_external.parent_conn.send(message) + output = self.unity_to_external.parent_conn.recv() + if output.header.status != 200: + return None + return output.unity_output + + def close(self): + """ + Sends a shutdown signal to the unity environment, and closes the grpc connection. + """ + if self.is_open: + message_input = UnityMessage() + message_input.header.status = 400 + self.unity_to_external.parent_conn.send(message_input) + self.unity_to_external.parent_conn.close() + self.server.stop(False) + self.is_open = False + + # def exchange_arena_update(self, inputs: ArenaConfigInput) -> None: + # self.unity_to_external.parent_conn.send(inputs) diff --git a/animalai_packages/animalai_envs/animalai/envs/socket_communicator.py b/animalai_packages/animalai_envs/animalai/envs/socket_communicator.py new file mode 100644 index 00000000..c600e938 --- /dev/null +++ b/animalai_packages/animalai_envs/animalai/envs/socket_communicator.py @@ -0,0 +1,98 @@ +import logging +import socket +import struct + +from .communicator import Communicator +from animalai.communicator_objects import UnityMessage, UnityOutput, UnityInput +from .exception import UnityTimeOutException + + +logger = logging.getLogger("mlagents.envs") + + +class SocketCommunicator(Communicator): + def __init__(self, worker_id=0, + base_port=5005): + """ + Python side of the socket communication + + :int base_port: Baseline port number to connect to Unity environment over. worker_id increments over this. + :int worker_id: Number to add to communication port (5005) [0]. Used for asynchronous agent scenarios. + """ + + self.port = base_port + worker_id + self._buffer_size = 12000 + self.worker_id = worker_id + self._socket = None + self._conn = None + + def initialize(self, inputs: UnityInput) -> UnityOutput: + try: + # Establish communication socket + self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self._socket.bind(("localhost", self.port)) + except: + raise UnityTimeOutException("Couldn't start socket communication because worker number {} is still in use. " + "You may need to manually close a previously opened environment " + "or use a different worker number.".format(str(self.worker_id))) + try: + self._socket.settimeout(30) + self._socket.listen(1) + self._conn, _ = self._socket.accept() + self._conn.settimeout(30) + except : + raise UnityTimeOutException( + "The Unity environment took too long to respond. Make sure that :\n" + "\t The environment does not need user interaction to launch\n" + "\t The Academy's Broadcast Hub is configured correctly\n" + "\t The Agents are linked to the appropriate Brains\n" + "\t The environment and the Python interface have compatible versions.") + message = UnityMessage() + message.header.status = 200 + message.unity_input.CopyFrom(inputs) + self._communicator_send(message.SerializeToString()) + initialization_output = UnityMessage() + initialization_output.ParseFromString(self._communicator_receive()) + return initialization_output.unity_output + + def _communicator_receive(self): + try: + s = self._conn.recv(self._buffer_size) + message_length = struct.unpack("I", bytearray(s[:4]))[0] + s = s[4:] + while len(s) != message_length: + s += self._conn.recv(self._buffer_size) + except socket.timeout as e: + raise UnityTimeOutException("The environment took too long to respond.") + return s + + def _communicator_send(self, message): + self._conn.send(struct.pack("I", len(message)) + message) + + def exchange(self, inputs: UnityInput) -> UnityOutput: + message = UnityMessage() + message.header.status = 200 + message.unity_input.CopyFrom(inputs) + self._communicator_send(message.SerializeToString()) + outputs = UnityMessage() + outputs.ParseFromString(self._communicator_receive()) + if outputs.header.status != 200: + return None + return outputs.unity_output + + def close(self): + """ + Sends a shutdown signal to the unity environment, and closes the socket connection. + """ + if self._socket is not None and self._conn is not None: + message_input = UnityMessage() + message_input.header.status = 400 + self._communicator_send(message_input.SerializeToString()) + if self._socket is not None: + self._socket.close() + self._socket = None + if self._socket is not None: + self._conn.close() + self._conn = None + diff --git a/animalai_packages/animalai_envs/setup.py b/animalai_packages/animalai_envs/setup.py new file mode 100644 index 00000000..9c5b270c --- /dev/null +++ b/animalai_packages/animalai_envs/setup.py @@ -0,0 +1,29 @@ +from setuptools import setup + +setup( + name='animalai', + version='0.4.0', + description='Animal AI competition interface', + url='https://github.com/beyretb/AnimalAI-Olympics', + author='Benjamin Beyret', + author_email='bb1010@ic.ac.uk', + + classifiers=[ + 'Intended Audience :: Developers', + 'Topic :: Scientific/Engineering :: Artificial Intelligence', + 'License :: OSI Approved :: Apache Software License', + 'Programming Language :: Python :: 3.6' + ], + + packages=['animalai.envs', 'animalai.communicator_objects'], # Required + zip_safe=False, + + install_requires=[ + 'Pillow>=4.2.1,<=5.4.1', + 'numpy>=1.13.3,<=1.14.5', + 'protobuf>=3.6,<3.7', + 'grpcio>=1.11.0,<1.12.0', + 'pyyaml>=5.1', + 'jsonpickle>=1.2'], + python_requires=">=3.5,<3.8", +) \ No newline at end of file diff --git a/animalai_packages/animalai_train/LICENSE b/animalai_packages/animalai_train/LICENSE new file mode 100644 index 00000000..7ff5035e --- /dev/null +++ b/animalai_packages/animalai_train/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2017 Unity Technologies + + 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. \ No newline at end of file diff --git a/animalai_packages/animalai_train/README.md b/animalai_packages/animalai_train/README.md new file mode 100644 index 00000000..1dd411bf --- /dev/null +++ b/animalai_packages/animalai_train/README.md @@ -0,0 +1,5 @@ +# AnimalAI Python API + +This package provides the Python API used for training agents for the Animal AI Olympics competition. + +This library is mostly the same as [Unity's MLAgents](https://github.com/Unity-Technologies/ml-agents). \ No newline at end of file diff --git a/animalai_packages/animalai_train/animalai_train/__init__.py b/animalai_packages/animalai_train/animalai_train/__init__.py new file mode 100644 index 00000000..fed01500 --- /dev/null +++ b/animalai_packages/animalai_train/animalai_train/__init__.py @@ -0,0 +1 @@ +name = "animalai_train" \ No newline at end of file diff --git a/animalai_packages/animalai_train/animalai_train/trainers/__init__.py b/animalai_packages/animalai_train/animalai_train/trainers/__init__.py new file mode 100644 index 00000000..4859f558 --- /dev/null +++ b/animalai_packages/animalai_train/animalai_train/trainers/__init__.py @@ -0,0 +1,15 @@ +from .buffer import * +from .curriculum import * +from .meta_curriculum import * +from .models import * +from .trainer_controller import * +from .bc.models import * +from .bc.offline_trainer import * +from .bc.online_trainer import * +from .bc.policy import * +from .ppo.models import * +from .ppo.trainer import * +from .ppo.policy import * +from .exception import * +from .policy import * +from .demo_loader import * diff --git a/animalai_packages/animalai_train/animalai_train/trainers/barracuda.py b/animalai_packages/animalai_train/animalai_train/trainers/barracuda.py new file mode 100644 index 00000000..813d54db --- /dev/null +++ b/animalai_packages/animalai_train/animalai_train/trainers/barracuda.py @@ -0,0 +1,491 @@ +from __future__ import print_function +from collections import defaultdict +import numpy as np +import json +import struct # convert from Python values and C structs +import re +import argparse +import os.path + +BARRACUDA_VERSION = 16 + +# Definition of Barracuda model +class Model: + def __init__(self): + self.layers = [] + self.tensors = {} + self.inputs = {} + self.outputs = [] + self.globals = [] + self.memories = [] + +class Struct: + "A structure that can have any fields defined." + def __init__(self, **entries): self.__dict__.update(entries) + +# Parse command line argumengts +def parse_args(description, source_extension, help): + parser = argparse.ArgumentParser(description=description) + parser.add_argument('source_file', help=help) + parser.add_argument('target_file', help='output Barracuda binary file') + parser.add_argument('-trim', '--trim-unused-by-output') + parser.add_argument('--print-layers', action='store_true') + parser.add_argument('--print-source-json', action='store_true') + parser.add_argument('-json', '--print-barracuda-json', action='store_true') + parser.add_argument('--print-layer-links', action='store_true') + parser.add_argument('--print-patterns', action='store_true') + parser.add_argument('--print-tensors', action='store_true') + parser.add_argument('--verbose', action='store_true') + args = parser.parse_args() + args.compress_f16 = False # TEMP: disabled, until properly implemented parser.add_argument('-f16', '--compress-f16', action='store_true') + + output_extension = '.bc' if not args.compress_f16 else '.f16.bc' + + if not os.path.exists(args.source_file): + args.source_file = args.source_file + source_extension + + if not os.path.exists(args.source_file): + print('File', args.source_file, 'does not exist.') + exit(-1) + + def replaceFilenameExtension(filename, newExtenstion): + return os.path.splitext(os.path.basename(filename))[0] + newExtenstion; + + if os.path.isdir(args.target_file): + args.target_file = os.path.join(args.target_file, replaceFilenameExtension(args.source_file, output_extension)) + + if args.verbose: + print(args) + + return args + +# Fuse training time BatchNorm tensors into Scale & Bias +def fuse_batchnorm_weights(gamma, beta, mean, var, epsilon): + # https://github.com/Tencent/ncnn/blob/master/src/layer/batchnorm.cpp + """ float sqrt_var = sqrt(var_data[i]); + a_data[i] = bias_data[i] - slope_data[i] * mean_data[i] / sqrt_var; + b_data[i] = slope_data[i] / sqrt_var; + ... + ptr[i] = b * ptr[i] + a; + """ + scale = gamma / np.sqrt(var + epsilon) + bias = beta - gamma * mean / np.sqrt(var + epsilon) + return [scale, bias] + +# Resort layers so that all inputs are satisfied for every layer beforehand +def sort(model, inputs, memories, verbose): + if hasattr(model, 'layers'): + model = model.layers + inputs_and_memories = set(list(inputs) + list(memories[1::3])) + + def find_missing_inputs(model, inputs): + missing = set() + ready = set(inputs) + for l in model: + for i in l.inputs: + if i not in ready: + missing.add(i) + ready.add(l.name) + return missing + + # Class to represent a graph + # Taken from: https://www.geeksforgeeks.org/python-program-for-topological-sorting/ + class Graph: + def __init__(self,vertices): + self.graph = defaultdict(list) #dictionary containing adjacency List + self.V = vertices #No. of vertices + + # function to add an edge to graph + def addEdge(self,u,v): + self.graph[u].append(v) + + # A recursive function used by topologicalSort + def topologicalSortUtil(self,v,visited,stack): + + # Mark the current node as visited. + visited[v] = True + + # Recur for all the vertices adjacent to this vertex + for i in self.graph[v]: + if visited[i] == False: + self.topologicalSortUtil(i,visited,stack) + + # Push current vertex to stack which stores result + stack.insert(0,v) + + # The function to do Topological Sort. It uses recursive + # topologicalSortUtil() + def topologicalSort(self): + # Mark all the vertices as not visited + visited = [False]*self.V + stack =[] + + # Call the recursive helper function to store Topological + # Sort starting from all vertices one by one + for i in range(self.V): + if visited[i] == False: + self.topologicalSortUtil(i,visited,stack) + + #print(stack) + return stack + + if (len(find_missing_inputs(model, inputs_and_memories)) == 0): + return model + + g = Graph(len(model)) + + layers = {} + id = 0 + for l in model: + layers[l.name] = id; + id += 1 + + for layer in model: + for i in layer.inputs: + if i not in inputs_and_memories: + g.addEdge(layers[i], layers[layer.name]) + + sorted_layer_indices = g.topologicalSort() + print("SORTED:", sorted_layer_indices) + new_model = [model[idx] for idx in sorted_layer_indices] + + assert(len(find_missing_inputs(new_model, inputs_and_memories)) == 0) + return new_model + + + +# Trim +def trim(model, criteria_regexp_string, verbose): + if hasattr(model, 'layers'): + model = model.layers + + def flatten(items,enter=lambda x:isinstance(x, list)): + # http://stackoverflow.com/a/40857703 + # https://github.com/ctmakro/canton/blob/master/canton/misc.py + """Yield items from any nested iterable; see REF.""" + for x in items: + if enter(x): + yield from flatten(x) + else: + yield x + + def trim_model(model, outputs): + layers = {l.name:l for l in model} + connected = {o for o in outputs} + while len(outputs) > 0: + outputs = set(flatten([layers[o].inputs for o in outputs if o in layers])) + if verbose and len(outputs) > 0: + print(outputs) + for o in outputs: + connected.add(o) + + trimmed = [l.name for l in model if l.name not in connected] + def array_without_brackets(arr): + return str(arr)[1:-1] # array to string without brackets + print("TRIMMED:", array_without_brackets(trimmed)) + + return [l for l in model if l.name in connected] + + layer_names = {l.name for l in model} + criteria = re.compile(criteria_regexp_string) + preserve_outputs = list(filter(criteria.match, layer_names)) + if preserve_outputs: + print("Trimming model given outputs to preserve:", preserve_outputs) + model = trim_model(model, preserve_outputs) + else: + print("WARNING: Trim couldn't find any layers to match:", criteria_regexp_string) + return model + +def compress(model): + compress_classes = { + 'Dense' + } + for l in model.layers: + if (l.class_name in compress_classes): + print("Compressing %s layer '%s' weights to float16" % (l.class_name, l.name)) + for x in l.tensors: + x.data = np.float16(x.data) + return model + +# Verbose +def to_json(model): + class StructEncoder(json.JSONEncoder): + def default(self, o): + if isinstance(o, np.ndarray): # skip binary data packed inside ndarray + return "" + if getattr(o, '__dict__', None): + return o.__dict__ + return str(o) + + s = json.dumps(model.layers, cls=StructEncoder, separators=(', ',':')) + # custom formatting + s = s.replace(']}, {', ']},\n{') + s = s.replace(':[{', ':[\n\t{') + s = s.replace('}, {', '},\n\t{') + s = s.replace('"', "'") + return s + +def summary(model, print_layer_links, print_barracuda_json, print_tensors): + def array_without_brackets(arr): + return str(arr)[1:-1] # array to string without brackets + + if print_layer_links: + for l in model.layers: + print(l.name, " <= ", l.inputs) + + if print_barracuda_json: + print(to_json(model)) + + if model.globals: + if isinstance(model.globals, dict): + model.globals = {x.name:x.shape for x in model.globals} + print("GLOBALS:", array_without_brackets(model.globals)) + + for l in model.layers: + if isinstance(model.inputs, dict): + ins = {i:model.inputs[i] for i in l.inputs if i in model.inputs} + else: + ins = [i for i in l.inputs if i in model.inputs] + if ins: + print("IN: %s => '%s'" % (array_without_brackets(ins), l.name)) + for mem_in, mem_out in zip(model.memories[1::3], model.memories[2::3]): + print("MEM: '%s' => '%s'" % (mem_in, mem_out)) + print("OUT:", array_without_brackets(model.outputs)) + + if (print_tensors): + for l in model.layers: + for x in l.tensors: + print(x.name, x.shape, x.data.dtype, x.data) + +class Build: + def __init__(self, scope=''): + self.scope = scope + self.layers = [] + self.names_taken = set() + + def __getattr__(self, attr): + if attr == '_': + return self.layers[-1].name if len(self.layer) > 0 else self.scope + raise AttributeError(attr) + + def _patch_last_layer_name_and_return(self): + if self.layers[-1].name: + return self.layers[-1].name + + # generate unique name based on op and increasing id + name = self.layers[-1].op + + i = 1 + while name in self.names_taken: + name = self.layers[-1].op + '_' + str(i) + i += 1 + self.names_taken.add(name) + + self.layers[-1].name = self.scope + ('/' if self.scope else '') + name + return self.layers[-1].name + + def concat(self, a, b, out=''): + self.layers += [Struct(name=out, op='Concat', input=[a, b])] + return self._patch_last_layer_name_and_return() + def mad(self, x, kernel, bias, out=''): + self.layers += [Struct(name=out, op='Dense', input=[x, kernel, bias])] + return self._patch_last_layer_name_and_return() + def mul(self, a, b, out=''): + self.layers += [Struct(name=out, op='Mul', input=[a, b])] + return self._patch_last_layer_name_and_return() + def add(self, a, b, out=''): + self.layers += [Struct(name=out, op='Add', input=[a, b])] + return self._patch_last_layer_name_and_return() + def sub(self, a, b, out=''): + self.layers += [Struct(name=out, op='Sub', input=[a, b])] + return self._patch_last_layer_name_and_return() + def sigmoid(self, x, out=''): + self.layers += [Struct(name=out, op='Sigmoid', input=[x])] + return self._patch_last_layer_name_and_return() + def tanh(self, x, out=''): + self.layers += [Struct(name=out, op='Tanh', input=[x])] + return self._patch_last_layer_name_and_return() + +def rnn(name, input, state, kernel, bias, new_state, number_of_gates = 2): + ''' - Ht = f(Xt*Wi + Ht_1*Ri + Wbi + Rbi) + ''' + + nn = Build(name) + nn.tanh( + nn.mad(kernel=kernel, bias=bias, + x=nn.concat(input, state)), + out=new_state); + return nn.layers; + +def gru(name, input, state, kernel_r, kernel_u, kernel_c, bias_r, bias_u, bias_c, new_state, number_of_gates = 2): + ''' - zt = f(Xt*Wz + Ht_1*Rz + Wbz + Rbz) + - rt = f(Xt*Wr + Ht_1*Rr + Wbr + Rbr) + - ht = g(Xt*Wh + (rt . Ht_1)*Rh + Rbh + Wbh) + - Ht = (1-zt).ht + zt.Ht_1 + ''' + nn = Build(name) + inputs = nn.concat(input, state) + + u = nn.sigmoid(nn.mad(inputs, kernel_u, bias_u)) + r = nn.sigmoid(nn.mad(inputs, kernel_r, bias_r)) + r_state = nn.mul(r, state) + + c = nn.tanh(nn.mad(kernel=kernel_c, bias=bias_c, + x=nn.concat(input, r_state))) + + # new_h = u' * state + (1 - u') * c' + # = u' * state + c' - u' * c' + + # u' * state + c' + nn.add(nn.mul(u, state), c) + # - u' * c' + nn.sub(nn._, nn.mul(u, c), + out=new_state) + + return nn.layers; + +def lstm(name, input, state_c, state_h, kernel_i, kernel_j, kernel_f, kernel_o, bias_i, bias_j, bias_f, bias_o, new_state_c, new_state_h): + ''' Full: + - it = f(Xt*Wi + Ht_1*Ri + Pi . Ct_1 + Wbi + Rbi) + - ft = f(Xt*Wf + Ht_1*Rf + Pf . Ct_1 + Wbf + Rbf) + - ct = g(Xt*Wc + Ht_1*Rc + Wbc + Rbc) + - Ct = ft . Ct_1 + it . ct + - ot = f(Xt*Wo + Ht_1*Ro + Po . Ct + Wbo + Rbo) + - Ht = ot . h(Ct) + ''' + + ''' No peephole: + - it = f(Xt*Wi + Ht_1*Ri + Wbi + Rbi) + - ft = f(Xt*Wf + Ht_1*Rf + Wbf + Rbf) + - ct = g(Xt*Wc + Ht_1*Rc + Wbc + Rbc) + - Ct = ft . Ct_ + it . ct + - ot = f(Xt*Wo + Ht_1*Ro + Wbo + Rbo) + - Ht = ot . h(Ct) + ''' + + nn = Build(name) + inputs = nn.concat(input, state_h) + + i = nn.sigmoid(nn.mad(x=inputs, kernel=kernel_i, bias=bias_i)) + j = nn.tanh(nn.mad(inputs, kernel_j, bias_j)) + f = nn.sigmoid(nn.mad(inputs, kernel_f, bias_f)) + o = nn.sigmoid(nn.mad(inputs, kernel_o, bias_o)) + + # new_c = state_c * f' + i' * j' + nn.add( + nn.mul(state_c, f), nn.mul(i, j), + out=new_state_c) + + # new_h = + nn.mul(o, nn.tanh(new_state_c), + out=new_state_h) + + return nn.layers + +# Serialize +class BarracudaWriter: + f = None + + def __init__(self, filename): + self.f = open(filename, 'wb+') + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + self.f.close() + + def write_array(self, arr): + arr.tofile(self.f) + + def write_str_array(self, array_of_strigs): + self.write_int32(len(array_of_strigs)) + for s in array_of_strigs: + self.write_str(s) + + def write_str(self, s): + self.write_int32(len(s)) + self.f.write(s.encode('ascii')) + + def write_float(self, d): + self.f.write(struct.pack('> 2 # length is measured in float32s (at least for now) + + w.write_str(x.name) + w.write_shape(x.shape) + w.write_int64(offset) + w.write_int32(x.data.itemsize) + w.write_int32(length) + + offset += length + all_tensors.append(x) + + for x in all_tensors: + w.write_array(x.data) + + + diff --git a/animalai_packages/animalai_train/animalai_train/trainers/bc/__init__.py b/animalai_packages/animalai_train/animalai_train/trainers/bc/__init__.py new file mode 100644 index 00000000..80cd0aa0 --- /dev/null +++ b/animalai_packages/animalai_train/animalai_train/trainers/bc/__init__.py @@ -0,0 +1,4 @@ +from .models import * +from .online_trainer import * +from .offline_trainer import * +from .policy import * diff --git a/animalai_packages/animalai_train/animalai_train/trainers/bc/models.py b/animalai_packages/animalai_train/animalai_train/trainers/bc/models.py new file mode 100644 index 00000000..e1ef94d5 --- /dev/null +++ b/animalai_packages/animalai_train/animalai_train/trainers/bc/models.py @@ -0,0 +1,55 @@ +import tensorflow as tf +import tensorflow.contrib.layers as c_layers +from animalai_train.trainers.models import LearningModel + + +class BehavioralCloningModel(LearningModel): + def __init__(self, brain, h_size=128, lr=1e-4, n_layers=2, m_size=128, + normalize=False, use_recurrent=False, seed=0): + LearningModel.__init__(self, m_size, normalize, use_recurrent, brain, seed) + num_streams = 1 + hidden_streams = self.create_observation_streams(num_streams, h_size, n_layers) + hidden = hidden_streams[0] + self.dropout_rate = tf.placeholder(dtype=tf.float32, shape=[], name="dropout_rate") + hidden_reg = tf.layers.dropout(hidden, self.dropout_rate) + if self.use_recurrent: + tf.Variable(self.m_size, name="memory_size", trainable=False, dtype=tf.int32) + self.memory_in = tf.placeholder(shape=[None, self.m_size], dtype=tf.float32, name='recurrent_in') + hidden_reg, self.memory_out = self.create_recurrent_encoder(hidden_reg, self.memory_in, + self.sequence_length) + self.memory_out = tf.identity(self.memory_out, name='recurrent_out') + + if brain.vector_action_space_type == "discrete": + policy_branches = [] + for size in self.act_size: + policy_branches.append( + tf.layers.dense( + hidden, + size, + activation=None, + use_bias=False, + kernel_initializer=c_layers.variance_scaling_initializer(factor=0.01))) + self.action_probs = tf.concat( + [tf.nn.softmax(branch) for branch in policy_branches], axis=1, name="action_probs") + self.action_masks = tf.placeholder(shape=[None, sum(self.act_size)], dtype=tf.float32, name="action_masks") + self.sample_action_float, normalized_logits = self.create_discrete_action_masking_layer( + tf.concat(policy_branches, axis=1), self.action_masks, self.act_size) + tf.identity(normalized_logits, name='action') + self.sample_action = tf.cast(self.sample_action_float, tf.int32) + self.true_action = tf.placeholder(shape=[None, len(policy_branches)], dtype=tf.int32, name="teacher_action") + self.action_oh = tf.concat([ + tf.one_hot(self.true_action[:, i], self.act_size[i]) for i in range(len(self.act_size))], axis=1) + self.loss = tf.reduce_sum(-tf.log(self.action_probs + 1e-10) * self.action_oh) + self.action_percent = tf.reduce_mean(tf.cast( + tf.equal(tf.cast(tf.argmax(self.action_probs, axis=1), tf.int32), self.sample_action), tf.float32)) + else: + self.policy = tf.layers.dense(hidden_reg, self.act_size[0], activation=None, use_bias=False, name='pre_action', + kernel_initializer=c_layers.variance_scaling_initializer(factor=0.01)) + self.clipped_sample_action = tf.clip_by_value(self.policy, -1, 1) + self.sample_action = tf.identity(self.clipped_sample_action, name="action") + self.true_action = tf.placeholder(shape=[None, self.act_size[0]], dtype=tf.float32, name="teacher_action") + self.clipped_true_action = tf.clip_by_value(self.true_action, -1, 1) + self.loss = tf.reduce_sum(tf.squared_difference(self.clipped_true_action, self.sample_action)) + + optimizer = tf.train.AdamOptimizer(learning_rate=lr) + self.update = optimizer.minimize(self.loss) diff --git a/animalai_packages/animalai_train/animalai_train/trainers/bc/offline_trainer.py b/animalai_packages/animalai_train/animalai_train/trainers/bc/offline_trainer.py new file mode 100644 index 00000000..ebdbc443 --- /dev/null +++ b/animalai_packages/animalai_train/animalai_train/trainers/bc/offline_trainer.py @@ -0,0 +1,56 @@ +# # Unity ML-Agents Toolkit +# ## ML-Agent Learning (Behavioral Cloning) +# Contains an implementation of Behavioral Cloning Algorithm + +import logging +import copy + +from animalai_train.trainers.bc.trainer import BCTrainer +from animalai_train.trainers.demo_loader import demo_to_buffer +from animalai_train.trainers.trainer import UnityTrainerException + +logger = logging.getLogger("mlagents.trainers") + + +class OfflineBCTrainer(BCTrainer): + """The OfflineBCTrainer is an implementation of Offline Behavioral Cloning.""" + + def __init__(self, brain, trainer_parameters, training, load, seed, run_id): + """ + Responsible for collecting experiences and training PPO model. + :param trainer_parameters: The parameters for the trainer (dictionary). + :param training: Whether the trainer is set for training. + :param load: Whether the model should be loaded. + :param seed: The seed the model will be initialized with + :param run_id: The The identifier of the current run + """ + super(OfflineBCTrainer, self).__init__( + brain, trainer_parameters, training, load, seed, run_id) + + self.param_keys = ['batch_size', 'summary_freq', 'max_steps', + 'batches_per_epoch', 'use_recurrent', + 'hidden_units', 'learning_rate', 'num_layers', + 'sequence_length', 'memory_size', 'model_path', + 'demo_path'] + + self.check_param_keys() + self.batches_per_epoch = trainer_parameters['batches_per_epoch'] + self.n_sequences = max(int(trainer_parameters['batch_size'] / self.policy.sequence_length), + 1) + + brain_params, self.demonstration_buffer = demo_to_buffer( + trainer_parameters['demo_path'], + self.policy.sequence_length) + + policy_brain = copy.deepcopy(brain.__dict__) + expert_brain = copy.deepcopy(brain_params.__dict__) + policy_brain.pop('brain_name') + expert_brain.pop('brain_name') + if expert_brain != policy_brain: + raise UnityTrainerException("The provided demonstration is not compatible with the " + "brain being used for performance evaluation.") + + def __str__(self): + return '''Hyperparameters for the Imitation Trainer of brain {0}: \n{1}'''.format( + self.brain_name, '\n'.join( + ['\t{0}:\t{1}'.format(x, self.trainer_parameters[x]) for x in self.param_keys])) diff --git a/animalai_packages/animalai_train/animalai_train/trainers/bc/online_trainer.py b/animalai_packages/animalai_train/animalai_train/trainers/bc/online_trainer.py new file mode 100644 index 00000000..91ba340c --- /dev/null +++ b/animalai_packages/animalai_train/animalai_train/trainers/bc/online_trainer.py @@ -0,0 +1,116 @@ +# # Unity ML-Agents Toolkit +# ## ML-Agent Learning (Behavioral Cloning) +# Contains an implementation of Behavioral Cloning Algorithm + +import logging +import numpy as np + +from animalai.envs import AllBrainInfo +from animalai_train.trainers.bc.trainer import BCTrainer + +logger = logging.getLogger("mlagents.trainers") + + +class OnlineBCTrainer(BCTrainer): + """The OnlineBCTrainer is an implementation of Online Behavioral Cloning.""" + + def __init__(self, brain, trainer_parameters, training, load, seed, run_id): + """ + Responsible for collecting experiences and training PPO model. + :param trainer_parameters: The parameters for the trainer (dictionary). + :param training: Whether the trainer is set for training. + :param load: Whether the model should be loaded. + :param seed: The seed the model will be initialized with + :param run_id: The The identifier of the current run + """ + super(OnlineBCTrainer, self).__init__(brain, trainer_parameters, training, load, seed, + run_id) + + self.param_keys = ['brain_to_imitate', 'batch_size', 'time_horizon', + 'summary_freq', 'max_steps', + 'batches_per_epoch', 'use_recurrent', + 'hidden_units', 'learning_rate', 'num_layers', + 'sequence_length', 'memory_size', 'model_path'] + + self.check_param_keys() + self.brain_to_imitate = trainer_parameters['brain_to_imitate'] + self.batches_per_epoch = trainer_parameters['batches_per_epoch'] + self.n_sequences = max(int(trainer_parameters['batch_size'] / self.policy.sequence_length), + 1) + + def __str__(self): + return '''Hyperparameters for the Imitation Trainer of brain {0}: \n{1}'''.format( + self.brain_name, '\n'.join( + ['\t{0}:\t{1}'.format(x, self.trainer_parameters[x]) for x in self.param_keys])) + + def add_experiences(self, curr_info: AllBrainInfo, next_info: AllBrainInfo, + take_action_outputs): + """ + Adds experiences to each agent's experience history. + :param curr_info: Current AllBrainInfo (Dictionary of all current brains and corresponding BrainInfo). + :param next_info: Next AllBrainInfo (Dictionary of all current brains and corresponding BrainInfo). + :param take_action_outputs: The outputs of the take action method. + """ + + # Used to collect teacher experience into training buffer + info_teacher = curr_info[self.brain_to_imitate] + next_info_teacher = next_info[self.brain_to_imitate] + for agent_id in info_teacher.agents: + self.demonstration_buffer[agent_id].last_brain_info = info_teacher + + for agent_id in next_info_teacher.agents: + stored_info_teacher = self.demonstration_buffer[agent_id].last_brain_info + if stored_info_teacher is None: + continue + else: + idx = stored_info_teacher.agents.index(agent_id) + next_idx = next_info_teacher.agents.index(agent_id) + if stored_info_teacher.text_observations[idx] != "": + info_teacher_record, info_teacher_reset = \ + stored_info_teacher.text_observations[idx].lower().split(",") + next_info_teacher_record, next_info_teacher_reset = \ + next_info_teacher.text_observations[idx]. \ + lower().split(",") + if next_info_teacher_reset == "true": + self.demonstration_buffer.reset_update_buffer() + else: + info_teacher_record, next_info_teacher_record = "true", "true" + if info_teacher_record == "true" and next_info_teacher_record == "true": + if not stored_info_teacher.local_done[idx]: + for i in range(self.policy.vis_obs_size): + self.demonstration_buffer[agent_id]['visual_obs%d' % i] \ + .append(stored_info_teacher.visual_observations[i][idx]) + if self.policy.use_vec_obs: + self.demonstration_buffer[agent_id]['vector_obs'] \ + .append(stored_info_teacher.vector_observations[idx]) + if self.policy.use_recurrent: + if stored_info_teacher.memories.shape[1] == 0: + stored_info_teacher.memories = np.zeros( + (len(stored_info_teacher.agents), + self.policy.m_size)) + self.demonstration_buffer[agent_id]['memory'].append( + stored_info_teacher.memories[idx]) + self.demonstration_buffer[agent_id]['actions'].append( + next_info_teacher.previous_vector_actions[next_idx]) + + super(OnlineBCTrainer, self).add_experiences(curr_info, next_info, take_action_outputs) + + def process_experiences(self, current_info: AllBrainInfo, next_info: AllBrainInfo): + """ + Checks agent histories for processing condition, and processes them as necessary. + Processing involves calculating value and advantage targets for model updating step. + :param current_info: Current AllBrainInfo + :param next_info: Next AllBrainInfo + """ + info_teacher = next_info[self.brain_to_imitate] + for l in range(len(info_teacher.agents)): + teacher_action_list = len(self.demonstration_buffer[info_teacher.agents[l]]['actions']) + horizon_reached = teacher_action_list > self.trainer_parameters['time_horizon'] + teacher_filled = len(self.demonstration_buffer[info_teacher.agents[l]]['actions']) > 0 + if (info_teacher.local_done[l] or horizon_reached) and teacher_filled: + agent_id = info_teacher.agents[l] + self.demonstration_buffer.append_update_buffer( + agent_id, batch_size=None, training_length=self.policy.sequence_length) + self.demonstration_buffer[agent_id].reset_agent() + + super(OnlineBCTrainer, self).process_experiences(current_info, next_info) diff --git a/animalai_packages/animalai_train/animalai_train/trainers/bc/policy.py b/animalai_packages/animalai_train/animalai_train/trainers/bc/policy.py new file mode 100644 index 00000000..f2d990b3 --- /dev/null +++ b/animalai_packages/animalai_train/animalai_train/trainers/bc/policy.py @@ -0,0 +1,93 @@ +import logging + +import numpy as np +from animalai_train.trainers.bc.models import BehavioralCloningModel +from animalai_train.trainers.policy import Policy + +logger = logging.getLogger("mlagents.trainers") + + +class BCPolicy(Policy): + def __init__(self, seed, brain, trainer_parameters, load): + """ + :param seed: Random seed. + :param brain: Assigned Brain object. + :param trainer_parameters: Defined training parameters. + :param load: Whether a pre-trained model will be loaded or a new one created. + """ + super(BCPolicy, self).__init__(seed, brain, trainer_parameters) + + with self.graph.as_default(): + with self.graph.as_default(): + self.model = BehavioralCloningModel( + h_size=int(trainer_parameters['hidden_units']), + lr=float(trainer_parameters['learning_rate']), + n_layers=int(trainer_parameters['num_layers']), + m_size=self.m_size, + normalize=False, + use_recurrent=trainer_parameters['use_recurrent'], + brain=brain, + seed=seed) + + if load: + self._load_graph() + else: + self._initialize_graph() + + self.inference_dict = {'action': self.model.sample_action} + self.update_dict = {'policy_loss': self.model.loss, + 'update_batch': self.model.update} + if self.use_recurrent: + self.inference_dict['memory_out'] = self.model.memory_out + + self.evaluate_rate = 1.0 + self.update_rate = 0.5 + + def evaluate(self, brain_info): + """ + Evaluates policy for the agent experiences provided. + :param brain_info: BrainInfo input to network. + :return: Results of evaluation. + """ + feed_dict = {self.model.dropout_rate: self.evaluate_rate, + self.model.sequence_length: 1} + + feed_dict = self._fill_eval_dict(feed_dict, brain_info) + if self.use_recurrent: + if brain_info.memories.shape[1] == 0: + brain_info.memories = self.make_empty_memory(len(brain_info.agents)) + feed_dict[self.model.memory_in] = brain_info.memories + run_out = self._execute_model(feed_dict, self.inference_dict) + return run_out + + def update(self, mini_batch, num_sequences): + """ + Performs update on model. + :param mini_batch: Batch of experiences. + :param num_sequences: Number of sequences to process. + :return: Results of update. + """ + + feed_dict = {self.model.dropout_rate: self.update_rate, + self.model.batch_size: num_sequences, + self.model.sequence_length: self.sequence_length} + if self.use_continuous_act: + feed_dict[self.model.true_action] = mini_batch['actions']. \ + reshape([-1, self.brain.vector_action_space_size[0]]) + else: + feed_dict[self.model.true_action] = mini_batch['actions'].reshape( + [-1, len(self.brain.vector_action_space_size)]) + feed_dict[self.model.action_masks] = np.ones( + (num_sequences, sum(self.brain.vector_action_space_size))) + if self.use_vec_obs: + apparent_obs_size = self.brain.vector_observation_space_size * \ + self.brain.num_stacked_vector_observations + feed_dict[self.model.vector_in] = mini_batch['vector_obs'] \ + .reshape([-1,apparent_obs_size]) + for i, _ in enumerate(self.model.visual_in): + visual_obs = mini_batch['visual_obs%d' % i] + feed_dict[self.model.visual_in[i]] = visual_obs + if self.use_recurrent: + feed_dict[self.model.memory_in] = np.zeros([num_sequences, self.m_size]) + run_out = self._execute_model(feed_dict, self.update_dict) + return run_out diff --git a/animalai_packages/animalai_train/animalai_train/trainers/bc/trainer.py b/animalai_packages/animalai_train/animalai_train/trainers/bc/trainer.py new file mode 100644 index 00000000..dbd4d9c4 --- /dev/null +++ b/animalai_packages/animalai_train/animalai_train/trainers/bc/trainer.py @@ -0,0 +1,190 @@ +# # Unity ML-Agents Toolkit +# ## ML-Agent Learning (Behavioral Cloning) +# Contains an implementation of Behavioral Cloning Algorithm + +import logging +import os + +import numpy as np +import tensorflow as tf + +from animalai.envs import AllBrainInfo +from animalai_train.trainers.bc.policy import BCPolicy +from animalai_train.trainers.buffer import Buffer +from animalai_train.trainers.trainer import Trainer + +logger = logging.getLogger("mlagents.trainers") + + +class BCTrainer(Trainer): + """The BCTrainer is an implementation of Behavioral Cloning.""" + + def __init__(self, brain, trainer_parameters, training, load, seed, run_id): + """ + Responsible for collecting experiences and training PPO model. + :param trainer_parameters: The parameters for the trainer (dictionary). + :param training: Whether the trainer is set for training. + :param load: Whether the model should be loaded. + :param seed: The seed the model will be initialized with + :param run_id: The The identifier of the current run + """ + super(BCTrainer, self).__init__(brain, trainer_parameters, training, run_id) + self.policy = BCPolicy(seed, brain, trainer_parameters, load) + self.n_sequences = 1 + self.cumulative_rewards = {} + self.episode_steps = {} + self.stats = {'Losses/Cloning Loss': [], 'Environment/Episode Length': [], + 'Environment/Cumulative Reward': []} + + self.summary_path = trainer_parameters['summary_path'] + self.batches_per_epoch = trainer_parameters['batches_per_epoch'] + if not os.path.exists(self.summary_path): + os.makedirs(self.summary_path) + + self.demonstration_buffer = Buffer() + self.evaluation_buffer = Buffer() + self.summary_writer = tf.summary.FileWriter(self.summary_path) + + @property + def parameters(self): + """ + Returns the trainer parameters of the trainer. + """ + return self.trainer_parameters + + @property + def get_max_steps(self): + """ + Returns the maximum number of steps. Is used to know when the trainer should be stopped. + :return: The maximum number of steps of the trainer + """ + return float(self.trainer_parameters['max_steps']) + + @property + def get_step(self): + """ + Returns the number of steps the trainer has performed + :return: the step count of the trainer + """ + return self.policy.get_current_step() + + @property + def get_last_reward(self): + """ + Returns the last reward the trainer has had + :return: the new last reward + """ + if len(self.stats['Environment/Cumulative Reward']) > 0: + return np.mean(self.stats['Environment/Cumulative Reward']) + else: + return 0 + + def increment_step_and_update_last_reward(self): + """ + Increment the step count of the trainer and Updates the last reward + """ + self.policy.increment_step() + return + + def take_action(self, all_brain_info: AllBrainInfo): + """ + Decides actions using policy given current brain info. + :param all_brain_info: AllBrainInfo from environment. + :return: a tuple containing action, memories, values and an object + to be passed to add experiences + """ + if len(all_brain_info[self.brain_name].agents) == 0: + return [], [], [], None, None + + agent_brain = all_brain_info[self.brain_name] + run_out = self.policy.evaluate(agent_brain) + if self.policy.use_recurrent: + return run_out['action'], run_out['memory_out'], None, None, None + else: + return run_out['action'], None, None, None, None + + def add_experiences(self, curr_info: AllBrainInfo, next_info: AllBrainInfo, + take_action_outputs): + """ + Adds experiences to each agent's experience history. + :param curr_info: Current AllBrainInfo (Dictionary of all current brains and corresponding BrainInfo). + :param next_info: Next AllBrainInfo (Dictionary of all current brains and corresponding BrainInfo). + :param take_action_outputs: The outputs of the take action method. + """ + + # Used to collect information about student performance. + info_student = curr_info[self.brain_name] + next_info_student = next_info[self.brain_name] + for agent_id in info_student.agents: + self.evaluation_buffer[agent_id].last_brain_info = info_student + + for agent_id in next_info_student.agents: + stored_info_student = self.evaluation_buffer[agent_id].last_brain_info + if stored_info_student is None: + continue + else: + next_idx = next_info_student.agents.index(agent_id) + if agent_id not in self.cumulative_rewards: + self.cumulative_rewards[agent_id] = 0 + self.cumulative_rewards[agent_id] += next_info_student.rewards[next_idx] + if not next_info_student.local_done[next_idx]: + if agent_id not in self.episode_steps: + self.episode_steps[agent_id] = 0 + self.episode_steps[agent_id] += 1 + + def process_experiences(self, current_info: AllBrainInfo, next_info: AllBrainInfo): + """ + Checks agent histories for processing condition, and processes them as necessary. + Processing involves calculating value and advantage targets for model updating step. + :param current_info: Current AllBrainInfo + :param next_info: Next AllBrainInfo + """ + info_student = next_info[self.brain_name] + for l in range(len(info_student.agents)): + if info_student.local_done[l]: + agent_id = info_student.agents[l] + self.stats['Environment/Cumulative Reward'].append( + self.cumulative_rewards.get(agent_id, 0)) + self.stats['Environment/Episode Length'].append( + self.episode_steps.get(agent_id, 0)) + self.cumulative_rewards[agent_id] = 0 + self.episode_steps[agent_id] = 0 + + def end_episode(self): + """ + A signal that the Episode has ended. The buffer must be reset. + Get only called when the academy resets. + """ + self.evaluation_buffer.reset_local_buffers() + for agent_id in self.cumulative_rewards: + self.cumulative_rewards[agent_id] = 0 + for agent_id in self.episode_steps: + self.episode_steps[agent_id] = 0 + + def is_ready_update(self): + """ + Returns whether or not the trainer has enough elements to run update model + :return: A boolean corresponding to whether or not update_model() can be run + """ + return len(self.demonstration_buffer.update_buffer['actions']) > self.n_sequences + + def update_policy(self): + """ + Updates the policy. + """ + self.demonstration_buffer.update_buffer.shuffle() + batch_losses = [] + num_batches = min(len(self.demonstration_buffer.update_buffer['actions']) // + self.n_sequences, self.batches_per_epoch) + for i in range(num_batches): + update_buffer = self.demonstration_buffer.update_buffer + start = i * self.n_sequences + end = (i + 1) * self.n_sequences + mini_batch = update_buffer.make_mini_batch(start, end) + run_out = self.policy.update(mini_batch, self.n_sequences) + loss = run_out['policy_loss'] + batch_losses.append(loss) + if len(batch_losses) > 0: + self.stats['Losses/Cloning Loss'].append(np.mean(batch_losses)) + else: + self.stats['Losses/Cloning Loss'].append(0) diff --git a/animalai_packages/animalai_train/animalai_train/trainers/buffer.py b/animalai_packages/animalai_train/animalai_train/trainers/buffer.py new file mode 100644 index 00000000..ff2f0b88 --- /dev/null +++ b/animalai_packages/animalai_train/animalai_train/trainers/buffer.py @@ -0,0 +1,255 @@ +import numpy as np + +from animalai.envs.exception import UnityException + + +class BufferException(UnityException): + """ + Related to errors with the Buffer. + """ + pass + + +class Buffer(dict): + """ + Buffer contains a dictionary of AgentBuffer. The AgentBuffers are indexed by agent_id. + Buffer also contains an update_buffer that corresponds to the buffer used when updating the model. + """ + + class AgentBuffer(dict): + """ + AgentBuffer contains a dictionary of AgentBufferFields. Each agent has his own AgentBuffer. + The keys correspond to the name of the field. Example: state, action + """ + + class AgentBufferField(list): + """ + AgentBufferField is a list of numpy arrays. When an agent collects a field, you can add it to his + AgentBufferField with the append method. + """ + + def __init__(self): + self.padding_value = 0 + super(Buffer.AgentBuffer.AgentBufferField, self).__init__() + + def __str__(self): + return str(np.array(self).shape) + + def append(self, element, padding_value=0): + """ + Adds an element to this list. Also lets you change the padding + type, so that it can be set on append (e.g. action_masks should + be padded with 1.) + :param element: The element to append to the list. + :param padding_value: The value used to pad when get_batch is called. + """ + super(Buffer.AgentBuffer.AgentBufferField, self).append(element) + self.padding_value = padding_value + + def extend(self, data): + """ + Adds a list of np.arrays to the end of the list of np.arrays. + :param data: The np.array list to append. + """ + self += list(np.array(data)) + + def set(self, data): + """ + Sets the list of np.array to the input data + :param data: The np.array list to be set. + """ + self[:] = [] + self[:] = list(np.array(data)) + + def get_batch(self, batch_size=None, training_length=1, sequential=True): + """ + Retrieve the last batch_size elements of length training_length + from the list of np.array + :param batch_size: The number of elements to retrieve. If None: + All elements will be retrieved. + :param training_length: The length of the sequence to be retrieved. If + None: only takes one element. + :param sequential: If true and training_length is not None: the elements + will not repeat in the sequence. [a,b,c,d,e] with training_length = 2 and + sequential=True gives [[0,a],[b,c],[d,e]]. If sequential=False gives + [[a,b],[b,c],[c,d],[d,e]] + """ + if training_length == 1: + # When the training length is 1, the method returns a list of elements, + # not a list of sequences of elements. + if batch_size is None: + # If batch_size is None : All the elements of the AgentBufferField are returned. + return np.array(self) + else: + # return the batch_size last elements + if batch_size > len(self): + raise BufferException("Batch size requested is too large") + return np.array(self[-batch_size:]) + else: + # The training_length is not None, the method returns a list of SEQUENCES of elements + if not sequential: + # The sequences will have overlapping elements + if batch_size is None: + # retrieve the maximum number of elements + batch_size = len(self) - training_length + 1 + # The number of sequences of length training_length taken from a list of len(self) elements + # with overlapping is equal to batch_size + if (len(self) - training_length + 1) < batch_size: + raise BufferException("The batch size and training length requested for get_batch where" + " too large given the current number of data points.") + tmp_list = [] + for end in range(len(self) - batch_size + 1, len(self) + 1): + tmp_list += [np.array(self[end - training_length:end])] + return np.array(tmp_list) + if sequential: + # The sequences will not have overlapping elements (this involves padding) + leftover = len(self) % training_length + # leftover is the number of elements in the first sequence (this sequence might need 0 padding) + if batch_size is None: + # retrieve the maximum number of elements + batch_size = len(self) // training_length + 1 * (leftover != 0) + # The maximum number of sequences taken from a list of length len(self) without overlapping + # with padding is equal to batch_size + if batch_size > (len(self) // training_length + 1 * (leftover != 0)): + raise BufferException("The batch size and training length requested for get_batch where" + " too large given the current number of data points.") + tmp_list = [] + padding = np.array(self[-1]) * self.padding_value + # The padding is made with zeros and its shape is given by the shape of the last element + for end in range(len(self), len(self) % training_length, -training_length)[:batch_size]: + tmp_list += [np.array(self[end - training_length:end])] + if (leftover != 0) and (len(tmp_list) < batch_size): + tmp_list += [np.array([padding] * (training_length - leftover) + self[:leftover])] + tmp_list.reverse() + return np.array(tmp_list) + + def reset_field(self): + """ + Resets the AgentBufferField + """ + self[:] = [] + + def __init__(self): + self.last_brain_info = None + self.last_take_action_outputs = None + super(Buffer.AgentBuffer, self).__init__() + + def __str__(self): + return ", ".join(["'{0}' : {1}".format(k, str(self[k])) for k in self.keys()]) + + def reset_agent(self): + """ + Resets the AgentBuffer + """ + for k in self.keys(): + self[k].reset_field() + self.last_brain_info = None + self.last_take_action_outputs = None + + def __getitem__(self, key): + if key not in self.keys(): + self[key] = self.AgentBufferField() + return super(Buffer.AgentBuffer, self).__getitem__(key) + + def check_length(self, key_list): + """ + Some methods will require that some fields have the same length. + check_length will return true if the fields in key_list + have the same length. + :param key_list: The fields which length will be compared + """ + if len(key_list) < 2: + return True + l = None + for key in key_list: + if key not in self.keys(): + return False + if (l is not None) and (l != len(self[key])): + return False + l = len(self[key]) + return True + + def shuffle(self, key_list=None): + """ + Shuffles the fields in key_list in a consistent way: The reordering will + Shuffles the fields in key_list in a consistent way: The reordering will + be the same across fields. + :param key_list: The fields that must be shuffled. + """ + if key_list is None: + key_list = list(self.keys()) + if not self.check_length(key_list): + raise BufferException("Unable to shuffle if the fields are not of same length") + s = np.arange(len(self[key_list[0]])) + np.random.shuffle(s) + for key in key_list: + self[key][:] = [self[key][i] for i in s] + + def make_mini_batch(self, start, end): + """ + Creates a mini-batch from buffer. + :param start: Starting index of buffer. + :param end: Ending index of buffer. + :return: Dict of mini batch. + """ + mini_batch = {} + for key in self: + mini_batch[key] = np.array(self[key][start:end]) + return mini_batch + + def __init__(self): + self.update_buffer = self.AgentBuffer() + super(Buffer, self).__init__() + + def __str__(self): + return "update buffer :\n\t{0}\nlocal_buffers :\n{1}".format(str(self.update_buffer), + '\n'.join( + ['\tagent {0} :{1}'.format(k, str(self[k])) for + k in self.keys()])) + + def __getitem__(self, key): + if key not in self.keys(): + self[key] = self.AgentBuffer() + return super(Buffer, self).__getitem__(key) + + def reset_update_buffer(self): + """ + Resets the update buffer + """ + self.update_buffer.reset_agent() + + def reset_local_buffers(self): + """ + Resets all the local local_buffers + """ + agent_ids = list(self.keys()) + for k in agent_ids: + self[k].reset_agent() + + def append_update_buffer(self, agent_id, key_list=None, batch_size=None, training_length=None): + """ + Appends the buffer of an agent to the update buffer. + :param agent_id: The id of the agent which data will be appended + :param key_list: The fields that must be added. If None: all fields will be appended. + :param batch_size: The number of elements that must be appended. If None: All of them will be. + :param training_length: The length of the samples that must be appended. If None: only takes one element. + """ + if key_list is None: + key_list = self[agent_id].keys() + if not self[agent_id].check_length(key_list): + raise BufferException("The length of the fields {0} for agent {1} where not of same length" + .format(key_list, agent_id)) + for field_key in key_list: + self.update_buffer[field_key].extend( + self[agent_id][field_key].get_batch(batch_size=batch_size, training_length=training_length) + ) + + def append_all_agent_batch_to_update_buffer(self, key_list=None, batch_size=None, training_length=None): + """ + Appends the buffer of all agents to the update buffer. + :param key_list: The fields that must be added. If None: all fields will be appended. + :param batch_size: The number of elements that must be appended. If None: All of them will be. + :param training_length: The length of the samples that must be appended. If None: only takes one element. + """ + for agent_id in self.keys(): + self.append_update_buffer(agent_id, key_list, batch_size, training_length) diff --git a/animalai_packages/animalai_train/animalai_train/trainers/curriculum.py b/animalai_packages/animalai_train/animalai_train/trainers/curriculum.py new file mode 100644 index 00000000..3ec0859f --- /dev/null +++ b/animalai_packages/animalai_train/animalai_train/trainers/curriculum.py @@ -0,0 +1,112 @@ +import os +import json +import math + +from .exception import CurriculumError + +import logging + +logger = logging.getLogger('mlagents.trainers') + + +class Curriculum(object): + def __init__(self, location, default_reset_parameters): + """ + Initializes a Curriculum object. + :param location: Path to JSON defining curriculum. + :param default_reset_parameters: Set of reset parameters for + environment. + """ + self.max_lesson_num = 0 + self.measure = None + self._lesson_num = 0 + # The name of the brain should be the basename of the file without the + # extension. + self._brain_name = os.path.basename(location).split('.')[0] + + try: + with open(location) as data_file: + self.data = json.load(data_file) + except IOError: + raise CurriculumError( + 'The file {0} could not be found.'.format(location)) + except UnicodeDecodeError: + raise CurriculumError('There was an error decoding {}' + .format(location)) + self.smoothing_value = 0 + for key in ['parameters', 'measure', 'thresholds', + 'min_lesson_length', 'signal_smoothing']: + if key not in self.data: + raise CurriculumError("{0} does not contain a " + "{1} field." + .format(location, key)) + self.smoothing_value = 0 + self.measure = self.data['measure'] + self.min_lesson_length = self.data['min_lesson_length'] + self.max_lesson_num = len(self.data['thresholds']) + + parameters = self.data['parameters'] + for key in parameters: + if key not in default_reset_parameters: + raise CurriculumError( + 'The parameter {0} in Curriculum {1} is not present in ' + 'the Environment'.format(key, location)) + if len(parameters[key]) != self.max_lesson_num + 1: + raise CurriculumError( + 'The parameter {0} in Curriculum {1} must have {2} values ' + 'but {3} were found'.format(key, location, + self.max_lesson_num + 1, + len(parameters[key]))) + + @property + def lesson_num(self): + return self._lesson_num + + @lesson_num.setter + def lesson_num(self, lesson_num): + self._lesson_num = max(0, min(lesson_num, self.max_lesson_num)) + + def increment_lesson(self, measure_val): + """ + Increments the lesson number depending on the progress given. + :param measure_val: Measure of progress (either reward or percentage + steps completed). + :return Whether the lesson was incremented. + """ + if not self.data or not measure_val or math.isnan(measure_val): + return False + if self.data['signal_smoothing']: + measure_val = self.smoothing_value * 0.25 + 0.75 * measure_val + self.smoothing_value = measure_val + if self.lesson_num < self.max_lesson_num: + if measure_val > self.data['thresholds'][self.lesson_num]: + self.lesson_num += 1 + config = {} + parameters = self.data['parameters'] + for key in parameters: + config[key] = parameters[key][self.lesson_num] + logger.info('{0} lesson changed. Now in lesson {1}: {2}' + .format(self._brain_name, + self.lesson_num, + ', '.join([str(x) + ' -> ' + str(config[x]) + for x in config]))) + return True + return False + + def get_config(self, lesson=None): + """ + Returns reset parameters which correspond to the lesson. + :param lesson: The lesson you want to get the config of. If None, the + current lesson is returned. + :return: The configuration of the reset parameters. + """ + if not self.data: + return {} + if lesson is None: + lesson = self.lesson_num + lesson = max(0, min(lesson, self.max_lesson_num)) + config = {} + parameters = self.data['parameters'] + for key in parameters: + config[key] = parameters[key][lesson] + return config diff --git a/animalai_packages/animalai_train/animalai_train/trainers/demo_loader.py b/animalai_packages/animalai_train/animalai_train/trainers/demo_loader.py new file mode 100644 index 00000000..173615e4 --- /dev/null +++ b/animalai_packages/animalai_train/animalai_train/trainers/demo_loader.py @@ -0,0 +1,94 @@ +import pathlib +import logging +import os +from animalai_train.trainers.buffer import Buffer +from animalai.envs.brain import BrainParameters, BrainInfo +from animalai.communicator_objects import * +from google.protobuf.internal.decoder import _DecodeVarint32 + +logger = logging.getLogger("mlagents.trainers") + + +def make_demo_buffer(brain_infos, brain_params, sequence_length): + # Create and populate buffer using experiences + demo_buffer = Buffer() + for idx, experience in enumerate(brain_infos): + if idx > len(brain_infos) - 2: + break + current_brain_info = brain_infos[idx] + next_brain_info = brain_infos[idx + 1] + demo_buffer[0].last_brain_info = current_brain_info + demo_buffer[0]['done'].append(next_brain_info.local_done[0]) + demo_buffer[0]['rewards'].append(next_brain_info.rewards[0]) + for i in range(brain_params.number_visual_observations): + demo_buffer[0]['visual_obs%d' % i] \ + .append(current_brain_info.visual_observations[i][0]) + if brain_params.vector_observation_space_size > 0: + demo_buffer[0]['vector_obs'] \ + .append(current_brain_info.vector_observations[0]) + demo_buffer[0]['actions'].append(next_brain_info.previous_vector_actions[0]) + if next_brain_info.local_done[0]: + demo_buffer.append_update_buffer(0, batch_size=None, + training_length=sequence_length) + demo_buffer.reset_local_buffers() + demo_buffer.append_update_buffer(0, batch_size=None, + training_length=sequence_length) + return demo_buffer + + +def demo_to_buffer(file_path, sequence_length): + """ + Loads demonstration file and uses it to fill training buffer. + :param file_path: Location of demonstration file (.demo). + :param sequence_length: Length of trajectories to fill buffer. + :return: + """ + brain_params, brain_infos, _ = load_demonstration(file_path) + demo_buffer = make_demo_buffer(brain_infos, brain_params, sequence_length) + return brain_params, demo_buffer + + +def load_demonstration(file_path): + """ + Loads and parses a demonstration file. + :param file_path: Location of demonstration file (.demo). + :return: BrainParameter and list of BrainInfos containing demonstration data. + """ + + # First 32 bytes of file dedicated to meta-data. + INITIAL_POS = 33 + + if not os.path.isfile(file_path): + raise FileNotFoundError("The demonstration file {} does not exist.".format(file_path)) + file_extension = pathlib.Path(file_path).suffix + if file_extension != '.demo': + raise ValueError("The file is not a '.demo' file. Please provide a file with the " + "correct extension.") + + brain_params = None + brain_infos = [] + data = open(file_path, "rb").read() + next_pos, pos, obs_decoded = 0, 0, 0 + total_expected = 0 + while pos < len(data): + next_pos, pos = _DecodeVarint32(data, pos) + if obs_decoded == 0: + meta_data_proto = DemonstrationMetaProto() + meta_data_proto.ParseFromString(data[pos:pos + next_pos]) + total_expected = meta_data_proto.number_steps + pos = INITIAL_POS + if obs_decoded == 1: + brain_param_proto = BrainParametersProto() + brain_param_proto.ParseFromString(data[pos:pos + next_pos]) + brain_params = BrainParameters.from_proto(brain_param_proto) + pos += next_pos + if obs_decoded > 1: + agent_info = AgentInfoProto() + agent_info.ParseFromString(data[pos:pos + next_pos]) + brain_info = BrainInfo.from_agent_proto([agent_info], brain_params) + brain_infos.append(brain_info) + if len(brain_infos) == total_expected: + break + pos += next_pos + obs_decoded += 1 + return brain_params, brain_infos, total_expected diff --git a/animalai_packages/animalai_train/animalai_train/trainers/exception.py b/animalai_packages/animalai_train/animalai_train/trainers/exception.py new file mode 100644 index 00000000..b2f0a0db --- /dev/null +++ b/animalai_packages/animalai_train/animalai_train/trainers/exception.py @@ -0,0 +1,20 @@ +""" +Contains exceptions for the trainers package. +""" + +class TrainerError(Exception): + """ + Any error related to the trainers in the ML-Agents Toolkit. + """ + pass + +class CurriculumError(TrainerError): + """ + Any error related to training with a curriculum. + """ + pass + +class MetaCurriculumError(TrainerError): + """ + Any error related to the configuration of a metacurriculum. + """ diff --git a/animalai_packages/animalai_train/animalai_train/trainers/learn.py b/animalai_packages/animalai_train/animalai_train/trainers/learn.py new file mode 100644 index 00000000..66050d9e --- /dev/null +++ b/animalai_packages/animalai_train/animalai_train/trainers/learn.py @@ -0,0 +1,249 @@ +# # Unity ML-Agents Toolkit + +import logging + +from multiprocessing import Process, Queue +import os +import glob +import shutil +import numpy as np +import yaml +from docopt import docopt +from typing import Optional + + +from animalai_train.trainers.trainer_controller import TrainerController +from animalai_train.trainers.exception import TrainerError +from animalai_train.trainers import MetaCurriculumError, MetaCurriculum +from animalai.envs import UnityEnvironment +from animalai.envs.exception import UnityEnvironmentException + + +def run_training(sub_id: int, run_seed: int, run_options, process_queue): + """ + Launches training session. + :param process_queue: Queue used to send signal back to main. + :param sub_id: Unique id for training session. + :param run_seed: Random seed used for training. + :param run_options: Command line arguments for training. + """ + # Docker Parameters + docker_target_name = (run_options['--docker-target-name'] + if run_options['--docker-target-name'] != 'None' else None) + + # General parameters + env_path = (run_options['--env'] + if run_options['--env'] != 'None' else None) + run_id = run_options['--run-id'] + load_model = run_options['--load'] + train_model = run_options['--train'] + save_freq = int(run_options['--save-freq']) + keep_checkpoints = int(run_options['--keep-checkpoints']) + worker_id = int(run_options['--worker-id']) + curriculum_folder = (run_options['--curriculum'] + if run_options['--curriculum'] != 'None' else None) + lesson = int(run_options['--lesson']) + fast_simulation = not bool(run_options['--slow']) + no_graphics = run_options['--no-graphics'] + trainer_config_path = run_options[''] + + # Recognize and use docker volume if one is passed as an argument + if not docker_target_name: + model_path = './models/{run_id}'.format(run_id=run_id) + summaries_dir = './summaries' + else: + trainer_config_path = \ + '/{docker_target_name}/{trainer_config_path}'.format( + docker_target_name=docker_target_name, + trainer_config_path=trainer_config_path) + if curriculum_folder is not None: + curriculum_folder = \ + '/{docker_target_name}/{curriculum_folder}'.format( + docker_target_name=docker_target_name, + curriculum_folder=curriculum_folder) + model_path = '/{docker_target_name}/models/{run_id}'.format( + docker_target_name=docker_target_name, + run_id=run_id) + summaries_dir = '/{docker_target_name}/summaries'.format( + docker_target_name=docker_target_name) + + trainer_config = load_config(trainer_config_path) + env = init_environment(env_path, docker_target_name, no_graphics, worker_id + sub_id, fast_simulation, run_seed) + maybe_meta_curriculum = try_create_meta_curriculum(curriculum_folder, env) + + external_brains = {} + for brain_name in env.external_brain_names: + external_brains[brain_name] = env.brains[brain_name] + + # Create controller and begin training. + tc = TrainerController(model_path, summaries_dir, run_id + '-' + str(sub_id), + save_freq, maybe_meta_curriculum, + load_model, train_model, + keep_checkpoints, lesson, external_brains, run_seed) + + # Signal that environment has been launched. + process_queue.put(True) + + # Begin training + tc.start_learning(env, trainer_config) + + +def try_create_meta_curriculum(curriculum_folder: Optional[str], env: UnityEnvironment) -> Optional[MetaCurriculum]: + if curriculum_folder is None: + return None + else: + meta_curriculum = MetaCurriculum(curriculum_folder, env._resetParameters) + if meta_curriculum: + for brain_name in meta_curriculum.brains_to_curriculums.keys(): + if brain_name not in env.external_brain_names: + raise MetaCurriculumError('One of the curricula ' + 'defined in ' + + curriculum_folder + ' ' + 'does not have a corresponding ' + 'Brain. Check that the ' + 'curriculum file has the same ' + 'name as the Brain ' + 'whose curriculum it defines.') + return meta_curriculum + + +def prepare_for_docker_run(docker_target_name, env_path): + for f in glob.glob('/{docker_target_name}/*'.format( + docker_target_name=docker_target_name)): + if env_path in f: + try: + b = os.path.basename(f) + if os.path.isdir(f): + shutil.copytree(f, + '/ml-agents/{b}'.format(b=b)) + else: + src_f = '/{docker_target_name}/{b}'.format( + docker_target_name=docker_target_name, b=b) + dst_f = '/ml-agents/{b}'.format(b=b) + shutil.copyfile(src_f, dst_f) + os.chmod(dst_f, 0o775) # Make executable + except Exception as e: + logging.getLogger('mlagents.trainers').info(e) + env_path = '/ml-agents/{env_path}'.format(env_path=env_path) + return env_path + + +def load_config(trainer_config_path): + try: + with open(trainer_config_path) as data_file: + trainer_config = yaml.load(data_file) + return trainer_config + except IOError: + raise UnityEnvironmentException('Parameter file could not be found ' + 'at {}.' + .format(trainer_config_path)) + except UnicodeDecodeError: + raise UnityEnvironmentException('There was an error decoding ' + 'Trainer Config from this path : {}' + .format(trainer_config_path)) + + +def init_environment(env_path, docker_target_name, no_graphics, worker_id, fast_simulation, seed): + if env_path is not None: + # Strip out executable extensions if passed + env_path = (env_path.strip() + .replace('.app', '') + .replace('.exe', '') + .replace('.x86_64', '') + .replace('.x86', '')) + docker_training = docker_target_name is not None + if docker_training and env_path is not None: + """ + Comments for future maintenance: + Some OS/VM instances (e.g. COS GCP Image) mount filesystems + with COS flag which prevents execution of the Unity scene, + to get around this, we will copy the executable into the + container. + """ + # Navigate in docker path and find env_path and copy it. + env_path = prepare_for_docker_run(docker_target_name, + env_path) + return UnityEnvironment( + file_name=env_path, + worker_id=worker_id, + seed=seed, + docker_training=docker_training, + no_graphics=no_graphics + ) + + +def main(): + try: + print(''' + + ▄▄▄▓▓▓▓ + ╓▓▓▓▓▓▓█▓▓▓▓▓ + ,▄▄▄m▀▀▀' ,▓▓▓▀▓▓▄ ▓▓▓ ▓▓▌ + ▄▓▓▓▀' ▄▓▓▀ ▓▓▓ ▄▄ ▄▄ ,▄▄ ▄▄▄▄ ,▄▄ ▄▓▓▌▄ ▄▄▄ ,▄▄ + ▄▓▓▓▀ ▄▓▓▀ ▐▓▓▌ ▓▓▌ ▐▓▓ ▐▓▓▓▀▀▀▓▓▌ ▓▓▓ ▀▓▓▌▀ ^▓▓▌ ╒▓▓▌ + ▄▓▓▓▓▓▄▄▄▄▄▄▄▄▓▓▓ ▓▀ ▓▓▌ ▐▓▓ ▐▓▓ ▓▓▓ ▓▓▓ ▓▓▌ ▐▓▓▄ ▓▓▌ + ▀▓▓▓▓▀▀▀▀▀▀▀▀▀▀▓▓▄ ▓▓ ▓▓▌ ▐▓▓ ▐▓▓ ▓▓▓ ▓▓▓ ▓▓▌ ▐▓▓▐▓▓ + ^█▓▓▓ ▀▓▓▄ ▐▓▓▌ ▓▓▓▓▄▓▓▓▓ ▐▓▓ ▓▓▓ ▓▓▓ ▓▓▓▄ ▓▓▓▓` + '▀▓▓▓▄ ^▓▓▓ ▓▓▓ └▀▀▀▀ ▀▀ ^▀▀ `▀▀ `▀▀ '▀▀ ▐▓▓▌ + ▀▀▀▀▓▄▄▄ ▓▓▓▓▓▓, ▓▓▓▓▀ + `▀█▓▓▓▓▓▓▓▓▓▌ + ¬`▀▀▀█▓ + + ''') + except: + print('\n\n\tUnity Technologies\n') + + logger = logging.getLogger('mlagents.trainers') + _USAGE = ''' + Usage: + mlagents-learn [options] + mlagents-learn --help + + Options: + --env= Name of the Unity executable [default: None]. + --curriculum= Curriculum json directory for environment [default: None]. + --keep-checkpoints= How many model checkpoints to keep [default: 5]. + --lesson= Start learning from this lesson [default: 0]. + --load Whether to load the model or randomly initialize [default: False]. + --run-id= The directory name for model and summary statistics [default: ppo]. + --num-runs= Number of concurrent training sessions [default: 1]. + --save-freq= Frequency at which to save model [default: 50000]. + --seed= Random seed used for training [default: -1]. + --slow Whether to run the game at training speed [default: False]. + --train Whether to train model, or only run inference [default: False]. + --worker-id= Number to add to communication port (5005) [default: 0]. + --docker-target-name=
Docker volume to store training-specific files [default: None]. + --no-graphics Whether to run the environment in no-graphics mode [default: False]. + ''' + + options = docopt(_USAGE) + logger.info(options) + num_runs = int(options['--num-runs']) + seed = int(options['--seed']) + + if options['--env'] == 'None' and num_runs > 1: + raise TrainerError('It is not possible to launch more than one concurrent training session ' + 'when training from the editor.') + + jobs = [] + run_seed = seed + + if num_runs == 1: + if seed == -1: + run_seed = np.random.randint(0, 10000) + run_training(0, run_seed, options, Queue()) + else: + for i in range(num_runs): + if seed == -1: + run_seed = np.random.randint(0, 10000) + process_queue = Queue() + p = Process(target=run_training, args=(i, run_seed, options, process_queue)) + jobs.append(p) + p.start() + # Wait for signal that environment has successfully launched + while process_queue.get() is not True: + continue + +# For python debugger to directly run this script +if __name__ == "__main__": + main() diff --git a/animalai_packages/animalai_train/animalai_train/trainers/meta_curriculum.py b/animalai_packages/animalai_train/animalai_train/trainers/meta_curriculum.py new file mode 100644 index 00000000..9809a887 --- /dev/null +++ b/animalai_packages/animalai_train/animalai_train/trainers/meta_curriculum.py @@ -0,0 +1,147 @@ +"""Contains the MetaCurriculum class.""" + +import os +from animalai_train.trainers.curriculum import Curriculum +from animalai_train.trainers.exception import MetaCurriculumError + +import logging + +logger = logging.getLogger('mlagents.trainers') + + +class MetaCurriculum(object): + """A MetaCurriculum holds curriculums. Each curriculum is associated to a + particular brain in the environment. + """ + + def __init__(self, curriculum_folder, default_reset_parameters): + """Initializes a MetaCurriculum object. + + Args: + curriculum_folder (str): The relative or absolute path of the + folder which holds the curriculums for this environment. + The folder should contain JSON files whose names are the + brains that the curriculums belong to. + default_reset_parameters (dict): The default reset parameters + of the environment. + """ + used_reset_parameters = set() + self._brains_to_curriculums = {} + + try: + for curriculum_filename in os.listdir(curriculum_folder): + brain_name = curriculum_filename.split('.')[0] + curriculum_filepath = \ + os.path.join(curriculum_folder, curriculum_filename) + curriculum = Curriculum(curriculum_filepath, + default_reset_parameters) + + # Check if any two curriculums use the same reset params. + if any([(parameter in curriculum.get_config().keys()) + for parameter in used_reset_parameters]): + logger.warning('Two or more curriculums will ' + 'attempt to change the same reset ' + 'parameter. The result will be ' + 'non-deterministic.') + + used_reset_parameters.update(curriculum.get_config().keys()) + self._brains_to_curriculums[brain_name] = curriculum + except NotADirectoryError: + raise MetaCurriculumError(curriculum_folder + ' is not a ' + 'directory. Refer to the ML-Agents ' + 'curriculum learning docs.') + + + @property + def brains_to_curriculums(self): + """A dict from brain_name to the brain's curriculum.""" + return self._brains_to_curriculums + + @property + def lesson_nums(self): + """A dict from brain name to the brain's curriculum's lesson number.""" + lesson_nums = {} + for brain_name, curriculum in self.brains_to_curriculums.items(): + lesson_nums[brain_name] = curriculum.lesson_num + + return lesson_nums + + @lesson_nums.setter + def lesson_nums(self, lesson_nums): + for brain_name, lesson in lesson_nums.items(): + self.brains_to_curriculums[brain_name].lesson_num = lesson + + def _lesson_ready_to_increment(self, brain_name, reward_buff_size): + """Determines whether the curriculum of a specified brain is ready + to attempt an increment. + + Args: + brain_name (str): The name of the brain whose curriculum will be + checked for readiness. + reward_buff_size (int): The size of the reward buffer of the trainer + that corresponds to the specified brain. + + Returns: + Whether the curriculum of the specified brain should attempt to + increment its lesson. + """ + return reward_buff_size >= (self.brains_to_curriculums[brain_name] + .min_lesson_length) + + def increment_lessons(self, measure_vals, reward_buff_sizes=None): + """Attempts to increments all the lessons of all the curriculums in this + MetaCurriculum. Note that calling this method does not guarantee the + lesson of a curriculum will increment. The lesson of a curriculum will + only increment if the specified measure threshold defined in the + curriculum has been reached and the minimum number of episodes in the + lesson have been completed. + + Args: + measure_vals (dict): A dict of brain name to measure value. + reward_buff_sizes (dict): A dict of brain names to the size of their + corresponding reward buffers. + + Returns: + A dict from brain name to whether that brain's lesson number was + incremented. + """ + ret = {} + if reward_buff_sizes: + for brain_name, buff_size in reward_buff_sizes.items(): + if self._lesson_ready_to_increment(brain_name, buff_size): + measure_val = measure_vals[brain_name] + ret[brain_name] = (self.brains_to_curriculums[brain_name] + .increment_lesson(measure_val)) + else: + for brain_name, measure_val in measure_vals.items(): + ret[brain_name] = (self.brains_to_curriculums[brain_name] + .increment_lesson(measure_val)) + return ret + + + def set_all_curriculums_to_lesson_num(self, lesson_num): + """Sets all the curriculums in this meta curriculum to a specified + lesson number. + + Args: + lesson_num (int): The lesson number which all the curriculums will + be set to. + """ + for _, curriculum in self.brains_to_curriculums.items(): + curriculum.lesson_num = lesson_num + + + def get_config(self): + """Get the combined configuration of all curriculums in this + MetaCurriculum. + + Returns: + A dict from parameter to value. + """ + config = {} + + for _, curriculum in self.brains_to_curriculums.items(): + curr_config = curriculum.get_config() + config.update(curr_config) + + return config diff --git a/animalai_packages/animalai_train/animalai_train/trainers/models.py b/animalai_packages/animalai_train/animalai_train/trainers/models.py new file mode 100644 index 00000000..66c6cd71 --- /dev/null +++ b/animalai_packages/animalai_train/animalai_train/trainers/models.py @@ -0,0 +1,380 @@ +import logging + +import numpy as np +import tensorflow as tf +import tensorflow.contrib.layers as c_layers + +logger = logging.getLogger("mlagents.envs") + + +class LearningModel(object): + _version_number_ = 2 + + def __init__(self, m_size, normalize, use_recurrent, brain, seed): + tf.set_random_seed(seed) + self.brain = brain + self.vector_in = None + self.global_step, self.increment_step = self.create_global_steps() + self.visual_in = [] + self.batch_size = tf.placeholder(shape=None, dtype=tf.int32, name='batch_size') + self.sequence_length = tf.placeholder(shape=None, dtype=tf.int32, name='sequence_length') + self.mask_input = tf.placeholder(shape=[None], dtype=tf.float32, name='masks') + self.mask = tf.cast(self.mask_input, tf.int32) + self.use_recurrent = use_recurrent + if self.use_recurrent: + self.m_size = m_size + else: + self.m_size = 0 + self.normalize = normalize + self.act_size = brain.vector_action_space_size + self.vec_obs_size = brain.vector_observation_space_size * \ + brain.num_stacked_vector_observations + self.vis_obs_size = brain.number_visual_observations + tf.Variable(int(brain.vector_action_space_type == 'continuous'), + name='is_continuous_control', trainable=False, dtype=tf.int32) + tf.Variable(self._version_number_, name='version_number', trainable=False, dtype=tf.int32) + tf.Variable(self.m_size, name="memory_size", trainable=False, dtype=tf.int32) + if brain.vector_action_space_type == 'continuous': + tf.Variable(self.act_size[0], name="action_output_shape", trainable=False, dtype=tf.int32) + else: + tf.Variable(sum(self.act_size), name="action_output_shape", trainable=False, dtype=tf.int32) + + @staticmethod + def create_global_steps(): + """Creates TF ops to track and increment global training step.""" + global_step = tf.Variable(0, name="global_step", trainable=False, dtype=tf.int32) + increment_step = tf.assign(global_step, tf.add(global_step, 1)) + return global_step, increment_step + + @staticmethod + def swish(input_activation): + """Swish activation function. For more info: https://arxiv.org/abs/1710.05941""" + return tf.multiply(input_activation, tf.nn.sigmoid(input_activation)) + + @staticmethod + def create_visual_input(camera_parameters, name): + """ + Creates image input op. + :param camera_parameters: Parameters for visual observation from BrainInfo. + :param name: Desired name of input op. + :return: input op. + """ + o_size_h = camera_parameters['height'] + o_size_w = camera_parameters['width'] + bw = camera_parameters['blackAndWhite'] + + if bw: + c_channels = 1 + else: + c_channels = 3 + + visual_in = tf.placeholder(shape=[None, o_size_h, o_size_w, c_channels], dtype=tf.float32, + name=name) + return visual_in + + def create_vector_input(self, name='vector_observation'): + """ + Creates ops for vector observation input. + :param name: Name of the placeholder op. + :param vec_obs_size: Size of stacked vector observation. + :return: + """ + self.vector_in = tf.placeholder(shape=[None, self.vec_obs_size], dtype=tf.float32, + name=name) + if self.normalize: + self.running_mean = tf.get_variable("running_mean", [self.vec_obs_size], + trainable=False, dtype=tf.float32, + initializer=tf.zeros_initializer()) + self.running_variance = tf.get_variable("running_variance", [self.vec_obs_size], + trainable=False, + dtype=tf.float32, + initializer=tf.ones_initializer()) + self.update_mean, self.update_variance = self.create_normalizer_update(self.vector_in) + + self.normalized_state = tf.clip_by_value((self.vector_in - self.running_mean) / tf.sqrt( + self.running_variance / (tf.cast(self.global_step, tf.float32) + 1)), -5, 5, + name="normalized_state") + return self.normalized_state + else: + return self.vector_in + + def create_normalizer_update(self, vector_input): + mean_current_observation = tf.reduce_mean(vector_input, axis=0) + new_mean = self.running_mean + (mean_current_observation - self.running_mean) / \ + tf.cast(tf.add(self.global_step, 1), tf.float32) + new_variance = self.running_variance + (mean_current_observation - new_mean) * \ + (mean_current_observation - self.running_mean) + update_mean = tf.assign(self.running_mean, new_mean) + update_variance = tf.assign(self.running_variance, new_variance) + return update_mean, update_variance + + @staticmethod + def create_vector_observation_encoder(observation_input, h_size, activation, num_layers, scope, + reuse): + """ + Builds a set of hidden state encoders. + :param reuse: Whether to re-use the weights within the same scope. + :param scope: Graph scope for the encoder ops. + :param observation_input: Input vector. + :param h_size: Hidden layer size. + :param activation: What type of activation function to use for layers. + :param num_layers: number of hidden layers to create. + :return: List of hidden layer tensors. + """ + with tf.variable_scope(scope): + hidden = observation_input + for i in range(num_layers): + hidden = tf.layers.dense(hidden, h_size, activation=activation, reuse=reuse, + name="hidden_{}".format(i), + kernel_initializer=c_layers.variance_scaling_initializer( + 1.0)) + return hidden + + def create_visual_observation_encoder(self, image_input, h_size, activation, num_layers, scope, + reuse): + """ + Builds a set of visual (CNN) encoders. + :param reuse: Whether to re-use the weights within the same scope. + :param scope: The scope of the graph within which to create the ops. + :param image_input: The placeholder for the image input to use. + :param h_size: Hidden layer size. + :param activation: What type of activation function to use for layers. + :param num_layers: number of hidden layers to create. + :return: List of hidden layer tensors. + """ + with tf.variable_scope(scope): + conv1 = tf.layers.conv2d(image_input, 16, kernel_size=[8, 8], strides=[4, 4], + activation=tf.nn.elu, reuse=reuse, name="conv_1") + conv2 = tf.layers.conv2d(conv1, 32, kernel_size=[4, 4], strides=[2, 2], + activation=tf.nn.elu, reuse=reuse, name="conv_2") + hidden = c_layers.flatten(conv2) + + with tf.variable_scope(scope + '/' + 'flat_encoding'): + hidden_flat = self.create_vector_observation_encoder(hidden, h_size, activation, + num_layers, scope, reuse) + return hidden_flat + + @staticmethod + def create_discrete_action_masking_layer(all_logits, action_masks, action_size): + """ + Creates a masking layer for the discrete actions + :param all_logits: The concatenated unnormalized action probabilities for all branches + :param action_masks: The mask for the logits. Must be of dimension [None x total_number_of_action] + :param action_size: A list containing the number of possible actions for each branch + :return: The action output dimension [batch_size, num_branches] and the concatenated normalized logits + """ + action_idx = [0] + list(np.cumsum(action_size)) + branches_logits = [all_logits[:, action_idx[i]:action_idx[i + 1]] for i in range(len(action_size))] + branch_masks = [action_masks[:, action_idx[i]:action_idx[i + 1]] for i in range(len(action_size))] + raw_probs = [tf.multiply(tf.nn.softmax(branches_logits[k]) + 1.0e-10, branch_masks[k]) + for k in range(len(action_size))] + normalized_probs = [ + tf.divide(raw_probs[k], tf.reduce_sum(raw_probs[k], axis=1, keepdims=True)) + for k in range(len(action_size))] + output = tf.concat([tf.multinomial(tf.log(normalized_probs[k]), 1) for k in range(len(action_size))], axis=1) + return output, tf.concat([tf.log(normalized_probs[k] + 1.0e-10) for k in range(len(action_size))], axis=1) + + def create_observation_streams(self, num_streams, h_size, num_layers): + """ + Creates encoding stream for observations. + :param num_streams: Number of streams to create. + :param h_size: Size of hidden linear layers in stream. + :param num_layers: Number of hidden linear layers in stream. + :return: List of encoded streams. + """ + brain = self.brain + activation_fn = self.swish + + self.visual_in = [] + for i in range(brain.number_visual_observations): + visual_input = self.create_visual_input(brain.camera_resolutions[i], + name="visual_observation_" + str(i)) + self.visual_in.append(visual_input) + vector_observation_input = self.create_vector_input() + + final_hiddens = [] + for i in range(num_streams): + visual_encoders = [] + hidden_state, hidden_visual = None, None + if self.vis_obs_size > 0: + for j in range(brain.number_visual_observations): + encoded_visual = self.create_visual_observation_encoder(self.visual_in[j], + h_size, + activation_fn, + num_layers, + "main_graph_{}_encoder{}" + .format(i, j), False) + visual_encoders.append(encoded_visual) + hidden_visual = tf.concat(visual_encoders, axis=1) + if brain.vector_observation_space_size > 0: + hidden_state = self.create_vector_observation_encoder(vector_observation_input, + h_size, activation_fn, + num_layers, + "main_graph_{}".format(i), + False) + if hidden_state is not None and hidden_visual is not None: + final_hidden = tf.concat([hidden_visual, hidden_state], axis=1) + elif hidden_state is None and hidden_visual is not None: + final_hidden = hidden_visual + elif hidden_state is not None and hidden_visual is None: + final_hidden = hidden_state + else: + raise Exception("No valid network configuration possible. " + "There are no states or observations in this brain") + final_hiddens.append(final_hidden) + return final_hiddens + + @staticmethod + def create_recurrent_encoder(input_state, memory_in, sequence_length, name='lstm'): + """ + Builds a recurrent encoder for either state or observations (LSTM). + :param sequence_length: Length of sequence to unroll. + :param input_state: The input tensor to the LSTM cell. + :param memory_in: The input memory to the LSTM cell. + :param name: The scope of the LSTM cell. + """ + s_size = input_state.get_shape().as_list()[1] + m_size = memory_in.get_shape().as_list()[1] + lstm_input_state = tf.reshape(input_state, shape=[-1, sequence_length, s_size]) + memory_in = tf.reshape(memory_in[:, :], [-1, m_size]) + _half_point = int(m_size / 2) + with tf.variable_scope(name): + rnn_cell = tf.contrib.rnn.BasicLSTMCell(_half_point) + lstm_vector_in = tf.contrib.rnn.LSTMStateTuple(memory_in[:, :_half_point], + memory_in[:, _half_point:]) + recurrent_output, lstm_state_out = tf.nn.dynamic_rnn(rnn_cell, lstm_input_state, + initial_state=lstm_vector_in) + + recurrent_output = tf.reshape(recurrent_output, shape=[-1, _half_point]) + return recurrent_output, tf.concat([lstm_state_out.c, lstm_state_out.h], axis=1) + + def create_cc_actor_critic(self, h_size, num_layers): + """ + Creates Continuous control actor-critic model. + :param h_size: Size of hidden linear layers. + :param num_layers: Number of hidden linear layers. + """ + hidden_streams = self.create_observation_streams(2, h_size, num_layers) + + if self.use_recurrent: + self.memory_in = tf.placeholder(shape=[None, self.m_size], dtype=tf.float32, + name='recurrent_in') + _half_point = int(self.m_size / 2) + hidden_policy, memory_policy_out = self.create_recurrent_encoder( + hidden_streams[0], self.memory_in[:, :_half_point], self.sequence_length, + name='lstm_policy') + + hidden_value, memory_value_out = self.create_recurrent_encoder( + hidden_streams[1], self.memory_in[:, _half_point:], self.sequence_length, + name='lstm_value') + self.memory_out = tf.concat([memory_policy_out, memory_value_out], axis=1, + name='recurrent_out') + else: + hidden_policy = hidden_streams[0] + hidden_value = hidden_streams[1] + + mu = tf.layers.dense(hidden_policy, self.act_size[0], activation=None, + kernel_initializer=c_layers.variance_scaling_initializer(factor=0.01)) + + log_sigma_sq = tf.get_variable("log_sigma_squared", [self.act_size[0]], dtype=tf.float32, + initializer=tf.zeros_initializer()) + + sigma_sq = tf.exp(log_sigma_sq) + + self.epsilon = tf.placeholder(shape=[None, self.act_size[0]], dtype=tf.float32, name='epsilon') + # Clip and scale output to ensure actions are always within [-1, 1] range. + self.output_pre = mu + tf.sqrt(sigma_sq) * self.epsilon + output_post = tf.clip_by_value(self.output_pre, -3, 3) / 3 + self.output = tf.identity(output_post, name='action') + self.selected_actions = tf.stop_gradient(output_post) + + # Compute probability of model output. + all_probs = - 0.5 * tf.square(tf.stop_gradient(self.output_pre) - mu) / sigma_sq \ + - 0.5 * tf.log(2.0 * np.pi) - 0.5 * log_sigma_sq + + self.all_log_probs = tf.identity(all_probs, name='action_probs') + + self.entropy = 0.5 * tf.reduce_mean(tf.log(2 * np.pi * np.e) + log_sigma_sq) + + value = tf.layers.dense(hidden_value, 1, activation=None) + self.value = tf.identity(value, name="value_estimate") + + self.all_old_log_probs = tf.placeholder(shape=[None, self.act_size[0]], dtype=tf.float32, + name='old_probabilities') + + # We keep these tensors the same name, but use new nodes to keep code parallelism with discrete control. + self.log_probs = tf.reduce_sum((tf.identity(self.all_log_probs)), axis=1, keepdims=True) + self.old_log_probs = tf.reduce_sum((tf.identity(self.all_old_log_probs)), axis=1, + keepdims=True) + + def create_dc_actor_critic(self, h_size, num_layers): + """ + Creates Discrete control actor-critic model. + :param h_size: Size of hidden linear layers. + :param num_layers: Number of hidden linear layers. + """ + hidden_streams = self.create_observation_streams(1, h_size, num_layers) + hidden = hidden_streams[0] + + if self.use_recurrent: + self.prev_action = tf.placeholder(shape=[None, len(self.act_size)], dtype=tf.int32, + name='prev_action') + prev_action_oh = tf.concat([ + tf.one_hot(self.prev_action[:, i], self.act_size[i]) for i in + range(len(self.act_size))], axis=1) + hidden = tf.concat([hidden, prev_action_oh], axis=1) + + self.memory_in = tf.placeholder(shape=[None, self.m_size], dtype=tf.float32, + name='recurrent_in') + hidden, memory_out = self.create_recurrent_encoder(hidden, self.memory_in, + self.sequence_length) + self.memory_out = tf.identity(memory_out, name='recurrent_out') + + policy_branches = [] + for size in self.act_size: + policy_branches.append(tf.layers.dense(hidden, size, activation=None, use_bias=False, + kernel_initializer=c_layers.variance_scaling_initializer(factor=0.01))) + + self.all_log_probs = tf.concat([branch for branch in policy_branches], axis=1, name="action_probs") + + self.action_masks = tf.placeholder(shape=[None, sum(self.act_size)], dtype=tf.float32, name="action_masks") + output, normalized_logits = self.create_discrete_action_masking_layer( + self.all_log_probs, self.action_masks, self.act_size) + + self.output = tf.identity(output) + self.normalized_logits = tf.identity(normalized_logits, name='action') + + value = tf.layers.dense(hidden, 1, activation=None) + self.value = tf.identity(value, name="value_estimate") + + self.action_holder = tf.placeholder( + shape=[None, len(policy_branches)], dtype=tf.int32, name="action_holder") + self.action_oh = tf.concat([ + tf.one_hot(self.action_holder[:, i], self.act_size[i]) for i in range(len(self.act_size))], axis=1) + self.selected_actions = tf.stop_gradient(self.action_oh) + + self.all_old_log_probs = tf.placeholder( + shape=[None, sum(self.act_size)], dtype=tf.float32, name='old_probabilities') + _, old_normalized_logits = self.create_discrete_action_masking_layer( + self.all_old_log_probs, self.action_masks, self.act_size) + + action_idx = [0] + list(np.cumsum(self.act_size)) + + self.entropy = tf.reduce_sum((tf.stack([ + tf.nn.softmax_cross_entropy_with_logits_v2( + labels=tf.nn.softmax(self.all_log_probs[:, action_idx[i]:action_idx[i + 1]]), + logits=self.all_log_probs[:, action_idx[i]:action_idx[i + 1]]) + for i in range(len(self.act_size))], axis=1)), axis=1) + + self.log_probs = tf.reduce_sum((tf.stack([ + -tf.nn.softmax_cross_entropy_with_logits_v2( + labels=self.action_oh[:, action_idx[i]:action_idx[i + 1]], + logits=normalized_logits[:, action_idx[i]:action_idx[i + 1]] + ) + for i in range(len(self.act_size))], axis=1)), axis=1, keepdims=True) + self.old_log_probs = tf.reduce_sum((tf.stack([ + -tf.nn.softmax_cross_entropy_with_logits_v2( + labels=self.action_oh[:, action_idx[i]:action_idx[i + 1]], + logits=old_normalized_logits[:, action_idx[i]:action_idx[i + 1]] + ) + for i in range(len(self.act_size))], axis=1)), axis=1, keepdims=True) diff --git a/animalai_packages/animalai_train/animalai_train/trainers/policy.py b/animalai_packages/animalai_train/animalai_train/trainers/policy.py new file mode 100644 index 00000000..dd23940a --- /dev/null +++ b/animalai_packages/animalai_train/animalai_train/trainers/policy.py @@ -0,0 +1,212 @@ +import logging +import numpy as np +import tensorflow as tf + +from animalai_train.trainers import UnityException +from tensorflow.python.tools import freeze_graph +from animalai_train.trainers import tensorflow_to_barracuda as tf2bc + +logger = logging.getLogger("mlagents.trainers") + + +class UnityPolicyException(UnityException): + """ + Related to errors with the Trainer. + """ + pass + + +class Policy(object): + """ + Contains a learning model, and the necessary + functions to interact with it to perform evaluate and updating. + """ + possible_output_nodes = ['action', 'value_estimate', + 'action_probs', 'recurrent_out', 'memory_size', + 'version_number', 'is_continuous_control', + 'action_output_shape'] + + def __init__(self, seed, brain, trainer_parameters): + """ + Initialized the policy. + :param seed: Random seed to use for TensorFlow. + :param brain: The corresponding Brain for this policy. + :param trainer_parameters: The trainer parameters. + """ + self.m_size = None + self.model = None + self.inference_dict = {} + self.update_dict = {} + self.sequence_length = 1 + self.seed = seed + self.brain = brain + self.use_recurrent = trainer_parameters["use_recurrent"] + self.use_continuous_act = (brain.vector_action_space_type == "continuous") + self.model_path = trainer_parameters["model_path"] + self.keep_checkpoints = trainer_parameters.get("keep_checkpoints", 5) + self.graph = tf.Graph() + config = tf.ConfigProto() + config.gpu_options.allow_growth = True + self.sess = tf.Session(config=config, graph=self.graph) + self.saver = None + if self.use_recurrent: + self.m_size = trainer_parameters["memory_size"] + self.sequence_length = trainer_parameters["sequence_length"] + if self.m_size == 0: + raise UnityPolicyException("The memory size for brain {0} is 0 even " + "though the trainer uses recurrent." + .format(brain.brain_name)) + elif self.m_size % 4 != 0: + raise UnityPolicyException("The memory size for brain {0} is {1} " + "but it must be divisible by 4." + .format(brain.brain_name, self.m_size)) + + def _initialize_graph(self): + with self.graph.as_default(): + self.saver = tf.train.Saver(max_to_keep=self.keep_checkpoints) + init = tf.global_variables_initializer() + self.sess.run(init) + + def _load_graph(self): + with self.graph.as_default(): + self.saver = tf.train.Saver(max_to_keep=self.keep_checkpoints) + logger.info('Loading Model for brain {}'.format(self.brain.brain_name)) + ckpt = tf.train.get_checkpoint_state(self.model_path) + if ckpt is None: + logger.info('The model {0} could not be found. Make ' + 'sure you specified the right ' + '--run-id' + .format(self.model_path)) + self.saver.restore(self.sess, ckpt.model_checkpoint_path) + + def evaluate(self, brain_info): + """ + Evaluates policy for the agent experiences provided. + :param brain_info: BrainInfo input to network. + :return: Output from policy based on self.inference_dict. + """ + raise UnityPolicyException("The evaluate function was not implemented.") + + def update(self, mini_batch, num_sequences): + """ + Performs update of the policy. + :param num_sequences: Number of experience trajectories in batch. + :param mini_batch: Batch of experiences. + :return: Results of update. + """ + raise UnityPolicyException("The update function was not implemented.") + + def _execute_model(self, feed_dict, out_dict): + """ + Executes model. + :param feed_dict: Input dictionary mapping nodes to input data. + :param out_dict: Output dictionary mapping names to nodes. + :return: Dictionary mapping names to input data. + """ + network_out = self.sess.run(list(out_dict.values()), feed_dict=feed_dict) + run_out = dict(zip(list(out_dict.keys()), network_out)) + return run_out + + def _fill_eval_dict(self, feed_dict, brain_info): + for i, _ in enumerate(brain_info.visual_observations): + feed_dict[self.model.visual_in[i]] = brain_info.visual_observations[i] + if self.use_vec_obs: + feed_dict[self.model.vector_in] = brain_info.vector_observations + if not self.use_continuous_act: + feed_dict[self.model.action_masks] = brain_info.action_masks + return feed_dict + + def make_empty_memory(self, num_agents): + """ + Creates empty memory for use with RNNs + :param num_agents: Number of agents. + :return: Numpy array of zeros. + """ + return np.zeros((num_agents, self.m_size)) + + def get_current_step(self): + """ + Gets current model step. + :return: current model step. + """ + step = self.sess.run(self.model.global_step) + return step + + def increment_step(self): + """ + Increments model step. + """ + self.sess.run(self.model.increment_step) + + def get_inference_vars(self): + """ + :return:list of inference var names + """ + return list(self.inference_dict.keys()) + + def get_update_vars(self): + """ + :return:list of update var names + """ + return list(self.update_dict.keys()) + + def save_model(self, steps): + """ + Saves the model + :param steps: The number of steps the model was trained for + :return: + """ + with self.graph.as_default(): + last_checkpoint = self.model_path + '/model-' + str(steps) + '.cptk' + self.saver.save(self.sess, last_checkpoint) + tf.train.write_graph(self.graph, self.model_path, + 'raw_graph_def.pb', as_text=False) + + def export_model(self): + """ + Exports latest saved model to .nn format for Unity embedding. + """ + + with self.graph.as_default(): + target_nodes = ','.join(self._process_graph()) + ckpt = tf.train.get_checkpoint_state(self.model_path) + freeze_graph.freeze_graph( + input_graph=self.model_path + '/raw_graph_def.pb', + input_binary=True, + input_checkpoint=ckpt.model_checkpoint_path, + output_node_names=target_nodes, + output_graph=(self.model_path + '/frozen_graph_def.pb'), + clear_devices=True, initializer_nodes='', input_saver='', + restore_op_name='save/restore_all', + filename_tensor_name='save/Const:0') + + tf2bc.convert(self.model_path + '/frozen_graph_def.pb', self.model_path + '.nn') + logger.info('Exported ' + self.model_path + '.nn file') + + def _process_graph(self): + """ + Gets the list of the output nodes present in the graph for inference + :return: list of node names + """ + all_nodes = [x.name for x in self.graph.as_graph_def().node] + nodes = [x for x in all_nodes if x in self.possible_output_nodes] + logger.info('List of nodes to export for brain :' + self.brain.brain_name) + for n in nodes: + logger.info('\t' + n) + return nodes + + @property + def vis_obs_size(self): + return self.model.vis_obs_size + + @property + def vec_obs_size(self): + return self.model.vec_obs_size + + @property + def use_vis_obs(self): + return self.model.vis_obs_size > 0 + + @property + def use_vec_obs(self): + return self.model.vec_obs_size > 0 diff --git a/animalai_packages/animalai_train/animalai_train/trainers/ppo/__init__.py b/animalai_packages/animalai_train/animalai_train/trainers/ppo/__init__.py new file mode 100644 index 00000000..d48a8ccf --- /dev/null +++ b/animalai_packages/animalai_train/animalai_train/trainers/ppo/__init__.py @@ -0,0 +1,3 @@ +from .models import * +from .trainer import * +from .policy import * diff --git a/animalai_packages/animalai_train/animalai_train/trainers/ppo/models.py b/animalai_packages/animalai_train/animalai_train/trainers/ppo/models.py new file mode 100644 index 00000000..519dfb50 --- /dev/null +++ b/animalai_packages/animalai_train/animalai_train/trainers/ppo/models.py @@ -0,0 +1,195 @@ +import logging +import numpy as np + +import tensorflow as tf +from animalai_train.trainers.models import LearningModel + +logger = logging.getLogger("mlagents.envs") + + +class PPOModel(LearningModel): + def __init__(self, brain, lr=1e-4, h_size=128, epsilon=0.2, beta=1e-3, max_step=5e6, + normalize=False, use_recurrent=False, num_layers=2, m_size=None, use_curiosity=False, + curiosity_strength=0.01, curiosity_enc_size=128, seed=0): + """ + Takes a Unity environment and model-specific hyper-parameters and returns the + appropriate PPO agent model for the environment. + :param brain: BrainInfo used to generate specific network graph. + :param lr: Learning rate. + :param h_size: Size of hidden layers + :param epsilon: Value for policy-divergence threshold. + :param beta: Strength of entropy regularization. + :return: a sub-class of PPOAgent tailored to the environment. + :param max_step: Total number of training steps. + :param normalize: Whether to normalize vector observation input. + :param use_recurrent: Whether to use an LSTM layer in the network. + :param num_layers Number of hidden layers between encoded input and policy & value layers + :param m_size: Size of brain memory. + """ + LearningModel.__init__(self, m_size, normalize, use_recurrent, brain, seed) + self.use_curiosity = use_curiosity + if num_layers < 1: + num_layers = 1 + self.last_reward, self.new_reward, self.update_reward = self.create_reward_encoder() + if brain.vector_action_space_type == "continuous": + self.create_cc_actor_critic(h_size, num_layers) + self.entropy = tf.ones_like(tf.reshape(self.value, [-1])) * self.entropy + else: + self.create_dc_actor_critic(h_size, num_layers) + if self.use_curiosity: + self.curiosity_enc_size = curiosity_enc_size + self.curiosity_strength = curiosity_strength + encoded_state, encoded_next_state = self.create_curiosity_encoders() + self.create_inverse_model(encoded_state, encoded_next_state) + self.create_forward_model(encoded_state, encoded_next_state) + self.create_ppo_optimizer(self.log_probs, self.old_log_probs, self.value, + self.entropy, beta, epsilon, lr, max_step) + + @staticmethod + def create_reward_encoder(): + """Creates TF ops to track and increment recent average cumulative reward.""" + last_reward = tf.Variable(0, name="last_reward", trainable=False, dtype=tf.float32) + new_reward = tf.placeholder(shape=[], dtype=tf.float32, name='new_reward') + update_reward = tf.assign(last_reward, new_reward) + return last_reward, new_reward, update_reward + + def create_curiosity_encoders(self): + """ + Creates state encoders for current and future observations. + Used for implementation of Curiosity-driven Exploration by Self-supervised Prediction + See https://arxiv.org/abs/1705.05363 for more details. + :return: current and future state encoder tensors. + """ + encoded_state_list = [] + encoded_next_state_list = [] + + if self.vis_obs_size > 0: + self.next_visual_in = [] + visual_encoders = [] + next_visual_encoders = [] + for i in range(self.vis_obs_size): + # Create input ops for next (t+1) visual observations. + next_visual_input = self.create_visual_input(self.brain.camera_resolutions[i], + name="next_visual_observation_" + str(i)) + self.next_visual_in.append(next_visual_input) + + # Create the encoder ops for current and next visual input. Not that these encoders are siamese. + encoded_visual = self.create_visual_observation_encoder(self.visual_in[i], self.curiosity_enc_size, + self.swish, 1, "stream_{}_visual_obs_encoder" + .format(i), False) + + encoded_next_visual = self.create_visual_observation_encoder(self.next_visual_in[i], + self.curiosity_enc_size, + self.swish, 1, + "stream_{}_visual_obs_encoder".format(i), + True) + visual_encoders.append(encoded_visual) + next_visual_encoders.append(encoded_next_visual) + + hidden_visual = tf.concat(visual_encoders, axis=1) + hidden_next_visual = tf.concat(next_visual_encoders, axis=1) + encoded_state_list.append(hidden_visual) + encoded_next_state_list.append(hidden_next_visual) + + if self.vec_obs_size > 0: + # Create the encoder ops for current and next vector input. Not that these encoders are siamese. + # Create input op for next (t+1) vector observation. + self.next_vector_in = tf.placeholder(shape=[None, self.vec_obs_size], dtype=tf.float32, + name='next_vector_observation') + + encoded_vector_obs = self.create_vector_observation_encoder(self.vector_in, + self.curiosity_enc_size, + self.swish, 2, "vector_obs_encoder", + False) + encoded_next_vector_obs = self.create_vector_observation_encoder(self.next_vector_in, + self.curiosity_enc_size, + self.swish, 2, + "vector_obs_encoder", + True) + encoded_state_list.append(encoded_vector_obs) + encoded_next_state_list.append(encoded_next_vector_obs) + + encoded_state = tf.concat(encoded_state_list, axis=1) + encoded_next_state = tf.concat(encoded_next_state_list, axis=1) + return encoded_state, encoded_next_state + + def create_inverse_model(self, encoded_state, encoded_next_state): + """ + Creates inverse model TensorFlow ops for Curiosity module. + Predicts action taken given current and future encoded states. + :param encoded_state: Tensor corresponding to encoded current state. + :param encoded_next_state: Tensor corresponding to encoded next state. + """ + combined_input = tf.concat([encoded_state, encoded_next_state], axis=1) + hidden = tf.layers.dense(combined_input, 256, activation=self.swish) + if self.brain.vector_action_space_type == "continuous": + pred_action = tf.layers.dense(hidden, self.act_size[0], activation=None) + squared_difference = tf.reduce_sum(tf.squared_difference(pred_action, self.selected_actions), axis=1) + self.inverse_loss = tf.reduce_mean(tf.dynamic_partition(squared_difference, self.mask, 2)[1]) + else: + pred_action = tf.concat( + [tf.layers.dense(hidden, self.act_size[i], activation=tf.nn.softmax) + for i in range(len(self.act_size))], axis=1) + cross_entropy = tf.reduce_sum(-tf.log(pred_action + 1e-10) * self.selected_actions, axis=1) + self.inverse_loss = tf.reduce_mean(tf.dynamic_partition(cross_entropy, self.mask, 2)[1]) + + def create_forward_model(self, encoded_state, encoded_next_state): + """ + Creates forward model TensorFlow ops for Curiosity module. + Predicts encoded future state based on encoded current state and given action. + :param encoded_state: Tensor corresponding to encoded current state. + :param encoded_next_state: Tensor corresponding to encoded next state. + """ + combined_input = tf.concat([encoded_state, self.selected_actions], axis=1) + hidden = tf.layers.dense(combined_input, 256, activation=self.swish) + # We compare against the concatenation of all observation streams, hence `self.vis_obs_size + int(self.vec_obs_size > 0)`. + pred_next_state = tf.layers.dense(hidden, self.curiosity_enc_size * (self.vis_obs_size + int(self.vec_obs_size > 0)), + activation=None) + + squared_difference = 0.5 * tf.reduce_sum(tf.squared_difference(pred_next_state, encoded_next_state), axis=1) + self.intrinsic_reward = tf.clip_by_value(self.curiosity_strength * squared_difference, 0, 1) + self.forward_loss = tf.reduce_mean(tf.dynamic_partition(squared_difference, self.mask, 2)[1]) + + def create_ppo_optimizer(self, probs, old_probs, value, entropy, beta, epsilon, lr, max_step): + """ + Creates training-specific Tensorflow ops for PPO models. + :param probs: Current policy probabilities + :param old_probs: Past policy probabilities + :param value: Current value estimate + :param beta: Entropy regularization strength + :param entropy: Current policy entropy + :param epsilon: Value for policy-divergence threshold + :param lr: Learning rate + :param max_step: Total number of training steps. + """ + self.returns_holder = tf.placeholder(shape=[None], dtype=tf.float32, name='discounted_rewards') + self.advantage = tf.placeholder(shape=[None, 1], dtype=tf.float32, name='advantages') + self.learning_rate = tf.train.polynomial_decay(lr, self.global_step, max_step, 1e-10, power=1.0) + + self.old_value = tf.placeholder(shape=[None], dtype=tf.float32, name='old_value_estimates') + + decay_epsilon = tf.train.polynomial_decay(epsilon, self.global_step, max_step, 0.1, power=1.0) + decay_beta = tf.train.polynomial_decay(beta, self.global_step, max_step, 1e-5, power=1.0) + optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate) + + clipped_value_estimate = self.old_value + tf.clip_by_value(tf.reduce_sum(value, axis=1) - self.old_value, + - decay_epsilon, decay_epsilon) + + v_opt_a = tf.squared_difference(self.returns_holder, tf.reduce_sum(value, axis=1)) + v_opt_b = tf.squared_difference(self.returns_holder, clipped_value_estimate) + self.value_loss = tf.reduce_mean(tf.dynamic_partition(tf.maximum(v_opt_a, v_opt_b), self.mask, 2)[1]) + + # Here we calculate PPO policy loss. In continuous control this is done independently for each action gaussian + # and then averaged together. This provides significantly better performance than treating the probability + # as an average of probabilities, or as a joint probability. + r_theta = tf.exp(probs - old_probs) + p_opt_a = r_theta * self.advantage + p_opt_b = tf.clip_by_value(r_theta, 1.0 - decay_epsilon, 1.0 + decay_epsilon) * self.advantage + self.policy_loss = -tf.reduce_mean(tf.dynamic_partition(tf.minimum(p_opt_a, p_opt_b), self.mask, 2)[1]) + + self.loss = self.policy_loss + 0.5 * self.value_loss - decay_beta * tf.reduce_mean( + tf.dynamic_partition(entropy, self.mask, 2)[1]) + + if self.use_curiosity: + self.loss += 10 * (0.2 * self.forward_loss + 0.8 * self.inverse_loss) + self.update_batch = optimizer.minimize(self.loss) diff --git a/animalai_packages/animalai_train/animalai_train/trainers/ppo/policy.py b/animalai_packages/animalai_train/animalai_train/trainers/ppo/policy.py new file mode 100644 index 00000000..33bbba62 --- /dev/null +++ b/animalai_packages/animalai_train/animalai_train/trainers/ppo/policy.py @@ -0,0 +1,214 @@ +import logging +import numpy as np + +from animalai_train.trainers.ppo.models import PPOModel +from animalai_train.trainers.policy import Policy + +logger = logging.getLogger("mlagents.trainers") + + +class PPOPolicy(Policy): + def __init__(self, seed, brain, trainer_params, is_training, load): + """ + Policy for Proximal Policy Optimization Networks. + :param seed: Random seed. + :param brain: Assigned Brain object. + :param trainer_params: Defined training parameters. + :param is_training: Whether the model should be trained. + :param load: Whether a pre-trained model will be loaded or a new one created. + """ + super().__init__(seed, brain, trainer_params) + self.has_updated = False + self.use_curiosity = bool(trainer_params['use_curiosity']) + + with self.graph.as_default(): + self.model = PPOModel(brain, + lr=float(trainer_params['learning_rate']), + h_size=int(trainer_params['hidden_units']), + epsilon=float(trainer_params['epsilon']), + beta=float(trainer_params['beta']), + max_step=float(trainer_params['max_steps']), + normalize=trainer_params['normalize'], + use_recurrent=trainer_params['use_recurrent'], + num_layers=int(trainer_params['num_layers']), + m_size=self.m_size, + use_curiosity=bool(trainer_params['use_curiosity']), + curiosity_strength=float(trainer_params['curiosity_strength']), + curiosity_enc_size=float(trainer_params['curiosity_enc_size']), + seed=seed) + + if load: + self._load_graph() + else: + self._initialize_graph() + + self.inference_dict = {'action': self.model.output, 'log_probs': self.model.all_log_probs, + 'value': self.model.value, 'entropy': self.model.entropy, + 'learning_rate': self.model.learning_rate} + if self.use_continuous_act: + self.inference_dict['pre_action'] = self.model.output_pre + if self.use_recurrent: + self.inference_dict['memory_out'] = self.model.memory_out + if is_training and self.use_vec_obs and trainer_params['normalize']: + self.inference_dict['update_mean'] = self.model.update_mean + self.inference_dict['update_variance'] = self.model.update_variance + + self.update_dict = {'value_loss': self.model.value_loss, + 'policy_loss': self.model.policy_loss, + 'update_batch': self.model.update_batch} + if self.use_curiosity: + self.update_dict['forward_loss'] = self.model.forward_loss + self.update_dict['inverse_loss'] = self.model.inverse_loss + + def evaluate(self, brain_info): + """ + Evaluates policy for the agent experiences provided. + :param brain_info: BrainInfo object containing inputs. + :return: Outputs from network as defined by self.inference_dict. + """ + feed_dict = {self.model.batch_size: len(brain_info.vector_observations), + self.model.sequence_length: 1} + epsilon = None + if self.use_recurrent: + if not self.use_continuous_act: + feed_dict[self.model.prev_action] = brain_info.previous_vector_actions.reshape( + [-1, len(self.model.act_size)]) + if brain_info.memories.shape[1] == 0: + brain_info.memories = self.make_empty_memory(len(brain_info.agents)) + feed_dict[self.model.memory_in] = brain_info.memories + if self.use_continuous_act: + epsilon = np.random.normal( + size=(len(brain_info.vector_observations), self.model.act_size[0])) + feed_dict[self.model.epsilon] = epsilon + feed_dict = self._fill_eval_dict(feed_dict, brain_info) + run_out = self._execute_model(feed_dict, self.inference_dict) + if self.use_continuous_act: + run_out['random_normal_epsilon'] = epsilon + return run_out + + def update(self, mini_batch, num_sequences): + """ + Updates model using buffer. + :param num_sequences: Number of trajectories in batch. + :param mini_batch: Experience batch. + :return: Output from update process. + """ + feed_dict = {self.model.batch_size: num_sequences, + self.model.sequence_length: self.sequence_length, + self.model.mask_input: mini_batch['masks'].flatten(), + self.model.returns_holder: mini_batch['discounted_returns'].flatten(), + self.model.old_value: mini_batch['value_estimates'].flatten(), + self.model.advantage: mini_batch['advantages'].reshape([-1, 1]), + self.model.all_old_log_probs: mini_batch['action_probs'].reshape( + [-1, sum(self.model.act_size)])} + if self.use_continuous_act: + feed_dict[self.model.output_pre] = mini_batch['actions_pre'].reshape( + [-1, self.model.act_size[0]]) + feed_dict[self.model.epsilon] = mini_batch['random_normal_epsilon'].reshape( + [-1, self.model.act_size[0]]) + else: + feed_dict[self.model.action_holder] = mini_batch['actions'].reshape( + [-1, len(self.model.act_size)]) + if self.use_recurrent: + feed_dict[self.model.prev_action] = mini_batch['prev_action'].reshape( + [-1, len(self.model.act_size)]) + feed_dict[self.model.action_masks] = mini_batch['action_mask'].reshape( + [-1, sum(self.brain.vector_action_space_size)]) + if self.use_vec_obs: + feed_dict[self.model.vector_in] = mini_batch['vector_obs'].reshape( + [-1, self.vec_obs_size]) + if self.use_curiosity: + feed_dict[self.model.next_vector_in] = mini_batch['next_vector_in'].reshape( + [-1, self.vec_obs_size]) + if self.model.vis_obs_size > 0: + for i, _ in enumerate(self.model.visual_in): + _obs = mini_batch['visual_obs%d' % i] + if self.sequence_length > 1 and self.use_recurrent: + (_batch, _seq, _w, _h, _c) = _obs.shape + feed_dict[self.model.visual_in[i]] = _obs.reshape([-1, _w, _h, _c]) + else: + feed_dict[self.model.visual_in[i]] = _obs + if self.use_curiosity: + for i, _ in enumerate(self.model.visual_in): + _obs = mini_batch['next_visual_obs%d' % i] + if self.sequence_length > 1 and self.use_recurrent: + (_batch, _seq, _w, _h, _c) = _obs.shape + feed_dict[self.model.next_visual_in[i]] = _obs.reshape([-1, _w, _h, _c]) + else: + feed_dict[self.model.next_visual_in[i]] = _obs + if self.use_recurrent: + mem_in = mini_batch['memory'][:, 0, :] + feed_dict[self.model.memory_in] = mem_in + self.has_updated = True + run_out = self._execute_model(feed_dict, self.update_dict) + return run_out + + def get_intrinsic_rewards(self, curr_info, next_info): + """ + Generates intrinsic reward used for Curiosity-based training. + :BrainInfo curr_info: Current BrainInfo. + :BrainInfo next_info: Next BrainInfo. + :return: Intrinsic rewards for all agents. + """ + if self.use_curiosity: + if len(curr_info.agents) == 0: + return [] + + feed_dict = {self.model.batch_size: len(next_info.vector_observations), + self.model.sequence_length: 1} + if self.use_continuous_act: + feed_dict[self.model.selected_actions] = next_info.previous_vector_actions + else: + feed_dict[self.model.action_holder] = next_info.previous_vector_actions + for i in range(self.model.vis_obs_size): + feed_dict[self.model.visual_in[i]] = curr_info.visual_observations[i] + feed_dict[self.model.next_visual_in[i]] = next_info.visual_observations[i] + if self.use_vec_obs: + feed_dict[self.model.vector_in] = curr_info.vector_observations + feed_dict[self.model.next_vector_in] = next_info.vector_observations + if self.use_recurrent: + if curr_info.memories.shape[1] == 0: + curr_info.memories = self.make_empty_memory(len(curr_info.agents)) + feed_dict[self.model.memory_in] = curr_info.memories + intrinsic_rewards = self.sess.run(self.model.intrinsic_reward, + feed_dict=feed_dict) * float(self.has_updated) + return intrinsic_rewards + else: + return None + + def get_value_estimate(self, brain_info, idx): + """ + Generates value estimates for bootstrapping. + :param brain_info: BrainInfo to be used for bootstrapping. + :param idx: Index in BrainInfo of agent. + :return: Value estimate. + """ + feed_dict = {self.model.batch_size: 1, self.model.sequence_length: 1} + for i in range(len(brain_info.visual_observations)): + feed_dict[self.model.visual_in[i]] = [brain_info.visual_observations[i][idx]] + if self.use_vec_obs: + feed_dict[self.model.vector_in] = [brain_info.vector_observations[idx]] + if self.use_recurrent: + if brain_info.memories.shape[1] == 0: + brain_info.memories = self.make_empty_memory(len(brain_info.agents)) + feed_dict[self.model.memory_in] = [brain_info.memories[idx]] + if not self.use_continuous_act and self.use_recurrent: + feed_dict[self.model.prev_action] = brain_info.previous_vector_actions[idx].reshape( + [-1, len(self.model.act_size)]) + value_estimate = self.sess.run(self.model.value, feed_dict) + return value_estimate + + def get_last_reward(self): + """ + Returns the last reward the trainer has had + :return: the new last reward + """ + return self.sess.run(self.model.last_reward) + + def update_reward(self, new_reward): + """ + Updates reward value for policy. + :param new_reward: New reward to save. + """ + self.sess.run(self.model.update_reward, + feed_dict={self.model.new_reward: new_reward}) diff --git a/animalai_packages/animalai_train/animalai_train/trainers/ppo/trainer.py b/animalai_packages/animalai_train/animalai_train/trainers/ppo/trainer.py new file mode 100644 index 00000000..817cd669 --- /dev/null +++ b/animalai_packages/animalai_train/animalai_train/trainers/ppo/trainer.py @@ -0,0 +1,386 @@ +# # Unity ML-Agents Toolkit +# ## ML-Agent Learning (PPO) +# Contains an implementation of PPO as described (https://arxiv.org/abs/1707.06347). + +import logging +import os +from collections import deque + +import numpy as np +import tensorflow as tf + +from animalai.envs import AllBrainInfo, BrainInfo +from animalai_train.trainers.buffer import Buffer +from animalai_train.trainers.ppo.policy import PPOPolicy +from animalai_train.trainers.trainer import Trainer + +logger = logging.getLogger("mlagents.trainers") + + +class PPOTrainer(Trainer): + """The PPOTrainer is an implementation of the PPO algorithm.""" + + def __init__(self, brain, reward_buff_cap, trainer_parameters, training, load, seed, run_id): + """ + Responsible for collecting experiences and training PPO model. + :param trainer_parameters: The parameters for the trainer (dictionary). + :param training: Whether the trainer is set for training. + :param load: Whether the model should be loaded. + :param seed: The seed the model will be initialized with + :param run_id: The The identifier of the current run + """ + super(PPOTrainer, self).__init__(brain, trainer_parameters, training, run_id) + self.param_keys = ['batch_size', 'beta', 'buffer_size', 'epsilon', 'gamma', 'hidden_units', 'lambd', + 'learning_rate', 'max_steps', 'normalize', 'num_epoch', 'num_layers', + 'time_horizon', 'sequence_length', 'summary_freq', 'use_recurrent', + 'summary_path', 'memory_size', 'use_curiosity', 'curiosity_strength', + 'curiosity_enc_size', 'model_path'] + + self.check_param_keys() + self.use_curiosity = bool(trainer_parameters['use_curiosity']) + self.step = 0 + self.policy = PPOPolicy(seed, brain, trainer_parameters, + self.is_training, load) + + stats = {'Environment/Cumulative Reward': [], 'Environment/Episode Length': [], + 'Policy/Value Estimate': [], 'Policy/Entropy': [], 'Losses/Value Loss': [], + 'Losses/Policy Loss': [], 'Policy/Learning Rate': []} + if self.use_curiosity: + stats['Losses/Forward Loss'] = [] + stats['Losses/Inverse Loss'] = [] + stats['Policy/Curiosity Reward'] = [] + self.intrinsic_rewards = {} + self.stats = stats + + self.training_buffer = Buffer() + self.cumulative_rewards = {} + self._reward_buffer = deque(maxlen=reward_buff_cap) + self.episode_steps = {} + self.summary_path = trainer_parameters['summary_path'] + if not os.path.exists(self.summary_path): + os.makedirs(self.summary_path) + + self.summary_writer = tf.summary.FileWriter(self.summary_path) + + def __str__(self): + return '''Hyperparameters for the PPO Trainer of brain {0}: \n{1}'''.format( + self.brain_name, '\n'.join(['\t{0}:\t{1}'.format(x, self.trainer_parameters[x]) for x in self.param_keys])) + + @property + def parameters(self): + """ + Returns the trainer parameters of the trainer. + """ + return self.trainer_parameters + + @property + def get_max_steps(self): + """ + Returns the maximum number of steps. Is used to know when the trainer should be stopped. + :return: The maximum number of steps of the trainer + """ + return float(self.trainer_parameters['max_steps']) + + @property + def get_step(self): + """ + Returns the number of steps the trainer has performed + :return: the step count of the trainer + """ + return self.step + + @property + def reward_buffer(self): + """ + Returns the reward buffer. The reward buffer contains the cumulative + rewards of the most recent episodes completed by agents using this + trainer. + :return: the reward buffer. + """ + return self._reward_buffer + + def increment_step_and_update_last_reward(self): + """ + Increment the step count of the trainer and Updates the last reward + """ + if len(self.stats['Environment/Cumulative Reward']) > 0: + mean_reward = np.mean(self.stats['Environment/Cumulative Reward']) + self.policy.update_reward(mean_reward) + self.policy.increment_step() + self.step = self.policy.get_current_step() + + def take_action(self, all_brain_info: AllBrainInfo): + """ + Decides actions given observations information, and takes them in environment. + :param all_brain_info: A dictionary of brain names and BrainInfo from environment. + :return: a tuple containing action, memories, values and an object + to be passed to add experiences + """ + curr_brain_info = all_brain_info[self.brain_name] + if len(curr_brain_info.agents) == 0: + return [], [], [], None, None + + run_out = self.policy.evaluate(curr_brain_info) + self.stats['Policy/Value Estimate'].append(run_out['value'].mean()) + self.stats['Policy/Entropy'].append(run_out['entropy'].mean()) + self.stats['Policy/Learning Rate'].append(run_out['learning_rate']) + if self.policy.use_recurrent: + return run_out['action'], run_out['memory_out'], None, \ + run_out['value'], run_out + else: + return run_out['action'], None, None, run_out['value'], run_out + + def construct_curr_info(self, next_info: BrainInfo) -> BrainInfo: + """ + Constructs a BrainInfo which contains the most recent previous experiences for all agents info + which correspond to the agents in a provided next_info. + :BrainInfo next_info: A t+1 BrainInfo. + :return: curr_info: Reconstructed BrainInfo to match agents of next_info. + """ + visual_observations = [[]] + vector_observations = [] + text_observations = [] + memories = [] + rewards = [] + local_dones = [] + max_reacheds = [] + agents = [] + prev_vector_actions = [] + prev_text_actions = [] + for agent_id in next_info.agents: + agent_brain_info = self.training_buffer[agent_id].last_brain_info + if agent_brain_info is None: + agent_brain_info = next_info + agent_index = agent_brain_info.agents.index(agent_id) + for i in range(len(next_info.visual_observations)): + visual_observations[i].append(agent_brain_info.visual_observations[i][agent_index]) + vector_observations.append(agent_brain_info.vector_observations[agent_index]) + text_observations.append(agent_brain_info.text_observations[agent_index]) + if self.policy.use_recurrent: + if len(agent_brain_info.memories > 0): + memories.append(agent_brain_info.memories[agent_index]) + else: + memories.append(self.policy.make_empty_memory(1)) + rewards.append(agent_brain_info.rewards[agent_index]) + local_dones.append(agent_brain_info.local_done[agent_index]) + max_reacheds.append(agent_brain_info.max_reached[agent_index]) + agents.append(agent_brain_info.agents[agent_index]) + prev_vector_actions.append(agent_brain_info.previous_vector_actions[agent_index]) + prev_text_actions.append(agent_brain_info.previous_text_actions[agent_index]) + if self.policy.use_recurrent: + memories = np.vstack(memories) + curr_info = BrainInfo(visual_observations, vector_observations, text_observations, + memories, rewards, agents, local_dones, prev_vector_actions, + prev_text_actions, max_reacheds) + return curr_info + + def add_experiences(self, curr_all_info: AllBrainInfo, next_all_info: AllBrainInfo, take_action_outputs): + """ + Adds experiences to each agent's experience history. + :param curr_all_info: Dictionary of all current brains and corresponding BrainInfo. + :param next_all_info: Dictionary of all current brains and corresponding BrainInfo. + :param take_action_outputs: The outputs of the take action method. + """ + curr_info = curr_all_info[self.brain_name] + next_info = next_all_info[self.brain_name] + + for agent_id in curr_info.agents: + self.training_buffer[agent_id].last_brain_info = curr_info + self.training_buffer[agent_id].last_take_action_outputs = take_action_outputs + + if curr_info.agents != next_info.agents: + curr_to_use = self.construct_curr_info(next_info) + else: + curr_to_use = curr_info + + intrinsic_rewards = self.policy.get_intrinsic_rewards(curr_to_use, next_info) + + for agent_id in next_info.agents: + stored_info = self.training_buffer[agent_id].last_brain_info + stored_take_action_outputs = self.training_buffer[agent_id].last_take_action_outputs + if stored_info is not None: + idx = stored_info.agents.index(agent_id) + next_idx = next_info.agents.index(agent_id) + if not stored_info.local_done[idx]: + for i, _ in enumerate(stored_info.visual_observations): + self.training_buffer[agent_id]['visual_obs%d' % i].append( + stored_info.visual_observations[i][idx]) + self.training_buffer[agent_id]['next_visual_obs%d' % i].append( + next_info.visual_observations[i][next_idx]) + if self.policy.use_vec_obs: + self.training_buffer[agent_id]['vector_obs'].append(stored_info.vector_observations[idx]) + self.training_buffer[agent_id]['next_vector_in'].append( + next_info.vector_observations[next_idx]) + if self.policy.use_recurrent: + if stored_info.memories.shape[1] == 0: + stored_info.memories = np.zeros((len(stored_info.agents), self.policy.m_size)) + self.training_buffer[agent_id]['memory'].append(stored_info.memories[idx]) + actions = stored_take_action_outputs['action'] + if self.policy.use_continuous_act: + actions_pre = stored_take_action_outputs['pre_action'] + self.training_buffer[agent_id]['actions_pre'].append(actions_pre[idx]) + epsilons = stored_take_action_outputs['random_normal_epsilon'] + self.training_buffer[agent_id]['random_normal_epsilon'].append( + epsilons[idx]) + else: + self.training_buffer[agent_id]['action_mask'].append( + stored_info.action_masks[idx], padding_value=1) + a_dist = stored_take_action_outputs['log_probs'] + value = stored_take_action_outputs['value'] + self.training_buffer[agent_id]['actions'].append(actions[idx]) + self.training_buffer[agent_id]['prev_action'].append(stored_info.previous_vector_actions[idx]) + self.training_buffer[agent_id]['masks'].append(1.0) + if self.use_curiosity: + self.training_buffer[agent_id]['rewards'].append(next_info.rewards[next_idx] + + intrinsic_rewards[next_idx]) + else: + self.training_buffer[agent_id]['rewards'].append(next_info.rewards[next_idx]) + self.training_buffer[agent_id]['action_probs'].append(a_dist[idx]) + self.training_buffer[agent_id]['value_estimates'].append(value[idx][0]) + if agent_id not in self.cumulative_rewards: + self.cumulative_rewards[agent_id] = 0 + self.cumulative_rewards[agent_id] += next_info.rewards[next_idx] + if self.use_curiosity: + if agent_id not in self.intrinsic_rewards: + self.intrinsic_rewards[agent_id] = 0 + self.intrinsic_rewards[agent_id] += intrinsic_rewards[next_idx] + if not next_info.local_done[next_idx]: + if agent_id not in self.episode_steps: + self.episode_steps[agent_id] = 0 + self.episode_steps[agent_id] += 1 + + def process_experiences(self, current_info: AllBrainInfo, new_info: AllBrainInfo): + """ + Checks agent histories for processing condition, and processes them as necessary. + Processing involves calculating value and advantage targets for model updating step. + :param current_info: Dictionary of all current brains and corresponding BrainInfo. + :param new_info: Dictionary of all next brains and corresponding BrainInfo. + """ + + info = new_info[self.brain_name] + for l in range(len(info.agents)): + agent_actions = self.training_buffer[info.agents[l]]['actions'] + if ((info.local_done[l] or len(agent_actions) > self.trainer_parameters['time_horizon']) + and len(agent_actions) > 0): + agent_id = info.agents[l] + if info.local_done[l] and not info.max_reached[l]: + value_next = 0.0 + else: + if info.max_reached[l]: + bootstrapping_info = self.training_buffer[agent_id].last_brain_info + idx = bootstrapping_info.agents.index(agent_id) + else: + bootstrapping_info = info + idx = l + value_next = self.policy.get_value_estimate(bootstrapping_info, idx) + + self.training_buffer[agent_id]['advantages'].set( + get_gae( + rewards=self.training_buffer[agent_id]['rewards'].get_batch(), + value_estimates=self.training_buffer[agent_id]['value_estimates'].get_batch(), + value_next=value_next, + gamma=self.trainer_parameters['gamma'], + lambd=self.trainer_parameters['lambd'])) + self.training_buffer[agent_id]['discounted_returns'].set( + self.training_buffer[agent_id]['advantages'].get_batch() + + self.training_buffer[agent_id]['value_estimates'].get_batch()) + + self.training_buffer.append_update_buffer(agent_id, batch_size=None, + training_length=self.policy.sequence_length) + + self.training_buffer[agent_id].reset_agent() + if info.local_done[l]: + self.stats['Environment/Cumulative Reward'].append( + self.cumulative_rewards.get(agent_id, 0)) + self.reward_buffer.appendleft(self.cumulative_rewards.get(agent_id, 0)) + self.stats['Environment/Episode Length'].append( + self.episode_steps.get(agent_id, 0)) + self.cumulative_rewards[agent_id] = 0 + self.episode_steps[agent_id] = 0 + if self.use_curiosity: + self.stats['Policy/Curiosity Reward'].append( + self.intrinsic_rewards.get(agent_id, 0)) + self.intrinsic_rewards[agent_id] = 0 + + def end_episode(self): + """ + A signal that the Episode has ended. The buffer must be reset. + Get only called when the academy resets. + """ + self.training_buffer.reset_local_buffers() + for agent_id in self.cumulative_rewards: + self.cumulative_rewards[agent_id] = 0 + for agent_id in self.episode_steps: + self.episode_steps[agent_id] = 0 + if self.use_curiosity: + for agent_id in self.intrinsic_rewards: + self.intrinsic_rewards[agent_id] = 0 + + def is_ready_update(self): + """ + Returns whether or not the trainer has enough elements to run update model + :return: A boolean corresponding to whether or not update_model() can be run + """ + size_of_buffer = len(self.training_buffer.update_buffer['actions']) + return size_of_buffer > max(int(self.trainer_parameters['buffer_size'] / self.policy.sequence_length), 1) + + def update_policy(self): + """ + Uses demonstration_buffer to update the policy. + """ + n_sequences = max(int(self.trainer_parameters['batch_size'] / self.policy.sequence_length), 1) + value_total, policy_total, forward_total, inverse_total = [], [], [], [] + advantages = self.training_buffer.update_buffer['advantages'].get_batch() + self.training_buffer.update_buffer['advantages'].set( + (advantages - advantages.mean()) / (advantages.std() + 1e-10)) + num_epoch = self.trainer_parameters['num_epoch'] + for k in range(num_epoch): + self.training_buffer.update_buffer.shuffle() + buffer = self.training_buffer.update_buffer + for l in range(len(self.training_buffer.update_buffer['actions']) // n_sequences): + start = l * n_sequences + end = (l + 1) * n_sequences + run_out = self.policy.update(buffer.make_mini_batch(start, end), n_sequences) + value_total.append(run_out['value_loss']) + policy_total.append(np.abs(run_out['policy_loss'])) + if self.use_curiosity: + inverse_total.append(run_out['inverse_loss']) + forward_total.append(run_out['forward_loss']) + self.stats['Losses/Value Loss'].append(np.mean(value_total)) + self.stats['Losses/Policy Loss'].append(np.mean(policy_total)) + if self.use_curiosity: + self.stats['Losses/Forward Loss'].append(np.mean(forward_total)) + self.stats['Losses/Inverse Loss'].append(np.mean(inverse_total)) + self.training_buffer.reset_update_buffer() + + +def discount_rewards(r, gamma=0.99, value_next=0.0): + """ + Computes discounted sum of future rewards for use in updating value estimate. + :param r: List of rewards. + :param gamma: Discount factor. + :param value_next: T+1 value estimate for returns calculation. + :return: discounted sum of future rewards as list. + """ + discounted_r = np.zeros_like(r) + running_add = value_next + for t in reversed(range(0, r.size)): + running_add = running_add * gamma + r[t] + discounted_r[t] = running_add + return discounted_r + + +def get_gae(rewards, value_estimates, value_next=0.0, gamma=0.99, lambd=0.95): + """ + Computes generalized advantage estimate for use in updating policy. + :param rewards: list of rewards for time-steps t to T. + :param value_next: Value estimate for time-step T+1. + :param value_estimates: list of value estimates for time-steps t to T. + :param gamma: Discount factor. + :param lambd: GAE weighing factor. + :return: list of advantage estimates for time-steps t to T. + """ + value_estimates = np.asarray(value_estimates.tolist() + [value_next]) + delta_t = rewards + gamma * value_estimates[1:] - value_estimates[:-1] + advantage = discount_rewards(r=delta_t, gamma=gamma * lambd) + return advantage diff --git a/animalai_packages/animalai_train/animalai_train/trainers/tensorflow_to_barracuda.py b/animalai_packages/animalai_train/animalai_train/trainers/tensorflow_to_barracuda.py new file mode 100644 index 00000000..a7942909 --- /dev/null +++ b/animalai_packages/animalai_train/animalai_train/trainers/tensorflow_to_barracuda.py @@ -0,0 +1,1034 @@ +from __future__ import print_function +import numpy as np +import struct # convert from Python values and C structs +import tensorflow as tf +import re +#import barracuda +#from barracuda import Struct +from animalai_train.trainers import barracuda +from animalai_train.trainers.barracuda import Struct +from google.protobuf import descriptor +from google.protobuf.json_format import MessageToJson + + +if __name__ == '__main__': + # Handle command line argumengts + args = barracuda.parse_args( + description = 'Convert Tensorflow model to Barracuda binary', + source_extension = '.pb', + help = 'input Tensorflow serialized .pb file') + # Te following code can be used as an example of API used from another module + # convert() is the main entry point for converter + import tensorflow_to_barracuda as tf2bc + tf2bc.convert(args.source_file, args.target_file, args.trim_unused_by_output, args) + + +# TODO: support more than 1 LSTM layer per model - prepend scope to names and inputs +# TODO: support different activation functions in LSTM +# TODO: strip output Identity node, instead patch upstream layer names +# TODO: use ScaleBias and Pow with alpha when input is constant Tensor +# TODO: support all data format types (curretly only NHWC) +# TODO: support all data types (currently only FLOAT, INT32, BOOL) +# TODO: implement FusedResizeAndPadConv2D + +# Important ProtoBuf definitions: +# https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/framework/types.proto +# https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/framework/tensor.proto +# https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/framework/node_def.proto +# +# Node descriptions: +# https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/ops/nn_ops.cc +# https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/ops/math_ops.cc +# https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/ops/random_ops.cc +# +# Class doc: +# https://www.tensorflow.org/api_docs/cc/ +# +known_classes = { + 'Dense': Struct( + id = 1, + out_shapes = lambda shapes: [ + [shapes[0][0], 1, 1, shapes[0][1]], # W + [1, 1, 1, shapes[-1][-1]] # B + ], + patch_data = lambda data: [ + data[0], + data[1] + ]), + 'MatMul': Struct( + id = 1, + out_shapes = lambda shapes: [ + [shapes[0][0], 1, 1, shapes[0][1]], # W + [1, 1, 1, shapes[0][1]] # B + ], + patch_data = lambda data: [ + data[0], + np.zeros(np.shape(data[1])) + ]), + 'BiasAdd': Struct( + id = 51, # implemented as ScaleBias + out_shapes = lambda shapes: [ + [1, 1, 1, shapes[0][0]], # ONE + [1, 1, 1, shapes[0][0]], # B + ], + patch_data = lambda data: [ + np.ones(np.shape(data[0])), + data[0] + ]), + + # TODO: NCHW + 'Conv2D': Struct( + id = 20, + out_shapes = lambda shapes: [ + shapes[0], # K + [1, 1, 1, shapes[-1][-1]] # B + ], + patch_data = lambda data: [ + data[0], + data[1] + ]), + 'DepthwiseConv2dNative': Struct( # DepthwiseConv2D + id = 21, + out_shapes = lambda s: [ + [s[0][0], s[0][1], s[0][3], s[0][2]], # K TF:[H, W, in_channels, channel_multiplier] => [H, W, 1, in_channels] + [1, 1, 1, s[-1][-1]] if len(s) > 1 else + [1, 1, 1, s[0][2]] # B + ], + patch_data = lambda data: [ + np.transpose(data[0], (0,1,3,2)), + data[1] + ]), + 'Conv2DBackpropInput': Struct( # Conv2DTranspose + id = 22, + out_shapes = lambda shapes: [ + shapes[0], # K + [1, 1, 1, shapes[-1][-1]] # B + ], + patch_data = lambda data: [ + data[0], + data[1] + ]), + + # TODO: 3D + + 'ResizeNearestNeighbor': + 23, # implemented as Upsample2D + 'ResizeBilinear': 23, # implemented as Upsample2D + 'ResizeBicubic': 23, # implemented as Upsample2D + 'MaxPool': 25, + 'AvgPool': 26, + + 'GlobalAveragePool':28, + + 'Activation': 50, + + 'BatchNormalization': Struct( + id = 51, # after fusion implemented as ScaleBias + out_shapes = lambda shapes: [ + [1, 1, 1, shapes[0][0]], # S + [1, 1, 1, shapes[0][0]], # B + ], + patch_data = lambda data: + # fuse [gamma, beta, mean, var, epsilon] => [scale, bias] + # TODO: double-check if epsilon is the last data argument and not the 1st? + barracuda.fuse_batchnorm_weights(data[0], data[1], data[2], data[3], data[4]) if len(data) == 5 else + # fuse [ONE, beta, mean, var, epsilon] => [scale, bias] + # TODO: double-check if epsilon is the last data argument and not the 1st? + barracuda.fuse_batchnorm_weights(np.ones(np.shape(data[0])), data[0], data[1], data[2], data[3]) + ), + 'FusedBatchNorm': Struct( + id = 51, # after fusion implemented as ScaleBias + out_shapes = lambda shapes: [ + [1, 1, 1, shapes[0][0]], # S + [1, 1, 1, shapes[0][0]], # B + ], + patch_data = lambda data, layer: + # fuse [gamma, beta, mean, var, epsilon] => [scale, bias] + barracuda.fuse_batchnorm_weights(data[0], data[1], data[2], data[3], get_epsilon(layer)) + ), + 'LRN': 53, + + 'RandomStandardNormal': + 64, + 'RandomUniform': 65, + 'Multinomial': 66, + 'OneHot': 67, + + # Broadcast ops + 'Add': 100, + 'Sub': 101, + 'Mul': 102, + 'RealDiv': 103, + 'Pow': 104, + 'Minimum': 110, + 'Maximum': 111, + + # Reduce ops + 'Max': 124, + 'Mean': 125, + 'Min': 126, + 'Prod': 127, + 'Sum': 128, + + 'Flatten': 200, + 'Reshape': 201, + #'Squeeze': 203, + #'Unsqueeze': 204, + 'Concat': 210, + 'StridedSlice': 211, +} + +requires_runtime_flag = { + 'Dropout' : 'DropoutRuntime', + 'BatchNormalization' : 'BatchNormalizationRuntime', +} + +known_activations = { + 'Linear' : 0, + 'Relu' : 1, + 'Softmax' : 2, + 'Tanh' : 3, + 'Sigmoid' : 4, + 'Elu' : 5, + 'Relu6' : 6, + 'LeakyRelu' : 7, + 'Selu' : 8, + 'Swish' : 9, + + 'LogSoftmax' : 10, + 'Softplus' : 11, + 'Softsign' : 12, + + 'Abs' : 100, + 'Neg' : 101, + 'Ceil' : 102, + 'Floor' : 104, + + 'Sqrt' : 111, + 'Exp' : 113, + 'Log' : 114, + + 'Acos' : 200, + 'Acosh' : 201, + 'Asin' : 202, + 'Asinh' : 203, + 'Atan' : 204, + 'Atanh' : 205, + 'Cos' : 206, + 'Cosh' : 207, + 'Sin' : 208, + 'Sinh' : 209, + 'Tan' : 210 +} + +known_paddings = { + 'VALID' : [0,0,0,0], + 'SAME' : [-1] # SameUpper +} + +supported_data_formats = { + 'NHWC' +} + +known_patterns = { + # TODO: Flatten pattern using namespace regexp + repr(['Shape', 'StridedSlice', 'Pack', 'Reshape']) : "Flatten", + repr(['Shape', 'StridedSlice', 'Prod', 'Pack', 'Reshape']) : "Flatten", + repr(['Shape', 'Slice', 'Slice', 'Prod', + 'ExpandDims', 'ConcatV2', 'Reshape']) : "Flatten", + repr(['Const', 'Reshape']) : 'Reshape', + + repr(['Add', 'Rsqrt', 'Mul', 'Mul', 'Sub', 'Add']) : 'BatchNormalization', + repr(['Add', 'Rsqrt', 'Mul', 'Mul', 'Mul', 'Sub', 'Add']) : 'BatchNormalization', + + repr(['ConcatV2']) : 'ConcatV2', + repr(['Mean']) : 'Mean', + repr(['Multinomial']) : 'Multinomial', + repr(['OneHot']) : 'OneHot', + repr(['Square']) : 'Square', + + repr(['MatMul', 'BiasAdd']) : 'Dense', + repr(['Conv2D', 'BiasAdd']) : 'Conv2D', + repr(['DepthwiseConv2dNative', 'BiasAdd']) : 'DepthwiseConv2dNative', + repr(['Conv2DBackpropInput', 'BiasAdd']) : 'Conv2DBackpropInput', + + + repr(['Pack', 'Reshape']) : 'Flatten$', # for now we assume that this combination is trivial Flatten + # for exmaple it is used in ML-agents LSTM nets with sequence_length==1 + + repr(['StridedSlice', 'Reshape', + re.compile('^lstm/'), + 'Reshape', 'ConcatV2', 'Identity']) : 'BasicLSTM', + + repr([re.compile('^lstm/'), + 'Reshape', 'ConcatV2', 'Identity']) : 'BasicLSTM', + + repr(['Sigmoid', 'Mul']) : "Swish", + + # TODO: FusedResizeAndPadConv2D +} + +def by_name(args, name): + for a in args: + if a.name.endswith(name): + return a + +def by_op(args, op): + for a in args: + if a.op == op: + return a + +def order_by(args, names): + ordered = [] + arg_count = len(args) + for name in names: + ordered += [a for a in args if a.endswith(name)] + args = [a for a in args if not a.endswith(name)] + ordered += args # append what is left + assert(len(ordered) == arg_count) + return ordered + +transform_patterns = { + 'Flatten' : lambda nodes, inputs, tensors, _: + Struct( + op = 'Flatten', + input = inputs + ), + 'Flatten$' : lambda nodes, inputs, tensors, _: + Struct( + op = 'Flatten', + input = [inputs[-1]] # take only the last input, assume all other arguments are trivial (like sequence_length==1 always in ML-agents LSTM nets) + ), + 'Reshape' : lambda nodes, inputs, tensors, _: + Struct( + op = 'Reshape', + input = inputs, + shape = [tensors[0].data[0], tensors[0].data[1], tensors[0].data[2], tensors[0].data[3]] if len(tensors[0].data) == 4 else + [tensors[0].data[0], 1, tensors[0].data[1], tensors[0].data[2]] if len(tensors[0].data) == 3 else + [tensors[0].data[0], 1, 1, tensors[0].data[1]] + # tensor.name = 'shape' + ), + 'Multinomial' : lambda nodes, inputs, tensors, _: + Struct( + op = 'Multinomial', + input = inputs, + shape = [int(by_name(tensors, '/num_samples').data[0])], + #seed = get_attr(nodes[0], 'seed'), + ), + 'OneHot' : lambda nodes, inputs, tensors, _: + Struct( + op = 'OneHot', + input = inputs, + shape = [int(by_name(tensors, '/depth').data[0])], + alpha = by_name(tensors, '/on_value').data[0], + beta = by_name(tensors, '/off_value').data[0], + ), + 'Square' : lambda nodes, inputs, tensors, _: + Struct( + op = 'Mul', + input = [i for i in inputs] + [i for i in inputs], # input * input + ), + 'ConcatV2' : lambda nodes, inputs, tensors, _: + Struct( + op = 'Concat', + input = inputs, + + # TEMPORARY: until we implemented rank detection and axis remapping (hopefully in exporter) + # HACK: assume Concat is always for last channel + axis = int(-1) + #axis = int(by_name(tensors, '/axis').data[0]) + ), + 'BatchNormalization' : lambda nodes, inputs, tensors, _: + Struct( + op = 'BatchNormalization', + input = [i for i in inputs] + + order_by([t.name for t in tensors], ['gamma', 'beta', 'mean', 'variance']), + ), + 'Mean' : lambda nodes, inputs, tensors, _: + Struct( + # TODO: use data_frmt of the input instead of hardcoded [1,2] for HW + op = 'GlobalAveragePool' if np.array_equal(tensors[0].data, [1,2]) else 'MeanWithUnsupportedReductionTensor', + input = [i for i in inputs], + ), + 'Dense' : lambda nodes, inputs, tensors, _: + Struct( + op = 'Dense', + input = [i for i in inputs] + [t.name for t in tensors], + data_frmt = get_attr(by_op(nodes, 'Dense') or by_op(nodes, 'MatMul'), 'data_format'), + ), + 'Conv2D' : lambda nodes, inputs, tensors, _: + Struct( + op = 'Conv2D', + input = [i for i in inputs] + [t.name for t in tensors], + padding = get_attr(by_op(nodes, 'Conv2D'), 'padding'), + strides = get_attr(by_op(nodes, 'Conv2D'), 'strides'), + dilations = get_attr(by_op(nodes, 'Conv2D'), 'dilations'), + data_frmt = get_attr(by_op(nodes, 'Conv2D'), 'data_format'), + ), + 'DepthwiseConv2dNative' : lambda nodes, inputs, tensors, _: + Struct( + op = 'DepthwiseConv2dNative', + input = [i for i in inputs] + [t.name for t in tensors], + padding = get_attr(by_op(nodes, 'DepthwiseConv2dNative'), 'padding'), + strides = get_attr(by_op(nodes, 'DepthwiseConv2dNative'), 'strides'), + dilations = get_attr(by_op(nodes, 'DepthwiseConv2dNative'), 'dilations'), + data_frmt = get_attr(by_op(nodes, 'DepthwiseConv2dNative'), 'data_format'), + ), + 'Conv2DBackpropInput' : lambda nodes, inputs, tensors, _: + Struct( + op = 'Conv2DBackpropInput', + input = [i for i in inputs] + [t.name for t in tensors], + padding = get_attr(by_op(nodes, 'Conv2DBackpropInput'), 'padding'), + strides = get_attr(by_op(nodes, 'Conv2DBackpropInput'), 'strides'), + dilations = get_attr(by_op(nodes, 'Conv2DBackpropInput'), 'dilations'), + data_frmt = get_attr(by_op(nodes, 'Conv2DBackpropInput'), 'data_format'), + ), + 'BasicLSTM' : lambda nodes, inputs, tensors, context: + basic_lstm(nodes, inputs, tensors, context), + + 'Swish' : lambda nodes, inputs, tensors, _: + Struct( + op = 'Swish', + input = inputs + ), + + # TODO:'Round' + # TODO:'Rsqrt' +} + +# Parse +def get_attr(node, attr_name, default=None): + if type(node) == Struct: + if hasattr(node, attr_name): + return getattr(node, attr_name) + else: + return default + + # See: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/framework/attr_value.proto + val = node.attr[attr_name] + + if val.HasField("list"): + return val.list.i + # NOTE: can't find way to identify type of list BUT it is almost always list(int) + # except list(float) in FractionalAvg/MaxPool + if val.HasField("b"): + return val.b + if val.HasField("i"): + return val.i + if val.HasField("f"): + return val.f + if val.HasField("s"): + return val.s.decode("utf-8") + if val.HasField("shape"): + return val.shape + if val.HasField("tensor"): + return val.tensor + return default + +def get_epsilon(layer): + return get_attr(layer, 'epsilon', default=0.001) # default epsilon taken from tf.layers.batch_normalization + +def get_layer_shape(layer): + shape = get_attr(layer, 'shape') + if not shape: + return [-1, -1, -1, -1] + shape = [dim.size for dim in shape.dim] + if len(shape) == 1: + return [1, 1, 1, shape[0]] + if len(shape) == 2: + return [shape[0], 1, 1, shape[1]] + return shape + +def get_tensor_dims(tensor): + if isinstance(tensor, np.ndarray): + return np.shape(tensor) + + dims = [] + if tensor.tensor_shape: + dims = [v.size for v in tensor.tensor_shape.dim] + if tensor.float_val: + dims = np.shape(tensor.float_val) + if tensor.int_val: + dims = np.shape(tensor.int_val) + if tensor.bool_val: + dims = np.shape(tensor.bool_val) + return dims + +def get_tensor_dtype(tensor): + if isinstance(tensor, np.ndarray): + return tensor.dtype + + dataType = '' + fields = tensor.ListFields() + + for field, value in fields: + if field.name == 'dtype' and field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_ENUM: + dataType = field.enum_type.values_by_number.get(value, None).name + + return dataType + +def get_tensor_data(tensor): + if isinstance(tensor, np.ndarray): + return tensor.astype(float) + + dims = get_tensor_dims(tensor) + elems = np.product(dims) + + if tensor.tensor_content: + # TODO: support other types + dataType = get_tensor_dtype(tensor) + if dataType == "DT_FLOAT": + data = struct.unpack('<'+str(elems)+'f', tensor.tensor_content) + elif dataType == "DT_INT32": + data = struct.unpack('<'+str(elems)+'i', tensor.tensor_content) + elif dataType == "DT_BOOL": + data = struct.unpack('<'+str(elems)+'?', tensor.tensor_content) + else: + print('UNSUPPORTED: data type', dataType) + if tensor.float_val: + data = tensor.float_val + if tensor.int_val: + data = np.array(tensor.int_val, dtype=float) + if tensor.bool_val: + data = np.array(tensor.bool_val, dtype=float) + return np.array(data).reshape(dims) + +def flatten(items,enter=lambda x:isinstance(x, list)): + # http://stackoverflow.com/a/40857703 + # https://github.com/ctmakro/canton/blob/master/canton/misc.py + """Yield items from any nested iterable; see REF.""" + for x in items: + if enter(x): + yield from flatten(x) + else: + yield x + +def replace_strings_in_list(array_of_strigs, replace_with_strings): + "A value in replace_with_strings can be either single string or list of strings" + potentially_nested_list = [replace_with_strings.get(s) or s for s in array_of_strigs] + return list(flatten(potentially_nested_list)) + +def remove_duplicates_from_list(array): + "Preserves the order of elements in the list" + output = [] + unique = set() + for a in array: + if a not in unique: + unique.add(a) + output.append(a) + return output + +######################################################### + +def pool_to_HW(shape, data_frmt): + """ Convert from NHWC|NCHW => HW + """ + if len(shape) != 4: + return shape # Not NHWC|NCHW, return as is + if data_frmt == 'NCHW': + return [shape[2], shape[3]] + return [shape[1], shape[2]] + +def strides_to_HW(shape, format): + return pool_to_HW(shape, format) + +######################################################### + +def gru(nodes, inputs, tensors, context): + assert(len(inputs) == 2) + + def find_tensor_by_name(name, default=None): + nonlocal tensors + candidates = [t for t in tensors if t.name.endswith(name)] + return candidates[0].data if candidates else default + + input = inputs[-1] + state = inputs[0] + gates_kernel = find_tensor_by_name('/gates/kernel') + gates_bias = find_tensor_by_name('/gates/bias', default=np.zeros(np.shape(gates_kernel)[-1])) + candidate_kernel = find_tensor_by_name('/candidate/kernel') + candidate_bias = find_tensor_by_name('/candidate/bias', default=np.zeros(np.shape(candidate_kernel)[-1])) + new_state = nodes[-1].name + '_h' + + assert(np.shape(gates_kernel)[-1] == np.shape(gates_bias)[-1]) + assert(np.shape(candidate_kernel)[-1] == np.shape(candidate_bias)[-1]) + + num_gates = 2 + seq_length = 1 + hidden_size = np.shape(gates_kernel)[-1] // num_gates + + gate_kernels = np.split(gates_kernel, num_gates, axis=-1) + gate_biases = np.split(gates_bias, num_gates, axis=-1) + + context.model_tensors['kernel_r'] = gate_kernels[0] + context.model_tensors['kernel_u'] = gate_kernels[1] + context.model_tensors['kernel_c'] = candidate_kernel + context.model_tensors['bias_r'] = gate_biases[0] + context.model_tensors['bias_u'] = gate_biases[1] + context.model_tensors['bias_c'] = candidate_bias + + new_layers = barracuda.gru('gru', input, state, + 'kernel_r', 'kernel_u', 'kernel_c', + 'bias_r', 'bias_u', 'bias_c', + new_state) + + state_shape = [1, 1, seq_length, hidden_size] + context.model_memories += [state_shape, state, new_state] + + # map exptected output of the replaced pattern to output from our GRU cell + actual_output_node = nodes[-4] + assert(actual_output_node.op == 'Reshape') + context.map_ignored_layer_to_its_input[actual_output_node.name] = new_state + + return new_layers + +def basic_lstm(nodes, inputs, tensors, context): + assert(len(inputs) == 2) + + def find_tensor_by_name(name, default=None): + nonlocal tensors + candidates = [t for t in tensors if t.name.endswith(name)] + return candidates[0].data if candidates else default + + def find_forget_bias(): + nonlocal nodes + nonlocal tensors + # TODO: make it more fault-tolerant + # search for scalar float constant that is input to Add node + # and hope it is not a constant for some complex activation function + for t in tensors: + if np.prod(t.shape) == 1 and get_tensor_dtype(t.obj) == "DT_FLOAT": + for n in nodes: + if n.op == 'Add' and t.name in n.input: + return t.data + return np.zeros(1) + + input = inputs[-1] + state_c = inputs[0] + '_c' + state_h = inputs[0] + '_h' + kernel = find_tensor_by_name('/kernel') + bias = find_tensor_by_name('/bias', default=np.zeros(np.shape(kernel)[-1])) + forget_bias = find_forget_bias() + new_state_c = nodes[-1].name + '_c' + new_state_h = nodes[-1].name + '_h' + + assert(np.shape(kernel)[-1] == np.shape(bias)[-1]) + + num_gates = 4 + seq_length = 1 + hidden_size = np.shape(kernel)[-1] // num_gates + + kernels = np.split(kernel, num_gates, axis=-1) + biases = np.split(bias, num_gates, axis=-1) + + context.model_tensors['kernel_i'] = kernels[0] + context.model_tensors['kernel_j'] = kernels[1] + context.model_tensors['kernel_f'] = kernels[2] + context.model_tensors['kernel_o'] = kernels[3] + context.model_tensors['bias_i'] = biases[0] + context.model_tensors['bias_j'] = biases[1] + context.model_tensors['bias_f'] = biases[2] + forget_bias + context.model_tensors['bias_o'] = biases[3] + + new_layers = barracuda.lstm('lstm', input, state_c, state_h, + 'kernel_i', 'kernel_j', 'kernel_f', 'kernel_o', + 'bias_i', 'bias_j', 'bias_f', 'bias_o', + new_state_c, new_state_h) + + state_shape = [1, 1, seq_length, hidden_size] + context.model_memories += [state_shape, state_c, new_state_c] + context.model_memories += [state_shape, state_h, new_state_h] + + # map expected output of the replaced pattern to output from our LSTM cell + actual_output_node = nodes[-4] + assert(actual_output_node.op == 'Reshape') + context.map_ignored_layer_to_its_input[actual_output_node.name] = new_state_h + + return new_layers + +######################################################### + +def process_layer(layer, context, args): + model_tensors = context.model_tensors + input_shapes = context.input_shapes + map_ignored_layer_to_its_input = context.map_ignored_layer_to_its_input + + name = layer.name + class_name = layer.op + inputs = layer.input # Tensorflow inputs are always explicit, but in case of Keras we had 'inputs = layer.input or [prev_layer_name]' + inputs = replace_strings_in_list(inputs, map_ignored_layer_to_its_input) + + if class_name == 'Const': + model_tensors[name] = layer.attr["value"].tensor + return + + if class_name == 'Placeholder': + assert(inputs == []) + map_ignored_layer_to_its_input[name] = inputs + input_shapes[name] = get_layer_shape(layer) + return + + if class_name == 'Identity': + connected_to_const = len(inputs) == 1 and inputs[0] in model_tensors + if connected_to_const: + map_ignored_layer_to_its_input[name] = inputs + return + else: + # treat Identity layer that are connected to processing nodes + # as output from the network + class_name = 'Linear' + + # TEMPORARY: until we implemented rank detection and StidedSlice at runtime + # HACK: skips trivial StridedSlices for rank=2 tensors + if class_name == 'StridedSlice' and get_attr(layer, 'begin_mask') == 1 and get_attr(layer, 'end_mask') == 1: + map_ignored_layer_to_its_input[name] = inputs[0] + return + + if args.print_layers or args.verbose: + var_tensors = [i for i in inputs if i not in model_tensors] + const_tensors = [i for i in inputs if i in model_tensors] + print("'%s' %s Vars:%s Const:%s" % (name, class_name, var_tensors, const_tensors)) + + if class_name in known_activations: + activation = class_name + class_name = 'Activation' + else: + activation = 'Linear' + + if not class_name in known_classes: + if class_name in requires_runtime_flag: + print('SKIP:', class_name, 'layer is used only for training') + else: + print('IGNORED:', class_name, 'unknown layer') + map_ignored_layer_to_its_input[name] = inputs + return + + klass = known_classes[class_name] + if type(klass) == int: + klass = Struct(id = klass) + + o_l = Struct() + o_l.type = klass.id + o_l.class_name = class_name + o_l.name = name + + padding = get_attr(layer, 'padding') # layer.attr['padding'].s.decode("utf-8") + strides = get_attr(layer, 'strides') # layer.attr['strides'].list.i + dilations = get_attr(layer, 'dilations') # layer.attr['dilations'].list.i + pool_size = get_attr(layer, 'ksize') # layer.attr['ksize'].list.i + shape = get_attr(layer, 'shape', default=[]) + data_frmt = get_attr(layer, 'data_format') # layer.attr['data_format'].s.decode("utf-8") + axis = get_attr(layer, 'axis') + alpha = get_attr(layer, 'alpha') + beta = get_attr(layer, 'beta') + + if activation and not activation in known_activations: + print('IGNORED: unknown activation', activation) + if padding and not padding in known_paddings: + print('IGNORED: unknown padding', padding) + if data_frmt and not data_frmt in supported_data_formats: + print('UNSUPPORTED: data format', data_frmt) + + o_l.activation = known_activations.get(activation) or 0 + o_l.pads = known_paddings.get(padding) or [0,0,0,0] + o_l.strides = strides_to_HW(strides, data_frmt) if strides else [] + o_l.pool_size = pool_to_HW(pool_size, data_frmt) if pool_size else shape + o_l.axis = axis or -1 + o_l.alpha = alpha or 1 + o_l.beta = beta or 0 + + tensor_names = [i for i in inputs if i in model_tensors] + o_l.tensors = [Struct(name = x, shape = get_tensor_dims(model_tensors[x]), data = get_tensor_data(model_tensors[x])) + for x in tensor_names] + # Patch shapes & data + layer_has_model_tensors = len(o_l.tensors) > 0 + if hasattr(klass, 'out_shapes') and layer_has_model_tensors: + shapes = klass.out_shapes([x.shape for x in o_l.tensors]) + + # if we have more shapes than actual tensors, + # then create & fill missing tensors with zeros + in_tensor_num = len(o_l.tensors) + for index, new_shape in enumerate(shapes): + if index >= in_tensor_num: + new_tensor = Struct(name = ('%s/patch:%i') % (name, index-in_tensor_num), + shape = new_shape, + data = np.zeros(new_shape)) + o_l.tensors.append(new_tensor) + assert(len(shapes) <= len(o_l.tensors)) + + if hasattr(klass, 'patch_data'): + data = [x.data for x in o_l.tensors] + + patch_data_fn = klass.patch_data + patch_data_expected_arg_count = patch_data_fn.__code__.co_argcount + patch_data_args = (data, layer) if patch_data_expected_arg_count > 1 else (data,) + tensor_data = patch_data_fn(*patch_data_args) + o_l.tensors = o_l.tensors[:len(tensor_data)] # resize tensor array to match patched data - patching might reduce number of tensors + for x, data in zip(o_l.tensors, tensor_data): + x.data = data + + # after this point we should have equal amount of shapes and tensors + assert(len(o_l.tensors) == len(shapes)) + + for x, shape in zip(o_l.tensors, shapes): + x.shape = shape + + o_l.inputs = [i for i in inputs if i not in model_tensors] + + else: + # no 'patch_data' lambda was specified, op does not require tensor args + o_l.tensors = [] + o_l.inputs = inputs + + # Force all tensors to float32 + for x in o_l.tensors: + x.data = x.data.astype(np.float32) + + # Layer is ready + context.layers.append(o_l) + +class ModelBuilderContext: + def __init__(self): + self.layers = [] + self.input_shapes = {} + self.model_tensors = {} + self.model_memories = [] + self.map_ignored_layer_to_its_input = {} + +def process_model(model, args): + o_context = ModelBuilderContext() + + # Find node patterns + nodes_as_array = [node for node in model.node] + + node_index = 0 + while node_index < len(nodes_as_array): + node = nodes_as_array[node_index] + match = False + for pattern_repr, pattern_name in known_patterns.items(): + pattern = eval(pattern_repr) + if node_index + len(pattern) > len(nodes_as_array): + continue # pattern too long, skip + + require_exact_match = (pattern[0] == 'Const' or pattern[0] == 'Identity') + pattern_end = node_index + + def match_node(node, pattern): + return node.op == pattern or (hasattr(pattern, 'match') and pattern.match(node.name)) + + for p in pattern: + if not require_exact_match: + while pattern_end < len(nodes_as_array) and nodes_as_array[pattern_end].op != p and ( + nodes_as_array[pattern_end].op == 'Const' or + nodes_as_array[pattern_end].op == 'Identity'): + pattern_end += 1 + if pattern_end >= len(nodes_as_array): + break + + match = False + if (hasattr(p, 'match')): # regexp + while pattern_end < len(nodes_as_array) and p.match(nodes_as_array[pattern_end].name): + match = True + pattern_end += 1 + else: # exact string + match = nodes_as_array[pattern_end].op == p + pattern_end += 1 + + if not match: + break + + def get_tensors(pattern_nodes): + nonlocal o_context + map_ignored_layer_to_its_input = o_context.map_ignored_layer_to_its_input + + # tensors <= all Const nodes within this pattern + tensor_nodes = [n for n in pattern_nodes if n.op == 'Const'] + tensors = [Struct(name = n.name, obj = n.attr["value"].tensor, shape = get_tensor_dims(n.attr["value"].tensor), data = get_tensor_data(n.attr["value"].tensor)) + for n in tensor_nodes] + + # TODO: unify / reuse code from process_layer + identity_nodes = [n for n in pattern_nodes if n.op == 'Identity'] + for i in identity_nodes: + inputs = replace_strings_in_list(i.input, map_ignored_layer_to_its_input) + map_ignored_layer_to_its_input[i.name] = inputs + + # gather inputs from Op nodes (not Const, not Identity) + op_nodes = [n for n in pattern_nodes if n not in tensor_nodes and n not in identity_nodes] + inputs_to_op_nodes = list(flatten([list(flatten(n.input)) for n in op_nodes])) + inputs_to_op_nodes = replace_strings_in_list(inputs_to_op_nodes, map_ignored_layer_to_its_input) + inputs_to_op_nodes = [i.split(':')[0] for i in inputs_to_op_nodes] + + # filter only inputs that are coming from nodes that are outside this pattern + # preserve the order + pattern_nodes = [n.name for n in pattern_nodes] + #inputs_from_outside_pattern = remove_duplicates_from_list([i for i in inputs_to_op_nodes if nodes_by_name[i] not in pattern_nodes]) + inputs_from_outside_pattern = remove_duplicates_from_list([i for i in inputs_to_op_nodes if i not in pattern_nodes]) + + return inputs_from_outside_pattern, tensors + + if match: + nodes = nodes_as_array[node_index:pattern_end] + name = nodes[-1].name + var_tensors, const_tensors = get_tensors(nodes) + if args.print_patterns or args.verbose: + print('PATTERN:', name, '~~', pattern_name, pattern, '<-', var_tensors, '+', [t.name for t in const_tensors]) + for n in nodes: + if n.op == 'Const' or n.op == 'Identity': + process_layer(n, o_context, args) + + new_layers = transform_patterns[pattern_name](nodes, var_tensors, const_tensors, o_context) + if not isinstance(new_layers, list): + if not hasattr(new_layers, name): new_layers.name = name + new_layers = [new_layers] + + for l in new_layers: + # TODO: prefix new layer names with scope, patch inputs + #l.name = name + '/' + l.name + process_layer(l, o_context, args) + + node_index = pattern_end + break # pattern found & processed + + if not match: + # TODO: gather tensors in the same way as patterns do + process_layer(node, o_context, args) + node_index += 1 + + return o_context.layers, o_context.input_shapes, o_context.model_tensors, o_context.model_memories + +######################################################### + +def convert(source_file, target_file, trim_unused_by_output="", verbose=False, compress_f16=False): + """ + Converts a TensorFlow model into a Barracuda model. + :param source_file: The TensorFlow Model + :param target_file: The name of the file the converted model will be saved to + :param trim_unused_by_output: The regexp to match output nodes to remain in the model. All other uconnected nodes will be removed. + :param verbose: If True, will display debug messages + :param compress_f16: If true, the float values will be converted to f16 + :return: + """ + if (type(verbose)==bool): + args = Struct() + args.verbose = verbose + args.print_layers = verbose + args.print_source_json = verbose + args.print_barracuda_json = verbose + args.print_layer_links = verbose + args.print_patterns = verbose + args.print_tensors = verbose + else: + args = verbose + + # Load Tensorflow model + print("Converting %s to %s" % (source_file, target_file)) + f = open(source_file, 'rb') + i_model = tf.GraphDef() + i_model.ParseFromString(f.read()) + + if args.verbose: + print('OP_TYPES:', {layer.op for layer in i_model.node}) + + if args.print_source_json or args.verbose: + for layer in i_model.node: + if not layer.op == 'Const': + print('MODEL:', MessageToJson(layer) + ",") + + # Convert + o_model = barracuda.Model() + o_model.layers, o_input_shapes, o_model.tensors, o_model.memories = \ + process_model(i_model, args) + + # Cleanup unconnected Identities (they might linger after processing complex node patterns like LSTM) + def cleanup_layers(layers): + all_layers = {l.name for l in layers} + all_inputs = {i for l in layers for i in l.inputs} + + def is_unconnected_identity(layer): + if layer.class_name == 'Activation' and layer.activation == 0: # Identity + assert(len(layer.inputs) == 1) + if layer.inputs[0] not in all_layers and layer.name not in all_inputs: + return True; + return False; + + return [l for l in layers if not is_unconnected_identity(l)] + o_model.layers = cleanup_layers(o_model.layers) + + all_inputs = {i for l in o_model.layers for i in l.inputs} + embedded_tensors = {t.name for l in o_model.layers for t in l.tensors} + + # Find global tensors + def dims_to_barracuda_shape(dims): + shape = list(dims) + while len(shape) < 4: + shape = [1] + shape + return shape + o_model.globals = [t for t in o_model.tensors if t not in all_inputs and t not in embedded_tensors] + #for x in global_tensors: + # shape = dims_to_barracuda_shape(get_tensor_dims(o_model.tensors[x])) + # o_globals += [Struct( + # name = x, + # shape = shape, + # data = np.reshape(get_tensor_data(o_model.tensors[x]), shape).astype(np.float32))] + + # Trim + if trim_unused_by_output: + o_model.layers = barracuda.trim(o_model.layers, trim_unused_by_output, args.verbose) + + # Create load layers for constants + const_tensors = [i for i in all_inputs if i in o_model.tensors] + const_tensors += o_model.globals + for x in const_tensors: + shape = dims_to_barracuda_shape(get_tensor_dims(o_model.tensors[x])) + + o_l = Struct( + type = 255, # Load + class_name = "Const", + name = x, + pads = [0,0,0,0], + strides = [], + pool_size = [], + axis = -1, + alpha = 1, + beta = 0, + activation = 0, + inputs = [], + tensors = [Struct( + name = x, + shape = shape, + data = np.reshape(get_tensor_data(o_model.tensors[x]), shape).astype(np.float32))] + ) + o_model.layers.insert(0, o_l) + + # Find model inputs & outputs + all_layers = {l.name for l in o_model.layers} + # global inputs => are inputs that are NOT connected to any layer in the network + # global outputs => are outputs that are NOT feeding any layer in the network OR are coming from Identity layers + o_model.inputs = {i:o_input_shapes[i] for l in o_model.layers for i in l.inputs if i not in all_layers and i not in o_model.memories} + + def is_output_layer(layer): + if layer.class_name == 'Const': # Constants never count as global output even when unconnected + return False; + if layer.name not in all_inputs: # this layer is not inputing to any other layer + return True + if layer.class_name == 'Activation' and layer.activation == 0: # Identity marks global output + return True + return False + o_model.outputs = [l.name for l in o_model.layers if is_output_layer(l)] + + # Compress + if compress_f16: + o_model = barracuda.compress(o_model) + + # Sort model so that layer inputs are always ready upfront + o_model.layers = barracuda.sort(o_model.layers, o_model.inputs, o_model.memories, args.verbose) + + # Summary + barracuda.summary(o_model, + print_layer_links = args.print_layer_links or args.verbose, + print_barracuda_json = args.print_barracuda_json or args.verbose, + print_tensors = args.print_tensors or args.verbose) + + # Write to file + barracuda.write(o_model, target_file) + print('DONE: wrote', target_file, 'file.') diff --git a/animalai_packages/animalai_train/animalai_train/trainers/trainer.py b/animalai_packages/animalai_train/animalai_train/trainers/trainer.py new file mode 100644 index 00000000..6abd8ca8 --- /dev/null +++ b/animalai_packages/animalai_train/animalai_train/trainers/trainer.py @@ -0,0 +1,198 @@ +# # Unity ML-Agents Toolkit +import logging + +import tensorflow as tf +import numpy as np + +from animalai.envs import UnityException, AllBrainInfo + +logger = logging.getLogger("mlagents.trainers") + + +class UnityTrainerException(UnityException): + """ + Related to errors with the Trainer. + """ + pass + + +class Trainer(object): + """This class is the base class for the mlagents.trainers""" + + def __init__(self, brain, trainer_parameters, training, run_id): + """ + Responsible for collecting experiences and training a neural network model. + :BrainParameters brain: Brain to be trained. + :dict trainer_parameters: The parameters for the trainer (dictionary). + :bool training: Whether the trainer is set for training. + :int run_id: The identifier of the current run + """ + self.param_keys = [] + self.brain_name = brain.brain_name + self.run_id = run_id + self.trainer_parameters = trainer_parameters + self.is_training = training + self.stats = {} + self.summary_writer = None + self.policy = None + + def __str__(self): + return '''{} Trainer'''.format(self.__class__) + + def check_param_keys(self): + for k in self.param_keys: + if k not in self.trainer_parameters: + raise UnityTrainerException( + "The hyper-parameter {0} could not be found for the {1} trainer of " + "brain {2}.".format(k, self.__class__, self.brain_name)) + + @property + def parameters(self): + """ + Returns the trainer parameters of the trainer. + """ + raise UnityTrainerException("The parameters property was not implemented.") + + @property + def graph_scope(self): + """ + Returns the graph scope of the trainer. + """ + raise UnityTrainerException("The graph_scope property was not implemented.") + + @property + def get_max_steps(self): + """ + Returns the maximum number of steps. Is used to know when the trainer should be stopped. + :return: The maximum number of steps of the trainer + """ + raise UnityTrainerException("The get_max_steps property was not implemented.") + + @property + def get_step(self): + """ + Returns the number of training steps the trainer has performed + :return: the step count of the trainer + """ + raise UnityTrainerException("The get_step property was not implemented.") + + @property + def get_last_reward(self): + """ + Returns the last reward the trainer has had + :return: the new last reward + """ + raise UnityTrainerException("The get_last_reward property was not implemented.") + + def increment_step_and_update_last_reward(self): + """ + Increment the step count of the trainer and updates the last reward + """ + raise UnityTrainerException( + "The increment_step_and_update_last_reward method was not implemented.") + + def take_action(self, all_brain_info: AllBrainInfo): + """ + Decides actions given state/observation information, and takes them in environment. + :param all_brain_info: A dictionary of brain names and BrainInfo from environment. + :return: a tuple containing action, memories, values and an object + to be passed to add experiences + """ + raise UnityTrainerException("The take_action method was not implemented.") + + def add_experiences(self, curr_info: AllBrainInfo, next_info: AllBrainInfo, + take_action_outputs): + """ + Adds experiences to each agent's experience history. + :param curr_info: Current AllBrainInfo. + :param next_info: Next AllBrainInfo. + :param take_action_outputs: The outputs of the take action method. + """ + raise UnityTrainerException("The add_experiences method was not implemented.") + + def process_experiences(self, current_info: AllBrainInfo, next_info: AllBrainInfo): + """ + Checks agent histories for processing condition, and processes them as necessary. + Processing involves calculating value and advantage targets for model updating step. + :param current_info: Dictionary of all current-step brains and corresponding BrainInfo. + :param next_info: Dictionary of all next-step brains and corresponding BrainInfo. + """ + raise UnityTrainerException("The process_experiences method was not implemented.") + + def end_episode(self): + """ + A signal that the Episode has ended. The buffer must be reset. + Get only called when the academy resets. + """ + raise UnityTrainerException("The end_episode method was not implemented.") + + def is_ready_update(self): + """ + Returns whether or not the trainer has enough elements to run update model + :return: A boolean corresponding to wether or not update_model() can be run + """ + raise UnityTrainerException("The is_ready_update method was not implemented.") + + def update_policy(self): + """ + Uses demonstration_buffer to update model. + """ + raise UnityTrainerException("The update_model method was not implemented.") + + def save_model(self): + """ + Saves the model + """ + self.policy.save_model(self.get_step) + + def export_model(self): + """ + Exports the model + """ + self.policy.export_model() + + def write_summary(self, global_step, lesson_num=0): + """ + Saves training statistics to Tensorboard. + :param lesson_num: Current lesson number in curriculum. + :param global_step: The number of steps the simulation has been going for + """ + if global_step % self.trainer_parameters['summary_freq'] == 0 and global_step != 0: + is_training = "Training." if self.is_training and self.get_step <= self.get_max_steps else "Not Training." + if len(self.stats['Environment/Cumulative Reward']) > 0: + mean_reward = np.mean(self.stats['Environment/Cumulative Reward']) + logger.info(" {}: {}: Step: {}. Mean Reward: {:0.3f}. Std of Reward: {:0.3f}. {}" + .format(self.run_id, self.brain_name, + min(self.get_step, self.get_max_steps), + mean_reward, np.std(self.stats['Environment/Cumulative Reward']), + is_training)) + else: + logger.info(" {}: {}: Step: {}. No episode was completed since last summary. {}" + .format(self.run_id, self.brain_name, self.get_step, is_training)) + summary = tf.Summary() + for key in self.stats: + if len(self.stats[key]) > 0: + stat_mean = float(np.mean(self.stats[key])) + summary.value.add(tag='{}'.format(key), simple_value=stat_mean) + self.stats[key] = [] + summary.value.add(tag='Environment/Lesson', simple_value=lesson_num) + self.summary_writer.add_summary(summary, self.get_step) + self.summary_writer.flush() + + def write_tensorboard_text(self, key, input_dict): + """ + Saves text to Tensorboard. + Note: Only works on tensorflow r1.2 or above. + :param key: The name of the text. + :param input_dict: A dictionary that will be displayed in a table on Tensorboard. + """ + try: + with tf.Session() as sess: + s_op = tf.summary.text(key, tf.convert_to_tensor( + ([[str(x), str(input_dict[x])] for x in input_dict]))) + s = sess.run(s_op) + self.summary_writer.add_summary(s, self.get_step) + except: + logger.info( + "Cannot write text summary for Tensorboard. Tensorflow version must be r1.2 or above.") + pass diff --git a/animalai_packages/animalai_train/animalai_train/trainers/trainer_controller.py b/animalai_packages/animalai_train/animalai_train/trainers/trainer_controller.py new file mode 100644 index 00000000..0eb6c53c --- /dev/null +++ b/animalai_packages/animalai_train/animalai_train/trainers/trainer_controller.py @@ -0,0 +1,301 @@ +# # Unity ML-Agents Toolkit +# ## ML-Agent Learning +"""Launches trainers for each External Brains in a Unity Environment.""" + +import os +import logging +import shutil +import sys +if sys.platform.startswith('win'): + import win32api + import win32con +from typing import * + +import numpy as np +import tensorflow as tf + +from animalai.envs import BrainInfo +from animalai.envs.exception import UnityEnvironmentException +from animalai_train.trainers.ppo.trainer import PPOTrainer +from animalai_train.trainers.bc.offline_trainer import OfflineBCTrainer +from animalai_train.trainers.bc.online_trainer import OnlineBCTrainer +from animalai_train.trainers.meta_curriculum import MetaCurriculum + + +class TrainerController(object): + def __init__(self, model_path: str, summaries_dir: str, + run_id: str, save_freq: int, meta_curriculum: Optional[MetaCurriculum], + load: bool, train: bool, keep_checkpoints: int, lesson: Optional[int], + external_brains: Dict[str, BrainInfo], training_seed: int, config=None): + """ + :param model_path: Path to save the model. + :param summaries_dir: Folder to save training summaries. + :param run_id: The sub-directory name for model and summary statistics + :param save_freq: Frequency at which to save model + :param meta_curriculum: MetaCurriculum object which stores information about all curricula. + :param load: Whether to load the model or randomly initialize. + :param train: Whether to train model, or only run inference. + :param keep_checkpoints: How many model checkpoints to keep. + :param lesson: Start learning from this lesson. + :param external_brains: dictionary of external brain names to BrainInfo objects. + :param training_seed: Seed to use for Numpy and Tensorflow random number generation. + """ + + self.model_path = model_path + self.summaries_dir = summaries_dir + self.external_brains = external_brains + self.external_brain_names = external_brains.keys() + self.logger = logging.getLogger('mlagents.envs') + self.run_id = run_id + self.save_freq = save_freq + self.lesson = lesson + self.load_model = load + self.train_model = train + self.keep_checkpoints = keep_checkpoints + self.trainers = {} + self.global_step = 0 + self.meta_curriculum = meta_curriculum + self.seed = training_seed + self.config = config + self.update_config = True + np.random.seed(self.seed) + tf.set_random_seed(self.seed) + + def _get_measure_vals(self): + if self.meta_curriculum: + brain_names_to_measure_vals = {} + for brain_name, curriculum \ + in self.meta_curriculum.brains_to_curriculums.items(): + if curriculum.measure == 'progress': + measure_val = (self.trainers[brain_name].get_step / + self.trainers[brain_name].get_max_steps) + brain_names_to_measure_vals[brain_name] = measure_val + elif curriculum.measure == 'reward': + measure_val = np.mean(self.trainers[brain_name] + .reward_buffer) + brain_names_to_measure_vals[brain_name] = measure_val + return brain_names_to_measure_vals + else: + return None + + def _save_model(self, steps=0): + """ + Saves current model to checkpoint folder. + :param steps: Current number of steps in training process. + :param saver: Tensorflow saver for session. + """ + for brain_name in self.trainers.keys(): + self.trainers[brain_name].save_model() + self.logger.info('Saved Model') + + def _save_model_when_interrupted(self, steps=0): + self.logger.info('Learning was interrupted. Please wait ' + 'while the graph is generated.') + self._save_model(steps) + + def _win_handler(self, event): + """ + This function gets triggered after ctrl-c or ctrl-break is pressed + under Windows platform. + """ + if event in (win32con.CTRL_C_EVENT, win32con.CTRL_BREAK_EVENT): + self._save_model_when_interrupted(self.global_step) + self._export_graph() + sys.exit() + return True + return False + + def _export_graph(self): + """ + Exports latest saved models to .nn format for Unity embedding. + """ + for brain_name in self.trainers.keys(): + self.trainers[brain_name].export_model() + + def initialize_trainers(self, trainer_config): + """ + Initialization of the trainers + :param trainer_config: The configurations of the trainers + """ + trainer_parameters_dict = {} + + for brain_name in self.external_brains: + trainer_parameters = trainer_config['default'].copy() + trainer_parameters['summary_path'] = '{basedir}/{name}'.format( + basedir=self.summaries_dir, + name=str(self.run_id) + '_' + brain_name) + trainer_parameters['model_path'] = '{basedir}/{name}'.format( + basedir=self.model_path, + name=brain_name) + trainer_parameters['keep_checkpoints'] = self.keep_checkpoints + if brain_name in trainer_config: + _brain_key = brain_name + while not isinstance(trainer_config[_brain_key], dict): + _brain_key = trainer_config[_brain_key] + for k in trainer_config[_brain_key]: + trainer_parameters[k] = trainer_config[_brain_key][k] + trainer_parameters_dict[brain_name] = trainer_parameters.copy() + for brain_name in self.external_brains: + if trainer_parameters_dict[brain_name]['trainer'] == 'offline_bc': + self.trainers[brain_name] = OfflineBCTrainer( + self.external_brains[brain_name], + trainer_parameters_dict[brain_name], self.train_model, + self.load_model, self.seed, self.run_id) + elif trainer_parameters_dict[brain_name]['trainer'] == 'online_bc': + self.trainers[brain_name] = OnlineBCTrainer( + self.external_brains[brain_name], + trainer_parameters_dict[brain_name], self.train_model, + self.load_model, self.seed, self.run_id) + elif trainer_parameters_dict[brain_name]['trainer'] == 'ppo': + self.trainers[brain_name] = PPOTrainer( + self.external_brains[brain_name], + self.meta_curriculum + .brains_to_curriculums[brain_name] + .min_lesson_length if self.meta_curriculum else 0, + trainer_parameters_dict[brain_name], + self.train_model, self.load_model, self.seed, self.run_id) + else: + raise UnityEnvironmentException('The trainer config contains ' + 'an unknown trainer type for ' + 'brain {}' + .format(brain_name)) + + @staticmethod + def _create_model_path(model_path): + try: + if not os.path.exists(model_path): + os.makedirs(model_path) + except Exception: + raise UnityEnvironmentException('The folder {} containing the ' + 'generated model could not be ' + 'accessed. Please make sure the ' + 'permissions are set correctly.' + .format(model_path)) + + def _reset_env(self, env): + """Resets the environment. + + Returns: + A Data structure corresponding to the initial reset state of the + environment. + """ + if self.meta_curriculum is not None: + return env.reset(config=self.meta_curriculum.get_config()) + else: + if self.update_config: + return env.reset(arenas_configurations_input=self.config) + self.update_config = False + else: + return env.reset() + + def start_learning(self, env, trainer_config): + # TODO: Should be able to start learning at different lesson numbers + # for each curriculum. + if self.meta_curriculum is not None: + self.meta_curriculum.set_all_curriculums_to_lesson_num(self.lesson) + self._create_model_path(self.model_path) + + tf.reset_default_graph() + + # Prevent a single session from taking all GPU memory. + self.initialize_trainers(trainer_config) + for _, t in self.trainers.items(): + self.logger.info(t) + + curr_info = self._reset_env(env) + if self.train_model: + for brain_name, trainer in self.trainers.items(): + trainer.write_tensorboard_text('Hyperparameters', + trainer.parameters) + if sys.platform.startswith('win'): + # Add the _win_handler function to the windows console's handler function list + win32api.SetConsoleCtrlHandler(self._win_handler, True) + try: + while any([t.get_step <= t.get_max_steps \ + for k, t in self.trainers.items()]) \ + or not self.train_model: + new_info = self.take_step(env, curr_info) + self.global_step += 1 + if self.global_step % self.save_freq == 0 and self.global_step != 0 \ + and self.train_model: + # Save Tensorflow model + self._save_model(steps=self.global_step) + curr_info = new_info + # Final save Tensorflow model + if self.global_step != 0 and self.train_model: + self._save_model(steps=self.global_step) + except KeyboardInterrupt: + if self.train_model: + self._save_model_when_interrupted(steps=self.global_step) + pass + env.close() + + if self.train_model: + self._export_graph() + + def take_step(self, env, curr_info): + if self.meta_curriculum: + # Get the sizes of the reward buffers. + reward_buff_sizes = {k: len(t.reward_buffer) \ + for (k, t) in self.trainers.items()} + # Attempt to increment the lessons of the brains who + # were ready. + lessons_incremented = \ + self.meta_curriculum.increment_lessons( + self._get_measure_vals(), + reward_buff_sizes=reward_buff_sizes) + + # If any lessons were incremented or the environment is + # ready to be reset + if (self.meta_curriculum + and any(lessons_incremented.values())): + curr_info = self._reset_env(env) + for brain_name, trainer in self.trainers.items(): + trainer.end_episode() + for brain_name, changed in lessons_incremented.items(): + if changed: + self.trainers[brain_name].reward_buffer.clear() + elif env.global_done: + curr_info = self._reset_env(env) + for brain_name, trainer in self.trainers.items(): + trainer.end_episode() + + # Decide and take an action + take_action_vector, \ + take_action_memories, \ + take_action_text, \ + take_action_value, \ + take_action_outputs \ + = {}, {}, {}, {}, {} + for brain_name, trainer in self.trainers.items(): + (take_action_vector[brain_name], + take_action_memories[brain_name], + take_action_text[brain_name], + take_action_value[brain_name], + take_action_outputs[brain_name]) = \ + trainer.take_action(curr_info) + new_info = env.step(vector_action=take_action_vector, + memory=take_action_memories, + text_action=take_action_text, + value=take_action_value) + for brain_name, trainer in self.trainers.items(): + trainer.add_experiences(curr_info, new_info, + take_action_outputs[brain_name]) + trainer.process_experiences(curr_info, new_info) + if trainer.is_ready_update() and self.train_model \ + and trainer.get_step <= trainer.get_max_steps: + # Perform gradient descent with experience buffer + trainer.update_policy() + # Write training statistics to Tensorboard. + if self.meta_curriculum is not None: + trainer.write_summary( + self.global_step, + lesson_num=self.meta_curriculum + .brains_to_curriculums[brain_name] + .lesson_num) + else: + trainer.write_summary(self.global_step) + if self.train_model \ + and trainer.get_step <= trainer.get_max_steps: + trainer.increment_step_and_update_last_reward() + return new_info diff --git a/animalai_packages/animalai_train/setup.py b/animalai_packages/animalai_train/setup.py new file mode 100644 index 00000000..6c31c5b6 --- /dev/null +++ b/animalai_packages/animalai_train/setup.py @@ -0,0 +1,33 @@ +from setuptools import setup + +setup( + name='animalai_train', + version='0.4.0', + description='Animal AI competition training library', + url='https://github.com/beyretb/AnimalAI-Olympics', + author='Benjamin Beyret', + author_email='bb1010@ic.ac.uk', + + classifiers=[ + 'Intended Audience :: Developers', + 'Topic :: Scientific/Engineering :: Artificial Intelligence', + 'License :: OSI Approved :: Apache Software License', + 'Programming Language :: Python :: 3.6' + ], + + packages=['animalai_train.trainers', 'animalai_train.trainers.bc', 'animalai_train.trainers.ppo'], # Required + zip_safe=False, + + install_requires=[ + 'animalai>=0.4.0', + 'tensorflow>=1.7,<1.8', + 'matplotlib', + 'Pillow>=4.2.1,<=5.4.1', + 'numpy>=1.13.3,<=1.14.5', + 'protobuf>=3.6,<3.7', + 'grpcio>=1.11.0,<1.12.0', + 'pyyaml>=5.1', + 'jsonpickle>=1.2', + 'pypiwin32==223;platform_system=="Windows"'], + python_requires=">=3.5,<3.8", +) \ No newline at end of file diff --git a/train.py b/train.py index b291b582..877f08ee 100644 --- a/train.py +++ b/train.py @@ -1,4 +1,4 @@ -from animalai.trainers.trainer_controller import TrainerController +from animalai_train.trainers.trainer_controller import TrainerController from animalai.envs import UnityEnvironment from animalai.envs.exception import UnityEnvironmentException from animalai.envs.arena_config import ArenaConfig From 7d2bd1a3097bf4675f6dfa3129767b1343da8fa4 Mon Sep 17 00:00:00 2001 From: Benjamin Beyret Date: Wed, 29 May 2019 16:14:10 +0100 Subject: [PATCH 02/23] add github link to env warning + remove requirements + create example folder --- .../animalai_envs/animalai/envs/environment.py | 4 +++- train.py => examples/train.py | 0 visualizeArena.py => examples/visualizeArena.py | 0 .../visualizeLightsOff.py | 0 requirementsOthers.txt | 12 ------------ requirementsWindows.txt | 13 ------------- 6 files changed, 3 insertions(+), 26 deletions(-) rename train.py => examples/train.py (100%) rename visualizeArena.py => examples/visualizeArena.py (100%) rename visualizeLightsOff.py => examples/visualizeLightsOff.py (100%) delete mode 100644 requirementsOthers.txt delete mode 100644 requirementsWindows.txt diff --git a/animalai_packages/animalai_envs/animalai/envs/environment.py b/animalai_packages/animalai_envs/animalai/envs/environment.py index 6c7fc0ae..7f3e28d1 100644 --- a/animalai_packages/animalai_envs/animalai/envs/environment.py +++ b/animalai_packages/animalai_envs/animalai/envs/environment.py @@ -168,7 +168,9 @@ def executable_launcher(self, file_name, docker_training): if launch_string is None: self._close() raise UnityEnvironmentException("Couldn't launch the {0} environment. " - "Provided filename does not match any environments." + "Provided filename does not match any environments.\n" + "If you haven't done so already, follow the instructions at: " + "https://github.com/beyretb/AnimalAI-Olympics " .format(true_filename)) else: logger.debug("This is the launch string {}".format(launch_string)) diff --git a/train.py b/examples/train.py similarity index 100% rename from train.py rename to examples/train.py diff --git a/visualizeArena.py b/examples/visualizeArena.py similarity index 100% rename from visualizeArena.py rename to examples/visualizeArena.py diff --git a/visualizeLightsOff.py b/examples/visualizeLightsOff.py similarity index 100% rename from visualizeLightsOff.py rename to examples/visualizeLightsOff.py diff --git a/requirementsOthers.txt b/requirementsOthers.txt deleted file mode 100644 index 5aedba07..00000000 --- a/requirementsOthers.txt +++ /dev/null @@ -1,12 +0,0 @@ -tensorflow>=1.7,<1.8 -Pillow>=4.2.1 -matplotlib -numpy>=1.13.3,<=1.14.5 -jupyter -pytest>=3.2.2,<4.0.0 -docopt -pyyaml -jsonpickle -matplotlib -protobuf>=3.6,<3.7 -grpcio>=1.11.0,<1.12.0 diff --git a/requirementsWindows.txt b/requirementsWindows.txt deleted file mode 100644 index c48ba5d3..00000000 --- a/requirementsWindows.txt +++ /dev/null @@ -1,13 +0,0 @@ -tensorflow>=1.7,<1.8 -Pillow>=4.2.1 -matplotlib -numpy>=1.13.3,<=1.14.5 -jupyter -pytest>=3.2.2,<4.0.0 -docopt -pyyaml -jsonpickle -matplotlib -protobuf>=3.6,<3.7 -grpcio>=1.11.0,<1.12.0 -pypiwin32==223 From 5144e5cee886c884892f9136a4da0fa54a6e6056 Mon Sep 17 00:00:00 2001 From: Benjamin Beyret Date: Wed, 29 May 2019 16:15:10 +0100 Subject: [PATCH 03/23] move configs to examples --- {configs => examples/configs}/allObjectsRandom.yaml | 0 {configs => examples/configs}/avoidance.yaml | 0 {configs => examples/configs}/exampleConfig.yaml | 0 {configs => examples/configs}/exampleTraining.yaml | 0 {configs => examples/configs}/justFood.yaml | 0 {configs => examples/configs}/lightsOff.yaml | 0 {configs => examples/configs}/movingFood.yaml | 0 {configs => examples/configs}/objectManipulation.yaml | 0 {configs => examples/configs}/obstacles.yaml | 0 {configs => examples/configs}/preferences.yaml | 0 {configs => examples/configs}/trainer_config.yaml | 0 11 files changed, 0 insertions(+), 0 deletions(-) rename {configs => examples/configs}/allObjectsRandom.yaml (100%) rename {configs => examples/configs}/avoidance.yaml (100%) rename {configs => examples/configs}/exampleConfig.yaml (100%) rename {configs => examples/configs}/exampleTraining.yaml (100%) rename {configs => examples/configs}/justFood.yaml (100%) rename {configs => examples/configs}/lightsOff.yaml (100%) rename {configs => examples/configs}/movingFood.yaml (100%) rename {configs => examples/configs}/objectManipulation.yaml (100%) rename {configs => examples/configs}/obstacles.yaml (100%) rename {configs => examples/configs}/preferences.yaml (100%) rename {configs => examples/configs}/trainer_config.yaml (100%) diff --git a/configs/allObjectsRandom.yaml b/examples/configs/allObjectsRandom.yaml similarity index 100% rename from configs/allObjectsRandom.yaml rename to examples/configs/allObjectsRandom.yaml diff --git a/configs/avoidance.yaml b/examples/configs/avoidance.yaml similarity index 100% rename from configs/avoidance.yaml rename to examples/configs/avoidance.yaml diff --git a/configs/exampleConfig.yaml b/examples/configs/exampleConfig.yaml similarity index 100% rename from configs/exampleConfig.yaml rename to examples/configs/exampleConfig.yaml diff --git a/configs/exampleTraining.yaml b/examples/configs/exampleTraining.yaml similarity index 100% rename from configs/exampleTraining.yaml rename to examples/configs/exampleTraining.yaml diff --git a/configs/justFood.yaml b/examples/configs/justFood.yaml similarity index 100% rename from configs/justFood.yaml rename to examples/configs/justFood.yaml diff --git a/configs/lightsOff.yaml b/examples/configs/lightsOff.yaml similarity index 100% rename from configs/lightsOff.yaml rename to examples/configs/lightsOff.yaml diff --git a/configs/movingFood.yaml b/examples/configs/movingFood.yaml similarity index 100% rename from configs/movingFood.yaml rename to examples/configs/movingFood.yaml diff --git a/configs/objectManipulation.yaml b/examples/configs/objectManipulation.yaml similarity index 100% rename from configs/objectManipulation.yaml rename to examples/configs/objectManipulation.yaml diff --git a/configs/obstacles.yaml b/examples/configs/obstacles.yaml similarity index 100% rename from configs/obstacles.yaml rename to examples/configs/obstacles.yaml diff --git a/configs/preferences.yaml b/examples/configs/preferences.yaml similarity index 100% rename from configs/preferences.yaml rename to examples/configs/preferences.yaml diff --git a/configs/trainer_config.yaml b/examples/configs/trainer_config.yaml similarity index 100% rename from configs/trainer_config.yaml rename to examples/configs/trainer_config.yaml From 16e8636fa3b77ae4eb0ccca75798d837cf601984 Mon Sep 17 00:00:00 2001 From: Benjamin Beyret Date: Wed, 29 May 2019 16:33:19 +0100 Subject: [PATCH 04/23] fix links in examples --- examples/train.py | 2 +- examples/visualizeArena.py | 2 +- examples/visualizeLightsOff.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/train.py b/examples/train.py index 877f08ee..38057b15 100644 --- a/examples/train.py +++ b/examples/train.py @@ -8,7 +8,7 @@ # ML-agents parameters for training -env_path = 'env/AnimalAI' +env_path = '../env/AnimalAI' worker_id = random.randint(1, 100) seed = 10 base_port = 5005 diff --git a/examples/visualizeArena.py b/examples/visualizeArena.py index ddc7a5bd..d87f56ed 100644 --- a/examples/visualizeArena.py +++ b/examples/visualizeArena.py @@ -3,7 +3,7 @@ import sys import random -env_path = 'env/AnimalAI' +env_path = '../env/AnimalAI' worker_id = random.randint(0, 200) run_seed = 1 docker_target_name = None diff --git a/examples/visualizeLightsOff.py b/examples/visualizeLightsOff.py index 0d941c39..855a0d40 100644 --- a/examples/visualizeLightsOff.py +++ b/examples/visualizeLightsOff.py @@ -5,7 +5,7 @@ from matplotlib import pyplot as plt from matplotlib import animation -env_path = 'env/AnimalAI' +env_path = '../env/AnimalAI' worker_id = random.randint(1, 100) seed = 10 From f899425cfbd62ff0bddd952bcc13092db2390013 Mon Sep 17 00:00:00 2001 From: Benjamin Beyret Date: Fri, 31 May 2019 18:41:35 +0100 Subject: [PATCH 05/23] add gym wrapper + add dopamine + move train package to examples --- .gitignore | 4 +- animalai_bkp/envs/arena_config.py | 8 +- animalai_bkp/envs/environment.py | 6 +- animalai_bkp/trainers/trainer_controller.py | 2 +- .../animalai}/LICENSE | 0 .../animalai}/README.md | 0 .../animalai}/animalai/__init__.py | 0 .../animalai/communicator_objects/__init__.py | 0 .../agent_action_proto_pb2.py | 0 .../agent_info_proto_pb2.py | 0 .../arena_parameters_proto_pb2.py | 0 .../brain_parameters_proto_pb2.py | 0 .../communicator_objects/command_proto_pb2.py | 0 .../demonstration_meta_proto_pb2.py | 0 .../engine_configuration_proto_pb2.py | 0 .../communicator_objects/header_pb2.py | 0 .../resolution_proto_pb2.py | 0 .../space_type_proto_pb2.py | 0 .../communicator_objects/unity_input_pb2.py | 0 .../communicator_objects/unity_message_pb2.py | 0 .../communicator_objects/unity_output_pb2.py | 0 .../unity_rl_initialization_input_pb2.py | 0 .../unity_rl_initialization_output_pb2.py | 0 .../unity_rl_input_pb2.py | 0 .../unity_rl_output_pb2.py | 0 .../unity_rl_reset_input_pb2.py | 0 .../unity_rl_reset_output_pb2.py | 0 .../unity_to_external_pb2.py | 0 .../unity_to_external_pb2_grpc.py | 0 .../animalai}/animalai/envs/__init__.py | 0 .../animalai}/animalai/envs/arena_config.py | 8 +- .../animalai}/animalai/envs/brain.py | 0 .../animalai}/animalai/envs/communicator.py | 0 .../animalai}/animalai/envs/environment.py | 11 +- .../animalai}/animalai/envs/exception.py | 0 .../animalai/animalai/envs/gym/environment.py | 354 ++++++++++++++++++ .../animalai/envs/rpc_communicator.py | 2 +- .../animalai/envs/socket_communicator.py | 0 .../animalai}/setup.py | 3 +- documentation/quickstart.md | 2 +- documentation/training.md | 2 +- .../animalai_train/LICENSE | 0 .../animalai_train/README.md | 0 .../animalai_train/animalai_train/__init__.py | 0 .../animalai_train/dopamine/animalai_lib.py | 270 +++++++++++++ .../animalai_train/trainers/__init__.py | 0 .../animalai_train/trainers/barracuda.py | 0 .../animalai_train/trainers/bc/__init__.py | 0 .../animalai_train/trainers/bc/models.py | 0 .../trainers/bc/offline_trainer.py | 0 .../trainers/bc/online_trainer.py | 0 .../animalai_train/trainers/bc/policy.py | 0 .../animalai_train/trainers/bc/trainer.py | 0 .../animalai_train/trainers/buffer.py | 0 .../animalai_train/trainers/curriculum.py | 0 .../animalai_train/trainers/demo_loader.py | 0 .../animalai_train/trainers/exception.py | 0 .../animalai_train/trainers/learn.py | 0 .../trainers/meta_curriculum.py | 0 .../animalai_train/trainers/models.py | 0 .../animalai_train/trainers/policy.py | 0 .../animalai_train/trainers/ppo/__init__.py | 0 .../animalai_train/trainers/ppo/models.py | 0 .../animalai_train/trainers/ppo/policy.py | 0 .../animalai_train/trainers/ppo/trainer.py | 0 .../trainers/tensorflow_to_barracuda.py | 0 .../animalai_train/trainers/trainer.py | 0 .../trainers/trainer_controller.py | 2 +- .../animalai_train/setup.py | 0 examples/configs/rainbow.gin | 34 ++ examples/trainBaselines.py | 33 ++ examples/visualizeArena.py | 2 +- examples/visualizeLightsOff.py | 6 +- 73 files changed, 721 insertions(+), 28 deletions(-) rename {animalai_packages/animalai_envs => animalai_package/animalai}/LICENSE (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/README.md (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/__init__.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/communicator_objects/__init__.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/communicator_objects/agent_action_proto_pb2.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/communicator_objects/agent_info_proto_pb2.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/communicator_objects/arena_parameters_proto_pb2.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/communicator_objects/brain_parameters_proto_pb2.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/communicator_objects/command_proto_pb2.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/communicator_objects/demonstration_meta_proto_pb2.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/communicator_objects/engine_configuration_proto_pb2.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/communicator_objects/header_pb2.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/communicator_objects/resolution_proto_pb2.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/communicator_objects/space_type_proto_pb2.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/communicator_objects/unity_input_pb2.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/communicator_objects/unity_message_pb2.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/communicator_objects/unity_output_pb2.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/communicator_objects/unity_rl_initialization_input_pb2.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/communicator_objects/unity_rl_initialization_output_pb2.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/communicator_objects/unity_rl_input_pb2.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/communicator_objects/unity_rl_output_pb2.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/communicator_objects/unity_rl_reset_input_pb2.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/communicator_objects/unity_rl_reset_output_pb2.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/communicator_objects/unity_to_external_pb2.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/communicator_objects/unity_to_external_pb2_grpc.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/envs/__init__.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/envs/arena_config.py (94%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/envs/brain.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/envs/communicator.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/envs/environment.py (98%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/envs/exception.py (100%) create mode 100644 animalai_package/animalai/animalai/envs/gym/environment.py rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/envs/rpc_communicator.py (98%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/animalai/envs/socket_communicator.py (100%) rename {animalai_packages/animalai_envs => animalai_package/animalai}/setup.py (94%) rename {animalai_packages => examples}/animalai_train/LICENSE (100%) rename {animalai_packages => examples}/animalai_train/README.md (100%) rename {animalai_packages => examples}/animalai_train/animalai_train/__init__.py (100%) create mode 100644 examples/animalai_train/animalai_train/dopamine/animalai_lib.py rename {animalai_packages => examples}/animalai_train/animalai_train/trainers/__init__.py (100%) rename {animalai_packages => examples}/animalai_train/animalai_train/trainers/barracuda.py (100%) rename {animalai_packages => examples}/animalai_train/animalai_train/trainers/bc/__init__.py (100%) rename {animalai_packages => examples}/animalai_train/animalai_train/trainers/bc/models.py (100%) rename {animalai_packages => examples}/animalai_train/animalai_train/trainers/bc/offline_trainer.py (100%) rename {animalai_packages => examples}/animalai_train/animalai_train/trainers/bc/online_trainer.py (100%) rename {animalai_packages => examples}/animalai_train/animalai_train/trainers/bc/policy.py (100%) rename {animalai_packages => examples}/animalai_train/animalai_train/trainers/bc/trainer.py (100%) rename {animalai_packages => examples}/animalai_train/animalai_train/trainers/buffer.py (100%) rename {animalai_packages => examples}/animalai_train/animalai_train/trainers/curriculum.py (100%) rename {animalai_packages => examples}/animalai_train/animalai_train/trainers/demo_loader.py (100%) rename {animalai_packages => examples}/animalai_train/animalai_train/trainers/exception.py (100%) rename {animalai_packages => examples}/animalai_train/animalai_train/trainers/learn.py (100%) rename {animalai_packages => examples}/animalai_train/animalai_train/trainers/meta_curriculum.py (100%) rename {animalai_packages => examples}/animalai_train/animalai_train/trainers/models.py (100%) rename {animalai_packages => examples}/animalai_train/animalai_train/trainers/policy.py (100%) rename {animalai_packages => examples}/animalai_train/animalai_train/trainers/ppo/__init__.py (100%) rename {animalai_packages => examples}/animalai_train/animalai_train/trainers/ppo/models.py (100%) rename {animalai_packages => examples}/animalai_train/animalai_train/trainers/ppo/policy.py (100%) rename {animalai_packages => examples}/animalai_train/animalai_train/trainers/ppo/trainer.py (100%) rename {animalai_packages => examples}/animalai_train/animalai_train/trainers/tensorflow_to_barracuda.py (100%) rename {animalai_packages => examples}/animalai_train/animalai_train/trainers/trainer.py (100%) rename {animalai_packages => examples}/animalai_train/animalai_train/trainers/trainer_controller.py (99%) rename {animalai_packages => examples}/animalai_train/setup.py (100%) create mode 100644 examples/configs/rainbow.gin create mode 100644 examples/trainBaselines.py diff --git a/.gitignore b/.gitignore index 82fde7b4..8ccb7e08 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ env/* !env/README.md -/models -/summaries +models/ +summaries/ /.idea __pycache__/ UnitySDK.log diff --git a/animalai_bkp/envs/arena_config.py b/animalai_bkp/envs/arena_config.py index 8e48b1a0..a756c493 100644 --- a/animalai_bkp/envs/arena_config.py +++ b/animalai_bkp/envs/arena_config.py @@ -94,11 +94,11 @@ def dict_to_arena_config(self) -> UnityRLResetInput: return config_out - def update(self, arenas_configurations_input): + def update(self, arenas_configurations): - if arenas_configurations_input is not None: - for arena_i in arenas_configurations_input.arenas: - self.arenas[arena_i] = copy.copy(arenas_configurations_input.arenas[arena_i]) + if arenas_configurations is not None: + for arena_i in arenas_configurations.arenas: + self.arenas[arena_i] = copy.copy(arenas_configurations.arenas[arena_i]) def constructor_arena(loader, node): diff --git a/animalai_bkp/envs/environment.py b/animalai_bkp/envs/environment.py index 6c7fc0ae..7397b9c8 100644 --- a/animalai_bkp/envs/environment.py +++ b/animalai_bkp/envs/environment.py @@ -217,16 +217,16 @@ def __str__(self): Number of Training Brains : {2}'''.format(self._academy_name, str(self._num_brains), str(self._num_external_brains)) - def reset(self, arenas_configurations_input=None, train_mode=True) -> AllBrainInfo: + def reset(self, arenas_configurations=None, train_mode=True) -> AllBrainInfo: """ Sends a signal to reset the unity environment. :return: AllBrainInfo : A data structure corresponding to the initial reset state of the environment. """ if self._loaded: - self.arenas_configurations.update(arenas_configurations_input) + self.arenas_configurations.update(arenas_configurations) outputs = self.communicator.exchange( - self._generate_reset_input(train_mode, arenas_configurations_input) + self._generate_reset_input(train_mode, arenas_configurations) ) if outputs is None: raise KeyboardInterrupt diff --git a/animalai_bkp/trainers/trainer_controller.py b/animalai_bkp/trainers/trainer_controller.py index 813a0a1e..0618815d 100644 --- a/animalai_bkp/trainers/trainer_controller.py +++ b/animalai_bkp/trainers/trainer_controller.py @@ -183,7 +183,7 @@ def _reset_env(self, env): return env.reset(config=self.meta_curriculum.get_config()) else: if self.update_config: - return env.reset(arenas_configurations_input=self.config) + return env.reset(arenas_configurations=self.config) self.update_config = False else: return env.reset() diff --git a/animalai_packages/animalai_envs/LICENSE b/animalai_package/animalai/LICENSE similarity index 100% rename from animalai_packages/animalai_envs/LICENSE rename to animalai_package/animalai/LICENSE diff --git a/animalai_packages/animalai_envs/README.md b/animalai_package/animalai/README.md similarity index 100% rename from animalai_packages/animalai_envs/README.md rename to animalai_package/animalai/README.md diff --git a/animalai_packages/animalai_envs/animalai/__init__.py b/animalai_package/animalai/animalai/__init__.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/__init__.py rename to animalai_package/animalai/animalai/__init__.py diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/__init__.py b/animalai_package/animalai/animalai/communicator_objects/__init__.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/communicator_objects/__init__.py rename to animalai_package/animalai/animalai/communicator_objects/__init__.py diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/agent_action_proto_pb2.py b/animalai_package/animalai/animalai/communicator_objects/agent_action_proto_pb2.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/communicator_objects/agent_action_proto_pb2.py rename to animalai_package/animalai/animalai/communicator_objects/agent_action_proto_pb2.py diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/agent_info_proto_pb2.py b/animalai_package/animalai/animalai/communicator_objects/agent_info_proto_pb2.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/communicator_objects/agent_info_proto_pb2.py rename to animalai_package/animalai/animalai/communicator_objects/agent_info_proto_pb2.py diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/arena_parameters_proto_pb2.py b/animalai_package/animalai/animalai/communicator_objects/arena_parameters_proto_pb2.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/communicator_objects/arena_parameters_proto_pb2.py rename to animalai_package/animalai/animalai/communicator_objects/arena_parameters_proto_pb2.py diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/brain_parameters_proto_pb2.py b/animalai_package/animalai/animalai/communicator_objects/brain_parameters_proto_pb2.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/communicator_objects/brain_parameters_proto_pb2.py rename to animalai_package/animalai/animalai/communicator_objects/brain_parameters_proto_pb2.py diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/command_proto_pb2.py b/animalai_package/animalai/animalai/communicator_objects/command_proto_pb2.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/communicator_objects/command_proto_pb2.py rename to animalai_package/animalai/animalai/communicator_objects/command_proto_pb2.py diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/demonstration_meta_proto_pb2.py b/animalai_package/animalai/animalai/communicator_objects/demonstration_meta_proto_pb2.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/communicator_objects/demonstration_meta_proto_pb2.py rename to animalai_package/animalai/animalai/communicator_objects/demonstration_meta_proto_pb2.py diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/engine_configuration_proto_pb2.py b/animalai_package/animalai/animalai/communicator_objects/engine_configuration_proto_pb2.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/communicator_objects/engine_configuration_proto_pb2.py rename to animalai_package/animalai/animalai/communicator_objects/engine_configuration_proto_pb2.py diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/header_pb2.py b/animalai_package/animalai/animalai/communicator_objects/header_pb2.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/communicator_objects/header_pb2.py rename to animalai_package/animalai/animalai/communicator_objects/header_pb2.py diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/resolution_proto_pb2.py b/animalai_package/animalai/animalai/communicator_objects/resolution_proto_pb2.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/communicator_objects/resolution_proto_pb2.py rename to animalai_package/animalai/animalai/communicator_objects/resolution_proto_pb2.py diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/space_type_proto_pb2.py b/animalai_package/animalai/animalai/communicator_objects/space_type_proto_pb2.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/communicator_objects/space_type_proto_pb2.py rename to animalai_package/animalai/animalai/communicator_objects/space_type_proto_pb2.py diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/unity_input_pb2.py b/animalai_package/animalai/animalai/communicator_objects/unity_input_pb2.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/communicator_objects/unity_input_pb2.py rename to animalai_package/animalai/animalai/communicator_objects/unity_input_pb2.py diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/unity_message_pb2.py b/animalai_package/animalai/animalai/communicator_objects/unity_message_pb2.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/communicator_objects/unity_message_pb2.py rename to animalai_package/animalai/animalai/communicator_objects/unity_message_pb2.py diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/unity_output_pb2.py b/animalai_package/animalai/animalai/communicator_objects/unity_output_pb2.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/communicator_objects/unity_output_pb2.py rename to animalai_package/animalai/animalai/communicator_objects/unity_output_pb2.py diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_initialization_input_pb2.py b/animalai_package/animalai/animalai/communicator_objects/unity_rl_initialization_input_pb2.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_initialization_input_pb2.py rename to animalai_package/animalai/animalai/communicator_objects/unity_rl_initialization_input_pb2.py diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_initialization_output_pb2.py b/animalai_package/animalai/animalai/communicator_objects/unity_rl_initialization_output_pb2.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_initialization_output_pb2.py rename to animalai_package/animalai/animalai/communicator_objects/unity_rl_initialization_output_pb2.py diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_input_pb2.py b/animalai_package/animalai/animalai/communicator_objects/unity_rl_input_pb2.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_input_pb2.py rename to animalai_package/animalai/animalai/communicator_objects/unity_rl_input_pb2.py diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_output_pb2.py b/animalai_package/animalai/animalai/communicator_objects/unity_rl_output_pb2.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_output_pb2.py rename to animalai_package/animalai/animalai/communicator_objects/unity_rl_output_pb2.py diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_reset_input_pb2.py b/animalai_package/animalai/animalai/communicator_objects/unity_rl_reset_input_pb2.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_reset_input_pb2.py rename to animalai_package/animalai/animalai/communicator_objects/unity_rl_reset_input_pb2.py diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_reset_output_pb2.py b/animalai_package/animalai/animalai/communicator_objects/unity_rl_reset_output_pb2.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/communicator_objects/unity_rl_reset_output_pb2.py rename to animalai_package/animalai/animalai/communicator_objects/unity_rl_reset_output_pb2.py diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/unity_to_external_pb2.py b/animalai_package/animalai/animalai/communicator_objects/unity_to_external_pb2.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/communicator_objects/unity_to_external_pb2.py rename to animalai_package/animalai/animalai/communicator_objects/unity_to_external_pb2.py diff --git a/animalai_packages/animalai_envs/animalai/communicator_objects/unity_to_external_pb2_grpc.py b/animalai_package/animalai/animalai/communicator_objects/unity_to_external_pb2_grpc.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/communicator_objects/unity_to_external_pb2_grpc.py rename to animalai_package/animalai/animalai/communicator_objects/unity_to_external_pb2_grpc.py diff --git a/animalai_packages/animalai_envs/animalai/envs/__init__.py b/animalai_package/animalai/animalai/envs/__init__.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/envs/__init__.py rename to animalai_package/animalai/animalai/envs/__init__.py diff --git a/animalai_packages/animalai_envs/animalai/envs/arena_config.py b/animalai_package/animalai/animalai/envs/arena_config.py similarity index 94% rename from animalai_packages/animalai_envs/animalai/envs/arena_config.py rename to animalai_package/animalai/animalai/envs/arena_config.py index 8e48b1a0..a756c493 100644 --- a/animalai_packages/animalai_envs/animalai/envs/arena_config.py +++ b/animalai_package/animalai/animalai/envs/arena_config.py @@ -94,11 +94,11 @@ def dict_to_arena_config(self) -> UnityRLResetInput: return config_out - def update(self, arenas_configurations_input): + def update(self, arenas_configurations): - if arenas_configurations_input is not None: - for arena_i in arenas_configurations_input.arenas: - self.arenas[arena_i] = copy.copy(arenas_configurations_input.arenas[arena_i]) + if arenas_configurations is not None: + for arena_i in arenas_configurations.arenas: + self.arenas[arena_i] = copy.copy(arenas_configurations.arenas[arena_i]) def constructor_arena(loader, node): diff --git a/animalai_packages/animalai_envs/animalai/envs/brain.py b/animalai_package/animalai/animalai/envs/brain.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/envs/brain.py rename to animalai_package/animalai/animalai/envs/brain.py diff --git a/animalai_packages/animalai_envs/animalai/envs/communicator.py b/animalai_package/animalai/animalai/envs/communicator.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/envs/communicator.py rename to animalai_package/animalai/animalai/envs/communicator.py diff --git a/animalai_packages/animalai_envs/animalai/envs/environment.py b/animalai_package/animalai/animalai/envs/environment.py similarity index 98% rename from animalai_packages/animalai_envs/animalai/envs/environment.py rename to animalai_package/animalai/animalai/envs/environment.py index 7f3e28d1..5e76c159 100644 --- a/animalai_packages/animalai_envs/animalai/envs/environment.py +++ b/animalai_package/animalai/animalai/envs/environment.py @@ -53,7 +53,8 @@ def __init__(self, file_name=None, self._loaded = False # If true, this means the environment was successfully loaded self.proc1 = None # The process that is started. If None, no process was started self.communicator = self.get_communicator(worker_id, base_port) - self.arenas_configurations = arenas_configurations if arenas_configurations is not None else ArenaConfig() + self.arenas_configurations = arenas_configurations if arenas_configurations is not None \ + else ArenaConfig() if file_name is not None: self.executable_launcher(file_name, docker_training) @@ -217,18 +218,18 @@ def __str__(self): return '''Unity Academy name: {0} Number of Brains: {1} Number of Training Brains : {2}'''.format(self._academy_name, str(self._num_brains), - str(self._num_external_brains)) + str(self._num_external_brains)) - def reset(self, arenas_configurations_input=None, train_mode=True) -> AllBrainInfo: + def reset(self, arenas_configurations=None, train_mode=True) -> AllBrainInfo: """ Sends a signal to reset the unity environment. :return: AllBrainInfo : A data structure corresponding to the initial reset state of the environment. """ if self._loaded: - self.arenas_configurations.update(arenas_configurations_input) + self.arenas_configurations.update(arenas_configurations) outputs = self.communicator.exchange( - self._generate_reset_input(train_mode, arenas_configurations_input) + self._generate_reset_input(train_mode, arenas_configurations) ) if outputs is None: raise KeyboardInterrupt diff --git a/animalai_packages/animalai_envs/animalai/envs/exception.py b/animalai_package/animalai/animalai/envs/exception.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/envs/exception.py rename to animalai_package/animalai/animalai/envs/exception.py diff --git a/animalai_package/animalai/animalai/envs/gym/environment.py b/animalai_package/animalai/animalai/envs/gym/environment.py new file mode 100644 index 00000000..1846952f --- /dev/null +++ b/animalai_package/animalai/animalai/envs/gym/environment.py @@ -0,0 +1,354 @@ +import logging +from PIL import Image +import itertools +import gym +import numpy as np +from animalai.envs import UnityEnvironment +from gym import error, spaces + + +class UnityGymException(error.Error): + """ + Any error related to the gym wrapper of ml-agents. + """ + pass + + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger("gym_unity") + + +class AnimalAIEnv(gym.Env): + """ + Provides Gym wrapper for Unity Learning Environments. + Multi-agent environments use lists for object types, as done here: + https://github.com/openai/multiagent-particle-envs + """ + + def __init__(self, + environment_filename: str, + worker_id=0, + docker_training=False, + n_arenas=1, + arenas_configurations=None, + greyscale=False, + retro=True): + """ + Environment initialization + :param environment_filename: The UnityEnvironment path or file to be wrapped in the gym. + :param worker_id: Worker number for environment. + :param docker_training: Whether this is running within a docker environment and should use a virtual + frame buffer (xvfb). + :param n_arenas: number of arenas to create in the environment (one agent per arena) + :param arenas_configurations: an ArenaConfig to configure the items present in each arena, will spawn random + objects randomly if not provided + :param greyscale: whether the visual observations should be grayscaled or not + :param retro: Resize visual observation to 84x84 (int8) and flattens action space. + """ + self._env = UnityEnvironment(file_name=environment_filename, + worker_id=worker_id, + docker_training=docker_training, + n_arenas=n_arenas, + arenas_configurations=arenas_configurations) + # self.name = self._env.academy_name + self.vector_obs = None + self._current_state = None + self._n_agents = None + self._flattener = None + self._greyscale = greyscale or retro + # self._seed = None + self.retro = retro + self.game_over = False # Hidden flag used by Atari environments to determine if the game is over + self.arenas_configurations = arenas_configurations + + self.flatten_branched = self.retro + self.uint8_visual = self.retro + + # Check brain configuration + if len(self._env.brains) != 1: + raise UnityGymException( + "There can only be one brain in a UnityEnvironment " + "if it is wrapped in a gym.") + self.brain_name = self._env.external_brain_names[0] + brain = self._env.brains[self.brain_name] + + if brain.number_visual_observations == 0: + raise UnityGymException("Environment provides no visual observations.") + + if brain.num_stacked_vector_observations != 1: + raise UnityGymException("Environment provides no vector observations.") + + # Check for number of agents in scene. + initial_info = self._env.reset(arenas_configurations=arenas_configurations)[self.brain_name] + self._check_agents(len(initial_info.agents)) + + if self.retro and self._n_agents > 1: + raise UnityGymException("Only one agent is allowed in retro mode, set n_agents to 1.") + + # Set observation and action spaces + if len(brain.vector_action_space_size) == 1: + self._action_space = spaces.Discrete(brain.vector_action_space_size[0]) + else: + if self.flatten_branched: + self._flattener = ActionFlattener(brain.vector_action_space_size) + self._action_space = self._flattener.action_space + else: + self._action_space = spaces.MultiDiscrete(brain.vector_action_space_size) + + # high = np.array([np.inf] * brain.vector_observation_space_size) + self.action_meanings = brain.vector_action_descriptions + + # if self.visual_obs: + if self._greyscale: + depth = 1 + else: + depth = 3 + + if self.retro: + image_space_max = 255 + image_space_dtype = np.uint8 + camera_height = 84 + camera_width = 84 + + image_space = spaces.Box( + 0, image_space_max, + dtype=image_space_dtype, + shape=(camera_height, camera_width, depth) + ) + + self._observation_space = image_space + else: + image_space_max = 1.0 + image_space_dtype = np.float32 + camera_height = brain.camera_resolutions[0]["height"] + camera_width = brain.camera_resolutions[0]["width"] + max_float = np.finfo(np.float32).max + + image_space = spaces.Box( + 0, image_space_max, + dtype=image_space_dtype, + shape=(self._n_agents, camera_height, camera_width, depth) + ) + vector_space = spaces.Box(-max_float, max_float, + shape=(self._n_agents, brain.vector_observation_space_size)) + self._observation_space = spaces.Tuple((image_space, vector_space)) + + def reset(self, arenas_configurations=None): + """Resets the state of the environment and returns an initial observation. + In the case of multi-agent environments, this is a list. + Returns: observation (object/list): the initial observation of the + space. + """ + info = self._env.reset(arenas_configurations=arenas_configurations)[self.brain_name] + n_agents = len(info.agents) + self._check_agents(n_agents) + self.game_over = False + + if self._n_agents == 1: + obs, reward, done, info = self._single_step(info) + else: + obs, reward, done, info = self._multi_step(info) + return obs + + def step(self, action): + """Run one timestep of the environment's dynamics. When end of + episode is reached, you are responsible for calling `reset()` + to reset this environment's state. + Accepts an action and returns a tuple (observation, reward, done, info). + In the case of multi-agent environments, these are lists. + Args: + action (object/list): an action provided by the environment + Returns: + observation (object/list): agent's observation of the current environment + reward (float/list) : amount of reward returned after previous action + done (boolean/list): whether the episode has ended. + info (dict): contains auxiliary diagnostic information, including BrainInfo. + """ + + # Use random actions for all other agents in environment. + if self._n_agents > 1: + if not isinstance(action, list): + raise UnityGymException("The environment was expecting `action` to be a list.") + if len(action) != self._n_agents: + raise UnityGymException( + "The environment was expecting a list of {} actions.".format(self._n_agents)) + else: + if self._flattener is not None: + # Action space is discrete and flattened - we expect a list of scalars + action = [self._flattener.lookup_action(_act) for _act in action] + action = np.array(action) + else: + if self._flattener is not None: + # Translate action into list + action = self._flattener.lookup_action(action) + + info = self._env.step(action)[self.brain_name] + n_agents = len(info.agents) + self._check_agents(n_agents) + self._current_state = info + + if self._n_agents == 1: + obs, reward, done, info = self._single_step(info) + self.game_over = done + else: + obs, reward, done, info = self._multi_step(info) + self.game_over = all(done) + return obs, reward, done, info + + def _single_step(self, info): + + self.visual_obs = self._preprocess_single(info.visual_observations[0][0, :, :, :]) + self.vector_obs = info.vector_observations[0] + + if self._greyscale: + self.visual_obs = self._greyscale_obs_single(self.visual_obs) + + if self.retro: + self.visual_obs = self._resize_observation(self.visual_obs) + default_observation = self.visual_obs + else: + default_observation = self.visual_obs, self.vector_obs + + return default_observation, info.rewards[0], info.local_done[0], { + "text_observation": info.text_observations[0], + "brain_info": info} + + def _preprocess_single(self, single_visual_obs): + if self.uint8_visual: + return (255.0 * single_visual_obs).astype(np.uint8) + else: + return single_visual_obs + + def _multi_step(self, info): + + self.visual_obs = self._preprocess_multi(info.visual_observations) + self.vector_obs = info.vector_observations + + if self._greyscale: + self.visual_obs = self._greyscale_obs_multi(self.visual_obs) + + default_observation = self.visual_obs + + return list(default_observation), info.rewards, info.local_done, { + "text_observation": info.text_observations, + "brain_info": info} + + def _preprocess_multi(self, multiple_visual_obs): + if self.uint8_visual: + return [(255.0 * _visual_obs).astype(np.uint8) for _visual_obs in multiple_visual_obs] + else: + return multiple_visual_obs + + def render(self, mode='rgb_array'): + return self.visual_obs + + def close(self): + """Override _close in your subclass to perform any necessary cleanup. + Environments will automatically close() themselves when + garbage collected or when the program exits. + """ + self._env.close() + + def get_action_meanings(self): + return self.action_meanings + + def seed(self, seed=None): + """Sets the seed for this env's random number generator(s). + Currently not implemented. + """ + logger.warning("Could not seed environment %s", self.name) + return + + @staticmethod + def _resize_observation(observation): + """ + Re-sizes visual observation to 84x84 + """ + obs_image = Image.fromarray(observation) + obs_image = obs_image.resize((84, 84), Image.NEAREST) + return np.array(obs_image) + + def _greyscale_obs_single(self, obs): + new_obs = np.floor(np.expand_dims(np.mean(obs, axis=2), axis=2)).squeeze().astype(np.uint8) + return new_obs + + def _greyscale_obs_multi(self, obs): + new_obs = [np.floor(np.expand_dims(np.mean(o, axis=2), axis=2)).squeeze().astype(np.uint8) for o in obs] + return new_obs + + def _check_agents(self, n_agents): + # if n_agents > 1: + # raise UnityGymException( + # "The environment was launched as a single-agent environment, however" + # "there is more than one agent in the scene.") + # elif self._multiagent and n_agents <= 1: + # raise UnityGymException( + # "The environment was launched as a mutli-agent environment, however" + # "there is only one agent in the scene.") + if self._n_agents is None: + self._n_agents = n_agents + logger.info("{} agents within environment.".format(n_agents)) + elif self._n_agents != n_agents: + raise UnityGymException("The number of agents in the environment has changed since " + "initialization. This is not supported.") + + @property + def metadata(self): + return {'render.modes': ['rgb_array']} + + @property + def reward_range(self): + return -float('inf'), float('inf') + + @property + def spec(self): + return None + + @property + def action_space(self): + return self._action_space + + @property + def observation_space(self): + return self._observation_space + + @property + def number_agents(self): + return self._n_agents + + +class ActionFlattener: + """ + Flattens branched discrete action spaces into single-branch discrete action spaces. + """ + + def __init__(self, branched_action_space): + """ + Initialize the flattener. + :param branched_action_space: A List containing the sizes of each branch of the action + space, e.g. [2,3,3] for three branches with size 2, 3, and 3 respectively. + """ + self._action_shape = branched_action_space + self.action_lookup = self._create_lookup(self._action_shape) + self.action_space = spaces.Discrete(len(self.action_lookup)) + + @classmethod + def _create_lookup(self, branched_action_space): + """ + Creates a Dict that maps discrete actions (scalars) to branched actions (lists). + Each key in the Dict maps to one unique set of branched actions, and each value + contains the List of branched actions. + """ + possible_vals = [range(_num) for _num in branched_action_space] + all_actions = [list(_action) for _action in itertools.product(*possible_vals)] + # Dict should be faster than List for large action spaces + action_lookup = {_scalar: _action for (_scalar, _action) in enumerate(all_actions)} + return action_lookup + + def lookup_action(self, action): + """ + Convert a scalar discrete action into a unique set of branched actions. + :param: action: A scalar value representing one of the discrete actions. + :return: The List containing the branched actions. + """ + return self.action_lookup[action] diff --git a/animalai_packages/animalai_envs/animalai/envs/rpc_communicator.py b/animalai_package/animalai/animalai/envs/rpc_communicator.py similarity index 98% rename from animalai_packages/animalai_envs/animalai/envs/rpc_communicator.py rename to animalai_package/animalai/animalai/envs/rpc_communicator.py index aa082305..ddc48ffd 100644 --- a/animalai_packages/animalai_envs/animalai/envs/rpc_communicator.py +++ b/animalai_package/animalai/animalai/envs/rpc_communicator.py @@ -74,7 +74,7 @@ def check_port(self, port): s.close() def initialize(self, inputs: UnityInput) -> UnityOutput: - if not self.unity_to_external.parent_conn.poll(3000): + if not self.unity_to_external.parent_conn.poll(90): raise UnityTimeOutException( "The Unity environment took too long to respond. Make sure that :\n" "\t The environment does not need user interaction to launch\n" diff --git a/animalai_packages/animalai_envs/animalai/envs/socket_communicator.py b/animalai_package/animalai/animalai/envs/socket_communicator.py similarity index 100% rename from animalai_packages/animalai_envs/animalai/envs/socket_communicator.py rename to animalai_package/animalai/animalai/envs/socket_communicator.py diff --git a/animalai_packages/animalai_envs/setup.py b/animalai_package/animalai/setup.py similarity index 94% rename from animalai_packages/animalai_envs/setup.py rename to animalai_package/animalai/setup.py index 9c5b270c..0be8087e 100644 --- a/animalai_packages/animalai_envs/setup.py +++ b/animalai_package/animalai/setup.py @@ -24,6 +24,7 @@ 'protobuf>=3.6,<3.7', 'grpcio>=1.11.0,<1.12.0', 'pyyaml>=5.1', - 'jsonpickle>=1.2'], + 'jsonpickle>=1.2', + 'gym'], python_requires=">=3.5,<3.8", ) \ No newline at end of file diff --git a/documentation/quickstart.md b/documentation/quickstart.md index f4fe1bd9..f20012f9 100644 --- a/documentation/quickstart.md +++ b/documentation/quickstart.md @@ -1,7 +1,7 @@ # Quick Start Guide You can run the Animal AI environment in three different ways: -- running the the standalone `AnimalAI` executable +- running the standalone `AnimalAI` executable - running a configuration file via `visualizeArena.py` - start training using `train.py` diff --git a/documentation/training.md b/documentation/training.md index 0d895c51..7ff0ae86 100644 --- a/documentation/training.md +++ b/documentation/training.md @@ -50,7 +50,7 @@ as an argument to reset the environment. The environment will use the new config following ones until a new configuration is passed. The syntax is: ``` -env.reset(arenas_configurations_input=arena_config, # A new ArenaConfig to use for reset, leave empty to use the last one provided +env.reset(arenas_configurations=arena_config, # A new ArenaConfig to use for reset, leave empty to use the last one provided train_mode=True # True for training ) ``` diff --git a/animalai_packages/animalai_train/LICENSE b/examples/animalai_train/LICENSE similarity index 100% rename from animalai_packages/animalai_train/LICENSE rename to examples/animalai_train/LICENSE diff --git a/animalai_packages/animalai_train/README.md b/examples/animalai_train/README.md similarity index 100% rename from animalai_packages/animalai_train/README.md rename to examples/animalai_train/README.md diff --git a/animalai_packages/animalai_train/animalai_train/__init__.py b/examples/animalai_train/animalai_train/__init__.py similarity index 100% rename from animalai_packages/animalai_train/animalai_train/__init__.py rename to examples/animalai_train/animalai_train/__init__.py diff --git a/examples/animalai_train/animalai_train/dopamine/animalai_lib.py b/examples/animalai_train/animalai_train/dopamine/animalai_lib.py new file mode 100644 index 00000000..532ea075 --- /dev/null +++ b/examples/animalai_train/animalai_train/dopamine/animalai_lib.py @@ -0,0 +1,270 @@ +# coding=utf-8 +# Copyright 2018 The Dopamine Authors. +# Modifications copyright 2019 Unity Technologies. +# +# 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. +"""Obstacle Tower-specific utilities including Atari-specific network architectures. + +This includes a class implementing minimal preprocessing, which +is in charge of: + . Converting observations to greyscale. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import math + +from animalai.envs.gym.environment import AnimalAIEnv + +import numpy as np +import tensorflow as tf + +import gin.tf +import cv2 + +slim = tf.contrib.slim + +NATURE_DQN_OBSERVATION_SHAPE = (84, 84) # Size of downscaled Atari 2600 frame. +NATURE_DQN_DTYPE = tf.uint8 # DType of Atari 2600 observations. +NATURE_DQN_STACK_SIZE = 4 # Number of frames in the state stack. + + +@gin.configurable +def create_animalai_environment(environment_path=None): + """Wraps the Animal AI environment with some basic preprocessing. + + Returns: + An Animal AI environment with some standard preprocessing. + """ + assert environment_path is not None + env = AnimalAIEnv(environment_path, 0, n_arenas=1, retro=True) + env = OTCPreprocessing(env) + return env + +@gin.configurable +def nature_dqn_network(num_actions, network_type, state): + """The convolutional network used to compute the agent's Q-values. + + Args: + num_actions: int, number of actions. + network_type: namedtuple, collection of expected values to return. + state: `tf.Tensor`, contains the agent's current state. + + Returns: + net: _network_type object containing the tensors output by the network. + """ + net = tf.cast(state, tf.float32) + net = tf.div(net, 255.) + net = slim.conv2d(net, 32, [8, 8], stride=4) + net = slim.conv2d(net, 64, [4, 4], stride=2) + net = slim.conv2d(net, 64, [3, 3], stride=1) + net = slim.flatten(net) + net = slim.fully_connected(net, 512) + q_values = slim.fully_connected(net, num_actions, activation_fn=None) + return network_type(q_values) + +@gin.configurable +def rainbow_network(num_actions, num_atoms, support, network_type, state): + """The convolutional network used to compute agent's Q-value distributions. + + Args: + num_actions: int, number of actions. + num_atoms: int, the number of buckets of the value function distribution. + support: tf.linspace, the support of the Q-value distribution. + network_type: namedtuple, collection of expected values to return. + state: `tf.Tensor`, contains the agent's current state. + + Returns: + net: _network_type object containing the tensors output by the network. + """ + weights_initializer = slim.variance_scaling_initializer( + factor=1.0 / np.sqrt(3.0), mode='FAN_IN', uniform=True) + + net = tf.cast(state, tf.float32) + net = tf.div(net, 255.) + net = slim.conv2d( + net, 32, [8, 8], stride=4, weights_initializer=weights_initializer) + net = slim.conv2d( + net, 64, [4, 4], stride=2, weights_initializer=weights_initializer) + net = slim.conv2d( + net, 64, [3, 3], stride=1, weights_initializer=weights_initializer) + net = slim.flatten(net) + net = slim.fully_connected( + net, 512, weights_initializer=weights_initializer) + net = slim.fully_connected( + net, + num_actions * num_atoms, + activation_fn=None, + weights_initializer=weights_initializer) + + logits = tf.reshape(net, [-1, num_actions, num_atoms]) + probabilities = tf.contrib.layers.softmax(logits) + q_values = tf.reduce_sum(support * probabilities, axis=2) + return network_type(q_values, logits, probabilities) + +@gin.configurable +def implicit_quantile_network(num_actions, quantile_embedding_dim, + network_type, state, num_quantiles): + """The Implicit Quantile ConvNet. + + Args: + num_actions: int, number of actions. + quantile_embedding_dim: int, embedding dimension for the quantile input. + network_type: namedtuple, collection of expected values to return. + state: `tf.Tensor`, contains the agent's current state. + num_quantiles: int, number of quantile inputs. + + Returns: + net: _network_type object containing the tensors output by the network. + """ + weights_initializer = slim.variance_scaling_initializer( + factor=1.0 / np.sqrt(3.0), mode='FAN_IN', uniform=True) + + state_net = tf.cast(state, tf.float32) + state_net = tf.div(state_net, 255.) + state_net = slim.conv2d( + state_net, 32, [8, 8], stride=4, + weights_initializer=weights_initializer) + state_net = slim.conv2d( + state_net, 64, [4, 4], stride=2, + weights_initializer=weights_initializer) + state_net = slim.conv2d( + state_net, 64, [3, 3], stride=1, + weights_initializer=weights_initializer) + state_net = slim.flatten(state_net) + state_net_size = state_net.get_shape().as_list()[-1] + state_net_tiled = tf.tile(state_net, [num_quantiles, 1]) + + batch_size = state_net.get_shape().as_list()[0] + quantiles_shape = [num_quantiles * batch_size, 1] + quantiles = tf.random_uniform( + quantiles_shape, minval=0, maxval=1, dtype=tf.float32) + + quantile_net = tf.tile(quantiles, [1, quantile_embedding_dim]) + pi = tf.constant(math.pi) + quantile_net = tf.cast(tf.range( + 1, quantile_embedding_dim + 1, 1), tf.float32) * pi * quantile_net + quantile_net = tf.cos(quantile_net) + quantile_net = slim.fully_connected(quantile_net, state_net_size, + weights_initializer=weights_initializer) + # Hadamard product. + net = tf.multiply(state_net_tiled, quantile_net) + + net = slim.fully_connected( + net, 512, weights_initializer=weights_initializer) + quantile_values = slim.fully_connected( + net, + num_actions, + activation_fn=None, + weights_initializer=weights_initializer) + + return network_type(quantile_values=quantile_values, quantiles=quantiles) + +# +# @gin.configurable +# class AAIPreprocessing(object): +# """A class implementing image preprocessing for OTC agents. +# +# Specifically, this converts observations to greyscale. It doesn't +# do anything else to the environment. +# """ +# +# def __init__(self, environment): +# """Constructor for an Obstacle Tower preprocessor. +# +# Args: +# environment: Gym environment whose observations are preprocessed. +# +# """ +# self.environment = environment +# +# self.game_over = False +# self.lives = 0 # Will need to be set by reset(). +# +# @property +# def observation_space(self): +# return self.environment.observation_space +# +# @property +# def action_space(self): +# return self.environment.action_space +# +# @property +# def reward_range(self): +# return self.environment.reward_range +# +# @property +# def metadata(self): +# return self.environment.metadata +# +# def reset(self): +# """Resets the environment. Converts the observation to greyscale, +# if it is not. +# +# Returns: +# observation: numpy array, the initial observation emitted by the +# environment. +# """ +# observation = self.environment.reset() +# if (len(observation.shape) > 2): +# observation = cv2.cvtColor(observation, cv2.COLOR_RGB2GRAY) +# +# return observation +# +# def render(self, mode): +# """Renders the current screen, before preprocessing. +# +# This calls the Gym API's render() method. +# +# Args: +# mode: Mode argument for the environment's render() method. +# Valid values (str) are: +# 'rgb_array': returns the raw ALE image. +# 'human': renders to display via the Gym renderer. +# +# Returns: +# if mode='rgb_array': numpy array, the most recent screen. +# if mode='human': bool, whether the rendering was successful. +# """ +# return self.environment.render(mode) +# +# def step(self, action): +# """Applies the given action in the environment. Converts the observation to +# greyscale, if it is not. +# +# Remarks: +# +# * If a terminal state (from life loss or episode end) is reached, this may +# execute fewer than self.frame_skip steps in the environment. +# * Furthermore, in this case the returned observation may not contain valid +# image data and should be ignored. +# +# Args: +# action: The action to be executed. +# +# Returns: +# observation: numpy array, the observation following the action. +# reward: float, the reward following the action. +# is_terminal: bool, whether the environment has reached a terminal state. +# This is true when a life is lost and terminal_on_life_loss, or when the +# episode is over. +# info: Gym API's info data structure. +# """ +# +# observation, reward, game_over, info = self.environment.step(action) +# self.game_over = game_over +# if (len(observation.shape) > 2): +# observation = cv2.cvtColor(observation, cv2.COLOR_RGB2GRAY) +# return observation, reward, game_over, info diff --git a/animalai_packages/animalai_train/animalai_train/trainers/__init__.py b/examples/animalai_train/animalai_train/trainers/__init__.py similarity index 100% rename from animalai_packages/animalai_train/animalai_train/trainers/__init__.py rename to examples/animalai_train/animalai_train/trainers/__init__.py diff --git a/animalai_packages/animalai_train/animalai_train/trainers/barracuda.py b/examples/animalai_train/animalai_train/trainers/barracuda.py similarity index 100% rename from animalai_packages/animalai_train/animalai_train/trainers/barracuda.py rename to examples/animalai_train/animalai_train/trainers/barracuda.py diff --git a/animalai_packages/animalai_train/animalai_train/trainers/bc/__init__.py b/examples/animalai_train/animalai_train/trainers/bc/__init__.py similarity index 100% rename from animalai_packages/animalai_train/animalai_train/trainers/bc/__init__.py rename to examples/animalai_train/animalai_train/trainers/bc/__init__.py diff --git a/animalai_packages/animalai_train/animalai_train/trainers/bc/models.py b/examples/animalai_train/animalai_train/trainers/bc/models.py similarity index 100% rename from animalai_packages/animalai_train/animalai_train/trainers/bc/models.py rename to examples/animalai_train/animalai_train/trainers/bc/models.py diff --git a/animalai_packages/animalai_train/animalai_train/trainers/bc/offline_trainer.py b/examples/animalai_train/animalai_train/trainers/bc/offline_trainer.py similarity index 100% rename from animalai_packages/animalai_train/animalai_train/trainers/bc/offline_trainer.py rename to examples/animalai_train/animalai_train/trainers/bc/offline_trainer.py diff --git a/animalai_packages/animalai_train/animalai_train/trainers/bc/online_trainer.py b/examples/animalai_train/animalai_train/trainers/bc/online_trainer.py similarity index 100% rename from animalai_packages/animalai_train/animalai_train/trainers/bc/online_trainer.py rename to examples/animalai_train/animalai_train/trainers/bc/online_trainer.py diff --git a/animalai_packages/animalai_train/animalai_train/trainers/bc/policy.py b/examples/animalai_train/animalai_train/trainers/bc/policy.py similarity index 100% rename from animalai_packages/animalai_train/animalai_train/trainers/bc/policy.py rename to examples/animalai_train/animalai_train/trainers/bc/policy.py diff --git a/animalai_packages/animalai_train/animalai_train/trainers/bc/trainer.py b/examples/animalai_train/animalai_train/trainers/bc/trainer.py similarity index 100% rename from animalai_packages/animalai_train/animalai_train/trainers/bc/trainer.py rename to examples/animalai_train/animalai_train/trainers/bc/trainer.py diff --git a/animalai_packages/animalai_train/animalai_train/trainers/buffer.py b/examples/animalai_train/animalai_train/trainers/buffer.py similarity index 100% rename from animalai_packages/animalai_train/animalai_train/trainers/buffer.py rename to examples/animalai_train/animalai_train/trainers/buffer.py diff --git a/animalai_packages/animalai_train/animalai_train/trainers/curriculum.py b/examples/animalai_train/animalai_train/trainers/curriculum.py similarity index 100% rename from animalai_packages/animalai_train/animalai_train/trainers/curriculum.py rename to examples/animalai_train/animalai_train/trainers/curriculum.py diff --git a/animalai_packages/animalai_train/animalai_train/trainers/demo_loader.py b/examples/animalai_train/animalai_train/trainers/demo_loader.py similarity index 100% rename from animalai_packages/animalai_train/animalai_train/trainers/demo_loader.py rename to examples/animalai_train/animalai_train/trainers/demo_loader.py diff --git a/animalai_packages/animalai_train/animalai_train/trainers/exception.py b/examples/animalai_train/animalai_train/trainers/exception.py similarity index 100% rename from animalai_packages/animalai_train/animalai_train/trainers/exception.py rename to examples/animalai_train/animalai_train/trainers/exception.py diff --git a/animalai_packages/animalai_train/animalai_train/trainers/learn.py b/examples/animalai_train/animalai_train/trainers/learn.py similarity index 100% rename from animalai_packages/animalai_train/animalai_train/trainers/learn.py rename to examples/animalai_train/animalai_train/trainers/learn.py diff --git a/animalai_packages/animalai_train/animalai_train/trainers/meta_curriculum.py b/examples/animalai_train/animalai_train/trainers/meta_curriculum.py similarity index 100% rename from animalai_packages/animalai_train/animalai_train/trainers/meta_curriculum.py rename to examples/animalai_train/animalai_train/trainers/meta_curriculum.py diff --git a/animalai_packages/animalai_train/animalai_train/trainers/models.py b/examples/animalai_train/animalai_train/trainers/models.py similarity index 100% rename from animalai_packages/animalai_train/animalai_train/trainers/models.py rename to examples/animalai_train/animalai_train/trainers/models.py diff --git a/animalai_packages/animalai_train/animalai_train/trainers/policy.py b/examples/animalai_train/animalai_train/trainers/policy.py similarity index 100% rename from animalai_packages/animalai_train/animalai_train/trainers/policy.py rename to examples/animalai_train/animalai_train/trainers/policy.py diff --git a/animalai_packages/animalai_train/animalai_train/trainers/ppo/__init__.py b/examples/animalai_train/animalai_train/trainers/ppo/__init__.py similarity index 100% rename from animalai_packages/animalai_train/animalai_train/trainers/ppo/__init__.py rename to examples/animalai_train/animalai_train/trainers/ppo/__init__.py diff --git a/animalai_packages/animalai_train/animalai_train/trainers/ppo/models.py b/examples/animalai_train/animalai_train/trainers/ppo/models.py similarity index 100% rename from animalai_packages/animalai_train/animalai_train/trainers/ppo/models.py rename to examples/animalai_train/animalai_train/trainers/ppo/models.py diff --git a/animalai_packages/animalai_train/animalai_train/trainers/ppo/policy.py b/examples/animalai_train/animalai_train/trainers/ppo/policy.py similarity index 100% rename from animalai_packages/animalai_train/animalai_train/trainers/ppo/policy.py rename to examples/animalai_train/animalai_train/trainers/ppo/policy.py diff --git a/animalai_packages/animalai_train/animalai_train/trainers/ppo/trainer.py b/examples/animalai_train/animalai_train/trainers/ppo/trainer.py similarity index 100% rename from animalai_packages/animalai_train/animalai_train/trainers/ppo/trainer.py rename to examples/animalai_train/animalai_train/trainers/ppo/trainer.py diff --git a/animalai_packages/animalai_train/animalai_train/trainers/tensorflow_to_barracuda.py b/examples/animalai_train/animalai_train/trainers/tensorflow_to_barracuda.py similarity index 100% rename from animalai_packages/animalai_train/animalai_train/trainers/tensorflow_to_barracuda.py rename to examples/animalai_train/animalai_train/trainers/tensorflow_to_barracuda.py diff --git a/animalai_packages/animalai_train/animalai_train/trainers/trainer.py b/examples/animalai_train/animalai_train/trainers/trainer.py similarity index 100% rename from animalai_packages/animalai_train/animalai_train/trainers/trainer.py rename to examples/animalai_train/animalai_train/trainers/trainer.py diff --git a/animalai_packages/animalai_train/animalai_train/trainers/trainer_controller.py b/examples/animalai_train/animalai_train/trainers/trainer_controller.py similarity index 99% rename from animalai_packages/animalai_train/animalai_train/trainers/trainer_controller.py rename to examples/animalai_train/animalai_train/trainers/trainer_controller.py index 0eb6c53c..e71a3624 100644 --- a/animalai_packages/animalai_train/animalai_train/trainers/trainer_controller.py +++ b/examples/animalai_train/animalai_train/trainers/trainer_controller.py @@ -183,7 +183,7 @@ def _reset_env(self, env): return env.reset(config=self.meta_curriculum.get_config()) else: if self.update_config: - return env.reset(arenas_configurations_input=self.config) + return env.reset(arenas_configurations=self.config) self.update_config = False else: return env.reset() diff --git a/animalai_packages/animalai_train/setup.py b/examples/animalai_train/setup.py similarity index 100% rename from animalai_packages/animalai_train/setup.py rename to examples/animalai_train/setup.py diff --git a/examples/configs/rainbow.gin b/examples/configs/rainbow.gin new file mode 100644 index 00000000..1cc5e979 --- /dev/null +++ b/examples/configs/rainbow.gin @@ -0,0 +1,34 @@ +# Hyperparameters follow Hessel et al. (2018). +import dopamine.agents.rainbow.rainbow_agent +import animalai_train.dopamine.animalai_lib +import dopamine.discrete_domains.run_experiment +import dopamine.replay_memory.prioritized_replay_buffer +import gin.tf.external_configurables + +RainbowAgent.num_atoms = 51 +RainbowAgent.vmax = 10. +RainbowAgent.gamma = 0.99 +RainbowAgent.update_horizon = 3 +RainbowAgent.min_replay_history = 20000 # agent steps +RainbowAgent.update_period = 4 +RainbowAgent.target_update_period = 8000 # agent steps +RainbowAgent.epsilon_train = 0.01 +RainbowAgent.epsilon_eval = 0.001 +RainbowAgent.epsilon_decay_period = 250000 # agent steps +RainbowAgent.replay_scheme = 'prioritized' +RainbowAgent.tf_device = '/gpu:0' # use '/cpu:*' for non-GPU version +RainbowAgent.optimizer = @tf.train.AdamOptimizer() +RainbowAgent.network = @animalai_lib.rainbow_network + +# Note these parameters are different from C51's. +tf.train.AdamOptimizer.learning_rate = 0.0000625 +tf.train.AdamOptimizer.epsilon = 0.00015 + +create_agent.agent_name = 'rainbow' +Runner.num_iterations = 200 +Runner.training_steps = 250000 # agent steps +Runner.evaluation_steps = 125000 # agent steps +Runner.max_steps_per_episode = 27000 # agent steps + +WrappedPrioritizedReplayBuffer.replay_capacity = 1000000 +WrappedPrioritizedReplayBuffer.batch_size = 32 diff --git a/examples/trainBaselines.py b/examples/trainBaselines.py new file mode 100644 index 00000000..bf97a7c5 --- /dev/null +++ b/examples/trainBaselines.py @@ -0,0 +1,33 @@ +from animalai.envs.gym.environment import AnimalAIEnv +from animalai.envs.arena_config import ArenaConfig +from dopamine.agents.rainbow import rainbow_agent +from dopamine.discrete_domains import run_experiment + + +import random + +env_path = '../env/AnimalAI' +worker_id = random.randint(1, 100) +arena_config_in = ArenaConfig('configs/justFood.yaml') +base_dir = 'models/dopamine' +gin_files = ['configs/rainbow.gin'] + + +def create_env_fn(): + env = AnimalAIEnv(environment_filename=env_path, + worker_id=worker_id, + n_arenas=1, + arenas_configurations=arena_config_in, + retro=True) + return env + + +def create_agent_fn(sess, env, summary_writer): + return rainbow_agent.RainbowAgent(sess=sess, num_actions=env.action_space.n, summary_writer=summary_writer) + + +run_experiment.load_gin_configs(gin_files, None) +runner = run_experiment.Runner(base_dir=base_dir, + create_agent_fn=create_agent_fn, + create_environment_fn=create_env_fn) +runner.run_experiment() diff --git a/examples/visualizeArena.py b/examples/visualizeArena.py index d87f56ed..09711631 100644 --- a/examples/visualizeArena.py +++ b/examples/visualizeArena.py @@ -41,7 +41,7 @@ def init_environment(env_path, docker_target_name, no_graphics, worker_id, seed) # We can pass a different configuration at each env.reset() call. You can therefore load different YAML files between # episodes or directly amend the arena_config_in which contains a dictionary of configurations for all arenas. # See animalai/envs/arena_config.py for the syntax -env.reset(arenas_configurations_input =arena_config_in) +env.reset(arenas_configurations =arena_config_in) try: while True: diff --git a/examples/visualizeLightsOff.py b/examples/visualizeLightsOff.py index 855a0d40..3c14995a 100644 --- a/examples/visualizeLightsOff.py +++ b/examples/visualizeLightsOff.py @@ -5,7 +5,7 @@ from matplotlib import pyplot as plt from matplotlib import animation -env_path = '../env/AnimalAI' +env_path = 'env/AnimalAI' worker_id = random.randint(1, 100) seed = 10 @@ -34,8 +34,8 @@ play=False ) -arena_config_in = ArenaConfig('configs/lightsOff.yaml') -env.reset(arenas_configurations_input=arena_config_in) +arena_config_in = ArenaConfig('examples/configs/lightsOff.yaml') +env.reset(arenas_configurations=arena_config_in) fig, axes = plt.subplots(2, 2) imshows = [] for i in range(2): From 39f7d70008e544cc9b0e1cdbf413b73e9f790860 Mon Sep 17 00:00:00 2001 From: Benjamin Beyret Date: Fri, 31 May 2019 18:45:20 +0100 Subject: [PATCH 06/23] delete animalai_bkp + rename animalai_package --- animalai_bkp/__init__.py | 0 animalai_bkp/communicator_objects/__init__.py | 22 - .../agent_action_proto_pb2.py | 92 -- .../agent_info_proto_pb2.py | 141 --- .../arena_parameters_proto_pb2.py | 209 ---- .../brain_parameters_proto_pb2.py | 125 -- .../communicator_objects/command_proto_pb2.py | 64 - .../demonstration_meta_proto_pb2.py | 99 -- .../engine_configuration_proto_pb2.py | 106 -- .../communicator_objects/header_pb2.py | 78 -- .../resolution_proto_pb2.py | 85 -- .../space_type_proto_pb2.py | 61 - .../communicator_objects/unity_input_pb2.py | 92 -- .../communicator_objects/unity_message_pb2.py | 92 -- .../communicator_objects/unity_output_pb2.py | 83 -- .../unity_rl_initialization_input_pb2.py | 71 -- .../unity_rl_initialization_output_pb2.py | 95 -- .../unity_rl_input_pb2.py | 178 --- .../unity_rl_output_pb2.py | 169 --- .../unity_rl_reset_input_pb2.py | 122 -- .../unity_rl_reset_output_pb2.py | 71 -- .../unity_to_external_pb2.py | 57 - .../unity_to_external_pb2_grpc.py | 46 - animalai_bkp/envs/__init__.py | 3 - animalai_bkp/envs/arena_config.py | 115 -- animalai_bkp/envs/brain.py | 149 --- animalai_bkp/envs/communicator.py | 35 - animalai_bkp/envs/environment.py | 491 -------- animalai_bkp/envs/exception.py | 63 - animalai_bkp/envs/rpc_communicator.py | 115 -- animalai_bkp/envs/socket_communicator.py | 98 -- animalai_bkp/trainers/__init__.py | 15 - animalai_bkp/trainers/barracuda.py | 491 -------- animalai_bkp/trainers/bc/__init__.py | 4 - animalai_bkp/trainers/bc/models.py | 55 - animalai_bkp/trainers/bc/offline_trainer.py | 56 - animalai_bkp/trainers/bc/online_trainer.py | 116 -- animalai_bkp/trainers/bc/policy.py | 93 -- animalai_bkp/trainers/bc/trainer.py | 190 --- animalai_bkp/trainers/buffer.py | 255 ---- animalai_bkp/trainers/curriculum.py | 112 -- animalai_bkp/trainers/demo_loader.py | 94 -- animalai_bkp/trainers/exception.py | 20 - animalai_bkp/trainers/learn.py | 249 ---- animalai_bkp/trainers/meta_curriculum.py | 147 --- animalai_bkp/trainers/models.py | 380 ------ animalai_bkp/trainers/policy.py | 212 ---- animalai_bkp/trainers/ppo/__init__.py | 3 - animalai_bkp/trainers/ppo/models.py | 195 ---- animalai_bkp/trainers/ppo/policy.py | 214 ---- animalai_bkp/trainers/ppo/trainer.py | 386 ------ .../trainers/tensorflow_to_barracuda.py | 1034 ----------------- animalai_bkp/trainers/trainer.py | 198 ---- animalai_bkp/trainers/trainer_controller.py | 301 ----- 54 files changed, 8047 deletions(-) delete mode 100644 animalai_bkp/__init__.py delete mode 100644 animalai_bkp/communicator_objects/__init__.py delete mode 100644 animalai_bkp/communicator_objects/agent_action_proto_pb2.py delete mode 100644 animalai_bkp/communicator_objects/agent_info_proto_pb2.py delete mode 100644 animalai_bkp/communicator_objects/arena_parameters_proto_pb2.py delete mode 100644 animalai_bkp/communicator_objects/brain_parameters_proto_pb2.py delete mode 100644 animalai_bkp/communicator_objects/command_proto_pb2.py delete mode 100644 animalai_bkp/communicator_objects/demonstration_meta_proto_pb2.py delete mode 100644 animalai_bkp/communicator_objects/engine_configuration_proto_pb2.py delete mode 100644 animalai_bkp/communicator_objects/header_pb2.py delete mode 100644 animalai_bkp/communicator_objects/resolution_proto_pb2.py delete mode 100644 animalai_bkp/communicator_objects/space_type_proto_pb2.py delete mode 100644 animalai_bkp/communicator_objects/unity_input_pb2.py delete mode 100644 animalai_bkp/communicator_objects/unity_message_pb2.py delete mode 100644 animalai_bkp/communicator_objects/unity_output_pb2.py delete mode 100644 animalai_bkp/communicator_objects/unity_rl_initialization_input_pb2.py delete mode 100644 animalai_bkp/communicator_objects/unity_rl_initialization_output_pb2.py delete mode 100644 animalai_bkp/communicator_objects/unity_rl_input_pb2.py delete mode 100644 animalai_bkp/communicator_objects/unity_rl_output_pb2.py delete mode 100644 animalai_bkp/communicator_objects/unity_rl_reset_input_pb2.py delete mode 100644 animalai_bkp/communicator_objects/unity_rl_reset_output_pb2.py delete mode 100644 animalai_bkp/communicator_objects/unity_to_external_pb2.py delete mode 100644 animalai_bkp/communicator_objects/unity_to_external_pb2_grpc.py delete mode 100644 animalai_bkp/envs/__init__.py delete mode 100644 animalai_bkp/envs/arena_config.py delete mode 100644 animalai_bkp/envs/brain.py delete mode 100644 animalai_bkp/envs/communicator.py delete mode 100644 animalai_bkp/envs/environment.py delete mode 100644 animalai_bkp/envs/exception.py delete mode 100644 animalai_bkp/envs/rpc_communicator.py delete mode 100644 animalai_bkp/envs/socket_communicator.py delete mode 100644 animalai_bkp/trainers/__init__.py delete mode 100644 animalai_bkp/trainers/barracuda.py delete mode 100644 animalai_bkp/trainers/bc/__init__.py delete mode 100644 animalai_bkp/trainers/bc/models.py delete mode 100644 animalai_bkp/trainers/bc/offline_trainer.py delete mode 100644 animalai_bkp/trainers/bc/online_trainer.py delete mode 100644 animalai_bkp/trainers/bc/policy.py delete mode 100644 animalai_bkp/trainers/bc/trainer.py delete mode 100644 animalai_bkp/trainers/buffer.py delete mode 100644 animalai_bkp/trainers/curriculum.py delete mode 100644 animalai_bkp/trainers/demo_loader.py delete mode 100644 animalai_bkp/trainers/exception.py delete mode 100644 animalai_bkp/trainers/learn.py delete mode 100644 animalai_bkp/trainers/meta_curriculum.py delete mode 100644 animalai_bkp/trainers/models.py delete mode 100644 animalai_bkp/trainers/policy.py delete mode 100644 animalai_bkp/trainers/ppo/__init__.py delete mode 100644 animalai_bkp/trainers/ppo/models.py delete mode 100644 animalai_bkp/trainers/ppo/policy.py delete mode 100644 animalai_bkp/trainers/ppo/trainer.py delete mode 100644 animalai_bkp/trainers/tensorflow_to_barracuda.py delete mode 100644 animalai_bkp/trainers/trainer.py delete mode 100644 animalai_bkp/trainers/trainer_controller.py diff --git a/animalai_bkp/__init__.py b/animalai_bkp/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/animalai_bkp/communicator_objects/__init__.py b/animalai_bkp/communicator_objects/__init__.py deleted file mode 100644 index 571ec13b..00000000 --- a/animalai_bkp/communicator_objects/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -from .agent_action_proto_pb2 import * -from .agent_info_proto_pb2 import * -from .arena_parameters_proto_pb2 import * -from .brain_parameters_proto_pb2 import * -from .command_proto_pb2 import * -from .demonstration_meta_proto_pb2 import * -from .engine_configuration_proto_pb2 import * -from .header_pb2 import * -from .__init__ import * -from .resolution_proto_pb2 import * -from .space_type_proto_pb2 import * -from .unity_input_pb2 import * -from .unity_message_pb2 import * -from .unity_output_pb2 import * -from .unity_rl_initialization_input_pb2 import * -from .unity_rl_initialization_output_pb2 import * -from .unity_rl_input_pb2 import * -from .unity_rl_output_pb2 import * -from .unity_rl_reset_input_pb2 import * -from .unity_rl_reset_output_pb2 import * -from .unity_to_external_pb2_grpc import * -from .unity_to_external_pb2 import * diff --git a/animalai_bkp/communicator_objects/agent_action_proto_pb2.py b/animalai_bkp/communicator_objects/agent_action_proto_pb2.py deleted file mode 100644 index 8d19593e..00000000 --- a/animalai_bkp/communicator_objects/agent_action_proto_pb2.py +++ /dev/null @@ -1,92 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: animalai/communicator_objects/agent_action_proto.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='animalai/communicator_objects/agent_action_proto.proto', - package='communicator_objects', - syntax='proto3', - serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), - serialized_pb=_b('\n6animalai/communicator_objects/agent_action_proto.proto\x12\x14\x63ommunicator_objects\"a\n\x10\x41gentActionProto\x12\x16\n\x0evector_actions\x18\x01 \x03(\x02\x12\x14\n\x0ctext_actions\x18\x02 \x01(\t\x12\x10\n\x08memories\x18\x03 \x03(\x02\x12\r\n\x05value\x18\x04 \x01(\x02\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') -) - - - - -_AGENTACTIONPROTO = _descriptor.Descriptor( - name='AgentActionProto', - full_name='communicator_objects.AgentActionProto', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='vector_actions', full_name='communicator_objects.AgentActionProto.vector_actions', index=0, - number=1, type=2, cpp_type=6, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='text_actions', full_name='communicator_objects.AgentActionProto.text_actions', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='memories', full_name='communicator_objects.AgentActionProto.memories', index=2, - number=3, type=2, cpp_type=6, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='value', full_name='communicator_objects.AgentActionProto.value', index=3, - number=4, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=80, - serialized_end=177, -) - -DESCRIPTOR.message_types_by_name['AgentActionProto'] = _AGENTACTIONPROTO -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -AgentActionProto = _reflection.GeneratedProtocolMessageType('AgentActionProto', (_message.Message,), { - 'DESCRIPTOR' : _AGENTACTIONPROTO, - '__module__' : 'animalai.communicator_objects.agent_action_proto_pb2' - # @@protoc_insertion_point(class_scope:communicator_objects.AgentActionProto) - }) -_sym_db.RegisterMessage(AgentActionProto) - - -DESCRIPTOR._options = None -# @@protoc_insertion_point(module_scope) diff --git a/animalai_bkp/communicator_objects/agent_info_proto_pb2.py b/animalai_bkp/communicator_objects/agent_info_proto_pb2.py deleted file mode 100644 index 0dad7e85..00000000 --- a/animalai_bkp/communicator_objects/agent_info_proto_pb2.py +++ /dev/null @@ -1,141 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: animalai/communicator_objects/agent_info_proto.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='animalai/communicator_objects/agent_info_proto.proto', - package='communicator_objects', - syntax='proto3', - serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), - serialized_pb=_b('\n4animalai/communicator_objects/agent_info_proto.proto\x12\x14\x63ommunicator_objects\"\x92\x02\n\x0e\x41gentInfoProto\x12\"\n\x1astacked_vector_observation\x18\x01 \x03(\x02\x12\x1b\n\x13visual_observations\x18\x02 \x03(\x0c\x12\x18\n\x10text_observation\x18\x03 \x01(\t\x12\x1d\n\x15stored_vector_actions\x18\x04 \x03(\x02\x12\x1b\n\x13stored_text_actions\x18\x05 \x01(\t\x12\x10\n\x08memories\x18\x06 \x03(\x02\x12\x0e\n\x06reward\x18\x07 \x01(\x02\x12\x0c\n\x04\x64one\x18\x08 \x01(\x08\x12\x18\n\x10max_step_reached\x18\t \x01(\x08\x12\n\n\x02id\x18\n \x01(\x05\x12\x13\n\x0b\x61\x63tion_mask\x18\x0b \x03(\x08\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') -) - - - - -_AGENTINFOPROTO = _descriptor.Descriptor( - name='AgentInfoProto', - full_name='communicator_objects.AgentInfoProto', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='stacked_vector_observation', full_name='communicator_objects.AgentInfoProto.stacked_vector_observation', index=0, - number=1, type=2, cpp_type=6, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='visual_observations', full_name='communicator_objects.AgentInfoProto.visual_observations', index=1, - number=2, type=12, cpp_type=9, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='text_observation', full_name='communicator_objects.AgentInfoProto.text_observation', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='stored_vector_actions', full_name='communicator_objects.AgentInfoProto.stored_vector_actions', index=3, - number=4, type=2, cpp_type=6, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='stored_text_actions', full_name='communicator_objects.AgentInfoProto.stored_text_actions', index=4, - number=5, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='memories', full_name='communicator_objects.AgentInfoProto.memories', index=5, - number=6, type=2, cpp_type=6, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='reward', full_name='communicator_objects.AgentInfoProto.reward', index=6, - number=7, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='done', full_name='communicator_objects.AgentInfoProto.done', index=7, - number=8, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='max_step_reached', full_name='communicator_objects.AgentInfoProto.max_step_reached', index=8, - number=9, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='id', full_name='communicator_objects.AgentInfoProto.id', index=9, - number=10, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='action_mask', full_name='communicator_objects.AgentInfoProto.action_mask', index=10, - number=11, type=8, cpp_type=7, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=79, - serialized_end=353, -) - -DESCRIPTOR.message_types_by_name['AgentInfoProto'] = _AGENTINFOPROTO -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -AgentInfoProto = _reflection.GeneratedProtocolMessageType('AgentInfoProto', (_message.Message,), { - 'DESCRIPTOR' : _AGENTINFOPROTO, - '__module__' : 'animalai.communicator_objects.agent_info_proto_pb2' - # @@protoc_insertion_point(class_scope:communicator_objects.AgentInfoProto) - }) -_sym_db.RegisterMessage(AgentInfoProto) - - -DESCRIPTOR._options = None -# @@protoc_insertion_point(module_scope) diff --git a/animalai_bkp/communicator_objects/arena_parameters_proto_pb2.py b/animalai_bkp/communicator_objects/arena_parameters_proto_pb2.py deleted file mode 100644 index 930b300c..00000000 --- a/animalai_bkp/communicator_objects/arena_parameters_proto_pb2.py +++ /dev/null @@ -1,209 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: animalai/communicator_objects/arena_parameters_proto.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='animalai/communicator_objects/arena_parameters_proto.proto', - package='communicator_objects', - syntax='proto3', - serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), - serialized_pb=_b('\n:animalai/communicator_objects/arena_parameters_proto.proto\x12\x14\x63ommunicator_objects\"\xcf\x03\n\x14\x41renaParametersProto\x12\t\n\x01t\x18\x01 \x01(\x05\x12\x46\n\x05items\x18\x02 \x03(\x0b\x32\x37.communicator_objects.ArenaParametersProto.ItemsToSpawn\x12\x11\n\tblackouts\x18\x03 \x03(\x05\x1a\xd0\x02\n\x0cItemsToSpawn\x12\x0c\n\x04name\x18\x01 \x01(\t\x12R\n\tpositions\x18\x03 \x03(\x0b\x32?.communicator_objects.ArenaParametersProto.ItemsToSpawn.Vector3\x12\x11\n\trotations\x18\x04 \x03(\x02\x12N\n\x05sizes\x18\x05 \x03(\x0b\x32?.communicator_objects.ArenaParametersProto.ItemsToSpawn.Vector3\x12O\n\x06\x63olors\x18\x06 \x03(\x0b\x32?.communicator_objects.ArenaParametersProto.ItemsToSpawn.Vector3\x1a*\n\x07Vector3\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02\x12\t\n\x01z\x18\x03 \x01(\x02\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') -) - - - - -_ARENAPARAMETERSPROTO_ITEMSTOSPAWN_VECTOR3 = _descriptor.Descriptor( - name='Vector3', - full_name='communicator_objects.ArenaParametersProto.ItemsToSpawn.Vector3', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='x', full_name='communicator_objects.ArenaParametersProto.ItemsToSpawn.Vector3.x', index=0, - number=1, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='y', full_name='communicator_objects.ArenaParametersProto.ItemsToSpawn.Vector3.y', index=1, - number=2, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='z', full_name='communicator_objects.ArenaParametersProto.ItemsToSpawn.Vector3.z', index=2, - number=3, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=506, - serialized_end=548, -) - -_ARENAPARAMETERSPROTO_ITEMSTOSPAWN = _descriptor.Descriptor( - name='ItemsToSpawn', - full_name='communicator_objects.ArenaParametersProto.ItemsToSpawn', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='name', full_name='communicator_objects.ArenaParametersProto.ItemsToSpawn.name', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='positions', full_name='communicator_objects.ArenaParametersProto.ItemsToSpawn.positions', index=1, - number=3, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='rotations', full_name='communicator_objects.ArenaParametersProto.ItemsToSpawn.rotations', index=2, - number=4, type=2, cpp_type=6, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='sizes', full_name='communicator_objects.ArenaParametersProto.ItemsToSpawn.sizes', index=3, - number=5, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='colors', full_name='communicator_objects.ArenaParametersProto.ItemsToSpawn.colors', index=4, - number=6, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[_ARENAPARAMETERSPROTO_ITEMSTOSPAWN_VECTOR3, ], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=212, - serialized_end=548, -) - -_ARENAPARAMETERSPROTO = _descriptor.Descriptor( - name='ArenaParametersProto', - full_name='communicator_objects.ArenaParametersProto', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='t', full_name='communicator_objects.ArenaParametersProto.t', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='items', full_name='communicator_objects.ArenaParametersProto.items', index=1, - number=2, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='blackouts', full_name='communicator_objects.ArenaParametersProto.blackouts', index=2, - number=3, type=5, cpp_type=1, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[_ARENAPARAMETERSPROTO_ITEMSTOSPAWN, ], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=85, - serialized_end=548, -) - -_ARENAPARAMETERSPROTO_ITEMSTOSPAWN_VECTOR3.containing_type = _ARENAPARAMETERSPROTO_ITEMSTOSPAWN -_ARENAPARAMETERSPROTO_ITEMSTOSPAWN.fields_by_name['positions'].message_type = _ARENAPARAMETERSPROTO_ITEMSTOSPAWN_VECTOR3 -_ARENAPARAMETERSPROTO_ITEMSTOSPAWN.fields_by_name['sizes'].message_type = _ARENAPARAMETERSPROTO_ITEMSTOSPAWN_VECTOR3 -_ARENAPARAMETERSPROTO_ITEMSTOSPAWN.fields_by_name['colors'].message_type = _ARENAPARAMETERSPROTO_ITEMSTOSPAWN_VECTOR3 -_ARENAPARAMETERSPROTO_ITEMSTOSPAWN.containing_type = _ARENAPARAMETERSPROTO -_ARENAPARAMETERSPROTO.fields_by_name['items'].message_type = _ARENAPARAMETERSPROTO_ITEMSTOSPAWN -DESCRIPTOR.message_types_by_name['ArenaParametersProto'] = _ARENAPARAMETERSPROTO -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -ArenaParametersProto = _reflection.GeneratedProtocolMessageType('ArenaParametersProto', (_message.Message,), { - - 'ItemsToSpawn' : _reflection.GeneratedProtocolMessageType('ItemsToSpawn', (_message.Message,), { - - 'Vector3' : _reflection.GeneratedProtocolMessageType('Vector3', (_message.Message,), { - 'DESCRIPTOR' : _ARENAPARAMETERSPROTO_ITEMSTOSPAWN_VECTOR3, - '__module__' : 'animalai.communicator_objects.arena_parameters_proto_pb2' - # @@protoc_insertion_point(class_scope:communicator_objects.ArenaParametersProto.ItemsToSpawn.Vector3) - }) - , - 'DESCRIPTOR' : _ARENAPARAMETERSPROTO_ITEMSTOSPAWN, - '__module__' : 'animalai.communicator_objects.arena_parameters_proto_pb2' - # @@protoc_insertion_point(class_scope:communicator_objects.ArenaParametersProto.ItemsToSpawn) - }) - , - 'DESCRIPTOR' : _ARENAPARAMETERSPROTO, - '__module__' : 'animalai.communicator_objects.arena_parameters_proto_pb2' - # @@protoc_insertion_point(class_scope:communicator_objects.ArenaParametersProto) - }) -_sym_db.RegisterMessage(ArenaParametersProto) -_sym_db.RegisterMessage(ArenaParametersProto.ItemsToSpawn) -_sym_db.RegisterMessage(ArenaParametersProto.ItemsToSpawn.Vector3) - - -DESCRIPTOR._options = None -# @@protoc_insertion_point(module_scope) diff --git a/animalai_bkp/communicator_objects/brain_parameters_proto_pb2.py b/animalai_bkp/communicator_objects/brain_parameters_proto_pb2.py deleted file mode 100644 index 07091b4f..00000000 --- a/animalai_bkp/communicator_objects/brain_parameters_proto_pb2.py +++ /dev/null @@ -1,125 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: animalai/communicator_objects/brain_parameters_proto.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -from animalai.communicator_objects import resolution_proto_pb2 as animalai_dot_communicator__objects_dot_resolution__proto__pb2 -from animalai.communicator_objects import space_type_proto_pb2 as animalai_dot_communicator__objects_dot_space__type__proto__pb2 - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='animalai/communicator_objects/brain_parameters_proto.proto', - package='communicator_objects', - syntax='proto3', - serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), - serialized_pb=_b('\n:animalai/communicator_objects/brain_parameters_proto.proto\x12\x14\x63ommunicator_objects\x1a\x34\x61nimalai/communicator_objects/resolution_proto.proto\x1a\x34\x61nimalai/communicator_objects/space_type_proto.proto\"\xd4\x02\n\x14\x42rainParametersProto\x12\x1f\n\x17vector_observation_size\x18\x01 \x01(\x05\x12\'\n\x1fnum_stacked_vector_observations\x18\x02 \x01(\x05\x12\x1a\n\x12vector_action_size\x18\x03 \x03(\x05\x12\x41\n\x12\x63\x61mera_resolutions\x18\x04 \x03(\x0b\x32%.communicator_objects.ResolutionProto\x12\"\n\x1avector_action_descriptions\x18\x05 \x03(\t\x12\x46\n\x18vector_action_space_type\x18\x06 \x01(\x0e\x32$.communicator_objects.SpaceTypeProto\x12\x12\n\nbrain_name\x18\x07 \x01(\t\x12\x13\n\x0bis_training\x18\x08 \x01(\x08\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') - , - dependencies=[animalai_dot_communicator__objects_dot_resolution__proto__pb2.DESCRIPTOR,animalai_dot_communicator__objects_dot_space__type__proto__pb2.DESCRIPTOR,]) - - - - -_BRAINPARAMETERSPROTO = _descriptor.Descriptor( - name='BrainParametersProto', - full_name='communicator_objects.BrainParametersProto', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='vector_observation_size', full_name='communicator_objects.BrainParametersProto.vector_observation_size', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='num_stacked_vector_observations', full_name='communicator_objects.BrainParametersProto.num_stacked_vector_observations', index=1, - number=2, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='vector_action_size', full_name='communicator_objects.BrainParametersProto.vector_action_size', index=2, - number=3, type=5, cpp_type=1, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='camera_resolutions', full_name='communicator_objects.BrainParametersProto.camera_resolutions', index=3, - number=4, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='vector_action_descriptions', full_name='communicator_objects.BrainParametersProto.vector_action_descriptions', index=4, - number=5, type=9, cpp_type=9, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='vector_action_space_type', full_name='communicator_objects.BrainParametersProto.vector_action_space_type', index=5, - number=6, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='brain_name', full_name='communicator_objects.BrainParametersProto.brain_name', index=6, - number=7, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='is_training', full_name='communicator_objects.BrainParametersProto.is_training', index=7, - number=8, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=193, - serialized_end=533, -) - -_BRAINPARAMETERSPROTO.fields_by_name['camera_resolutions'].message_type = animalai_dot_communicator__objects_dot_resolution__proto__pb2._RESOLUTIONPROTO -_BRAINPARAMETERSPROTO.fields_by_name['vector_action_space_type'].enum_type = animalai_dot_communicator__objects_dot_space__type__proto__pb2._SPACETYPEPROTO -DESCRIPTOR.message_types_by_name['BrainParametersProto'] = _BRAINPARAMETERSPROTO -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -BrainParametersProto = _reflection.GeneratedProtocolMessageType('BrainParametersProto', (_message.Message,), { - 'DESCRIPTOR' : _BRAINPARAMETERSPROTO, - '__module__' : 'animalai.communicator_objects.brain_parameters_proto_pb2' - # @@protoc_insertion_point(class_scope:communicator_objects.BrainParametersProto) - }) -_sym_db.RegisterMessage(BrainParametersProto) - - -DESCRIPTOR._options = None -# @@protoc_insertion_point(module_scope) diff --git a/animalai_bkp/communicator_objects/command_proto_pb2.py b/animalai_bkp/communicator_objects/command_proto_pb2.py deleted file mode 100644 index 4912301f..00000000 --- a/animalai_bkp/communicator_objects/command_proto_pb2.py +++ /dev/null @@ -1,64 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: animalai/communicator_objects/command_proto.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) -from google.protobuf.internal import enum_type_wrapper -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='animalai/communicator_objects/command_proto.proto', - package='communicator_objects', - syntax='proto3', - serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), - serialized_pb=_b('\n1animalai/communicator_objects/command_proto.proto\x12\x14\x63ommunicator_objects*-\n\x0c\x43ommandProto\x12\x08\n\x04STEP\x10\x00\x12\t\n\x05RESET\x10\x01\x12\x08\n\x04QUIT\x10\x02\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') -) - -_COMMANDPROTO = _descriptor.EnumDescriptor( - name='CommandProto', - full_name='communicator_objects.CommandProto', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='STEP', index=0, number=0, - serialized_options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='RESET', index=1, number=1, - serialized_options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='QUIT', index=2, number=2, - serialized_options=None, - type=None), - ], - containing_type=None, - serialized_options=None, - serialized_start=75, - serialized_end=120, -) -_sym_db.RegisterEnumDescriptor(_COMMANDPROTO) - -CommandProto = enum_type_wrapper.EnumTypeWrapper(_COMMANDPROTO) -STEP = 0 -RESET = 1 -QUIT = 2 - - -DESCRIPTOR.enum_types_by_name['CommandProto'] = _COMMANDPROTO -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - - -DESCRIPTOR._options = None -# @@protoc_insertion_point(module_scope) diff --git a/animalai_bkp/communicator_objects/demonstration_meta_proto_pb2.py b/animalai_bkp/communicator_objects/demonstration_meta_proto_pb2.py deleted file mode 100644 index 107b1335..00000000 --- a/animalai_bkp/communicator_objects/demonstration_meta_proto_pb2.py +++ /dev/null @@ -1,99 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: animalai/communicator_objects/demonstration_meta_proto.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='animalai/communicator_objects/demonstration_meta_proto.proto', - package='communicator_objects', - syntax='proto3', - serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), - serialized_pb=_b('\nanimalai/communicator_objects/engine_configuration_proto.proto\x12\x14\x63ommunicator_objects\"\x95\x01\n\x18\x45ngineConfigurationProto\x12\r\n\x05width\x18\x01 \x01(\x05\x12\x0e\n\x06height\x18\x02 \x01(\x05\x12\x15\n\rquality_level\x18\x03 \x01(\x05\x12\x12\n\ntime_scale\x18\x04 \x01(\x02\x12\x19\n\x11target_frame_rate\x18\x05 \x01(\x05\x12\x14\n\x0cshow_monitor\x18\x06 \x01(\x08\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') -) - - - - -_ENGINECONFIGURATIONPROTO = _descriptor.Descriptor( - name='EngineConfigurationProto', - full_name='communicator_objects.EngineConfigurationProto', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='width', full_name='communicator_objects.EngineConfigurationProto.width', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='height', full_name='communicator_objects.EngineConfigurationProto.height', index=1, - number=2, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='quality_level', full_name='communicator_objects.EngineConfigurationProto.quality_level', index=2, - number=3, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='time_scale', full_name='communicator_objects.EngineConfigurationProto.time_scale', index=3, - number=4, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='target_frame_rate', full_name='communicator_objects.EngineConfigurationProto.target_frame_rate', index=4, - number=5, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='show_monitor', full_name='communicator_objects.EngineConfigurationProto.show_monitor', index=5, - number=6, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=89, - serialized_end=238, -) - -DESCRIPTOR.message_types_by_name['EngineConfigurationProto'] = _ENGINECONFIGURATIONPROTO -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -EngineConfigurationProto = _reflection.GeneratedProtocolMessageType('EngineConfigurationProto', (_message.Message,), { - 'DESCRIPTOR' : _ENGINECONFIGURATIONPROTO, - '__module__' : 'animalai.communicator_objects.engine_configuration_proto_pb2' - # @@protoc_insertion_point(class_scope:communicator_objects.EngineConfigurationProto) - }) -_sym_db.RegisterMessage(EngineConfigurationProto) - - -DESCRIPTOR._options = None -# @@protoc_insertion_point(module_scope) diff --git a/animalai_bkp/communicator_objects/header_pb2.py b/animalai_bkp/communicator_objects/header_pb2.py deleted file mode 100644 index 6c40f6cc..00000000 --- a/animalai_bkp/communicator_objects/header_pb2.py +++ /dev/null @@ -1,78 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: animalai/communicator_objects/header.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='animalai/communicator_objects/header.proto', - package='communicator_objects', - syntax='proto3', - serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), - serialized_pb=_b('\n*animalai/communicator_objects/header.proto\x12\x14\x63ommunicator_objects\")\n\x06Header\x12\x0e\n\x06status\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\tB\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') -) - - - - -_HEADER = _descriptor.Descriptor( - name='Header', - full_name='communicator_objects.Header', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='status', full_name='communicator_objects.Header.status', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='message', full_name='communicator_objects.Header.message', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=68, - serialized_end=109, -) - -DESCRIPTOR.message_types_by_name['Header'] = _HEADER -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -Header = _reflection.GeneratedProtocolMessageType('Header', (_message.Message,), { - 'DESCRIPTOR' : _HEADER, - '__module__' : 'animalai.communicator_objects.header_pb2' - # @@protoc_insertion_point(class_scope:communicator_objects.Header) - }) -_sym_db.RegisterMessage(Header) - - -DESCRIPTOR._options = None -# @@protoc_insertion_point(module_scope) diff --git a/animalai_bkp/communicator_objects/resolution_proto_pb2.py b/animalai_bkp/communicator_objects/resolution_proto_pb2.py deleted file mode 100644 index cade7d49..00000000 --- a/animalai_bkp/communicator_objects/resolution_proto_pb2.py +++ /dev/null @@ -1,85 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: animalai/communicator_objects/resolution_proto.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='animalai/communicator_objects/resolution_proto.proto', - package='communicator_objects', - syntax='proto3', - serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), - serialized_pb=_b('\n4animalai/communicator_objects/resolution_proto.proto\x12\x14\x63ommunicator_objects\"D\n\x0fResolutionProto\x12\r\n\x05width\x18\x01 \x01(\x05\x12\x0e\n\x06height\x18\x02 \x01(\x05\x12\x12\n\ngray_scale\x18\x03 \x01(\x08\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') -) - - - - -_RESOLUTIONPROTO = _descriptor.Descriptor( - name='ResolutionProto', - full_name='communicator_objects.ResolutionProto', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='width', full_name='communicator_objects.ResolutionProto.width', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='height', full_name='communicator_objects.ResolutionProto.height', index=1, - number=2, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='gray_scale', full_name='communicator_objects.ResolutionProto.gray_scale', index=2, - number=3, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=78, - serialized_end=146, -) - -DESCRIPTOR.message_types_by_name['ResolutionProto'] = _RESOLUTIONPROTO -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -ResolutionProto = _reflection.GeneratedProtocolMessageType('ResolutionProto', (_message.Message,), { - 'DESCRIPTOR' : _RESOLUTIONPROTO, - '__module__' : 'animalai.communicator_objects.resolution_proto_pb2' - # @@protoc_insertion_point(class_scope:communicator_objects.ResolutionProto) - }) -_sym_db.RegisterMessage(ResolutionProto) - - -DESCRIPTOR._options = None -# @@protoc_insertion_point(module_scope) diff --git a/animalai_bkp/communicator_objects/space_type_proto_pb2.py b/animalai_bkp/communicator_objects/space_type_proto_pb2.py deleted file mode 100644 index 02a9b16e..00000000 --- a/animalai_bkp/communicator_objects/space_type_proto_pb2.py +++ /dev/null @@ -1,61 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: animalai/communicator_objects/space_type_proto.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) -from google.protobuf.internal import enum_type_wrapper -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -from animalai.communicator_objects import resolution_proto_pb2 as animalai_dot_communicator__objects_dot_resolution__proto__pb2 - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='animalai/communicator_objects/space_type_proto.proto', - package='communicator_objects', - syntax='proto3', - serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), - serialized_pb=_b('\n4animalai/communicator_objects/space_type_proto.proto\x12\x14\x63ommunicator_objects\x1a\x34\x61nimalai/communicator_objects/resolution_proto.proto*.\n\x0eSpaceTypeProto\x12\x0c\n\x08\x64iscrete\x10\x00\x12\x0e\n\ncontinuous\x10\x01\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') - , - dependencies=[animalai_dot_communicator__objects_dot_resolution__proto__pb2.DESCRIPTOR,]) - -_SPACETYPEPROTO = _descriptor.EnumDescriptor( - name='SpaceTypeProto', - full_name='communicator_objects.SpaceTypeProto', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='discrete', index=0, number=0, - serialized_options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='continuous', index=1, number=1, - serialized_options=None, - type=None), - ], - containing_type=None, - serialized_options=None, - serialized_start=132, - serialized_end=178, -) -_sym_db.RegisterEnumDescriptor(_SPACETYPEPROTO) - -SpaceTypeProto = enum_type_wrapper.EnumTypeWrapper(_SPACETYPEPROTO) -discrete = 0 -continuous = 1 - - -DESCRIPTOR.enum_types_by_name['SpaceTypeProto'] = _SPACETYPEPROTO -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - - -DESCRIPTOR._options = None -# @@protoc_insertion_point(module_scope) diff --git a/animalai_bkp/communicator_objects/unity_input_pb2.py b/animalai_bkp/communicator_objects/unity_input_pb2.py deleted file mode 100644 index a3f9d1c1..00000000 --- a/animalai_bkp/communicator_objects/unity_input_pb2.py +++ /dev/null @@ -1,92 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: animalai/communicator_objects/unity_input.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -from animalai.communicator_objects import unity_rl_input_pb2 as animalai_dot_communicator__objects_dot_unity__rl__input__pb2 -from animalai.communicator_objects import unity_rl_initialization_input_pb2 as animalai_dot_communicator__objects_dot_unity__rl__initialization__input__pb2 -from animalai.communicator_objects import unity_rl_reset_input_pb2 as animalai_dot_communicator__objects_dot_unity__rl__reset__input__pb2 - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='animalai/communicator_objects/unity_input.proto', - package='communicator_objects', - syntax='proto3', - serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), - serialized_pb=_b('\n/animalai/communicator_objects/unity_input.proto\x12\x14\x63ommunicator_objects\x1a\x32\x61nimalai/communicator_objects/unity_rl_input.proto\x1a\x41\x61nimalai/communicator_objects/unity_rl_initialization_input.proto\x1a\x38\x61nimalai/communicator_objects/unity_rl_reset_input.proto\"\xd6\x01\n\nUnityInput\x12\x34\n\x08rl_input\x18\x01 \x01(\x0b\x32\".communicator_objects.UnityRLInput\x12Q\n\x17rl_initialization_input\x18\x02 \x01(\x0b\x32\x30.communicator_objects.UnityRLInitializationInput\x12?\n\x0erl_reset_input\x18\x03 \x01(\x0b\x32\'.communicator_objects.UnityRLResetInputB\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') - , - dependencies=[animalai_dot_communicator__objects_dot_unity__rl__input__pb2.DESCRIPTOR,animalai_dot_communicator__objects_dot_unity__rl__initialization__input__pb2.DESCRIPTOR,animalai_dot_communicator__objects_dot_unity__rl__reset__input__pb2.DESCRIPTOR,]) - - - - -_UNITYINPUT = _descriptor.Descriptor( - name='UnityInput', - full_name='communicator_objects.UnityInput', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='rl_input', full_name='communicator_objects.UnityInput.rl_input', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='rl_initialization_input', full_name='communicator_objects.UnityInput.rl_initialization_input', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='rl_reset_input', full_name='communicator_objects.UnityInput.rl_reset_input', index=2, - number=3, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=251, - serialized_end=465, -) - -_UNITYINPUT.fields_by_name['rl_input'].message_type = animalai_dot_communicator__objects_dot_unity__rl__input__pb2._UNITYRLINPUT -_UNITYINPUT.fields_by_name['rl_initialization_input'].message_type = animalai_dot_communicator__objects_dot_unity__rl__initialization__input__pb2._UNITYRLINITIALIZATIONINPUT -_UNITYINPUT.fields_by_name['rl_reset_input'].message_type = animalai_dot_communicator__objects_dot_unity__rl__reset__input__pb2._UNITYRLRESETINPUT -DESCRIPTOR.message_types_by_name['UnityInput'] = _UNITYINPUT -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -UnityInput = _reflection.GeneratedProtocolMessageType('UnityInput', (_message.Message,), { - 'DESCRIPTOR' : _UNITYINPUT, - '__module__' : 'animalai.communicator_objects.unity_input_pb2' - # @@protoc_insertion_point(class_scope:communicator_objects.UnityInput) - }) -_sym_db.RegisterMessage(UnityInput) - - -DESCRIPTOR._options = None -# @@protoc_insertion_point(module_scope) diff --git a/animalai_bkp/communicator_objects/unity_message_pb2.py b/animalai_bkp/communicator_objects/unity_message_pb2.py deleted file mode 100644 index 47deefdc..00000000 --- a/animalai_bkp/communicator_objects/unity_message_pb2.py +++ /dev/null @@ -1,92 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: animalai/communicator_objects/unity_message.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -from animalai.communicator_objects import unity_output_pb2 as animalai_dot_communicator__objects_dot_unity__output__pb2 -from animalai.communicator_objects import unity_input_pb2 as animalai_dot_communicator__objects_dot_unity__input__pb2 -from animalai.communicator_objects import header_pb2 as animalai_dot_communicator__objects_dot_header__pb2 - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='animalai/communicator_objects/unity_message.proto', - package='communicator_objects', - syntax='proto3', - serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), - serialized_pb=_b('\n1animalai/communicator_objects/unity_message.proto\x12\x14\x63ommunicator_objects\x1a\x30\x61nimalai/communicator_objects/unity_output.proto\x1a/animalai/communicator_objects/unity_input.proto\x1a*animalai/communicator_objects/header.proto\"\xac\x01\n\x0cUnityMessage\x12,\n\x06header\x18\x01 \x01(\x0b\x32\x1c.communicator_objects.Header\x12\x37\n\x0cunity_output\x18\x02 \x01(\x0b\x32!.communicator_objects.UnityOutput\x12\x35\n\x0bunity_input\x18\x03 \x01(\x0b\x32 .communicator_objects.UnityInputB\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') - , - dependencies=[animalai_dot_communicator__objects_dot_unity__output__pb2.DESCRIPTOR,animalai_dot_communicator__objects_dot_unity__input__pb2.DESCRIPTOR,animalai_dot_communicator__objects_dot_header__pb2.DESCRIPTOR,]) - - - - -_UNITYMESSAGE = _descriptor.Descriptor( - name='UnityMessage', - full_name='communicator_objects.UnityMessage', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='header', full_name='communicator_objects.UnityMessage.header', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='unity_output', full_name='communicator_objects.UnityMessage.unity_output', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='unity_input', full_name='communicator_objects.UnityMessage.unity_input', index=2, - number=3, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=219, - serialized_end=391, -) - -_UNITYMESSAGE.fields_by_name['header'].message_type = animalai_dot_communicator__objects_dot_header__pb2._HEADER -_UNITYMESSAGE.fields_by_name['unity_output'].message_type = animalai_dot_communicator__objects_dot_unity__output__pb2._UNITYOUTPUT -_UNITYMESSAGE.fields_by_name['unity_input'].message_type = animalai_dot_communicator__objects_dot_unity__input__pb2._UNITYINPUT -DESCRIPTOR.message_types_by_name['UnityMessage'] = _UNITYMESSAGE -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -UnityMessage = _reflection.GeneratedProtocolMessageType('UnityMessage', (_message.Message,), { - 'DESCRIPTOR' : _UNITYMESSAGE, - '__module__' : 'animalai.communicator_objects.unity_message_pb2' - # @@protoc_insertion_point(class_scope:communicator_objects.UnityMessage) - }) -_sym_db.RegisterMessage(UnityMessage) - - -DESCRIPTOR._options = None -# @@protoc_insertion_point(module_scope) diff --git a/animalai_bkp/communicator_objects/unity_output_pb2.py b/animalai_bkp/communicator_objects/unity_output_pb2.py deleted file mode 100644 index 5beed76e..00000000 --- a/animalai_bkp/communicator_objects/unity_output_pb2.py +++ /dev/null @@ -1,83 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: animalai/communicator_objects/unity_output.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -from animalai.communicator_objects import unity_rl_output_pb2 as animalai_dot_communicator__objects_dot_unity__rl__output__pb2 -from animalai.communicator_objects import unity_rl_initialization_output_pb2 as animalai_dot_communicator__objects_dot_unity__rl__initialization__output__pb2 - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='animalai/communicator_objects/unity_output.proto', - package='communicator_objects', - syntax='proto3', - serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), - serialized_pb=_b('\n0animalai/communicator_objects/unity_output.proto\x12\x14\x63ommunicator_objects\x1a\x33\x61nimalai/communicator_objects/unity_rl_output.proto\x1a\x42\x61nimalai/communicator_objects/unity_rl_initialization_output.proto\"\x9a\x01\n\x0bUnityOutput\x12\x36\n\trl_output\x18\x01 \x01(\x0b\x32#.communicator_objects.UnityRLOutput\x12S\n\x18rl_initialization_output\x18\x02 \x01(\x0b\x32\x31.communicator_objects.UnityRLInitializationOutputB\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') - , - dependencies=[animalai_dot_communicator__objects_dot_unity__rl__output__pb2.DESCRIPTOR,animalai_dot_communicator__objects_dot_unity__rl__initialization__output__pb2.DESCRIPTOR,]) - - - - -_UNITYOUTPUT = _descriptor.Descriptor( - name='UnityOutput', - full_name='communicator_objects.UnityOutput', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='rl_output', full_name='communicator_objects.UnityOutput.rl_output', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='rl_initialization_output', full_name='communicator_objects.UnityOutput.rl_initialization_output', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=196, - serialized_end=350, -) - -_UNITYOUTPUT.fields_by_name['rl_output'].message_type = animalai_dot_communicator__objects_dot_unity__rl__output__pb2._UNITYRLOUTPUT -_UNITYOUTPUT.fields_by_name['rl_initialization_output'].message_type = animalai_dot_communicator__objects_dot_unity__rl__initialization__output__pb2._UNITYRLINITIALIZATIONOUTPUT -DESCRIPTOR.message_types_by_name['UnityOutput'] = _UNITYOUTPUT -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -UnityOutput = _reflection.GeneratedProtocolMessageType('UnityOutput', (_message.Message,), { - 'DESCRIPTOR' : _UNITYOUTPUT, - '__module__' : 'animalai.communicator_objects.unity_output_pb2' - # @@protoc_insertion_point(class_scope:communicator_objects.UnityOutput) - }) -_sym_db.RegisterMessage(UnityOutput) - - -DESCRIPTOR._options = None -# @@protoc_insertion_point(module_scope) diff --git a/animalai_bkp/communicator_objects/unity_rl_initialization_input_pb2.py b/animalai_bkp/communicator_objects/unity_rl_initialization_input_pb2.py deleted file mode 100644 index 9b16381b..00000000 --- a/animalai_bkp/communicator_objects/unity_rl_initialization_input_pb2.py +++ /dev/null @@ -1,71 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: animalai/communicator_objects/unity_rl_initialization_input.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='animalai/communicator_objects/unity_rl_initialization_input.proto', - package='communicator_objects', - syntax='proto3', - serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), - serialized_pb=_b('\nAanimalai/communicator_objects/unity_rl_initialization_input.proto\x12\x14\x63ommunicator_objects\"*\n\x1aUnityRLInitializationInput\x12\x0c\n\x04seed\x18\x01 \x01(\x05\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') -) - - - - -_UNITYRLINITIALIZATIONINPUT = _descriptor.Descriptor( - name='UnityRLInitializationInput', - full_name='communicator_objects.UnityRLInitializationInput', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='seed', full_name='communicator_objects.UnityRLInitializationInput.seed', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=91, - serialized_end=133, -) - -DESCRIPTOR.message_types_by_name['UnityRLInitializationInput'] = _UNITYRLINITIALIZATIONINPUT -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -UnityRLInitializationInput = _reflection.GeneratedProtocolMessageType('UnityRLInitializationInput', (_message.Message,), { - 'DESCRIPTOR' : _UNITYRLINITIALIZATIONINPUT, - '__module__' : 'animalai.communicator_objects.unity_rl_initialization_input_pb2' - # @@protoc_insertion_point(class_scope:communicator_objects.UnityRLInitializationInput) - }) -_sym_db.RegisterMessage(UnityRLInitializationInput) - - -DESCRIPTOR._options = None -# @@protoc_insertion_point(module_scope) diff --git a/animalai_bkp/communicator_objects/unity_rl_initialization_output_pb2.py b/animalai_bkp/communicator_objects/unity_rl_initialization_output_pb2.py deleted file mode 100644 index 1042578f..00000000 --- a/animalai_bkp/communicator_objects/unity_rl_initialization_output_pb2.py +++ /dev/null @@ -1,95 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: animalai/communicator_objects/unity_rl_initialization_output.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -from animalai.communicator_objects import brain_parameters_proto_pb2 as animalai_dot_communicator__objects_dot_brain__parameters__proto__pb2 - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='animalai/communicator_objects/unity_rl_initialization_output.proto', - package='communicator_objects', - syntax='proto3', - serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), - serialized_pb=_b('\nBanimalai/communicator_objects/unity_rl_initialization_output.proto\x12\x14\x63ommunicator_objects\x1a:animalai/communicator_objects/brain_parameters_proto.proto\"\x94\x01\n\x1bUnityRLInitializationOutput\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\t\x12\x10\n\x08log_path\x18\x03 \x01(\t\x12\x44\n\x10\x62rain_parameters\x18\x05 \x03(\x0b\x32*.communicator_objects.BrainParametersProtoB\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') - , - dependencies=[animalai_dot_communicator__objects_dot_brain__parameters__proto__pb2.DESCRIPTOR,]) - - - - -_UNITYRLINITIALIZATIONOUTPUT = _descriptor.Descriptor( - name='UnityRLInitializationOutput', - full_name='communicator_objects.UnityRLInitializationOutput', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='name', full_name='communicator_objects.UnityRLInitializationOutput.name', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='version', full_name='communicator_objects.UnityRLInitializationOutput.version', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='log_path', full_name='communicator_objects.UnityRLInitializationOutput.log_path', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='brain_parameters', full_name='communicator_objects.UnityRLInitializationOutput.brain_parameters', index=3, - number=5, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=153, - serialized_end=301, -) - -_UNITYRLINITIALIZATIONOUTPUT.fields_by_name['brain_parameters'].message_type = animalai_dot_communicator__objects_dot_brain__parameters__proto__pb2._BRAINPARAMETERSPROTO -DESCRIPTOR.message_types_by_name['UnityRLInitializationOutput'] = _UNITYRLINITIALIZATIONOUTPUT -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -UnityRLInitializationOutput = _reflection.GeneratedProtocolMessageType('UnityRLInitializationOutput', (_message.Message,), { - 'DESCRIPTOR' : _UNITYRLINITIALIZATIONOUTPUT, - '__module__' : 'animalai.communicator_objects.unity_rl_initialization_output_pb2' - # @@protoc_insertion_point(class_scope:communicator_objects.UnityRLInitializationOutput) - }) -_sym_db.RegisterMessage(UnityRLInitializationOutput) - - -DESCRIPTOR._options = None -# @@protoc_insertion_point(module_scope) diff --git a/animalai_bkp/communicator_objects/unity_rl_input_pb2.py b/animalai_bkp/communicator_objects/unity_rl_input_pb2.py deleted file mode 100644 index 29225764..00000000 --- a/animalai_bkp/communicator_objects/unity_rl_input_pb2.py +++ /dev/null @@ -1,178 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: animalai/communicator_objects/unity_rl_input.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -from animalai.communicator_objects import agent_action_proto_pb2 as animalai_dot_communicator__objects_dot_agent__action__proto__pb2 -from animalai.communicator_objects import command_proto_pb2 as animalai_dot_communicator__objects_dot_command__proto__pb2 - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='animalai/communicator_objects/unity_rl_input.proto', - package='communicator_objects', - syntax='proto3', - serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), - serialized_pb=_b('\n2animalai/communicator_objects/unity_rl_input.proto\x12\x14\x63ommunicator_objects\x1a\x36\x61nimalai/communicator_objects/agent_action_proto.proto\x1a\x31\x61nimalai/communicator_objects/command_proto.proto\"\xe2\x02\n\x0cUnityRLInput\x12K\n\ragent_actions\x18\x01 \x03(\x0b\x32\x34.communicator_objects.UnityRLInput.AgentActionsEntry\x12\x13\n\x0bis_training\x18\x02 \x01(\x08\x12\x33\n\x07\x63ommand\x18\x03 \x01(\x0e\x32\".communicator_objects.CommandProto\x1aM\n\x14ListAgentActionProto\x12\x35\n\x05value\x18\x01 \x03(\x0b\x32&.communicator_objects.AgentActionProto\x1al\n\x11\x41gentActionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x46\n\x05value\x18\x02 \x01(\x0b\x32\x37.communicator_objects.UnityRLInput.ListAgentActionProto:\x02\x38\x01\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') - , - dependencies=[animalai_dot_communicator__objects_dot_agent__action__proto__pb2.DESCRIPTOR,animalai_dot_communicator__objects_dot_command__proto__pb2.DESCRIPTOR,]) - - - - -_UNITYRLINPUT_LISTAGENTACTIONPROTO = _descriptor.Descriptor( - name='ListAgentActionProto', - full_name='communicator_objects.UnityRLInput.ListAgentActionProto', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='value', full_name='communicator_objects.UnityRLInput.ListAgentActionProto.value', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=351, - serialized_end=428, -) - -_UNITYRLINPUT_AGENTACTIONSENTRY = _descriptor.Descriptor( - name='AgentActionsEntry', - full_name='communicator_objects.UnityRLInput.AgentActionsEntry', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='key', full_name='communicator_objects.UnityRLInput.AgentActionsEntry.key', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='value', full_name='communicator_objects.UnityRLInput.AgentActionsEntry.value', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=_b('8\001'), - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=430, - serialized_end=538, -) - -_UNITYRLINPUT = _descriptor.Descriptor( - name='UnityRLInput', - full_name='communicator_objects.UnityRLInput', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='agent_actions', full_name='communicator_objects.UnityRLInput.agent_actions', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='is_training', full_name='communicator_objects.UnityRLInput.is_training', index=1, - number=2, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='command', full_name='communicator_objects.UnityRLInput.command', index=2, - number=3, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[_UNITYRLINPUT_LISTAGENTACTIONPROTO, _UNITYRLINPUT_AGENTACTIONSENTRY, ], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=184, - serialized_end=538, -) - -_UNITYRLINPUT_LISTAGENTACTIONPROTO.fields_by_name['value'].message_type = animalai_dot_communicator__objects_dot_agent__action__proto__pb2._AGENTACTIONPROTO -_UNITYRLINPUT_LISTAGENTACTIONPROTO.containing_type = _UNITYRLINPUT -_UNITYRLINPUT_AGENTACTIONSENTRY.fields_by_name['value'].message_type = _UNITYRLINPUT_LISTAGENTACTIONPROTO -_UNITYRLINPUT_AGENTACTIONSENTRY.containing_type = _UNITYRLINPUT -_UNITYRLINPUT.fields_by_name['agent_actions'].message_type = _UNITYRLINPUT_AGENTACTIONSENTRY -_UNITYRLINPUT.fields_by_name['command'].enum_type = animalai_dot_communicator__objects_dot_command__proto__pb2._COMMANDPROTO -DESCRIPTOR.message_types_by_name['UnityRLInput'] = _UNITYRLINPUT -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -UnityRLInput = _reflection.GeneratedProtocolMessageType('UnityRLInput', (_message.Message,), { - - 'ListAgentActionProto' : _reflection.GeneratedProtocolMessageType('ListAgentActionProto', (_message.Message,), { - 'DESCRIPTOR' : _UNITYRLINPUT_LISTAGENTACTIONPROTO, - '__module__' : 'animalai.communicator_objects.unity_rl_input_pb2' - # @@protoc_insertion_point(class_scope:communicator_objects.UnityRLInput.ListAgentActionProto) - }) - , - - 'AgentActionsEntry' : _reflection.GeneratedProtocolMessageType('AgentActionsEntry', (_message.Message,), { - 'DESCRIPTOR' : _UNITYRLINPUT_AGENTACTIONSENTRY, - '__module__' : 'animalai.communicator_objects.unity_rl_input_pb2' - # @@protoc_insertion_point(class_scope:communicator_objects.UnityRLInput.AgentActionsEntry) - }) - , - 'DESCRIPTOR' : _UNITYRLINPUT, - '__module__' : 'animalai.communicator_objects.unity_rl_input_pb2' - # @@protoc_insertion_point(class_scope:communicator_objects.UnityRLInput) - }) -_sym_db.RegisterMessage(UnityRLInput) -_sym_db.RegisterMessage(UnityRLInput.ListAgentActionProto) -_sym_db.RegisterMessage(UnityRLInput.AgentActionsEntry) - - -DESCRIPTOR._options = None -_UNITYRLINPUT_AGENTACTIONSENTRY._options = None -# @@protoc_insertion_point(module_scope) diff --git a/animalai_bkp/communicator_objects/unity_rl_output_pb2.py b/animalai_bkp/communicator_objects/unity_rl_output_pb2.py deleted file mode 100644 index a35cdd20..00000000 --- a/animalai_bkp/communicator_objects/unity_rl_output_pb2.py +++ /dev/null @@ -1,169 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: animalai/communicator_objects/unity_rl_output.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -from animalai.communicator_objects import agent_info_proto_pb2 as animalai_dot_communicator__objects_dot_agent__info__proto__pb2 - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='animalai/communicator_objects/unity_rl_output.proto', - package='communicator_objects', - syntax='proto3', - serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), - serialized_pb=_b('\n3animalai/communicator_objects/unity_rl_output.proto\x12\x14\x63ommunicator_objects\x1a\x34\x61nimalai/communicator_objects/agent_info_proto.proto\"\xa3\x02\n\rUnityRLOutput\x12\x13\n\x0bglobal_done\x18\x01 \x01(\x08\x12G\n\nagentInfos\x18\x02 \x03(\x0b\x32\x33.communicator_objects.UnityRLOutput.AgentInfosEntry\x1aI\n\x12ListAgentInfoProto\x12\x33\n\x05value\x18\x01 \x03(\x0b\x32$.communicator_objects.AgentInfoProto\x1ai\n\x0f\x41gentInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x45\n\x05value\x18\x02 \x01(\x0b\x32\x36.communicator_objects.UnityRLOutput.ListAgentInfoProto:\x02\x38\x01\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') - , - dependencies=[animalai_dot_communicator__objects_dot_agent__info__proto__pb2.DESCRIPTOR,]) - - - - -_UNITYRLOUTPUT_LISTAGENTINFOPROTO = _descriptor.Descriptor( - name='ListAgentInfoProto', - full_name='communicator_objects.UnityRLOutput.ListAgentInfoProto', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='value', full_name='communicator_objects.UnityRLOutput.ListAgentInfoProto.value', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=243, - serialized_end=316, -) - -_UNITYRLOUTPUT_AGENTINFOSENTRY = _descriptor.Descriptor( - name='AgentInfosEntry', - full_name='communicator_objects.UnityRLOutput.AgentInfosEntry', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='key', full_name='communicator_objects.UnityRLOutput.AgentInfosEntry.key', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='value', full_name='communicator_objects.UnityRLOutput.AgentInfosEntry.value', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=_b('8\001'), - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=318, - serialized_end=423, -) - -_UNITYRLOUTPUT = _descriptor.Descriptor( - name='UnityRLOutput', - full_name='communicator_objects.UnityRLOutput', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='global_done', full_name='communicator_objects.UnityRLOutput.global_done', index=0, - number=1, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='agentInfos', full_name='communicator_objects.UnityRLOutput.agentInfos', index=1, - number=2, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[_UNITYRLOUTPUT_LISTAGENTINFOPROTO, _UNITYRLOUTPUT_AGENTINFOSENTRY, ], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=132, - serialized_end=423, -) - -_UNITYRLOUTPUT_LISTAGENTINFOPROTO.fields_by_name['value'].message_type = animalai_dot_communicator__objects_dot_agent__info__proto__pb2._AGENTINFOPROTO -_UNITYRLOUTPUT_LISTAGENTINFOPROTO.containing_type = _UNITYRLOUTPUT -_UNITYRLOUTPUT_AGENTINFOSENTRY.fields_by_name['value'].message_type = _UNITYRLOUTPUT_LISTAGENTINFOPROTO -_UNITYRLOUTPUT_AGENTINFOSENTRY.containing_type = _UNITYRLOUTPUT -_UNITYRLOUTPUT.fields_by_name['agentInfos'].message_type = _UNITYRLOUTPUT_AGENTINFOSENTRY -DESCRIPTOR.message_types_by_name['UnityRLOutput'] = _UNITYRLOUTPUT -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -UnityRLOutput = _reflection.GeneratedProtocolMessageType('UnityRLOutput', (_message.Message,), { - - 'ListAgentInfoProto' : _reflection.GeneratedProtocolMessageType('ListAgentInfoProto', (_message.Message,), { - 'DESCRIPTOR' : _UNITYRLOUTPUT_LISTAGENTINFOPROTO, - '__module__' : 'animalai.communicator_objects.unity_rl_output_pb2' - # @@protoc_insertion_point(class_scope:communicator_objects.UnityRLOutput.ListAgentInfoProto) - }) - , - - 'AgentInfosEntry' : _reflection.GeneratedProtocolMessageType('AgentInfosEntry', (_message.Message,), { - 'DESCRIPTOR' : _UNITYRLOUTPUT_AGENTINFOSENTRY, - '__module__' : 'animalai.communicator_objects.unity_rl_output_pb2' - # @@protoc_insertion_point(class_scope:communicator_objects.UnityRLOutput.AgentInfosEntry) - }) - , - 'DESCRIPTOR' : _UNITYRLOUTPUT, - '__module__' : 'animalai.communicator_objects.unity_rl_output_pb2' - # @@protoc_insertion_point(class_scope:communicator_objects.UnityRLOutput) - }) -_sym_db.RegisterMessage(UnityRLOutput) -_sym_db.RegisterMessage(UnityRLOutput.ListAgentInfoProto) -_sym_db.RegisterMessage(UnityRLOutput.AgentInfosEntry) - - -DESCRIPTOR._options = None -_UNITYRLOUTPUT_AGENTINFOSENTRY._options = None -# @@protoc_insertion_point(module_scope) diff --git a/animalai_bkp/communicator_objects/unity_rl_reset_input_pb2.py b/animalai_bkp/communicator_objects/unity_rl_reset_input_pb2.py deleted file mode 100644 index e07a7286..00000000 --- a/animalai_bkp/communicator_objects/unity_rl_reset_input_pb2.py +++ /dev/null @@ -1,122 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: animalai/communicator_objects/unity_rl_reset_input.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -from animalai.communicator_objects import arena_parameters_proto_pb2 as animalai_dot_communicator__objects_dot_arena__parameters__proto__pb2 - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='animalai/communicator_objects/unity_rl_reset_input.proto', - package='communicator_objects', - syntax='proto3', - serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), - serialized_pb=_b('\n8animalai/communicator_objects/unity_rl_reset_input.proto\x12\x14\x63ommunicator_objects\x1a:animalai/communicator_objects/arena_parameters_proto.proto\"\xb3\x01\n\x11UnityRLResetInput\x12\x43\n\x06\x61renas\x18\x01 \x03(\x0b\x32\x33.communicator_objects.UnityRLResetInput.ArenasEntry\x1aY\n\x0b\x41renasEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.communicator_objects.ArenaParametersProto:\x02\x38\x01\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') - , - dependencies=[animalai_dot_communicator__objects_dot_arena__parameters__proto__pb2.DESCRIPTOR,]) - - - - -_UNITYRLRESETINPUT_ARENASENTRY = _descriptor.Descriptor( - name='ArenasEntry', - full_name='communicator_objects.UnityRLResetInput.ArenasEntry', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='key', full_name='communicator_objects.UnityRLResetInput.ArenasEntry.key', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='value', full_name='communicator_objects.UnityRLResetInput.ArenasEntry.value', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=_b('8\001'), - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=233, - serialized_end=322, -) - -_UNITYRLRESETINPUT = _descriptor.Descriptor( - name='UnityRLResetInput', - full_name='communicator_objects.UnityRLResetInput', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='arenas', full_name='communicator_objects.UnityRLResetInput.arenas', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[_UNITYRLRESETINPUT_ARENASENTRY, ], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=143, - serialized_end=322, -) - -_UNITYRLRESETINPUT_ARENASENTRY.fields_by_name['value'].message_type = animalai_dot_communicator__objects_dot_arena__parameters__proto__pb2._ARENAPARAMETERSPROTO -_UNITYRLRESETINPUT_ARENASENTRY.containing_type = _UNITYRLRESETINPUT -_UNITYRLRESETINPUT.fields_by_name['arenas'].message_type = _UNITYRLRESETINPUT_ARENASENTRY -DESCRIPTOR.message_types_by_name['UnityRLResetInput'] = _UNITYRLRESETINPUT -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -UnityRLResetInput = _reflection.GeneratedProtocolMessageType('UnityRLResetInput', (_message.Message,), { - - 'ArenasEntry' : _reflection.GeneratedProtocolMessageType('ArenasEntry', (_message.Message,), { - 'DESCRIPTOR' : _UNITYRLRESETINPUT_ARENASENTRY, - '__module__' : 'animalai.communicator_objects.unity_rl_reset_input_pb2' - # @@protoc_insertion_point(class_scope:communicator_objects.UnityRLResetInput.ArenasEntry) - }) - , - 'DESCRIPTOR' : _UNITYRLRESETINPUT, - '__module__' : 'animalai.communicator_objects.unity_rl_reset_input_pb2' - # @@protoc_insertion_point(class_scope:communicator_objects.UnityRLResetInput) - }) -_sym_db.RegisterMessage(UnityRLResetInput) -_sym_db.RegisterMessage(UnityRLResetInput.ArenasEntry) - - -DESCRIPTOR._options = None -_UNITYRLRESETINPUT_ARENASENTRY._options = None -# @@protoc_insertion_point(module_scope) diff --git a/animalai_bkp/communicator_objects/unity_rl_reset_output_pb2.py b/animalai_bkp/communicator_objects/unity_rl_reset_output_pb2.py deleted file mode 100644 index 4b5a24c2..00000000 --- a/animalai_bkp/communicator_objects/unity_rl_reset_output_pb2.py +++ /dev/null @@ -1,71 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: animalai/communicator_objects/unity_rl_reset_output.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='animalai/communicator_objects/unity_rl_reset_output.proto', - package='communicator_objects', - syntax='proto3', - serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), - serialized_pb=_b('\n9animalai/communicator_objects/unity_rl_reset_output.proto\x12\x14\x63ommunicator_objects\"1\n\x12UnityRLResetOutput\x12\x1b\n\x13\x61renas_instanciated\x18\x01 \x03(\x08\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') -) - - - - -_UNITYRLRESETOUTPUT = _descriptor.Descriptor( - name='UnityRLResetOutput', - full_name='communicator_objects.UnityRLResetOutput', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='arenas_instanciated', full_name='communicator_objects.UnityRLResetOutput.arenas_instanciated', index=0, - number=1, type=8, cpp_type=7, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=83, - serialized_end=132, -) - -DESCRIPTOR.message_types_by_name['UnityRLResetOutput'] = _UNITYRLRESETOUTPUT -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -UnityRLResetOutput = _reflection.GeneratedProtocolMessageType('UnityRLResetOutput', (_message.Message,), { - 'DESCRIPTOR' : _UNITYRLRESETOUTPUT, - '__module__' : 'animalai.communicator_objects.unity_rl_reset_output_pb2' - # @@protoc_insertion_point(class_scope:communicator_objects.UnityRLResetOutput) - }) -_sym_db.RegisterMessage(UnityRLResetOutput) - - -DESCRIPTOR._options = None -# @@protoc_insertion_point(module_scope) diff --git a/animalai_bkp/communicator_objects/unity_to_external_pb2.py b/animalai_bkp/communicator_objects/unity_to_external_pb2.py deleted file mode 100644 index 852b3813..00000000 --- a/animalai_bkp/communicator_objects/unity_to_external_pb2.py +++ /dev/null @@ -1,57 +0,0 @@ -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: animalai/communicator_objects/unity_to_external.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -from animalai.communicator_objects import unity_message_pb2 as animalai_dot_communicator__objects_dot_unity__message__pb2 - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='animalai/communicator_objects/unity_to_external.proto', - package='communicator_objects', - syntax='proto3', - serialized_options=_b('\252\002\034MLAgents.CommunicatorObjects'), - serialized_pb=_b('\n5animalai/communicator_objects/unity_to_external.proto\x12\x14\x63ommunicator_objects\x1a\x31\x61nimalai/communicator_objects/unity_message.proto2g\n\x0fUnityToExternal\x12T\n\x08\x45xchange\x12\".communicator_objects.UnityMessage\x1a\".communicator_objects.UnityMessage\"\x00\x42\x1f\xaa\x02\x1cMLAgents.CommunicatorObjectsb\x06proto3') - , - dependencies=[animalai_dot_communicator__objects_dot_unity__message__pb2.DESCRIPTOR,]) - - - -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - - -DESCRIPTOR._options = None - -_UNITYTOEXTERNAL = _descriptor.ServiceDescriptor( - name='UnityToExternal', - full_name='communicator_objects.UnityToExternal', - file=DESCRIPTOR, - index=0, - serialized_options=None, - serialized_start=130, - serialized_end=233, - methods=[ - _descriptor.MethodDescriptor( - name='Exchange', - full_name='communicator_objects.UnityToExternal.Exchange', - index=0, - containing_service=None, - input_type=animalai_dot_communicator__objects_dot_unity__message__pb2._UNITYMESSAGE, - output_type=animalai_dot_communicator__objects_dot_unity__message__pb2._UNITYMESSAGE, - serialized_options=None, - ), -]) -_sym_db.RegisterServiceDescriptor(_UNITYTOEXTERNAL) - -DESCRIPTOR.services_by_name['UnityToExternal'] = _UNITYTOEXTERNAL - -# @@protoc_insertion_point(module_scope) diff --git a/animalai_bkp/communicator_objects/unity_to_external_pb2_grpc.py b/animalai_bkp/communicator_objects/unity_to_external_pb2_grpc.py deleted file mode 100644 index f1406fa1..00000000 --- a/animalai_bkp/communicator_objects/unity_to_external_pb2_grpc.py +++ /dev/null @@ -1,46 +0,0 @@ -# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! -import grpc - -from animalai.communicator_objects import unity_message_pb2 as animalai_dot_communicator__objects_dot_unity__message__pb2 - - -class UnityToExternalStub(object): - # missing associated documentation comment in .proto file - pass - - def __init__(self, channel): - """Constructor. - - Args: - channel: A grpc.Channel. - """ - self.Exchange = channel.unary_unary( - '/communicator_objects.UnityToExternal/Exchange', - request_serializer=animalai_dot_communicator__objects_dot_unity__message__pb2.UnityMessage.SerializeToString, - response_deserializer=animalai_dot_communicator__objects_dot_unity__message__pb2.UnityMessage.FromString, - ) - - -class UnityToExternalServicer(object): - # missing associated documentation comment in .proto file - pass - - def Exchange(self, request, context): - """Sends the academy parameters - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - -def add_UnityToExternalServicer_to_server(servicer, server): - rpc_method_handlers = { - 'Exchange': grpc.unary_unary_rpc_method_handler( - servicer.Exchange, - request_deserializer=animalai_dot_communicator__objects_dot_unity__message__pb2.UnityMessage.FromString, - response_serializer=animalai_dot_communicator__objects_dot_unity__message__pb2.UnityMessage.SerializeToString, - ), - } - generic_handler = grpc.method_handlers_generic_handler( - 'communicator_objects.UnityToExternal', rpc_method_handlers) - server.add_generic_rpc_handlers((generic_handler,)) diff --git a/animalai_bkp/envs/__init__.py b/animalai_bkp/envs/__init__.py deleted file mode 100644 index 93960d2f..00000000 --- a/animalai_bkp/envs/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .environment import * -from .brain import * -from .exception import * diff --git a/animalai_bkp/envs/arena_config.py b/animalai_bkp/envs/arena_config.py deleted file mode 100644 index a756c493..00000000 --- a/animalai_bkp/envs/arena_config.py +++ /dev/null @@ -1,115 +0,0 @@ -import json -import jsonpickle -import yaml -import copy - -from animalai.communicator_objects import UnityRLResetInput, ArenaParametersProto - -yaml.Dumper.ignore_aliases = lambda *args: True - - -class Vector3(yaml.YAMLObject): - yaml_tag = u'!Vector3' - - def __init__(self, x=0, y=0, z=0): - self.x = x - self.y = y - self.z = z - - def to_proto(self): - res = ArenaParametersProto.ItemsToSpawn.Vector3() - res.x = self.x - res.y = self.y - res.z = self.z - - return res - - -class RGB(yaml.YAMLObject): - yaml_tag = u'!RGB' - - def __init__(self, r=0, g=0, b=0): - self.r = r - self.g = g - self.b = b - - def to_proto(self): - res = ArenaParametersProto.ItemsToSpawn.Vector3() - res.x = self.r - res.y = self.g - res.z = self.b - - return res - - -class Item(yaml.YAMLObject): - yaml_tag = u'!Item' - - def __init__(self, name='', positions=None, rotations=None, sizes=None, colors=None): - self.name = name - self.positions = positions if positions is not None else [] - self.rotations = rotations if rotations is not None else [] - self.sizes = sizes if sizes is not None else [] - self.colors = colors if colors is not None else [] - - -class Arena(yaml.YAMLObject): - yaml_tag = u'!Arena' - - def __init__(self, t=1000, items=None, blackouts=None): - self.t = t - self.items = items if items is not None else {} - self.blackouts = blackouts if blackouts is not None else [] - - -class ArenaConfig(yaml.YAMLObject): - yaml_tag = u'!ArenaConfig' - - def __init__(self, yaml_path=None): - - if yaml_path is not None: - self.arenas = yaml.load(open(yaml_path, 'r'), Loader=yaml.Loader).arenas - else: - self.arenas = {} - - def save_config(self, json_path): - out = jsonpickle.encode(self.arenas) - out = json.loads(out) - json.dump(out, open(json_path, 'w'), indent=4) - - def dict_to_arena_config(self) -> UnityRLResetInput: - config_out = UnityRLResetInput() - - for k in self.arenas: - config_out.arenas[k].CopyFrom(ArenaParametersProto()) - config_out.arenas[k].t = self.arenas[k].t - config_out.arenas[k].blackouts.extend(self.arenas[k].blackouts) - for item in self.arenas[k].items: - to_spawn = config_out.arenas[k].items.add() - to_spawn.name = item.name - to_spawn.positions.extend([v.to_proto() for v in item.positions]) - to_spawn.rotations.extend(item.rotations) - to_spawn.sizes.extend([v.to_proto() for v in item.sizes]) - to_spawn.colors.extend([v.to_proto() for v in item.colors]) - - return config_out - - def update(self, arenas_configurations): - - if arenas_configurations is not None: - for arena_i in arenas_configurations.arenas: - self.arenas[arena_i] = copy.copy(arenas_configurations.arenas[arena_i]) - - -def constructor_arena(loader, node): - fields = loader.construct_mapping(node) - return Arena(**fields) - - -def constructor_item(loader, node): - fields = loader.construct_mapping(node) - return Item(**fields) - - -yaml.add_constructor(u'!Arena', constructor_arena) -yaml.add_constructor(u'!Item', constructor_item) diff --git a/animalai_bkp/envs/brain.py b/animalai_bkp/envs/brain.py deleted file mode 100644 index 06940fd2..00000000 --- a/animalai_bkp/envs/brain.py +++ /dev/null @@ -1,149 +0,0 @@ -import logging -import numpy as np -import io - -from typing import Dict -from PIL import Image - -logger = logging.getLogger("mlagents.envs") - - -class BrainInfo: - def __init__(self, visual_observation, vector_observation, text_observations, memory=None, - reward=None, agents=None, local_done=None, - vector_action=None, text_action=None, max_reached=None, action_mask=None): - """ - Describes experience at current step of all agents linked to a brain. - """ - self.visual_observations = visual_observation - self.vector_observations = vector_observation - self.text_observations = text_observations - self.memories = memory - self.rewards = reward - self.local_done = local_done - self.max_reached = max_reached - self.agents = agents - self.previous_vector_actions = vector_action - self.previous_text_actions = text_action - self.action_masks = action_mask - - @staticmethod - def process_pixels(image_bytes, gray_scale): - """ - Converts byte array observation image into numpy array, re-sizes it, - and optionally converts it to grey scale - :param gray_scale: Whether to convert the image to grayscale. - :param image_bytes: input byte array corresponding to image - :return: processed numpy array of observation from environment - """ - s = bytearray(image_bytes) - image = Image.open(io.BytesIO(s)) - s = np.array(image) / 255.0 - if gray_scale: - s = np.mean(s, axis=2) - s = np.reshape(s, [s.shape[0], s.shape[1], 1]) - return s - - @staticmethod - def from_agent_proto(agent_info_list, brain_params): - """ - Converts list of agent infos to BrainInfo. - """ - vis_obs = [] - for i in range(brain_params.number_visual_observations): - obs = [BrainInfo.process_pixels(x.visual_observations[i], - brain_params.camera_resolutions[i]['blackAndWhite']) - for x in agent_info_list] - vis_obs += [np.array(obs)] - if len(agent_info_list) == 0: - memory_size = 0 - else: - memory_size = max([len(x.memories) for x in agent_info_list]) - if memory_size == 0: - memory = np.zeros((0, 0)) - else: - [x.memories.extend([0] * (memory_size - len(x.memories))) for x in agent_info_list] - memory = np.array([x.memories for x in agent_info_list]) - total_num_actions = sum(brain_params.vector_action_space_size) - mask_actions = np.ones((len(agent_info_list), total_num_actions)) - for agent_index, agent_info in enumerate(agent_info_list): - if agent_info.action_mask is not None: - if len(agent_info.action_mask) == total_num_actions: - mask_actions[agent_index, :] = [ - 0 if agent_info.action_mask[k] else 1 for k in range(total_num_actions)] - if any([np.isnan(x.reward) for x in agent_info_list]): - logger.warning("An agent had a NaN reward for brain " + brain_params.brain_name) - if any([np.isnan(x.stacked_vector_observation).any() for x in agent_info_list]): - logger.warning("An agent had a NaN observation for brain " + brain_params.brain_name) - brain_info = BrainInfo( - visual_observation=vis_obs, - vector_observation=np.nan_to_num( - np.array([x.stacked_vector_observation for x in agent_info_list])), - text_observations=[x.text_observation for x in agent_info_list], - memory=memory, - reward=[x.reward if not np.isnan(x.reward) else 0 for x in agent_info_list], - agents=[x.id for x in agent_info_list], - local_done=[x.done for x in agent_info_list], - vector_action=np.array([x.stored_vector_actions for x in agent_info_list]), - text_action=[x.stored_text_actions for x in agent_info_list], - max_reached=[x.max_step_reached for x in agent_info_list], - action_mask=mask_actions - ) - return brain_info - - -# Renaming of dictionary of brain name to BrainInfo for clarity -AllBrainInfo = Dict[str, BrainInfo] - - -class BrainParameters: - def __init__(self, brain_name, vector_observation_space_size, num_stacked_vector_observations, - camera_resolutions, vector_action_space_size, - vector_action_descriptions, vector_action_space_type): - """ - Contains all brain-specific parameters. - """ - self.brain_name = brain_name - self.vector_observation_space_size = vector_observation_space_size - self.num_stacked_vector_observations = num_stacked_vector_observations - self.number_visual_observations = len(camera_resolutions) - self.camera_resolutions = camera_resolutions - self.vector_action_space_size = vector_action_space_size - self.vector_action_descriptions = vector_action_descriptions - self.vector_action_space_type = ["discrete", "continuous"][vector_action_space_type] - - def __str__(self): - return '''Unity brain name: {} - Number of Visual Observations (per agent): {} - Vector Observation space size (per agent): {} - Number of stacked Vector Observation: {} - Vector Action space type: {} - Vector Action space size (per agent): {} - Vector Action descriptions: {}'''.format(self.brain_name, - str(self.number_visual_observations), - str(self.vector_observation_space_size), - str(self.num_stacked_vector_observations), - self.vector_action_space_type, - str(self.vector_action_space_size), - ', '.join(self.vector_action_descriptions)) - - @staticmethod - def from_proto(brain_param_proto): - """ - Converts brain parameter proto to BrainParameter object. - :param brain_param_proto: protobuf object. - :return: BrainParameter object. - """ - resolution = [{ - "height": x.height, - "width": x.width, - "blackAndWhite": x.gray_scale - } for x in brain_param_proto.camera_resolutions] - brain_params = BrainParameters(brain_param_proto.brain_name, - brain_param_proto.vector_observation_size, - brain_param_proto.num_stacked_vector_observations, - resolution, - brain_param_proto.vector_action_size, - brain_param_proto.vector_action_descriptions, - brain_param_proto.vector_action_space_type) - return brain_params diff --git a/animalai_bkp/envs/communicator.py b/animalai_bkp/envs/communicator.py deleted file mode 100644 index 85b56db1..00000000 --- a/animalai_bkp/envs/communicator.py +++ /dev/null @@ -1,35 +0,0 @@ -import logging - -from animalai.communicator_objects import UnityOutput, UnityInput - -logger = logging.getLogger("mlagents.envs") - - -class Communicator(object): - def __init__(self, worker_id=0, base_port=5005): - """ - Python side of the communication. Must be used in pair with the right Unity Communicator equivalent. - - :int base_port: Baseline port number to connect to Unity environment over. worker_id increments over this. - :int worker_id: Number to add to communication port (5005) [0]. Used for asynchronous agent scenarios. - """ - - def initialize(self, inputs: UnityInput) -> UnityOutput: - """ - Used to exchange initialization parameters between Python and the Environment - :param inputs: The initialization input that will be sent to the environment. - :return: UnityOutput: The initialization output sent by Unity - """ - - def exchange(self, inputs: UnityInput) -> UnityOutput: - """ - Used to send an input and receive an output from the Environment - :param inputs: The UnityInput that needs to be sent the Environment - :return: The UnityOutputs generated by the Environment - """ - - def close(self): - """ - Sends a shutdown signal to the unity environment, and closes the connection. - """ - diff --git a/animalai_bkp/envs/environment.py b/animalai_bkp/envs/environment.py deleted file mode 100644 index 7397b9c8..00000000 --- a/animalai_bkp/envs/environment.py +++ /dev/null @@ -1,491 +0,0 @@ -import atexit -import glob -import logging -import numpy as np -import os -import subprocess - -from .brain import AllBrainInfo, BrainInfo, BrainParameters -from .exception import UnityEnvironmentException, UnityActionException, UnityTimeOutException - -from animalai.communicator_objects import UnityRLInput, UnityRLOutput, AgentActionProto, \ - UnityRLInitializationInput, UnityRLInitializationOutput, \ - UnityRLResetInput, UnityInput, UnityOutput - -from .rpc_communicator import RpcCommunicator -from sys import platform -from .arena_config import ArenaConfig - -logging.basicConfig(level=logging.INFO) -logger = logging.getLogger("mlagents.envs") - - -class UnityEnvironment(object): - SCALAR_ACTION_TYPES = (int, np.int32, np.int64, float, np.float32, np.float64) - SINGLE_BRAIN_ACTION_TYPES = SCALAR_ACTION_TYPES + (list, np.ndarray) - SINGLE_BRAIN_TEXT_TYPES = (str, list, np.ndarray) - - def __init__(self, file_name=None, - worker_id=0, - base_port=5005, - seed=0, - docker_training=False, - n_arenas=1, - play=False, - arenas_configurations=None): - """ - Starts a new unity environment and establishes a connection with the environment. - Notice: Currently communication between Unity and Python takes place over an open socket without authentication. - Ensure that the network where training takes place is secure. - - :string file_name: Name of Unity environment binary. - :int base_port: Baseline port number to connect to Unity environment over. worker_id increments over this. - :int worker_id: Number to add to communication port (5005) [0]. Used for asynchronous agent scenarios. - :param docker_training: Informs this class whether the process is being run within a container. - """ - - atexit.register(self._close) - self.n_arenas = n_arenas - self.play = play - self.port = base_port + worker_id - self._buffer_size = 12000 - self._version_ = "API-7" - self._loaded = False # If true, this means the environment was successfully loaded - self.proc1 = None # The process that is started. If None, no process was started - self.communicator = self.get_communicator(worker_id, base_port) - self.arenas_configurations = arenas_configurations if arenas_configurations is not None else ArenaConfig() - - if file_name is not None: - self.executable_launcher(file_name, docker_training) - else: - logger.info("Start training by pressing the Play button in the Unity Editor.") - self._loaded = True - - rl_init_parameters_in = UnityRLInitializationInput( - seed=seed - ) - try: - aca_params = self.send_academy_parameters(rl_init_parameters_in) - except UnityTimeOutException: - self._close() - raise - # TODO : think of a better way to expose the academyParameters - self._unity_version = aca_params.version - if self._unity_version != self._version_: - raise UnityEnvironmentException( - "The API number is not compatible between Unity and python. Python API : {0}, Unity API : " - "{1}.\nPlease go to https://github.com/Unity-Technologies/ml-agents to download the latest version " - "of ML-Agents.".format(self._version_, self._unity_version)) - self._n_agents = {} - self._global_done = None - self._academy_name = aca_params.name - self._log_path = aca_params.log_path - self._brains = {} - self._brain_names = [] - self._external_brain_names = [] - for brain_param in aca_params.brain_parameters: - self._brain_names += [brain_param.brain_name] - self._brains[brain_param.brain_name] = BrainParameters.from_proto(brain_param) - if brain_param.is_training: - self._external_brain_names += [brain_param.brain_name] - self._num_brains = len(self._brain_names) - self._num_external_brains = len(self._external_brain_names) - logger.info("\n'{0}' started successfully!\n{1}".format(self._academy_name, str(self))) - if self._num_external_brains == 0: - logger.warning(" No Learning Brains set to train found in the Unity Environment. " - "You will not be able to pass actions to your agent(s).") - - @property - def logfile_path(self): - return self._log_path - - @property - def brains(self): - return self._brains - - @property - def global_done(self): - return self._global_done - - @property - def academy_name(self): - return self._academy_name - - @property - def number_brains(self): - return self._num_brains - - @property - def number_external_brains(self): - return self._num_external_brains - - @property - def brain_names(self): - return self._brain_names - - @property - def external_brain_names(self): - return self._external_brain_names - - def executable_launcher(self, file_name, docker_training): - cwd = os.getcwd() - file_name = (file_name.strip() - .replace('.app', '').replace('.exe', '').replace('.x86_64', '').replace('.x86', - '')) - true_filename = os.path.basename(os.path.normpath(file_name)) - logger.debug('The true file name is {}'.format(true_filename)) - launch_string = None - if platform == "linux" or platform == "linux2": - candidates = glob.glob(os.path.join(cwd, file_name) + '.x86_64') - if len(candidates) == 0: - candidates = glob.glob(os.path.join(cwd, file_name) + '.x86') - if len(candidates) == 0: - candidates = glob.glob(file_name + '.x86_64') - if len(candidates) == 0: - candidates = glob.glob(file_name + '.x86') - if len(candidates) > 0: - launch_string = candidates[0] - - elif platform == 'darwin': - candidates = glob.glob( - os.path.join(cwd, file_name + '.app', 'Contents', 'MacOS', true_filename)) - if len(candidates) == 0: - candidates = glob.glob( - os.path.join(file_name + '.app', 'Contents', 'MacOS', true_filename)) - if len(candidates) == 0: - candidates = glob.glob( - os.path.join(cwd, file_name + '.app', 'Contents', 'MacOS', '*')) - if len(candidates) == 0: - candidates = glob.glob(os.path.join(file_name + '.app', 'Contents', 'MacOS', '*')) - if len(candidates) > 0: - launch_string = candidates[0] - elif platform == 'win32': - candidates = glob.glob(os.path.join(cwd, file_name + '.exe')) - if len(candidates) == 0: - candidates = glob.glob(file_name + '.exe') - if len(candidates) > 0: - launch_string = candidates[0] - if launch_string is None: - self._close() - raise UnityEnvironmentException("Couldn't launch the {0} environment. " - "Provided filename does not match any environments." - .format(true_filename)) - else: - logger.debug("This is the launch string {}".format(launch_string)) - # Launch Unity environment - if not docker_training: - if not self.play: - self.proc1 = subprocess.Popen( - [launch_string, '--port', str(self.port), '--nArenas', str(self.n_arenas)]) - else: - self.proc1 = subprocess.Popen( - [launch_string, '--port', str(self.port)]) - - else: - """ - Comments for future maintenance: - xvfb-run is a wrapper around Xvfb, a virtual xserver where all - rendering is done to virtual memory. It automatically creates a - new virtual server automatically picking a server number `auto-servernum`. - The server is passed the arguments using `server-args`, we are telling - Xvfb to create Screen number 0 with width 640, height 480 and depth 24 bits. - Note that 640 X 480 are the default width and height. The main reason for - us to add this is because we'd like to change the depth from the default - of 8 bits to 24. - Unfortunately, this means that we will need to pass the arguments through - a shell which is why we set `shell=True`. Now, this adds its own - complications. E.g SIGINT can bounce off the shell and not get propagated - to the child processes. This is why we add `exec`, so that the shell gets - launched, the arguments are passed to `xvfb-run`. `exec` replaces the shell - we created with `xvfb`. - """ - docker_ls = ("exec xvfb-run --auto-servernum" - " --server-args='-screen 0 640x480x24'" - " {0} --port {1} --nArenas {2}").format(launch_string, str(self.port), str(self.n_arenas)) - self.proc1 = subprocess.Popen(docker_ls, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - shell=True) - - def get_communicator(self, worker_id, base_port): - return RpcCommunicator(worker_id, base_port) - # return SocketCommunicator(worker_id, base_port) - - def __str__(self): - return '''Unity Academy name: {0} - Number of Brains: {1} - Number of Training Brains : {2}'''.format(self._academy_name, str(self._num_brains), - str(self._num_external_brains)) - - def reset(self, arenas_configurations=None, train_mode=True) -> AllBrainInfo: - """ - Sends a signal to reset the unity environment. - :return: AllBrainInfo : A data structure corresponding to the initial reset state of the environment. - """ - if self._loaded: - self.arenas_configurations.update(arenas_configurations) - - outputs = self.communicator.exchange( - self._generate_reset_input(train_mode, arenas_configurations) - ) - if outputs is None: - raise KeyboardInterrupt - rl_output = outputs.rl_output - s = self._get_state(rl_output) - self._global_done = s[1] - for _b in self._external_brain_names: - self._n_agents[_b] = len(s[0][_b].agents) - return s[0] - else: - raise UnityEnvironmentException("No Unity environment is loaded.") - - def step(self, vector_action=None, memory=None, text_action=None, value=None, step_number=0) -> AllBrainInfo: - """ - Provides the environment with an action, moves the environment dynamics forward accordingly, - and returns observation, state, and reward information to the agent. - :param value: Value estimates provided by agents. - :param vector_action: Agent's vector action. Can be a scalar or vector of int/floats. - :param memory: Vector corresponding to memory used for recurrent policies. - :param text_action: Text action to send to environment for. - :return: AllBrainInfo : A Data structure corresponding to the new state of the environment. - """ - vector_action = {} if vector_action is None else vector_action - memory = {} if memory is None else memory - text_action = {} if text_action is None else text_action - value = {} if value is None else value - - # Check that environment is loaded, and episode is currently running. - if self._loaded and not self._global_done and self._global_done is not None: - if isinstance(vector_action, self.SINGLE_BRAIN_ACTION_TYPES): - if self._num_external_brains == 1: - vector_action = {self._external_brain_names[0]: vector_action} - elif self._num_external_brains > 1: - raise UnityActionException( - "You have {0} brains, you need to feed a dictionary of brain names a keys, " - "and vector_actions as values".format(self._num_brains)) - else: - raise UnityActionException( - "There are no external brains in the environment, " - "step cannot take a vector_action input") - - if isinstance(memory, self.SINGLE_BRAIN_ACTION_TYPES): - if self._num_external_brains == 1: - memory = {self._external_brain_names[0]: memory} - elif self._num_external_brains > 1: - raise UnityActionException( - "You have {0} brains, you need to feed a dictionary of brain names as keys " - "and memories as values".format(self._num_brains)) - else: - raise UnityActionException( - "There are no external brains in the environment, " - "step cannot take a memory input") - - if isinstance(text_action, self.SINGLE_BRAIN_TEXT_TYPES): - if self._num_external_brains == 1: - text_action = {self._external_brain_names[0]: text_action} - elif self._num_external_brains > 1: - raise UnityActionException( - "You have {0} brains, you need to feed a dictionary of brain names as keys " - "and text_actions as values".format(self._num_brains)) - else: - raise UnityActionException( - "There are no external brains in the environment, " - "step cannot take a value input") - - if isinstance(value, self.SINGLE_BRAIN_ACTION_TYPES): - if self._num_external_brains == 1: - value = {self._external_brain_names[0]: value} - elif self._num_external_brains > 1: - raise UnityActionException( - "You have {0} brains, you need to feed a dictionary of brain names as keys " - "and state/action value estimates as values".format(self._num_brains)) - else: - raise UnityActionException( - "There are no external brains in the environment, " - "step cannot take a value input") - - for brain_name in list(vector_action.keys()) + list(memory.keys()) + list( - text_action.keys()): - if brain_name not in self._external_brain_names: - raise UnityActionException( - "The name {0} does not correspond to an external brain " - "in the environment".format(brain_name)) - - for brain_name in self._external_brain_names: - n_agent = self._n_agents[brain_name] - if brain_name not in vector_action: - if self._brains[brain_name].vector_action_space_type == "discrete": - vector_action[brain_name] = [0.0] * n_agent * len( - self._brains[brain_name].vector_action_space_size) - else: - vector_action[brain_name] = [0.0] * n_agent * \ - self._brains[ - brain_name].vector_action_space_size[0] - else: - vector_action[brain_name] = self._flatten(vector_action[brain_name]) - if brain_name not in memory: - memory[brain_name] = [] - else: - if memory[brain_name] is None: - memory[brain_name] = [] - else: - memory[brain_name] = self._flatten(memory[brain_name]) - if brain_name not in text_action: - text_action[brain_name] = [""] * n_agent - else: - if text_action[brain_name] is None: - text_action[brain_name] = [""] * n_agent - if isinstance(text_action[brain_name], str): - text_action[brain_name] = [text_action[brain_name]] * n_agent - - number_text_actions = len(text_action[brain_name]) - if not ((number_text_actions == n_agent) or number_text_actions == 0): - raise UnityActionException( - "There was a mismatch between the provided text_action and " - "the environment's expectation: " - "The brain {0} expected {1} text_action but was given {2}".format( - brain_name, n_agent, number_text_actions)) - - discrete_check = self._brains[brain_name].vector_action_space_type == "discrete" - - expected_discrete_size = n_agent * len( - self._brains[brain_name].vector_action_space_size) - - continuous_check = self._brains[brain_name].vector_action_space_type == "continuous" - - expected_continuous_size = self._brains[brain_name].vector_action_space_size[ - 0] * n_agent - - if not ((discrete_check and len( - vector_action[brain_name]) == expected_discrete_size) or - (continuous_check and len( - vector_action[brain_name]) == expected_continuous_size)): - raise UnityActionException( - "There was a mismatch between the provided action and " - "the environment's expectation: " - "The brain {0} expected {1} {2} action(s), but was provided: {3}" - .format(brain_name, str(expected_discrete_size) - if discrete_check - else str(expected_continuous_size), - self._brains[brain_name].vector_action_space_type, - str(vector_action[brain_name]))) - - outputs = self.communicator.exchange( - self._generate_step_input(vector_action, memory, text_action, value)) - if outputs is None: - raise KeyboardInterrupt - rl_output = outputs.rl_output - state = self._get_state(rl_output) - self._global_done = state[1] - for _b in self._external_brain_names: - self._n_agents[_b] = len(state[0][_b].agents) - return state[0] - elif not self._loaded: - raise UnityEnvironmentException("No Unity environment is loaded.") - elif self._global_done: - raise UnityActionException( - "The episode is completed. Reset the environment with 'reset()'") - elif self.global_done is None: - raise UnityActionException( - "You cannot conduct step without first calling reset. " - "Reset the environment with 'reset()'") - - def close(self): - """ - Sends a shutdown signal to the unity environment, and closes the socket connection. - """ - if self._loaded: - self._close() - else: - raise UnityEnvironmentException("No Unity environment is loaded.") - - def _close(self): - self._loaded = False - self.communicator.close() - if self.proc1 is not None: - self.proc1.kill() - - @classmethod - def _flatten(cls, arr): - """ - Converts arrays to list. - :param arr: numpy vector. - :return: flattened list. - """ - if isinstance(arr, cls.SCALAR_ACTION_TYPES): - arr = [float(arr)] - if isinstance(arr, np.ndarray): - arr = arr.tolist() - if len(arr) == 0: - return arr - if isinstance(arr[0], np.ndarray): - arr = [item for sublist in arr for item in sublist.tolist()] - if isinstance(arr[0], list): - arr = [item for sublist in arr for item in sublist] - arr = [float(x) for x in arr] - return arr - - def _get_state(self, output: UnityRLOutput) -> (AllBrainInfo, bool): - """ - Collects experience information from all external brains in environment at current step. - :return: a dictionary of BrainInfo objects. - """ - _data = {} - global_done = output.global_done - for brain_name in output.agentInfos: - agent_info_list = output.agentInfos[brain_name].value - _data[brain_name] = BrainInfo.from_agent_proto(agent_info_list, - self.brains[brain_name]) - return _data, global_done - - def _generate_step_input(self, vector_action, memory, text_action, value) -> UnityRLInput: - rl_in = UnityRLInput() - for b in vector_action: - n_agents = self._n_agents[b] - if n_agents == 0: - continue - _a_s = len(vector_action[b]) // n_agents - _m_s = len(memory[b]) // n_agents - for i in range(n_agents): - action = AgentActionProto( - vector_actions=vector_action[b][i * _a_s: (i + 1) * _a_s], - memories=memory[b][i * _m_s: (i + 1) * _m_s], - text_actions=text_action[b][i], - ) - if b in value: - if value[b] is not None: - action.value = float(value[b][i]) - rl_in.agent_actions[b].value.extend([action]) - rl_in.command = 0 - return self.wrap_unity_input(rl_in) - - def _generate_reset_input(self, training, config: ArenaConfig) -> UnityRLInput: - rl_in = UnityRLInput() - rl_in.is_training = training - rl_in.command = 1 - rl_reset = UnityRLResetInput() - if (config is not None): - rl_reset.CopyFrom(config.dict_to_arena_config()) - result = UnityInput() - result.rl_input.CopyFrom(rl_in) - result.rl_reset_input.CopyFrom(rl_reset) - return result - - # return self.wrap_unity_input(rl_in) - - def send_academy_parameters(self, - init_parameters: UnityRLInitializationInput) -> UnityRLInitializationOutput: - inputs = UnityInput() - inputs.rl_initialization_input.CopyFrom(init_parameters) - return self.communicator.initialize(inputs).rl_initialization_output - - def wrap_unity_input(self, rl_input: UnityRLInput) -> UnityOutput: - result = UnityInput() - result.rl_input.CopyFrom(rl_input) - return result - - # def send_update_arena_parameters(self, arena_parameters : ArenaConfigInput) -> None: - # - # # TODO: add return status ==> create new proto for ArenaParametersOutput - # - # self.communicator.exchange_arena_update(arena_parameters) diff --git a/animalai_bkp/envs/exception.py b/animalai_bkp/envs/exception.py deleted file mode 100644 index edf16ff4..00000000 --- a/animalai_bkp/envs/exception.py +++ /dev/null @@ -1,63 +0,0 @@ -import logging -logger = logging.getLogger("mlagents.envs") - -class UnityException(Exception): - """ - Any error related to ml-agents environment. - """ - pass - -class UnityEnvironmentException(UnityException): - """ - Related to errors starting and closing environment. - """ - pass - - -class UnityActionException(UnityException): - """ - Related to errors with sending actions. - """ - pass - -class UnityTimeOutException(UnityException): - """ - Related to errors with communication timeouts. - """ - def __init__(self, message, log_file_path = None): - if log_file_path is not None: - try: - with open(log_file_path, "r") as f: - printing = False - unity_error = '\n' - for l in f: - l=l.strip() - if (l == 'Exception') or (l=='Error'): - printing = True - unity_error += '----------------------\n' - if (l == ''): - printing = False - if printing: - unity_error += l + '\n' - logger.info(unity_error) - logger.error("An error might have occured in the environment. " - "You can check the logfile for more information at {}".format(log_file_path)) - except: - logger.error("An error might have occured in the environment. " - "No UnitySDK.log file could be found.") - super(UnityTimeOutException, self).__init__(message) - - -class UnityWorkerInUseException(UnityException): - """ - This error occurs when the port for a certain worker ID is already reserved. - """ - - MESSAGE_TEMPLATE = ( - "Couldn't start socket communication because worker number {} is still in use. " - "You may need to manually close a previously opened environment " - "or use a different worker number.") - - def __init__(self, worker_id): - message = self.MESSAGE_TEMPLATE.format(str(worker_id)) - super(UnityWorkerInUseException, self).__init__(message) diff --git a/animalai_bkp/envs/rpc_communicator.py b/animalai_bkp/envs/rpc_communicator.py deleted file mode 100644 index aa082305..00000000 --- a/animalai_bkp/envs/rpc_communicator.py +++ /dev/null @@ -1,115 +0,0 @@ -import logging -import grpc - -import socket -from multiprocessing import Pipe -from concurrent.futures import ThreadPoolExecutor - -from .communicator import Communicator -from animalai.communicator_objects import UnityToExternalServicer, add_UnityToExternalServicer_to_server -from animalai.communicator_objects import UnityMessage, UnityInput, UnityOutput #, ArenaConfigInput -from .exception import UnityTimeOutException, UnityWorkerInUseException - -logger = logging.getLogger("mlagents.envs") - - -class UnityToExternalServicerImplementation(UnityToExternalServicer): - def __init__(self): - self.parent_conn, self.child_conn = Pipe() - - def Initialize(self, request, context): - self.child_conn.send(request) - return self.child_conn.recv() - - def Exchange(self, request, context): - self.child_conn.send(request) - return self.child_conn.recv() - - -class RpcCommunicator(Communicator): - def __init__(self, worker_id=0, base_port=5005): - """ - Python side of the grpc communication. Python is the server and Unity the client - - - :int base_port: Baseline port number to connect to Unity environment over. worker_id increments over this. - :int worker_id: Number to add to communication port (5005) [0]. Used for asynchronous agent scenarios. - """ - self.port = base_port + worker_id - self.worker_id = worker_id - self.server = None - self.unity_to_external = None - self.is_open = False - self.create_server() - - def create_server(self): - """ - Creates the GRPC server. - """ - self.check_port(self.port) - - try: - # Establish communication grpc - self.server = grpc.server(ThreadPoolExecutor(max_workers=10)) - self.unity_to_external = UnityToExternalServicerImplementation() - add_UnityToExternalServicer_to_server(self.unity_to_external, self.server) - # Using unspecified address, which means that grpc is communicating on all IPs - # This is so that the docker container can connect. - self.server.add_insecure_port('[::]:' + str(self.port)) - self.server.start() - self.is_open = True - except: - raise UnityWorkerInUseException(self.worker_id) - - def check_port(self, port): - """ - Attempts to bind to the requested communicator port, checking if it is already in use. - """ - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - try: - s.bind(("localhost", port)) - except socket.error: - raise UnityWorkerInUseException(self.worker_id) - finally: - s.close() - - def initialize(self, inputs: UnityInput) -> UnityOutput: - if not self.unity_to_external.parent_conn.poll(3000): - raise UnityTimeOutException( - "The Unity environment took too long to respond. Make sure that :\n" - "\t The environment does not need user interaction to launch\n" - "\t The Academy's Broadcast Hub is configured correctly\n" - "\t The Agents are linked to the appropriate Brains\n" - "\t The environment and the Python interface have compatible versions.") - aca_param = self.unity_to_external.parent_conn.recv().unity_output - message = UnityMessage() - message.header.status = 200 - message.unity_input.CopyFrom(inputs) - self.unity_to_external.parent_conn.send(message) - self.unity_to_external.parent_conn.recv() - return aca_param - - def exchange(self, inputs: UnityInput) -> UnityOutput: - message = UnityMessage() - message.header.status = 200 - message.unity_input.CopyFrom(inputs) - self.unity_to_external.parent_conn.send(message) - output = self.unity_to_external.parent_conn.recv() - if output.header.status != 200: - return None - return output.unity_output - - def close(self): - """ - Sends a shutdown signal to the unity environment, and closes the grpc connection. - """ - if self.is_open: - message_input = UnityMessage() - message_input.header.status = 400 - self.unity_to_external.parent_conn.send(message_input) - self.unity_to_external.parent_conn.close() - self.server.stop(False) - self.is_open = False - - # def exchange_arena_update(self, inputs: ArenaConfigInput) -> None: - # self.unity_to_external.parent_conn.send(inputs) diff --git a/animalai_bkp/envs/socket_communicator.py b/animalai_bkp/envs/socket_communicator.py deleted file mode 100644 index c600e938..00000000 --- a/animalai_bkp/envs/socket_communicator.py +++ /dev/null @@ -1,98 +0,0 @@ -import logging -import socket -import struct - -from .communicator import Communicator -from animalai.communicator_objects import UnityMessage, UnityOutput, UnityInput -from .exception import UnityTimeOutException - - -logger = logging.getLogger("mlagents.envs") - - -class SocketCommunicator(Communicator): - def __init__(self, worker_id=0, - base_port=5005): - """ - Python side of the socket communication - - :int base_port: Baseline port number to connect to Unity environment over. worker_id increments over this. - :int worker_id: Number to add to communication port (5005) [0]. Used for asynchronous agent scenarios. - """ - - self.port = base_port + worker_id - self._buffer_size = 12000 - self.worker_id = worker_id - self._socket = None - self._conn = None - - def initialize(self, inputs: UnityInput) -> UnityOutput: - try: - # Establish communication socket - self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - self._socket.bind(("localhost", self.port)) - except: - raise UnityTimeOutException("Couldn't start socket communication because worker number {} is still in use. " - "You may need to manually close a previously opened environment " - "or use a different worker number.".format(str(self.worker_id))) - try: - self._socket.settimeout(30) - self._socket.listen(1) - self._conn, _ = self._socket.accept() - self._conn.settimeout(30) - except : - raise UnityTimeOutException( - "The Unity environment took too long to respond. Make sure that :\n" - "\t The environment does not need user interaction to launch\n" - "\t The Academy's Broadcast Hub is configured correctly\n" - "\t The Agents are linked to the appropriate Brains\n" - "\t The environment and the Python interface have compatible versions.") - message = UnityMessage() - message.header.status = 200 - message.unity_input.CopyFrom(inputs) - self._communicator_send(message.SerializeToString()) - initialization_output = UnityMessage() - initialization_output.ParseFromString(self._communicator_receive()) - return initialization_output.unity_output - - def _communicator_receive(self): - try: - s = self._conn.recv(self._buffer_size) - message_length = struct.unpack("I", bytearray(s[:4]))[0] - s = s[4:] - while len(s) != message_length: - s += self._conn.recv(self._buffer_size) - except socket.timeout as e: - raise UnityTimeOutException("The environment took too long to respond.") - return s - - def _communicator_send(self, message): - self._conn.send(struct.pack("I", len(message)) + message) - - def exchange(self, inputs: UnityInput) -> UnityOutput: - message = UnityMessage() - message.header.status = 200 - message.unity_input.CopyFrom(inputs) - self._communicator_send(message.SerializeToString()) - outputs = UnityMessage() - outputs.ParseFromString(self._communicator_receive()) - if outputs.header.status != 200: - return None - return outputs.unity_output - - def close(self): - """ - Sends a shutdown signal to the unity environment, and closes the socket connection. - """ - if self._socket is not None and self._conn is not None: - message_input = UnityMessage() - message_input.header.status = 400 - self._communicator_send(message_input.SerializeToString()) - if self._socket is not None: - self._socket.close() - self._socket = None - if self._socket is not None: - self._conn.close() - self._conn = None - diff --git a/animalai_bkp/trainers/__init__.py b/animalai_bkp/trainers/__init__.py deleted file mode 100644 index 4859f558..00000000 --- a/animalai_bkp/trainers/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -from .buffer import * -from .curriculum import * -from .meta_curriculum import * -from .models import * -from .trainer_controller import * -from .bc.models import * -from .bc.offline_trainer import * -from .bc.online_trainer import * -from .bc.policy import * -from .ppo.models import * -from .ppo.trainer import * -from .ppo.policy import * -from .exception import * -from .policy import * -from .demo_loader import * diff --git a/animalai_bkp/trainers/barracuda.py b/animalai_bkp/trainers/barracuda.py deleted file mode 100644 index 813d54db..00000000 --- a/animalai_bkp/trainers/barracuda.py +++ /dev/null @@ -1,491 +0,0 @@ -from __future__ import print_function -from collections import defaultdict -import numpy as np -import json -import struct # convert from Python values and C structs -import re -import argparse -import os.path - -BARRACUDA_VERSION = 16 - -# Definition of Barracuda model -class Model: - def __init__(self): - self.layers = [] - self.tensors = {} - self.inputs = {} - self.outputs = [] - self.globals = [] - self.memories = [] - -class Struct: - "A structure that can have any fields defined." - def __init__(self, **entries): self.__dict__.update(entries) - -# Parse command line argumengts -def parse_args(description, source_extension, help): - parser = argparse.ArgumentParser(description=description) - parser.add_argument('source_file', help=help) - parser.add_argument('target_file', help='output Barracuda binary file') - parser.add_argument('-trim', '--trim-unused-by-output') - parser.add_argument('--print-layers', action='store_true') - parser.add_argument('--print-source-json', action='store_true') - parser.add_argument('-json', '--print-barracuda-json', action='store_true') - parser.add_argument('--print-layer-links', action='store_true') - parser.add_argument('--print-patterns', action='store_true') - parser.add_argument('--print-tensors', action='store_true') - parser.add_argument('--verbose', action='store_true') - args = parser.parse_args() - args.compress_f16 = False # TEMP: disabled, until properly implemented parser.add_argument('-f16', '--compress-f16', action='store_true') - - output_extension = '.bc' if not args.compress_f16 else '.f16.bc' - - if not os.path.exists(args.source_file): - args.source_file = args.source_file + source_extension - - if not os.path.exists(args.source_file): - print('File', args.source_file, 'does not exist.') - exit(-1) - - def replaceFilenameExtension(filename, newExtenstion): - return os.path.splitext(os.path.basename(filename))[0] + newExtenstion; - - if os.path.isdir(args.target_file): - args.target_file = os.path.join(args.target_file, replaceFilenameExtension(args.source_file, output_extension)) - - if args.verbose: - print(args) - - return args - -# Fuse training time BatchNorm tensors into Scale & Bias -def fuse_batchnorm_weights(gamma, beta, mean, var, epsilon): - # https://github.com/Tencent/ncnn/blob/master/src/layer/batchnorm.cpp - """ float sqrt_var = sqrt(var_data[i]); - a_data[i] = bias_data[i] - slope_data[i] * mean_data[i] / sqrt_var; - b_data[i] = slope_data[i] / sqrt_var; - ... - ptr[i] = b * ptr[i] + a; - """ - scale = gamma / np.sqrt(var + epsilon) - bias = beta - gamma * mean / np.sqrt(var + epsilon) - return [scale, bias] - -# Resort layers so that all inputs are satisfied for every layer beforehand -def sort(model, inputs, memories, verbose): - if hasattr(model, 'layers'): - model = model.layers - inputs_and_memories = set(list(inputs) + list(memories[1::3])) - - def find_missing_inputs(model, inputs): - missing = set() - ready = set(inputs) - for l in model: - for i in l.inputs: - if i not in ready: - missing.add(i) - ready.add(l.name) - return missing - - # Class to represent a graph - # Taken from: https://www.geeksforgeeks.org/python-program-for-topological-sorting/ - class Graph: - def __init__(self,vertices): - self.graph = defaultdict(list) #dictionary containing adjacency List - self.V = vertices #No. of vertices - - # function to add an edge to graph - def addEdge(self,u,v): - self.graph[u].append(v) - - # A recursive function used by topologicalSort - def topologicalSortUtil(self,v,visited,stack): - - # Mark the current node as visited. - visited[v] = True - - # Recur for all the vertices adjacent to this vertex - for i in self.graph[v]: - if visited[i] == False: - self.topologicalSortUtil(i,visited,stack) - - # Push current vertex to stack which stores result - stack.insert(0,v) - - # The function to do Topological Sort. It uses recursive - # topologicalSortUtil() - def topologicalSort(self): - # Mark all the vertices as not visited - visited = [False]*self.V - stack =[] - - # Call the recursive helper function to store Topological - # Sort starting from all vertices one by one - for i in range(self.V): - if visited[i] == False: - self.topologicalSortUtil(i,visited,stack) - - #print(stack) - return stack - - if (len(find_missing_inputs(model, inputs_and_memories)) == 0): - return model - - g = Graph(len(model)) - - layers = {} - id = 0 - for l in model: - layers[l.name] = id; - id += 1 - - for layer in model: - for i in layer.inputs: - if i not in inputs_and_memories: - g.addEdge(layers[i], layers[layer.name]) - - sorted_layer_indices = g.topologicalSort() - print("SORTED:", sorted_layer_indices) - new_model = [model[idx] for idx in sorted_layer_indices] - - assert(len(find_missing_inputs(new_model, inputs_and_memories)) == 0) - return new_model - - - -# Trim -def trim(model, criteria_regexp_string, verbose): - if hasattr(model, 'layers'): - model = model.layers - - def flatten(items,enter=lambda x:isinstance(x, list)): - # http://stackoverflow.com/a/40857703 - # https://github.com/ctmakro/canton/blob/master/canton/misc.py - """Yield items from any nested iterable; see REF.""" - for x in items: - if enter(x): - yield from flatten(x) - else: - yield x - - def trim_model(model, outputs): - layers = {l.name:l for l in model} - connected = {o for o in outputs} - while len(outputs) > 0: - outputs = set(flatten([layers[o].inputs for o in outputs if o in layers])) - if verbose and len(outputs) > 0: - print(outputs) - for o in outputs: - connected.add(o) - - trimmed = [l.name for l in model if l.name not in connected] - def array_without_brackets(arr): - return str(arr)[1:-1] # array to string without brackets - print("TRIMMED:", array_without_brackets(trimmed)) - - return [l for l in model if l.name in connected] - - layer_names = {l.name for l in model} - criteria = re.compile(criteria_regexp_string) - preserve_outputs = list(filter(criteria.match, layer_names)) - if preserve_outputs: - print("Trimming model given outputs to preserve:", preserve_outputs) - model = trim_model(model, preserve_outputs) - else: - print("WARNING: Trim couldn't find any layers to match:", criteria_regexp_string) - return model - -def compress(model): - compress_classes = { - 'Dense' - } - for l in model.layers: - if (l.class_name in compress_classes): - print("Compressing %s layer '%s' weights to float16" % (l.class_name, l.name)) - for x in l.tensors: - x.data = np.float16(x.data) - return model - -# Verbose -def to_json(model): - class StructEncoder(json.JSONEncoder): - def default(self, o): - if isinstance(o, np.ndarray): # skip binary data packed inside ndarray - return "" - if getattr(o, '__dict__', None): - return o.__dict__ - return str(o) - - s = json.dumps(model.layers, cls=StructEncoder, separators=(', ',':')) - # custom formatting - s = s.replace(']}, {', ']},\n{') - s = s.replace(':[{', ':[\n\t{') - s = s.replace('}, {', '},\n\t{') - s = s.replace('"', "'") - return s - -def summary(model, print_layer_links, print_barracuda_json, print_tensors): - def array_without_brackets(arr): - return str(arr)[1:-1] # array to string without brackets - - if print_layer_links: - for l in model.layers: - print(l.name, " <= ", l.inputs) - - if print_barracuda_json: - print(to_json(model)) - - if model.globals: - if isinstance(model.globals, dict): - model.globals = {x.name:x.shape for x in model.globals} - print("GLOBALS:", array_without_brackets(model.globals)) - - for l in model.layers: - if isinstance(model.inputs, dict): - ins = {i:model.inputs[i] for i in l.inputs if i in model.inputs} - else: - ins = [i for i in l.inputs if i in model.inputs] - if ins: - print("IN: %s => '%s'" % (array_without_brackets(ins), l.name)) - for mem_in, mem_out in zip(model.memories[1::3], model.memories[2::3]): - print("MEM: '%s' => '%s'" % (mem_in, mem_out)) - print("OUT:", array_without_brackets(model.outputs)) - - if (print_tensors): - for l in model.layers: - for x in l.tensors: - print(x.name, x.shape, x.data.dtype, x.data) - -class Build: - def __init__(self, scope=''): - self.scope = scope - self.layers = [] - self.names_taken = set() - - def __getattr__(self, attr): - if attr == '_': - return self.layers[-1].name if len(self.layer) > 0 else self.scope - raise AttributeError(attr) - - def _patch_last_layer_name_and_return(self): - if self.layers[-1].name: - return self.layers[-1].name - - # generate unique name based on op and increasing id - name = self.layers[-1].op - - i = 1 - while name in self.names_taken: - name = self.layers[-1].op + '_' + str(i) - i += 1 - self.names_taken.add(name) - - self.layers[-1].name = self.scope + ('/' if self.scope else '') + name - return self.layers[-1].name - - def concat(self, a, b, out=''): - self.layers += [Struct(name=out, op='Concat', input=[a, b])] - return self._patch_last_layer_name_and_return() - def mad(self, x, kernel, bias, out=''): - self.layers += [Struct(name=out, op='Dense', input=[x, kernel, bias])] - return self._patch_last_layer_name_and_return() - def mul(self, a, b, out=''): - self.layers += [Struct(name=out, op='Mul', input=[a, b])] - return self._patch_last_layer_name_and_return() - def add(self, a, b, out=''): - self.layers += [Struct(name=out, op='Add', input=[a, b])] - return self._patch_last_layer_name_and_return() - def sub(self, a, b, out=''): - self.layers += [Struct(name=out, op='Sub', input=[a, b])] - return self._patch_last_layer_name_and_return() - def sigmoid(self, x, out=''): - self.layers += [Struct(name=out, op='Sigmoid', input=[x])] - return self._patch_last_layer_name_and_return() - def tanh(self, x, out=''): - self.layers += [Struct(name=out, op='Tanh', input=[x])] - return self._patch_last_layer_name_and_return() - -def rnn(name, input, state, kernel, bias, new_state, number_of_gates = 2): - ''' - Ht = f(Xt*Wi + Ht_1*Ri + Wbi + Rbi) - ''' - - nn = Build(name) - nn.tanh( - nn.mad(kernel=kernel, bias=bias, - x=nn.concat(input, state)), - out=new_state); - return nn.layers; - -def gru(name, input, state, kernel_r, kernel_u, kernel_c, bias_r, bias_u, bias_c, new_state, number_of_gates = 2): - ''' - zt = f(Xt*Wz + Ht_1*Rz + Wbz + Rbz) - - rt = f(Xt*Wr + Ht_1*Rr + Wbr + Rbr) - - ht = g(Xt*Wh + (rt . Ht_1)*Rh + Rbh + Wbh) - - Ht = (1-zt).ht + zt.Ht_1 - ''' - nn = Build(name) - inputs = nn.concat(input, state) - - u = nn.sigmoid(nn.mad(inputs, kernel_u, bias_u)) - r = nn.sigmoid(nn.mad(inputs, kernel_r, bias_r)) - r_state = nn.mul(r, state) - - c = nn.tanh(nn.mad(kernel=kernel_c, bias=bias_c, - x=nn.concat(input, r_state))) - - # new_h = u' * state + (1 - u') * c' - # = u' * state + c' - u' * c' - - # u' * state + c' - nn.add(nn.mul(u, state), c) - # - u' * c' - nn.sub(nn._, nn.mul(u, c), - out=new_state) - - return nn.layers; - -def lstm(name, input, state_c, state_h, kernel_i, kernel_j, kernel_f, kernel_o, bias_i, bias_j, bias_f, bias_o, new_state_c, new_state_h): - ''' Full: - - it = f(Xt*Wi + Ht_1*Ri + Pi . Ct_1 + Wbi + Rbi) - - ft = f(Xt*Wf + Ht_1*Rf + Pf . Ct_1 + Wbf + Rbf) - - ct = g(Xt*Wc + Ht_1*Rc + Wbc + Rbc) - - Ct = ft . Ct_1 + it . ct - - ot = f(Xt*Wo + Ht_1*Ro + Po . Ct + Wbo + Rbo) - - Ht = ot . h(Ct) - ''' - - ''' No peephole: - - it = f(Xt*Wi + Ht_1*Ri + Wbi + Rbi) - - ft = f(Xt*Wf + Ht_1*Rf + Wbf + Rbf) - - ct = g(Xt*Wc + Ht_1*Rc + Wbc + Rbc) - - Ct = ft . Ct_ + it . ct - - ot = f(Xt*Wo + Ht_1*Ro + Wbo + Rbo) - - Ht = ot . h(Ct) - ''' - - nn = Build(name) - inputs = nn.concat(input, state_h) - - i = nn.sigmoid(nn.mad(x=inputs, kernel=kernel_i, bias=bias_i)) - j = nn.tanh(nn.mad(inputs, kernel_j, bias_j)) - f = nn.sigmoid(nn.mad(inputs, kernel_f, bias_f)) - o = nn.sigmoid(nn.mad(inputs, kernel_o, bias_o)) - - # new_c = state_c * f' + i' * j' - nn.add( - nn.mul(state_c, f), nn.mul(i, j), - out=new_state_c) - - # new_h = - nn.mul(o, nn.tanh(new_state_c), - out=new_state_h) - - return nn.layers - -# Serialize -class BarracudaWriter: - f = None - - def __init__(self, filename): - self.f = open(filename, 'wb+') - - def __enter__(self): - return self - - def __exit__(self, type, value, tb): - self.f.close() - - def write_array(self, arr): - arr.tofile(self.f) - - def write_str_array(self, array_of_strigs): - self.write_int32(len(array_of_strigs)) - for s in array_of_strigs: - self.write_str(s) - - def write_str(self, s): - self.write_int32(len(s)) - self.f.write(s.encode('ascii')) - - def write_float(self, d): - self.f.write(struct.pack('> 2 # length is measured in float32s (at least for now) - - w.write_str(x.name) - w.write_shape(x.shape) - w.write_int64(offset) - w.write_int32(x.data.itemsize) - w.write_int32(length) - - offset += length - all_tensors.append(x) - - for x in all_tensors: - w.write_array(x.data) - - - diff --git a/animalai_bkp/trainers/bc/__init__.py b/animalai_bkp/trainers/bc/__init__.py deleted file mode 100644 index 80cd0aa0..00000000 --- a/animalai_bkp/trainers/bc/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .models import * -from .online_trainer import * -from .offline_trainer import * -from .policy import * diff --git a/animalai_bkp/trainers/bc/models.py b/animalai_bkp/trainers/bc/models.py deleted file mode 100644 index 06cdab6d..00000000 --- a/animalai_bkp/trainers/bc/models.py +++ /dev/null @@ -1,55 +0,0 @@ -import tensorflow as tf -import tensorflow.contrib.layers as c_layers -from animalai.trainers.models import LearningModel - - -class BehavioralCloningModel(LearningModel): - def __init__(self, brain, h_size=128, lr=1e-4, n_layers=2, m_size=128, - normalize=False, use_recurrent=False, seed=0): - LearningModel.__init__(self, m_size, normalize, use_recurrent, brain, seed) - num_streams = 1 - hidden_streams = self.create_observation_streams(num_streams, h_size, n_layers) - hidden = hidden_streams[0] - self.dropout_rate = tf.placeholder(dtype=tf.float32, shape=[], name="dropout_rate") - hidden_reg = tf.layers.dropout(hidden, self.dropout_rate) - if self.use_recurrent: - tf.Variable(self.m_size, name="memory_size", trainable=False, dtype=tf.int32) - self.memory_in = tf.placeholder(shape=[None, self.m_size], dtype=tf.float32, name='recurrent_in') - hidden_reg, self.memory_out = self.create_recurrent_encoder(hidden_reg, self.memory_in, - self.sequence_length) - self.memory_out = tf.identity(self.memory_out, name='recurrent_out') - - if brain.vector_action_space_type == "discrete": - policy_branches = [] - for size in self.act_size: - policy_branches.append( - tf.layers.dense( - hidden, - size, - activation=None, - use_bias=False, - kernel_initializer=c_layers.variance_scaling_initializer(factor=0.01))) - self.action_probs = tf.concat( - [tf.nn.softmax(branch) for branch in policy_branches], axis=1, name="action_probs") - self.action_masks = tf.placeholder(shape=[None, sum(self.act_size)], dtype=tf.float32, name="action_masks") - self.sample_action_float, normalized_logits = self.create_discrete_action_masking_layer( - tf.concat(policy_branches, axis=1), self.action_masks, self.act_size) - tf.identity(normalized_logits, name='action') - self.sample_action = tf.cast(self.sample_action_float, tf.int32) - self.true_action = tf.placeholder(shape=[None, len(policy_branches)], dtype=tf.int32, name="teacher_action") - self.action_oh = tf.concat([ - tf.one_hot(self.true_action[:, i], self.act_size[i]) for i in range(len(self.act_size))], axis=1) - self.loss = tf.reduce_sum(-tf.log(self.action_probs + 1e-10) * self.action_oh) - self.action_percent = tf.reduce_mean(tf.cast( - tf.equal(tf.cast(tf.argmax(self.action_probs, axis=1), tf.int32), self.sample_action), tf.float32)) - else: - self.policy = tf.layers.dense(hidden_reg, self.act_size[0], activation=None, use_bias=False, name='pre_action', - kernel_initializer=c_layers.variance_scaling_initializer(factor=0.01)) - self.clipped_sample_action = tf.clip_by_value(self.policy, -1, 1) - self.sample_action = tf.identity(self.clipped_sample_action, name="action") - self.true_action = tf.placeholder(shape=[None, self.act_size[0]], dtype=tf.float32, name="teacher_action") - self.clipped_true_action = tf.clip_by_value(self.true_action, -1, 1) - self.loss = tf.reduce_sum(tf.squared_difference(self.clipped_true_action, self.sample_action)) - - optimizer = tf.train.AdamOptimizer(learning_rate=lr) - self.update = optimizer.minimize(self.loss) diff --git a/animalai_bkp/trainers/bc/offline_trainer.py b/animalai_bkp/trainers/bc/offline_trainer.py deleted file mode 100644 index 36e209f2..00000000 --- a/animalai_bkp/trainers/bc/offline_trainer.py +++ /dev/null @@ -1,56 +0,0 @@ -# # Unity ML-Agents Toolkit -# ## ML-Agent Learning (Behavioral Cloning) -# Contains an implementation of Behavioral Cloning Algorithm - -import logging -import copy - -from animalai.trainers.bc.trainer import BCTrainer -from animalai.trainers.demo_loader import demo_to_buffer -from animalai.trainers.trainer import UnityTrainerException - -logger = logging.getLogger("mlagents.trainers") - - -class OfflineBCTrainer(BCTrainer): - """The OfflineBCTrainer is an implementation of Offline Behavioral Cloning.""" - - def __init__(self, brain, trainer_parameters, training, load, seed, run_id): - """ - Responsible for collecting experiences and training PPO model. - :param trainer_parameters: The parameters for the trainer (dictionary). - :param training: Whether the trainer is set for training. - :param load: Whether the model should be loaded. - :param seed: The seed the model will be initialized with - :param run_id: The The identifier of the current run - """ - super(OfflineBCTrainer, self).__init__( - brain, trainer_parameters, training, load, seed, run_id) - - self.param_keys = ['batch_size', 'summary_freq', 'max_steps', - 'batches_per_epoch', 'use_recurrent', - 'hidden_units', 'learning_rate', 'num_layers', - 'sequence_length', 'memory_size', 'model_path', - 'demo_path'] - - self.check_param_keys() - self.batches_per_epoch = trainer_parameters['batches_per_epoch'] - self.n_sequences = max(int(trainer_parameters['batch_size'] / self.policy.sequence_length), - 1) - - brain_params, self.demonstration_buffer = demo_to_buffer( - trainer_parameters['demo_path'], - self.policy.sequence_length) - - policy_brain = copy.deepcopy(brain.__dict__) - expert_brain = copy.deepcopy(brain_params.__dict__) - policy_brain.pop('brain_name') - expert_brain.pop('brain_name') - if expert_brain != policy_brain: - raise UnityTrainerException("The provided demonstration is not compatible with the " - "brain being used for performance evaluation.") - - def __str__(self): - return '''Hyperparameters for the Imitation Trainer of brain {0}: \n{1}'''.format( - self.brain_name, '\n'.join( - ['\t{0}:\t{1}'.format(x, self.trainer_parameters[x]) for x in self.param_keys])) diff --git a/animalai_bkp/trainers/bc/online_trainer.py b/animalai_bkp/trainers/bc/online_trainer.py deleted file mode 100644 index d06ac321..00000000 --- a/animalai_bkp/trainers/bc/online_trainer.py +++ /dev/null @@ -1,116 +0,0 @@ -# # Unity ML-Agents Toolkit -# ## ML-Agent Learning (Behavioral Cloning) -# Contains an implementation of Behavioral Cloning Algorithm - -import logging -import numpy as np - -from animalai.envs import AllBrainInfo -from animalai.trainers.bc.trainer import BCTrainer - -logger = logging.getLogger("mlagents.trainers") - - -class OnlineBCTrainer(BCTrainer): - """The OnlineBCTrainer is an implementation of Online Behavioral Cloning.""" - - def __init__(self, brain, trainer_parameters, training, load, seed, run_id): - """ - Responsible for collecting experiences and training PPO model. - :param trainer_parameters: The parameters for the trainer (dictionary). - :param training: Whether the trainer is set for training. - :param load: Whether the model should be loaded. - :param seed: The seed the model will be initialized with - :param run_id: The The identifier of the current run - """ - super(OnlineBCTrainer, self).__init__(brain, trainer_parameters, training, load, seed, - run_id) - - self.param_keys = ['brain_to_imitate', 'batch_size', 'time_horizon', - 'summary_freq', 'max_steps', - 'batches_per_epoch', 'use_recurrent', - 'hidden_units', 'learning_rate', 'num_layers', - 'sequence_length', 'memory_size', 'model_path'] - - self.check_param_keys() - self.brain_to_imitate = trainer_parameters['brain_to_imitate'] - self.batches_per_epoch = trainer_parameters['batches_per_epoch'] - self.n_sequences = max(int(trainer_parameters['batch_size'] / self.policy.sequence_length), - 1) - - def __str__(self): - return '''Hyperparameters for the Imitation Trainer of brain {0}: \n{1}'''.format( - self.brain_name, '\n'.join( - ['\t{0}:\t{1}'.format(x, self.trainer_parameters[x]) for x in self.param_keys])) - - def add_experiences(self, curr_info: AllBrainInfo, next_info: AllBrainInfo, - take_action_outputs): - """ - Adds experiences to each agent's experience history. - :param curr_info: Current AllBrainInfo (Dictionary of all current brains and corresponding BrainInfo). - :param next_info: Next AllBrainInfo (Dictionary of all current brains and corresponding BrainInfo). - :param take_action_outputs: The outputs of the take action method. - """ - - # Used to collect teacher experience into training buffer - info_teacher = curr_info[self.brain_to_imitate] - next_info_teacher = next_info[self.brain_to_imitate] - for agent_id in info_teacher.agents: - self.demonstration_buffer[agent_id].last_brain_info = info_teacher - - for agent_id in next_info_teacher.agents: - stored_info_teacher = self.demonstration_buffer[agent_id].last_brain_info - if stored_info_teacher is None: - continue - else: - idx = stored_info_teacher.agents.index(agent_id) - next_idx = next_info_teacher.agents.index(agent_id) - if stored_info_teacher.text_observations[idx] != "": - info_teacher_record, info_teacher_reset = \ - stored_info_teacher.text_observations[idx].lower().split(",") - next_info_teacher_record, next_info_teacher_reset = \ - next_info_teacher.text_observations[idx]. \ - lower().split(",") - if next_info_teacher_reset == "true": - self.demonstration_buffer.reset_update_buffer() - else: - info_teacher_record, next_info_teacher_record = "true", "true" - if info_teacher_record == "true" and next_info_teacher_record == "true": - if not stored_info_teacher.local_done[idx]: - for i in range(self.policy.vis_obs_size): - self.demonstration_buffer[agent_id]['visual_obs%d' % i] \ - .append(stored_info_teacher.visual_observations[i][idx]) - if self.policy.use_vec_obs: - self.demonstration_buffer[agent_id]['vector_obs'] \ - .append(stored_info_teacher.vector_observations[idx]) - if self.policy.use_recurrent: - if stored_info_teacher.memories.shape[1] == 0: - stored_info_teacher.memories = np.zeros( - (len(stored_info_teacher.agents), - self.policy.m_size)) - self.demonstration_buffer[agent_id]['memory'].append( - stored_info_teacher.memories[idx]) - self.demonstration_buffer[agent_id]['actions'].append( - next_info_teacher.previous_vector_actions[next_idx]) - - super(OnlineBCTrainer, self).add_experiences(curr_info, next_info, take_action_outputs) - - def process_experiences(self, current_info: AllBrainInfo, next_info: AllBrainInfo): - """ - Checks agent histories for processing condition, and processes them as necessary. - Processing involves calculating value and advantage targets for model updating step. - :param current_info: Current AllBrainInfo - :param next_info: Next AllBrainInfo - """ - info_teacher = next_info[self.brain_to_imitate] - for l in range(len(info_teacher.agents)): - teacher_action_list = len(self.demonstration_buffer[info_teacher.agents[l]]['actions']) - horizon_reached = teacher_action_list > self.trainer_parameters['time_horizon'] - teacher_filled = len(self.demonstration_buffer[info_teacher.agents[l]]['actions']) > 0 - if (info_teacher.local_done[l] or horizon_reached) and teacher_filled: - agent_id = info_teacher.agents[l] - self.demonstration_buffer.append_update_buffer( - agent_id, batch_size=None, training_length=self.policy.sequence_length) - self.demonstration_buffer[agent_id].reset_agent() - - super(OnlineBCTrainer, self).process_experiences(current_info, next_info) diff --git a/animalai_bkp/trainers/bc/policy.py b/animalai_bkp/trainers/bc/policy.py deleted file mode 100644 index b9fd3bdb..00000000 --- a/animalai_bkp/trainers/bc/policy.py +++ /dev/null @@ -1,93 +0,0 @@ -import logging - -import numpy as np -from animalai.trainers.bc.models import BehavioralCloningModel -from animalai.trainers.policy import Policy - -logger = logging.getLogger("mlagents.trainers") - - -class BCPolicy(Policy): - def __init__(self, seed, brain, trainer_parameters, load): - """ - :param seed: Random seed. - :param brain: Assigned Brain object. - :param trainer_parameters: Defined training parameters. - :param load: Whether a pre-trained model will be loaded or a new one created. - """ - super(BCPolicy, self).__init__(seed, brain, trainer_parameters) - - with self.graph.as_default(): - with self.graph.as_default(): - self.model = BehavioralCloningModel( - h_size=int(trainer_parameters['hidden_units']), - lr=float(trainer_parameters['learning_rate']), - n_layers=int(trainer_parameters['num_layers']), - m_size=self.m_size, - normalize=False, - use_recurrent=trainer_parameters['use_recurrent'], - brain=brain, - seed=seed) - - if load: - self._load_graph() - else: - self._initialize_graph() - - self.inference_dict = {'action': self.model.sample_action} - self.update_dict = {'policy_loss': self.model.loss, - 'update_batch': self.model.update} - if self.use_recurrent: - self.inference_dict['memory_out'] = self.model.memory_out - - self.evaluate_rate = 1.0 - self.update_rate = 0.5 - - def evaluate(self, brain_info): - """ - Evaluates policy for the agent experiences provided. - :param brain_info: BrainInfo input to network. - :return: Results of evaluation. - """ - feed_dict = {self.model.dropout_rate: self.evaluate_rate, - self.model.sequence_length: 1} - - feed_dict = self._fill_eval_dict(feed_dict, brain_info) - if self.use_recurrent: - if brain_info.memories.shape[1] == 0: - brain_info.memories = self.make_empty_memory(len(brain_info.agents)) - feed_dict[self.model.memory_in] = brain_info.memories - run_out = self._execute_model(feed_dict, self.inference_dict) - return run_out - - def update(self, mini_batch, num_sequences): - """ - Performs update on model. - :param mini_batch: Batch of experiences. - :param num_sequences: Number of sequences to process. - :return: Results of update. - """ - - feed_dict = {self.model.dropout_rate: self.update_rate, - self.model.batch_size: num_sequences, - self.model.sequence_length: self.sequence_length} - if self.use_continuous_act: - feed_dict[self.model.true_action] = mini_batch['actions']. \ - reshape([-1, self.brain.vector_action_space_size[0]]) - else: - feed_dict[self.model.true_action] = mini_batch['actions'].reshape( - [-1, len(self.brain.vector_action_space_size)]) - feed_dict[self.model.action_masks] = np.ones( - (num_sequences, sum(self.brain.vector_action_space_size))) - if self.use_vec_obs: - apparent_obs_size = self.brain.vector_observation_space_size * \ - self.brain.num_stacked_vector_observations - feed_dict[self.model.vector_in] = mini_batch['vector_obs'] \ - .reshape([-1,apparent_obs_size]) - for i, _ in enumerate(self.model.visual_in): - visual_obs = mini_batch['visual_obs%d' % i] - feed_dict[self.model.visual_in[i]] = visual_obs - if self.use_recurrent: - feed_dict[self.model.memory_in] = np.zeros([num_sequences, self.m_size]) - run_out = self._execute_model(feed_dict, self.update_dict) - return run_out diff --git a/animalai_bkp/trainers/bc/trainer.py b/animalai_bkp/trainers/bc/trainer.py deleted file mode 100644 index bdc2010f..00000000 --- a/animalai_bkp/trainers/bc/trainer.py +++ /dev/null @@ -1,190 +0,0 @@ -# # Unity ML-Agents Toolkit -# ## ML-Agent Learning (Behavioral Cloning) -# Contains an implementation of Behavioral Cloning Algorithm - -import logging -import os - -import numpy as np -import tensorflow as tf - -from animalai.envs import AllBrainInfo -from animalai.trainers.bc.policy import BCPolicy -from animalai.trainers.buffer import Buffer -from animalai.trainers.trainer import Trainer - -logger = logging.getLogger("mlagents.trainers") - - -class BCTrainer(Trainer): - """The BCTrainer is an implementation of Behavioral Cloning.""" - - def __init__(self, brain, trainer_parameters, training, load, seed, run_id): - """ - Responsible for collecting experiences and training PPO model. - :param trainer_parameters: The parameters for the trainer (dictionary). - :param training: Whether the trainer is set for training. - :param load: Whether the model should be loaded. - :param seed: The seed the model will be initialized with - :param run_id: The The identifier of the current run - """ - super(BCTrainer, self).__init__(brain, trainer_parameters, training, run_id) - self.policy = BCPolicy(seed, brain, trainer_parameters, load) - self.n_sequences = 1 - self.cumulative_rewards = {} - self.episode_steps = {} - self.stats = {'Losses/Cloning Loss': [], 'Environment/Episode Length': [], - 'Environment/Cumulative Reward': []} - - self.summary_path = trainer_parameters['summary_path'] - self.batches_per_epoch = trainer_parameters['batches_per_epoch'] - if not os.path.exists(self.summary_path): - os.makedirs(self.summary_path) - - self.demonstration_buffer = Buffer() - self.evaluation_buffer = Buffer() - self.summary_writer = tf.summary.FileWriter(self.summary_path) - - @property - def parameters(self): - """ - Returns the trainer parameters of the trainer. - """ - return self.trainer_parameters - - @property - def get_max_steps(self): - """ - Returns the maximum number of steps. Is used to know when the trainer should be stopped. - :return: The maximum number of steps of the trainer - """ - return float(self.trainer_parameters['max_steps']) - - @property - def get_step(self): - """ - Returns the number of steps the trainer has performed - :return: the step count of the trainer - """ - return self.policy.get_current_step() - - @property - def get_last_reward(self): - """ - Returns the last reward the trainer has had - :return: the new last reward - """ - if len(self.stats['Environment/Cumulative Reward']) > 0: - return np.mean(self.stats['Environment/Cumulative Reward']) - else: - return 0 - - def increment_step_and_update_last_reward(self): - """ - Increment the step count of the trainer and Updates the last reward - """ - self.policy.increment_step() - return - - def take_action(self, all_brain_info: AllBrainInfo): - """ - Decides actions using policy given current brain info. - :param all_brain_info: AllBrainInfo from environment. - :return: a tuple containing action, memories, values and an object - to be passed to add experiences - """ - if len(all_brain_info[self.brain_name].agents) == 0: - return [], [], [], None, None - - agent_brain = all_brain_info[self.brain_name] - run_out = self.policy.evaluate(agent_brain) - if self.policy.use_recurrent: - return run_out['action'], run_out['memory_out'], None, None, None - else: - return run_out['action'], None, None, None, None - - def add_experiences(self, curr_info: AllBrainInfo, next_info: AllBrainInfo, - take_action_outputs): - """ - Adds experiences to each agent's experience history. - :param curr_info: Current AllBrainInfo (Dictionary of all current brains and corresponding BrainInfo). - :param next_info: Next AllBrainInfo (Dictionary of all current brains and corresponding BrainInfo). - :param take_action_outputs: The outputs of the take action method. - """ - - # Used to collect information about student performance. - info_student = curr_info[self.brain_name] - next_info_student = next_info[self.brain_name] - for agent_id in info_student.agents: - self.evaluation_buffer[agent_id].last_brain_info = info_student - - for agent_id in next_info_student.agents: - stored_info_student = self.evaluation_buffer[agent_id].last_brain_info - if stored_info_student is None: - continue - else: - next_idx = next_info_student.agents.index(agent_id) - if agent_id not in self.cumulative_rewards: - self.cumulative_rewards[agent_id] = 0 - self.cumulative_rewards[agent_id] += next_info_student.rewards[next_idx] - if not next_info_student.local_done[next_idx]: - if agent_id not in self.episode_steps: - self.episode_steps[agent_id] = 0 - self.episode_steps[agent_id] += 1 - - def process_experiences(self, current_info: AllBrainInfo, next_info: AllBrainInfo): - """ - Checks agent histories for processing condition, and processes them as necessary. - Processing involves calculating value and advantage targets for model updating step. - :param current_info: Current AllBrainInfo - :param next_info: Next AllBrainInfo - """ - info_student = next_info[self.brain_name] - for l in range(len(info_student.agents)): - if info_student.local_done[l]: - agent_id = info_student.agents[l] - self.stats['Environment/Cumulative Reward'].append( - self.cumulative_rewards.get(agent_id, 0)) - self.stats['Environment/Episode Length'].append( - self.episode_steps.get(agent_id, 0)) - self.cumulative_rewards[agent_id] = 0 - self.episode_steps[agent_id] = 0 - - def end_episode(self): - """ - A signal that the Episode has ended. The buffer must be reset. - Get only called when the academy resets. - """ - self.evaluation_buffer.reset_local_buffers() - for agent_id in self.cumulative_rewards: - self.cumulative_rewards[agent_id] = 0 - for agent_id in self.episode_steps: - self.episode_steps[agent_id] = 0 - - def is_ready_update(self): - """ - Returns whether or not the trainer has enough elements to run update model - :return: A boolean corresponding to whether or not update_model() can be run - """ - return len(self.demonstration_buffer.update_buffer['actions']) > self.n_sequences - - def update_policy(self): - """ - Updates the policy. - """ - self.demonstration_buffer.update_buffer.shuffle() - batch_losses = [] - num_batches = min(len(self.demonstration_buffer.update_buffer['actions']) // - self.n_sequences, self.batches_per_epoch) - for i in range(num_batches): - update_buffer = self.demonstration_buffer.update_buffer - start = i * self.n_sequences - end = (i + 1) * self.n_sequences - mini_batch = update_buffer.make_mini_batch(start, end) - run_out = self.policy.update(mini_batch, self.n_sequences) - loss = run_out['policy_loss'] - batch_losses.append(loss) - if len(batch_losses) > 0: - self.stats['Losses/Cloning Loss'].append(np.mean(batch_losses)) - else: - self.stats['Losses/Cloning Loss'].append(0) diff --git a/animalai_bkp/trainers/buffer.py b/animalai_bkp/trainers/buffer.py deleted file mode 100644 index ff2f0b88..00000000 --- a/animalai_bkp/trainers/buffer.py +++ /dev/null @@ -1,255 +0,0 @@ -import numpy as np - -from animalai.envs.exception import UnityException - - -class BufferException(UnityException): - """ - Related to errors with the Buffer. - """ - pass - - -class Buffer(dict): - """ - Buffer contains a dictionary of AgentBuffer. The AgentBuffers are indexed by agent_id. - Buffer also contains an update_buffer that corresponds to the buffer used when updating the model. - """ - - class AgentBuffer(dict): - """ - AgentBuffer contains a dictionary of AgentBufferFields. Each agent has his own AgentBuffer. - The keys correspond to the name of the field. Example: state, action - """ - - class AgentBufferField(list): - """ - AgentBufferField is a list of numpy arrays. When an agent collects a field, you can add it to his - AgentBufferField with the append method. - """ - - def __init__(self): - self.padding_value = 0 - super(Buffer.AgentBuffer.AgentBufferField, self).__init__() - - def __str__(self): - return str(np.array(self).shape) - - def append(self, element, padding_value=0): - """ - Adds an element to this list. Also lets you change the padding - type, so that it can be set on append (e.g. action_masks should - be padded with 1.) - :param element: The element to append to the list. - :param padding_value: The value used to pad when get_batch is called. - """ - super(Buffer.AgentBuffer.AgentBufferField, self).append(element) - self.padding_value = padding_value - - def extend(self, data): - """ - Adds a list of np.arrays to the end of the list of np.arrays. - :param data: The np.array list to append. - """ - self += list(np.array(data)) - - def set(self, data): - """ - Sets the list of np.array to the input data - :param data: The np.array list to be set. - """ - self[:] = [] - self[:] = list(np.array(data)) - - def get_batch(self, batch_size=None, training_length=1, sequential=True): - """ - Retrieve the last batch_size elements of length training_length - from the list of np.array - :param batch_size: The number of elements to retrieve. If None: - All elements will be retrieved. - :param training_length: The length of the sequence to be retrieved. If - None: only takes one element. - :param sequential: If true and training_length is not None: the elements - will not repeat in the sequence. [a,b,c,d,e] with training_length = 2 and - sequential=True gives [[0,a],[b,c],[d,e]]. If sequential=False gives - [[a,b],[b,c],[c,d],[d,e]] - """ - if training_length == 1: - # When the training length is 1, the method returns a list of elements, - # not a list of sequences of elements. - if batch_size is None: - # If batch_size is None : All the elements of the AgentBufferField are returned. - return np.array(self) - else: - # return the batch_size last elements - if batch_size > len(self): - raise BufferException("Batch size requested is too large") - return np.array(self[-batch_size:]) - else: - # The training_length is not None, the method returns a list of SEQUENCES of elements - if not sequential: - # The sequences will have overlapping elements - if batch_size is None: - # retrieve the maximum number of elements - batch_size = len(self) - training_length + 1 - # The number of sequences of length training_length taken from a list of len(self) elements - # with overlapping is equal to batch_size - if (len(self) - training_length + 1) < batch_size: - raise BufferException("The batch size and training length requested for get_batch where" - " too large given the current number of data points.") - tmp_list = [] - for end in range(len(self) - batch_size + 1, len(self) + 1): - tmp_list += [np.array(self[end - training_length:end])] - return np.array(tmp_list) - if sequential: - # The sequences will not have overlapping elements (this involves padding) - leftover = len(self) % training_length - # leftover is the number of elements in the first sequence (this sequence might need 0 padding) - if batch_size is None: - # retrieve the maximum number of elements - batch_size = len(self) // training_length + 1 * (leftover != 0) - # The maximum number of sequences taken from a list of length len(self) without overlapping - # with padding is equal to batch_size - if batch_size > (len(self) // training_length + 1 * (leftover != 0)): - raise BufferException("The batch size and training length requested for get_batch where" - " too large given the current number of data points.") - tmp_list = [] - padding = np.array(self[-1]) * self.padding_value - # The padding is made with zeros and its shape is given by the shape of the last element - for end in range(len(self), len(self) % training_length, -training_length)[:batch_size]: - tmp_list += [np.array(self[end - training_length:end])] - if (leftover != 0) and (len(tmp_list) < batch_size): - tmp_list += [np.array([padding] * (training_length - leftover) + self[:leftover])] - tmp_list.reverse() - return np.array(tmp_list) - - def reset_field(self): - """ - Resets the AgentBufferField - """ - self[:] = [] - - def __init__(self): - self.last_brain_info = None - self.last_take_action_outputs = None - super(Buffer.AgentBuffer, self).__init__() - - def __str__(self): - return ", ".join(["'{0}' : {1}".format(k, str(self[k])) for k in self.keys()]) - - def reset_agent(self): - """ - Resets the AgentBuffer - """ - for k in self.keys(): - self[k].reset_field() - self.last_brain_info = None - self.last_take_action_outputs = None - - def __getitem__(self, key): - if key not in self.keys(): - self[key] = self.AgentBufferField() - return super(Buffer.AgentBuffer, self).__getitem__(key) - - def check_length(self, key_list): - """ - Some methods will require that some fields have the same length. - check_length will return true if the fields in key_list - have the same length. - :param key_list: The fields which length will be compared - """ - if len(key_list) < 2: - return True - l = None - for key in key_list: - if key not in self.keys(): - return False - if (l is not None) and (l != len(self[key])): - return False - l = len(self[key]) - return True - - def shuffle(self, key_list=None): - """ - Shuffles the fields in key_list in a consistent way: The reordering will - Shuffles the fields in key_list in a consistent way: The reordering will - be the same across fields. - :param key_list: The fields that must be shuffled. - """ - if key_list is None: - key_list = list(self.keys()) - if not self.check_length(key_list): - raise BufferException("Unable to shuffle if the fields are not of same length") - s = np.arange(len(self[key_list[0]])) - np.random.shuffle(s) - for key in key_list: - self[key][:] = [self[key][i] for i in s] - - def make_mini_batch(self, start, end): - """ - Creates a mini-batch from buffer. - :param start: Starting index of buffer. - :param end: Ending index of buffer. - :return: Dict of mini batch. - """ - mini_batch = {} - for key in self: - mini_batch[key] = np.array(self[key][start:end]) - return mini_batch - - def __init__(self): - self.update_buffer = self.AgentBuffer() - super(Buffer, self).__init__() - - def __str__(self): - return "update buffer :\n\t{0}\nlocal_buffers :\n{1}".format(str(self.update_buffer), - '\n'.join( - ['\tagent {0} :{1}'.format(k, str(self[k])) for - k in self.keys()])) - - def __getitem__(self, key): - if key not in self.keys(): - self[key] = self.AgentBuffer() - return super(Buffer, self).__getitem__(key) - - def reset_update_buffer(self): - """ - Resets the update buffer - """ - self.update_buffer.reset_agent() - - def reset_local_buffers(self): - """ - Resets all the local local_buffers - """ - agent_ids = list(self.keys()) - for k in agent_ids: - self[k].reset_agent() - - def append_update_buffer(self, agent_id, key_list=None, batch_size=None, training_length=None): - """ - Appends the buffer of an agent to the update buffer. - :param agent_id: The id of the agent which data will be appended - :param key_list: The fields that must be added. If None: all fields will be appended. - :param batch_size: The number of elements that must be appended. If None: All of them will be. - :param training_length: The length of the samples that must be appended. If None: only takes one element. - """ - if key_list is None: - key_list = self[agent_id].keys() - if not self[agent_id].check_length(key_list): - raise BufferException("The length of the fields {0} for agent {1} where not of same length" - .format(key_list, agent_id)) - for field_key in key_list: - self.update_buffer[field_key].extend( - self[agent_id][field_key].get_batch(batch_size=batch_size, training_length=training_length) - ) - - def append_all_agent_batch_to_update_buffer(self, key_list=None, batch_size=None, training_length=None): - """ - Appends the buffer of all agents to the update buffer. - :param key_list: The fields that must be added. If None: all fields will be appended. - :param batch_size: The number of elements that must be appended. If None: All of them will be. - :param training_length: The length of the samples that must be appended. If None: only takes one element. - """ - for agent_id in self.keys(): - self.append_update_buffer(agent_id, key_list, batch_size, training_length) diff --git a/animalai_bkp/trainers/curriculum.py b/animalai_bkp/trainers/curriculum.py deleted file mode 100644 index 3ec0859f..00000000 --- a/animalai_bkp/trainers/curriculum.py +++ /dev/null @@ -1,112 +0,0 @@ -import os -import json -import math - -from .exception import CurriculumError - -import logging - -logger = logging.getLogger('mlagents.trainers') - - -class Curriculum(object): - def __init__(self, location, default_reset_parameters): - """ - Initializes a Curriculum object. - :param location: Path to JSON defining curriculum. - :param default_reset_parameters: Set of reset parameters for - environment. - """ - self.max_lesson_num = 0 - self.measure = None - self._lesson_num = 0 - # The name of the brain should be the basename of the file without the - # extension. - self._brain_name = os.path.basename(location).split('.')[0] - - try: - with open(location) as data_file: - self.data = json.load(data_file) - except IOError: - raise CurriculumError( - 'The file {0} could not be found.'.format(location)) - except UnicodeDecodeError: - raise CurriculumError('There was an error decoding {}' - .format(location)) - self.smoothing_value = 0 - for key in ['parameters', 'measure', 'thresholds', - 'min_lesson_length', 'signal_smoothing']: - if key not in self.data: - raise CurriculumError("{0} does not contain a " - "{1} field." - .format(location, key)) - self.smoothing_value = 0 - self.measure = self.data['measure'] - self.min_lesson_length = self.data['min_lesson_length'] - self.max_lesson_num = len(self.data['thresholds']) - - parameters = self.data['parameters'] - for key in parameters: - if key not in default_reset_parameters: - raise CurriculumError( - 'The parameter {0} in Curriculum {1} is not present in ' - 'the Environment'.format(key, location)) - if len(parameters[key]) != self.max_lesson_num + 1: - raise CurriculumError( - 'The parameter {0} in Curriculum {1} must have {2} values ' - 'but {3} were found'.format(key, location, - self.max_lesson_num + 1, - len(parameters[key]))) - - @property - def lesson_num(self): - return self._lesson_num - - @lesson_num.setter - def lesson_num(self, lesson_num): - self._lesson_num = max(0, min(lesson_num, self.max_lesson_num)) - - def increment_lesson(self, measure_val): - """ - Increments the lesson number depending on the progress given. - :param measure_val: Measure of progress (either reward or percentage - steps completed). - :return Whether the lesson was incremented. - """ - if not self.data or not measure_val or math.isnan(measure_val): - return False - if self.data['signal_smoothing']: - measure_val = self.smoothing_value * 0.25 + 0.75 * measure_val - self.smoothing_value = measure_val - if self.lesson_num < self.max_lesson_num: - if measure_val > self.data['thresholds'][self.lesson_num]: - self.lesson_num += 1 - config = {} - parameters = self.data['parameters'] - for key in parameters: - config[key] = parameters[key][self.lesson_num] - logger.info('{0} lesson changed. Now in lesson {1}: {2}' - .format(self._brain_name, - self.lesson_num, - ', '.join([str(x) + ' -> ' + str(config[x]) - for x in config]))) - return True - return False - - def get_config(self, lesson=None): - """ - Returns reset parameters which correspond to the lesson. - :param lesson: The lesson you want to get the config of. If None, the - current lesson is returned. - :return: The configuration of the reset parameters. - """ - if not self.data: - return {} - if lesson is None: - lesson = self.lesson_num - lesson = max(0, min(lesson, self.max_lesson_num)) - config = {} - parameters = self.data['parameters'] - for key in parameters: - config[key] = parameters[key][lesson] - return config diff --git a/animalai_bkp/trainers/demo_loader.py b/animalai_bkp/trainers/demo_loader.py deleted file mode 100644 index 02c8f68b..00000000 --- a/animalai_bkp/trainers/demo_loader.py +++ /dev/null @@ -1,94 +0,0 @@ -import pathlib -import logging -import os -from animalai.trainers.buffer import Buffer -from animalai.envs.brain import BrainParameters, BrainInfo -from animalai.communicator_objects import * -from google.protobuf.internal.decoder import _DecodeVarint32 - -logger = logging.getLogger("mlagents.trainers") - - -def make_demo_buffer(brain_infos, brain_params, sequence_length): - # Create and populate buffer using experiences - demo_buffer = Buffer() - for idx, experience in enumerate(brain_infos): - if idx > len(brain_infos) - 2: - break - current_brain_info = brain_infos[idx] - next_brain_info = brain_infos[idx + 1] - demo_buffer[0].last_brain_info = current_brain_info - demo_buffer[0]['done'].append(next_brain_info.local_done[0]) - demo_buffer[0]['rewards'].append(next_brain_info.rewards[0]) - for i in range(brain_params.number_visual_observations): - demo_buffer[0]['visual_obs%d' % i] \ - .append(current_brain_info.visual_observations[i][0]) - if brain_params.vector_observation_space_size > 0: - demo_buffer[0]['vector_obs'] \ - .append(current_brain_info.vector_observations[0]) - demo_buffer[0]['actions'].append(next_brain_info.previous_vector_actions[0]) - if next_brain_info.local_done[0]: - demo_buffer.append_update_buffer(0, batch_size=None, - training_length=sequence_length) - demo_buffer.reset_local_buffers() - demo_buffer.append_update_buffer(0, batch_size=None, - training_length=sequence_length) - return demo_buffer - - -def demo_to_buffer(file_path, sequence_length): - """ - Loads demonstration file and uses it to fill training buffer. - :param file_path: Location of demonstration file (.demo). - :param sequence_length: Length of trajectories to fill buffer. - :return: - """ - brain_params, brain_infos, _ = load_demonstration(file_path) - demo_buffer = make_demo_buffer(brain_infos, brain_params, sequence_length) - return brain_params, demo_buffer - - -def load_demonstration(file_path): - """ - Loads and parses a demonstration file. - :param file_path: Location of demonstration file (.demo). - :return: BrainParameter and list of BrainInfos containing demonstration data. - """ - - # First 32 bytes of file dedicated to meta-data. - INITIAL_POS = 33 - - if not os.path.isfile(file_path): - raise FileNotFoundError("The demonstration file {} does not exist.".format(file_path)) - file_extension = pathlib.Path(file_path).suffix - if file_extension != '.demo': - raise ValueError("The file is not a '.demo' file. Please provide a file with the " - "correct extension.") - - brain_params = None - brain_infos = [] - data = open(file_path, "rb").read() - next_pos, pos, obs_decoded = 0, 0, 0 - total_expected = 0 - while pos < len(data): - next_pos, pos = _DecodeVarint32(data, pos) - if obs_decoded == 0: - meta_data_proto = DemonstrationMetaProto() - meta_data_proto.ParseFromString(data[pos:pos + next_pos]) - total_expected = meta_data_proto.number_steps - pos = INITIAL_POS - if obs_decoded == 1: - brain_param_proto = BrainParametersProto() - brain_param_proto.ParseFromString(data[pos:pos + next_pos]) - brain_params = BrainParameters.from_proto(brain_param_proto) - pos += next_pos - if obs_decoded > 1: - agent_info = AgentInfoProto() - agent_info.ParseFromString(data[pos:pos + next_pos]) - brain_info = BrainInfo.from_agent_proto([agent_info], brain_params) - brain_infos.append(brain_info) - if len(brain_infos) == total_expected: - break - pos += next_pos - obs_decoded += 1 - return brain_params, brain_infos, total_expected diff --git a/animalai_bkp/trainers/exception.py b/animalai_bkp/trainers/exception.py deleted file mode 100644 index b2f0a0db..00000000 --- a/animalai_bkp/trainers/exception.py +++ /dev/null @@ -1,20 +0,0 @@ -""" -Contains exceptions for the trainers package. -""" - -class TrainerError(Exception): - """ - Any error related to the trainers in the ML-Agents Toolkit. - """ - pass - -class CurriculumError(TrainerError): - """ - Any error related to training with a curriculum. - """ - pass - -class MetaCurriculumError(TrainerError): - """ - Any error related to the configuration of a metacurriculum. - """ diff --git a/animalai_bkp/trainers/learn.py b/animalai_bkp/trainers/learn.py deleted file mode 100644 index 309e4f66..00000000 --- a/animalai_bkp/trainers/learn.py +++ /dev/null @@ -1,249 +0,0 @@ -# # Unity ML-Agents Toolkit - -import logging - -from multiprocessing import Process, Queue -import os -import glob -import shutil -import numpy as np -import yaml -from docopt import docopt -from typing import Optional - - -from animalai.trainers.trainer_controller import TrainerController -from animalai.trainers.exception import TrainerError -from animalai.trainers import MetaCurriculumError, MetaCurriculum -from animalai.envs import UnityEnvironment -from animalai.envs.exception import UnityEnvironmentException - - -def run_training(sub_id: int, run_seed: int, run_options, process_queue): - """ - Launches training session. - :param process_queue: Queue used to send signal back to main. - :param sub_id: Unique id for training session. - :param run_seed: Random seed used for training. - :param run_options: Command line arguments for training. - """ - # Docker Parameters - docker_target_name = (run_options['--docker-target-name'] - if run_options['--docker-target-name'] != 'None' else None) - - # General parameters - env_path = (run_options['--env'] - if run_options['--env'] != 'None' else None) - run_id = run_options['--run-id'] - load_model = run_options['--load'] - train_model = run_options['--train'] - save_freq = int(run_options['--save-freq']) - keep_checkpoints = int(run_options['--keep-checkpoints']) - worker_id = int(run_options['--worker-id']) - curriculum_folder = (run_options['--curriculum'] - if run_options['--curriculum'] != 'None' else None) - lesson = int(run_options['--lesson']) - fast_simulation = not bool(run_options['--slow']) - no_graphics = run_options['--no-graphics'] - trainer_config_path = run_options[''] - - # Recognize and use docker volume if one is passed as an argument - if not docker_target_name: - model_path = './models/{run_id}'.format(run_id=run_id) - summaries_dir = './summaries' - else: - trainer_config_path = \ - '/{docker_target_name}/{trainer_config_path}'.format( - docker_target_name=docker_target_name, - trainer_config_path=trainer_config_path) - if curriculum_folder is not None: - curriculum_folder = \ - '/{docker_target_name}/{curriculum_folder}'.format( - docker_target_name=docker_target_name, - curriculum_folder=curriculum_folder) - model_path = '/{docker_target_name}/models/{run_id}'.format( - docker_target_name=docker_target_name, - run_id=run_id) - summaries_dir = '/{docker_target_name}/summaries'.format( - docker_target_name=docker_target_name) - - trainer_config = load_config(trainer_config_path) - env = init_environment(env_path, docker_target_name, no_graphics, worker_id + sub_id, fast_simulation, run_seed) - maybe_meta_curriculum = try_create_meta_curriculum(curriculum_folder, env) - - external_brains = {} - for brain_name in env.external_brain_names: - external_brains[brain_name] = env.brains[brain_name] - - # Create controller and begin training. - tc = TrainerController(model_path, summaries_dir, run_id + '-' + str(sub_id), - save_freq, maybe_meta_curriculum, - load_model, train_model, - keep_checkpoints, lesson, external_brains, run_seed) - - # Signal that environment has been launched. - process_queue.put(True) - - # Begin training - tc.start_learning(env, trainer_config) - - -def try_create_meta_curriculum(curriculum_folder: Optional[str], env: UnityEnvironment) -> Optional[MetaCurriculum]: - if curriculum_folder is None: - return None - else: - meta_curriculum = MetaCurriculum(curriculum_folder, env._resetParameters) - if meta_curriculum: - for brain_name in meta_curriculum.brains_to_curriculums.keys(): - if brain_name not in env.external_brain_names: - raise MetaCurriculumError('One of the curricula ' - 'defined in ' + - curriculum_folder + ' ' - 'does not have a corresponding ' - 'Brain. Check that the ' - 'curriculum file has the same ' - 'name as the Brain ' - 'whose curriculum it defines.') - return meta_curriculum - - -def prepare_for_docker_run(docker_target_name, env_path): - for f in glob.glob('/{docker_target_name}/*'.format( - docker_target_name=docker_target_name)): - if env_path in f: - try: - b = os.path.basename(f) - if os.path.isdir(f): - shutil.copytree(f, - '/ml-agents/{b}'.format(b=b)) - else: - src_f = '/{docker_target_name}/{b}'.format( - docker_target_name=docker_target_name, b=b) - dst_f = '/ml-agents/{b}'.format(b=b) - shutil.copyfile(src_f, dst_f) - os.chmod(dst_f, 0o775) # Make executable - except Exception as e: - logging.getLogger('mlagents.trainers').info(e) - env_path = '/ml-agents/{env_path}'.format(env_path=env_path) - return env_path - - -def load_config(trainer_config_path): - try: - with open(trainer_config_path) as data_file: - trainer_config = yaml.load(data_file) - return trainer_config - except IOError: - raise UnityEnvironmentException('Parameter file could not be found ' - 'at {}.' - .format(trainer_config_path)) - except UnicodeDecodeError: - raise UnityEnvironmentException('There was an error decoding ' - 'Trainer Config from this path : {}' - .format(trainer_config_path)) - - -def init_environment(env_path, docker_target_name, no_graphics, worker_id, fast_simulation, seed): - if env_path is not None: - # Strip out executable extensions if passed - env_path = (env_path.strip() - .replace('.app', '') - .replace('.exe', '') - .replace('.x86_64', '') - .replace('.x86', '')) - docker_training = docker_target_name is not None - if docker_training and env_path is not None: - """ - Comments for future maintenance: - Some OS/VM instances (e.g. COS GCP Image) mount filesystems - with COS flag which prevents execution of the Unity scene, - to get around this, we will copy the executable into the - container. - """ - # Navigate in docker path and find env_path and copy it. - env_path = prepare_for_docker_run(docker_target_name, - env_path) - return UnityEnvironment( - file_name=env_path, - worker_id=worker_id, - seed=seed, - docker_training=docker_training, - no_graphics=no_graphics - ) - - -def main(): - try: - print(''' - - ▄▄▄▓▓▓▓ - ╓▓▓▓▓▓▓█▓▓▓▓▓ - ,▄▄▄m▀▀▀' ,▓▓▓▀▓▓▄ ▓▓▓ ▓▓▌ - ▄▓▓▓▀' ▄▓▓▀ ▓▓▓ ▄▄ ▄▄ ,▄▄ ▄▄▄▄ ,▄▄ ▄▓▓▌▄ ▄▄▄ ,▄▄ - ▄▓▓▓▀ ▄▓▓▀ ▐▓▓▌ ▓▓▌ ▐▓▓ ▐▓▓▓▀▀▀▓▓▌ ▓▓▓ ▀▓▓▌▀ ^▓▓▌ ╒▓▓▌ - ▄▓▓▓▓▓▄▄▄▄▄▄▄▄▓▓▓ ▓▀ ▓▓▌ ▐▓▓ ▐▓▓ ▓▓▓ ▓▓▓ ▓▓▌ ▐▓▓▄ ▓▓▌ - ▀▓▓▓▓▀▀▀▀▀▀▀▀▀▀▓▓▄ ▓▓ ▓▓▌ ▐▓▓ ▐▓▓ ▓▓▓ ▓▓▓ ▓▓▌ ▐▓▓▐▓▓ - ^█▓▓▓ ▀▓▓▄ ▐▓▓▌ ▓▓▓▓▄▓▓▓▓ ▐▓▓ ▓▓▓ ▓▓▓ ▓▓▓▄ ▓▓▓▓` - '▀▓▓▓▄ ^▓▓▓ ▓▓▓ └▀▀▀▀ ▀▀ ^▀▀ `▀▀ `▀▀ '▀▀ ▐▓▓▌ - ▀▀▀▀▓▄▄▄ ▓▓▓▓▓▓, ▓▓▓▓▀ - `▀█▓▓▓▓▓▓▓▓▓▌ - ¬`▀▀▀█▓ - - ''') - except: - print('\n\n\tUnity Technologies\n') - - logger = logging.getLogger('mlagents.trainers') - _USAGE = ''' - Usage: - mlagents-learn [options] - mlagents-learn --help - - Options: - --env= Name of the Unity executable [default: None]. - --curriculum= Curriculum json directory for environment [default: None]. - --keep-checkpoints= How many model checkpoints to keep [default: 5]. - --lesson= Start learning from this lesson [default: 0]. - --load Whether to load the model or randomly initialize [default: False]. - --run-id= The directory name for model and summary statistics [default: ppo]. - --num-runs= Number of concurrent training sessions [default: 1]. - --save-freq= Frequency at which to save model [default: 50000]. - --seed= Random seed used for training [default: -1]. - --slow Whether to run the game at training speed [default: False]. - --train Whether to train model, or only run inference [default: False]. - --worker-id= Number to add to communication port (5005) [default: 0]. - --docker-target-name=
Docker volume to store training-specific files [default: None]. - --no-graphics Whether to run the environment in no-graphics mode [default: False]. - ''' - - options = docopt(_USAGE) - logger.info(options) - num_runs = int(options['--num-runs']) - seed = int(options['--seed']) - - if options['--env'] == 'None' and num_runs > 1: - raise TrainerError('It is not possible to launch more than one concurrent training session ' - 'when training from the editor.') - - jobs = [] - run_seed = seed - - if num_runs == 1: - if seed == -1: - run_seed = np.random.randint(0, 10000) - run_training(0, run_seed, options, Queue()) - else: - for i in range(num_runs): - if seed == -1: - run_seed = np.random.randint(0, 10000) - process_queue = Queue() - p = Process(target=run_training, args=(i, run_seed, options, process_queue)) - jobs.append(p) - p.start() - # Wait for signal that environment has successfully launched - while process_queue.get() is not True: - continue - -# For python debugger to directly run this script -if __name__ == "__main__": - main() diff --git a/animalai_bkp/trainers/meta_curriculum.py b/animalai_bkp/trainers/meta_curriculum.py deleted file mode 100644 index f71e91e3..00000000 --- a/animalai_bkp/trainers/meta_curriculum.py +++ /dev/null @@ -1,147 +0,0 @@ -"""Contains the MetaCurriculum class.""" - -import os -from animalai.trainers.curriculum import Curriculum -from animalai.trainers.exception import MetaCurriculumError - -import logging - -logger = logging.getLogger('mlagents.trainers') - - -class MetaCurriculum(object): - """A MetaCurriculum holds curriculums. Each curriculum is associated to a - particular brain in the environment. - """ - - def __init__(self, curriculum_folder, default_reset_parameters): - """Initializes a MetaCurriculum object. - - Args: - curriculum_folder (str): The relative or absolute path of the - folder which holds the curriculums for this environment. - The folder should contain JSON files whose names are the - brains that the curriculums belong to. - default_reset_parameters (dict): The default reset parameters - of the environment. - """ - used_reset_parameters = set() - self._brains_to_curriculums = {} - - try: - for curriculum_filename in os.listdir(curriculum_folder): - brain_name = curriculum_filename.split('.')[0] - curriculum_filepath = \ - os.path.join(curriculum_folder, curriculum_filename) - curriculum = Curriculum(curriculum_filepath, - default_reset_parameters) - - # Check if any two curriculums use the same reset params. - if any([(parameter in curriculum.get_config().keys()) - for parameter in used_reset_parameters]): - logger.warning('Two or more curriculums will ' - 'attempt to change the same reset ' - 'parameter. The result will be ' - 'non-deterministic.') - - used_reset_parameters.update(curriculum.get_config().keys()) - self._brains_to_curriculums[brain_name] = curriculum - except NotADirectoryError: - raise MetaCurriculumError(curriculum_folder + ' is not a ' - 'directory. Refer to the ML-Agents ' - 'curriculum learning docs.') - - - @property - def brains_to_curriculums(self): - """A dict from brain_name to the brain's curriculum.""" - return self._brains_to_curriculums - - @property - def lesson_nums(self): - """A dict from brain name to the brain's curriculum's lesson number.""" - lesson_nums = {} - for brain_name, curriculum in self.brains_to_curriculums.items(): - lesson_nums[brain_name] = curriculum.lesson_num - - return lesson_nums - - @lesson_nums.setter - def lesson_nums(self, lesson_nums): - for brain_name, lesson in lesson_nums.items(): - self.brains_to_curriculums[brain_name].lesson_num = lesson - - def _lesson_ready_to_increment(self, brain_name, reward_buff_size): - """Determines whether the curriculum of a specified brain is ready - to attempt an increment. - - Args: - brain_name (str): The name of the brain whose curriculum will be - checked for readiness. - reward_buff_size (int): The size of the reward buffer of the trainer - that corresponds to the specified brain. - - Returns: - Whether the curriculum of the specified brain should attempt to - increment its lesson. - """ - return reward_buff_size >= (self.brains_to_curriculums[brain_name] - .min_lesson_length) - - def increment_lessons(self, measure_vals, reward_buff_sizes=None): - """Attempts to increments all the lessons of all the curriculums in this - MetaCurriculum. Note that calling this method does not guarantee the - lesson of a curriculum will increment. The lesson of a curriculum will - only increment if the specified measure threshold defined in the - curriculum has been reached and the minimum number of episodes in the - lesson have been completed. - - Args: - measure_vals (dict): A dict of brain name to measure value. - reward_buff_sizes (dict): A dict of brain names to the size of their - corresponding reward buffers. - - Returns: - A dict from brain name to whether that brain's lesson number was - incremented. - """ - ret = {} - if reward_buff_sizes: - for brain_name, buff_size in reward_buff_sizes.items(): - if self._lesson_ready_to_increment(brain_name, buff_size): - measure_val = measure_vals[brain_name] - ret[brain_name] = (self.brains_to_curriculums[brain_name] - .increment_lesson(measure_val)) - else: - for brain_name, measure_val in measure_vals.items(): - ret[brain_name] = (self.brains_to_curriculums[brain_name] - .increment_lesson(measure_val)) - return ret - - - def set_all_curriculums_to_lesson_num(self, lesson_num): - """Sets all the curriculums in this meta curriculum to a specified - lesson number. - - Args: - lesson_num (int): The lesson number which all the curriculums will - be set to. - """ - for _, curriculum in self.brains_to_curriculums.items(): - curriculum.lesson_num = lesson_num - - - def get_config(self): - """Get the combined configuration of all curriculums in this - MetaCurriculum. - - Returns: - A dict from parameter to value. - """ - config = {} - - for _, curriculum in self.brains_to_curriculums.items(): - curr_config = curriculum.get_config() - config.update(curr_config) - - return config diff --git a/animalai_bkp/trainers/models.py b/animalai_bkp/trainers/models.py deleted file mode 100644 index 66c6cd71..00000000 --- a/animalai_bkp/trainers/models.py +++ /dev/null @@ -1,380 +0,0 @@ -import logging - -import numpy as np -import tensorflow as tf -import tensorflow.contrib.layers as c_layers - -logger = logging.getLogger("mlagents.envs") - - -class LearningModel(object): - _version_number_ = 2 - - def __init__(self, m_size, normalize, use_recurrent, brain, seed): - tf.set_random_seed(seed) - self.brain = brain - self.vector_in = None - self.global_step, self.increment_step = self.create_global_steps() - self.visual_in = [] - self.batch_size = tf.placeholder(shape=None, dtype=tf.int32, name='batch_size') - self.sequence_length = tf.placeholder(shape=None, dtype=tf.int32, name='sequence_length') - self.mask_input = tf.placeholder(shape=[None], dtype=tf.float32, name='masks') - self.mask = tf.cast(self.mask_input, tf.int32) - self.use_recurrent = use_recurrent - if self.use_recurrent: - self.m_size = m_size - else: - self.m_size = 0 - self.normalize = normalize - self.act_size = brain.vector_action_space_size - self.vec_obs_size = brain.vector_observation_space_size * \ - brain.num_stacked_vector_observations - self.vis_obs_size = brain.number_visual_observations - tf.Variable(int(brain.vector_action_space_type == 'continuous'), - name='is_continuous_control', trainable=False, dtype=tf.int32) - tf.Variable(self._version_number_, name='version_number', trainable=False, dtype=tf.int32) - tf.Variable(self.m_size, name="memory_size", trainable=False, dtype=tf.int32) - if brain.vector_action_space_type == 'continuous': - tf.Variable(self.act_size[0], name="action_output_shape", trainable=False, dtype=tf.int32) - else: - tf.Variable(sum(self.act_size), name="action_output_shape", trainable=False, dtype=tf.int32) - - @staticmethod - def create_global_steps(): - """Creates TF ops to track and increment global training step.""" - global_step = tf.Variable(0, name="global_step", trainable=False, dtype=tf.int32) - increment_step = tf.assign(global_step, tf.add(global_step, 1)) - return global_step, increment_step - - @staticmethod - def swish(input_activation): - """Swish activation function. For more info: https://arxiv.org/abs/1710.05941""" - return tf.multiply(input_activation, tf.nn.sigmoid(input_activation)) - - @staticmethod - def create_visual_input(camera_parameters, name): - """ - Creates image input op. - :param camera_parameters: Parameters for visual observation from BrainInfo. - :param name: Desired name of input op. - :return: input op. - """ - o_size_h = camera_parameters['height'] - o_size_w = camera_parameters['width'] - bw = camera_parameters['blackAndWhite'] - - if bw: - c_channels = 1 - else: - c_channels = 3 - - visual_in = tf.placeholder(shape=[None, o_size_h, o_size_w, c_channels], dtype=tf.float32, - name=name) - return visual_in - - def create_vector_input(self, name='vector_observation'): - """ - Creates ops for vector observation input. - :param name: Name of the placeholder op. - :param vec_obs_size: Size of stacked vector observation. - :return: - """ - self.vector_in = tf.placeholder(shape=[None, self.vec_obs_size], dtype=tf.float32, - name=name) - if self.normalize: - self.running_mean = tf.get_variable("running_mean", [self.vec_obs_size], - trainable=False, dtype=tf.float32, - initializer=tf.zeros_initializer()) - self.running_variance = tf.get_variable("running_variance", [self.vec_obs_size], - trainable=False, - dtype=tf.float32, - initializer=tf.ones_initializer()) - self.update_mean, self.update_variance = self.create_normalizer_update(self.vector_in) - - self.normalized_state = tf.clip_by_value((self.vector_in - self.running_mean) / tf.sqrt( - self.running_variance / (tf.cast(self.global_step, tf.float32) + 1)), -5, 5, - name="normalized_state") - return self.normalized_state - else: - return self.vector_in - - def create_normalizer_update(self, vector_input): - mean_current_observation = tf.reduce_mean(vector_input, axis=0) - new_mean = self.running_mean + (mean_current_observation - self.running_mean) / \ - tf.cast(tf.add(self.global_step, 1), tf.float32) - new_variance = self.running_variance + (mean_current_observation - new_mean) * \ - (mean_current_observation - self.running_mean) - update_mean = tf.assign(self.running_mean, new_mean) - update_variance = tf.assign(self.running_variance, new_variance) - return update_mean, update_variance - - @staticmethod - def create_vector_observation_encoder(observation_input, h_size, activation, num_layers, scope, - reuse): - """ - Builds a set of hidden state encoders. - :param reuse: Whether to re-use the weights within the same scope. - :param scope: Graph scope for the encoder ops. - :param observation_input: Input vector. - :param h_size: Hidden layer size. - :param activation: What type of activation function to use for layers. - :param num_layers: number of hidden layers to create. - :return: List of hidden layer tensors. - """ - with tf.variable_scope(scope): - hidden = observation_input - for i in range(num_layers): - hidden = tf.layers.dense(hidden, h_size, activation=activation, reuse=reuse, - name="hidden_{}".format(i), - kernel_initializer=c_layers.variance_scaling_initializer( - 1.0)) - return hidden - - def create_visual_observation_encoder(self, image_input, h_size, activation, num_layers, scope, - reuse): - """ - Builds a set of visual (CNN) encoders. - :param reuse: Whether to re-use the weights within the same scope. - :param scope: The scope of the graph within which to create the ops. - :param image_input: The placeholder for the image input to use. - :param h_size: Hidden layer size. - :param activation: What type of activation function to use for layers. - :param num_layers: number of hidden layers to create. - :return: List of hidden layer tensors. - """ - with tf.variable_scope(scope): - conv1 = tf.layers.conv2d(image_input, 16, kernel_size=[8, 8], strides=[4, 4], - activation=tf.nn.elu, reuse=reuse, name="conv_1") - conv2 = tf.layers.conv2d(conv1, 32, kernel_size=[4, 4], strides=[2, 2], - activation=tf.nn.elu, reuse=reuse, name="conv_2") - hidden = c_layers.flatten(conv2) - - with tf.variable_scope(scope + '/' + 'flat_encoding'): - hidden_flat = self.create_vector_observation_encoder(hidden, h_size, activation, - num_layers, scope, reuse) - return hidden_flat - - @staticmethod - def create_discrete_action_masking_layer(all_logits, action_masks, action_size): - """ - Creates a masking layer for the discrete actions - :param all_logits: The concatenated unnormalized action probabilities for all branches - :param action_masks: The mask for the logits. Must be of dimension [None x total_number_of_action] - :param action_size: A list containing the number of possible actions for each branch - :return: The action output dimension [batch_size, num_branches] and the concatenated normalized logits - """ - action_idx = [0] + list(np.cumsum(action_size)) - branches_logits = [all_logits[:, action_idx[i]:action_idx[i + 1]] for i in range(len(action_size))] - branch_masks = [action_masks[:, action_idx[i]:action_idx[i + 1]] for i in range(len(action_size))] - raw_probs = [tf.multiply(tf.nn.softmax(branches_logits[k]) + 1.0e-10, branch_masks[k]) - for k in range(len(action_size))] - normalized_probs = [ - tf.divide(raw_probs[k], tf.reduce_sum(raw_probs[k], axis=1, keepdims=True)) - for k in range(len(action_size))] - output = tf.concat([tf.multinomial(tf.log(normalized_probs[k]), 1) for k in range(len(action_size))], axis=1) - return output, tf.concat([tf.log(normalized_probs[k] + 1.0e-10) for k in range(len(action_size))], axis=1) - - def create_observation_streams(self, num_streams, h_size, num_layers): - """ - Creates encoding stream for observations. - :param num_streams: Number of streams to create. - :param h_size: Size of hidden linear layers in stream. - :param num_layers: Number of hidden linear layers in stream. - :return: List of encoded streams. - """ - brain = self.brain - activation_fn = self.swish - - self.visual_in = [] - for i in range(brain.number_visual_observations): - visual_input = self.create_visual_input(brain.camera_resolutions[i], - name="visual_observation_" + str(i)) - self.visual_in.append(visual_input) - vector_observation_input = self.create_vector_input() - - final_hiddens = [] - for i in range(num_streams): - visual_encoders = [] - hidden_state, hidden_visual = None, None - if self.vis_obs_size > 0: - for j in range(brain.number_visual_observations): - encoded_visual = self.create_visual_observation_encoder(self.visual_in[j], - h_size, - activation_fn, - num_layers, - "main_graph_{}_encoder{}" - .format(i, j), False) - visual_encoders.append(encoded_visual) - hidden_visual = tf.concat(visual_encoders, axis=1) - if brain.vector_observation_space_size > 0: - hidden_state = self.create_vector_observation_encoder(vector_observation_input, - h_size, activation_fn, - num_layers, - "main_graph_{}".format(i), - False) - if hidden_state is not None and hidden_visual is not None: - final_hidden = tf.concat([hidden_visual, hidden_state], axis=1) - elif hidden_state is None and hidden_visual is not None: - final_hidden = hidden_visual - elif hidden_state is not None and hidden_visual is None: - final_hidden = hidden_state - else: - raise Exception("No valid network configuration possible. " - "There are no states or observations in this brain") - final_hiddens.append(final_hidden) - return final_hiddens - - @staticmethod - def create_recurrent_encoder(input_state, memory_in, sequence_length, name='lstm'): - """ - Builds a recurrent encoder for either state or observations (LSTM). - :param sequence_length: Length of sequence to unroll. - :param input_state: The input tensor to the LSTM cell. - :param memory_in: The input memory to the LSTM cell. - :param name: The scope of the LSTM cell. - """ - s_size = input_state.get_shape().as_list()[1] - m_size = memory_in.get_shape().as_list()[1] - lstm_input_state = tf.reshape(input_state, shape=[-1, sequence_length, s_size]) - memory_in = tf.reshape(memory_in[:, :], [-1, m_size]) - _half_point = int(m_size / 2) - with tf.variable_scope(name): - rnn_cell = tf.contrib.rnn.BasicLSTMCell(_half_point) - lstm_vector_in = tf.contrib.rnn.LSTMStateTuple(memory_in[:, :_half_point], - memory_in[:, _half_point:]) - recurrent_output, lstm_state_out = tf.nn.dynamic_rnn(rnn_cell, lstm_input_state, - initial_state=lstm_vector_in) - - recurrent_output = tf.reshape(recurrent_output, shape=[-1, _half_point]) - return recurrent_output, tf.concat([lstm_state_out.c, lstm_state_out.h], axis=1) - - def create_cc_actor_critic(self, h_size, num_layers): - """ - Creates Continuous control actor-critic model. - :param h_size: Size of hidden linear layers. - :param num_layers: Number of hidden linear layers. - """ - hidden_streams = self.create_observation_streams(2, h_size, num_layers) - - if self.use_recurrent: - self.memory_in = tf.placeholder(shape=[None, self.m_size], dtype=tf.float32, - name='recurrent_in') - _half_point = int(self.m_size / 2) - hidden_policy, memory_policy_out = self.create_recurrent_encoder( - hidden_streams[0], self.memory_in[:, :_half_point], self.sequence_length, - name='lstm_policy') - - hidden_value, memory_value_out = self.create_recurrent_encoder( - hidden_streams[1], self.memory_in[:, _half_point:], self.sequence_length, - name='lstm_value') - self.memory_out = tf.concat([memory_policy_out, memory_value_out], axis=1, - name='recurrent_out') - else: - hidden_policy = hidden_streams[0] - hidden_value = hidden_streams[1] - - mu = tf.layers.dense(hidden_policy, self.act_size[0], activation=None, - kernel_initializer=c_layers.variance_scaling_initializer(factor=0.01)) - - log_sigma_sq = tf.get_variable("log_sigma_squared", [self.act_size[0]], dtype=tf.float32, - initializer=tf.zeros_initializer()) - - sigma_sq = tf.exp(log_sigma_sq) - - self.epsilon = tf.placeholder(shape=[None, self.act_size[0]], dtype=tf.float32, name='epsilon') - # Clip and scale output to ensure actions are always within [-1, 1] range. - self.output_pre = mu + tf.sqrt(sigma_sq) * self.epsilon - output_post = tf.clip_by_value(self.output_pre, -3, 3) / 3 - self.output = tf.identity(output_post, name='action') - self.selected_actions = tf.stop_gradient(output_post) - - # Compute probability of model output. - all_probs = - 0.5 * tf.square(tf.stop_gradient(self.output_pre) - mu) / sigma_sq \ - - 0.5 * tf.log(2.0 * np.pi) - 0.5 * log_sigma_sq - - self.all_log_probs = tf.identity(all_probs, name='action_probs') - - self.entropy = 0.5 * tf.reduce_mean(tf.log(2 * np.pi * np.e) + log_sigma_sq) - - value = tf.layers.dense(hidden_value, 1, activation=None) - self.value = tf.identity(value, name="value_estimate") - - self.all_old_log_probs = tf.placeholder(shape=[None, self.act_size[0]], dtype=tf.float32, - name='old_probabilities') - - # We keep these tensors the same name, but use new nodes to keep code parallelism with discrete control. - self.log_probs = tf.reduce_sum((tf.identity(self.all_log_probs)), axis=1, keepdims=True) - self.old_log_probs = tf.reduce_sum((tf.identity(self.all_old_log_probs)), axis=1, - keepdims=True) - - def create_dc_actor_critic(self, h_size, num_layers): - """ - Creates Discrete control actor-critic model. - :param h_size: Size of hidden linear layers. - :param num_layers: Number of hidden linear layers. - """ - hidden_streams = self.create_observation_streams(1, h_size, num_layers) - hidden = hidden_streams[0] - - if self.use_recurrent: - self.prev_action = tf.placeholder(shape=[None, len(self.act_size)], dtype=tf.int32, - name='prev_action') - prev_action_oh = tf.concat([ - tf.one_hot(self.prev_action[:, i], self.act_size[i]) for i in - range(len(self.act_size))], axis=1) - hidden = tf.concat([hidden, prev_action_oh], axis=1) - - self.memory_in = tf.placeholder(shape=[None, self.m_size], dtype=tf.float32, - name='recurrent_in') - hidden, memory_out = self.create_recurrent_encoder(hidden, self.memory_in, - self.sequence_length) - self.memory_out = tf.identity(memory_out, name='recurrent_out') - - policy_branches = [] - for size in self.act_size: - policy_branches.append(tf.layers.dense(hidden, size, activation=None, use_bias=False, - kernel_initializer=c_layers.variance_scaling_initializer(factor=0.01))) - - self.all_log_probs = tf.concat([branch for branch in policy_branches], axis=1, name="action_probs") - - self.action_masks = tf.placeholder(shape=[None, sum(self.act_size)], dtype=tf.float32, name="action_masks") - output, normalized_logits = self.create_discrete_action_masking_layer( - self.all_log_probs, self.action_masks, self.act_size) - - self.output = tf.identity(output) - self.normalized_logits = tf.identity(normalized_logits, name='action') - - value = tf.layers.dense(hidden, 1, activation=None) - self.value = tf.identity(value, name="value_estimate") - - self.action_holder = tf.placeholder( - shape=[None, len(policy_branches)], dtype=tf.int32, name="action_holder") - self.action_oh = tf.concat([ - tf.one_hot(self.action_holder[:, i], self.act_size[i]) for i in range(len(self.act_size))], axis=1) - self.selected_actions = tf.stop_gradient(self.action_oh) - - self.all_old_log_probs = tf.placeholder( - shape=[None, sum(self.act_size)], dtype=tf.float32, name='old_probabilities') - _, old_normalized_logits = self.create_discrete_action_masking_layer( - self.all_old_log_probs, self.action_masks, self.act_size) - - action_idx = [0] + list(np.cumsum(self.act_size)) - - self.entropy = tf.reduce_sum((tf.stack([ - tf.nn.softmax_cross_entropy_with_logits_v2( - labels=tf.nn.softmax(self.all_log_probs[:, action_idx[i]:action_idx[i + 1]]), - logits=self.all_log_probs[:, action_idx[i]:action_idx[i + 1]]) - for i in range(len(self.act_size))], axis=1)), axis=1) - - self.log_probs = tf.reduce_sum((tf.stack([ - -tf.nn.softmax_cross_entropy_with_logits_v2( - labels=self.action_oh[:, action_idx[i]:action_idx[i + 1]], - logits=normalized_logits[:, action_idx[i]:action_idx[i + 1]] - ) - for i in range(len(self.act_size))], axis=1)), axis=1, keepdims=True) - self.old_log_probs = tf.reduce_sum((tf.stack([ - -tf.nn.softmax_cross_entropy_with_logits_v2( - labels=self.action_oh[:, action_idx[i]:action_idx[i + 1]], - logits=old_normalized_logits[:, action_idx[i]:action_idx[i + 1]] - ) - for i in range(len(self.act_size))], axis=1)), axis=1, keepdims=True) diff --git a/animalai_bkp/trainers/policy.py b/animalai_bkp/trainers/policy.py deleted file mode 100644 index ad18c501..00000000 --- a/animalai_bkp/trainers/policy.py +++ /dev/null @@ -1,212 +0,0 @@ -import logging -import numpy as np -import tensorflow as tf - -from animalai.trainers import UnityException -from tensorflow.python.tools import freeze_graph -from animalai.trainers import tensorflow_to_barracuda as tf2bc - -logger = logging.getLogger("mlagents.trainers") - - -class UnityPolicyException(UnityException): - """ - Related to errors with the Trainer. - """ - pass - - -class Policy(object): - """ - Contains a learning model, and the necessary - functions to interact with it to perform evaluate and updating. - """ - possible_output_nodes = ['action', 'value_estimate', - 'action_probs', 'recurrent_out', 'memory_size', - 'version_number', 'is_continuous_control', - 'action_output_shape'] - - def __init__(self, seed, brain, trainer_parameters): - """ - Initialized the policy. - :param seed: Random seed to use for TensorFlow. - :param brain: The corresponding Brain for this policy. - :param trainer_parameters: The trainer parameters. - """ - self.m_size = None - self.model = None - self.inference_dict = {} - self.update_dict = {} - self.sequence_length = 1 - self.seed = seed - self.brain = brain - self.use_recurrent = trainer_parameters["use_recurrent"] - self.use_continuous_act = (brain.vector_action_space_type == "continuous") - self.model_path = trainer_parameters["model_path"] - self.keep_checkpoints = trainer_parameters.get("keep_checkpoints", 5) - self.graph = tf.Graph() - config = tf.ConfigProto() - config.gpu_options.allow_growth = True - self.sess = tf.Session(config=config, graph=self.graph) - self.saver = None - if self.use_recurrent: - self.m_size = trainer_parameters["memory_size"] - self.sequence_length = trainer_parameters["sequence_length"] - if self.m_size == 0: - raise UnityPolicyException("The memory size for brain {0} is 0 even " - "though the trainer uses recurrent." - .format(brain.brain_name)) - elif self.m_size % 4 != 0: - raise UnityPolicyException("The memory size for brain {0} is {1} " - "but it must be divisible by 4." - .format(brain.brain_name, self.m_size)) - - def _initialize_graph(self): - with self.graph.as_default(): - self.saver = tf.train.Saver(max_to_keep=self.keep_checkpoints) - init = tf.global_variables_initializer() - self.sess.run(init) - - def _load_graph(self): - with self.graph.as_default(): - self.saver = tf.train.Saver(max_to_keep=self.keep_checkpoints) - logger.info('Loading Model for brain {}'.format(self.brain.brain_name)) - ckpt = tf.train.get_checkpoint_state(self.model_path) - if ckpt is None: - logger.info('The model {0} could not be found. Make ' - 'sure you specified the right ' - '--run-id' - .format(self.model_path)) - self.saver.restore(self.sess, ckpt.model_checkpoint_path) - - def evaluate(self, brain_info): - """ - Evaluates policy for the agent experiences provided. - :param brain_info: BrainInfo input to network. - :return: Output from policy based on self.inference_dict. - """ - raise UnityPolicyException("The evaluate function was not implemented.") - - def update(self, mini_batch, num_sequences): - """ - Performs update of the policy. - :param num_sequences: Number of experience trajectories in batch. - :param mini_batch: Batch of experiences. - :return: Results of update. - """ - raise UnityPolicyException("The update function was not implemented.") - - def _execute_model(self, feed_dict, out_dict): - """ - Executes model. - :param feed_dict: Input dictionary mapping nodes to input data. - :param out_dict: Output dictionary mapping names to nodes. - :return: Dictionary mapping names to input data. - """ - network_out = self.sess.run(list(out_dict.values()), feed_dict=feed_dict) - run_out = dict(zip(list(out_dict.keys()), network_out)) - return run_out - - def _fill_eval_dict(self, feed_dict, brain_info): - for i, _ in enumerate(brain_info.visual_observations): - feed_dict[self.model.visual_in[i]] = brain_info.visual_observations[i] - if self.use_vec_obs: - feed_dict[self.model.vector_in] = brain_info.vector_observations - if not self.use_continuous_act: - feed_dict[self.model.action_masks] = brain_info.action_masks - return feed_dict - - def make_empty_memory(self, num_agents): - """ - Creates empty memory for use with RNNs - :param num_agents: Number of agents. - :return: Numpy array of zeros. - """ - return np.zeros((num_agents, self.m_size)) - - def get_current_step(self): - """ - Gets current model step. - :return: current model step. - """ - step = self.sess.run(self.model.global_step) - return step - - def increment_step(self): - """ - Increments model step. - """ - self.sess.run(self.model.increment_step) - - def get_inference_vars(self): - """ - :return:list of inference var names - """ - return list(self.inference_dict.keys()) - - def get_update_vars(self): - """ - :return:list of update var names - """ - return list(self.update_dict.keys()) - - def save_model(self, steps): - """ - Saves the model - :param steps: The number of steps the model was trained for - :return: - """ - with self.graph.as_default(): - last_checkpoint = self.model_path + '/model-' + str(steps) + '.cptk' - self.saver.save(self.sess, last_checkpoint) - tf.train.write_graph(self.graph, self.model_path, - 'raw_graph_def.pb', as_text=False) - - def export_model(self): - """ - Exports latest saved model to .nn format for Unity embedding. - """ - - with self.graph.as_default(): - target_nodes = ','.join(self._process_graph()) - ckpt = tf.train.get_checkpoint_state(self.model_path) - freeze_graph.freeze_graph( - input_graph=self.model_path + '/raw_graph_def.pb', - input_binary=True, - input_checkpoint=ckpt.model_checkpoint_path, - output_node_names=target_nodes, - output_graph=(self.model_path + '/frozen_graph_def.pb'), - clear_devices=True, initializer_nodes='', input_saver='', - restore_op_name='save/restore_all', - filename_tensor_name='save/Const:0') - - tf2bc.convert(self.model_path + '/frozen_graph_def.pb', self.model_path + '.nn') - logger.info('Exported ' + self.model_path + '.nn file') - - def _process_graph(self): - """ - Gets the list of the output nodes present in the graph for inference - :return: list of node names - """ - all_nodes = [x.name for x in self.graph.as_graph_def().node] - nodes = [x for x in all_nodes if x in self.possible_output_nodes] - logger.info('List of nodes to export for brain :' + self.brain.brain_name) - for n in nodes: - logger.info('\t' + n) - return nodes - - @property - def vis_obs_size(self): - return self.model.vis_obs_size - - @property - def vec_obs_size(self): - return self.model.vec_obs_size - - @property - def use_vis_obs(self): - return self.model.vis_obs_size > 0 - - @property - def use_vec_obs(self): - return self.model.vec_obs_size > 0 diff --git a/animalai_bkp/trainers/ppo/__init__.py b/animalai_bkp/trainers/ppo/__init__.py deleted file mode 100644 index d48a8ccf..00000000 --- a/animalai_bkp/trainers/ppo/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .models import * -from .trainer import * -from .policy import * diff --git a/animalai_bkp/trainers/ppo/models.py b/animalai_bkp/trainers/ppo/models.py deleted file mode 100644 index cb1546cd..00000000 --- a/animalai_bkp/trainers/ppo/models.py +++ /dev/null @@ -1,195 +0,0 @@ -import logging -import numpy as np - -import tensorflow as tf -from animalai.trainers.models import LearningModel - -logger = logging.getLogger("mlagents.envs") - - -class PPOModel(LearningModel): - def __init__(self, brain, lr=1e-4, h_size=128, epsilon=0.2, beta=1e-3, max_step=5e6, - normalize=False, use_recurrent=False, num_layers=2, m_size=None, use_curiosity=False, - curiosity_strength=0.01, curiosity_enc_size=128, seed=0): - """ - Takes a Unity environment and model-specific hyper-parameters and returns the - appropriate PPO agent model for the environment. - :param brain: BrainInfo used to generate specific network graph. - :param lr: Learning rate. - :param h_size: Size of hidden layers - :param epsilon: Value for policy-divergence threshold. - :param beta: Strength of entropy regularization. - :return: a sub-class of PPOAgent tailored to the environment. - :param max_step: Total number of training steps. - :param normalize: Whether to normalize vector observation input. - :param use_recurrent: Whether to use an LSTM layer in the network. - :param num_layers Number of hidden layers between encoded input and policy & value layers - :param m_size: Size of brain memory. - """ - LearningModel.__init__(self, m_size, normalize, use_recurrent, brain, seed) - self.use_curiosity = use_curiosity - if num_layers < 1: - num_layers = 1 - self.last_reward, self.new_reward, self.update_reward = self.create_reward_encoder() - if brain.vector_action_space_type == "continuous": - self.create_cc_actor_critic(h_size, num_layers) - self.entropy = tf.ones_like(tf.reshape(self.value, [-1])) * self.entropy - else: - self.create_dc_actor_critic(h_size, num_layers) - if self.use_curiosity: - self.curiosity_enc_size = curiosity_enc_size - self.curiosity_strength = curiosity_strength - encoded_state, encoded_next_state = self.create_curiosity_encoders() - self.create_inverse_model(encoded_state, encoded_next_state) - self.create_forward_model(encoded_state, encoded_next_state) - self.create_ppo_optimizer(self.log_probs, self.old_log_probs, self.value, - self.entropy, beta, epsilon, lr, max_step) - - @staticmethod - def create_reward_encoder(): - """Creates TF ops to track and increment recent average cumulative reward.""" - last_reward = tf.Variable(0, name="last_reward", trainable=False, dtype=tf.float32) - new_reward = tf.placeholder(shape=[], dtype=tf.float32, name='new_reward') - update_reward = tf.assign(last_reward, new_reward) - return last_reward, new_reward, update_reward - - def create_curiosity_encoders(self): - """ - Creates state encoders for current and future observations. - Used for implementation of Curiosity-driven Exploration by Self-supervised Prediction - See https://arxiv.org/abs/1705.05363 for more details. - :return: current and future state encoder tensors. - """ - encoded_state_list = [] - encoded_next_state_list = [] - - if self.vis_obs_size > 0: - self.next_visual_in = [] - visual_encoders = [] - next_visual_encoders = [] - for i in range(self.vis_obs_size): - # Create input ops for next (t+1) visual observations. - next_visual_input = self.create_visual_input(self.brain.camera_resolutions[i], - name="next_visual_observation_" + str(i)) - self.next_visual_in.append(next_visual_input) - - # Create the encoder ops for current and next visual input. Not that these encoders are siamese. - encoded_visual = self.create_visual_observation_encoder(self.visual_in[i], self.curiosity_enc_size, - self.swish, 1, "stream_{}_visual_obs_encoder" - .format(i), False) - - encoded_next_visual = self.create_visual_observation_encoder(self.next_visual_in[i], - self.curiosity_enc_size, - self.swish, 1, - "stream_{}_visual_obs_encoder".format(i), - True) - visual_encoders.append(encoded_visual) - next_visual_encoders.append(encoded_next_visual) - - hidden_visual = tf.concat(visual_encoders, axis=1) - hidden_next_visual = tf.concat(next_visual_encoders, axis=1) - encoded_state_list.append(hidden_visual) - encoded_next_state_list.append(hidden_next_visual) - - if self.vec_obs_size > 0: - # Create the encoder ops for current and next vector input. Not that these encoders are siamese. - # Create input op for next (t+1) vector observation. - self.next_vector_in = tf.placeholder(shape=[None, self.vec_obs_size], dtype=tf.float32, - name='next_vector_observation') - - encoded_vector_obs = self.create_vector_observation_encoder(self.vector_in, - self.curiosity_enc_size, - self.swish, 2, "vector_obs_encoder", - False) - encoded_next_vector_obs = self.create_vector_observation_encoder(self.next_vector_in, - self.curiosity_enc_size, - self.swish, 2, - "vector_obs_encoder", - True) - encoded_state_list.append(encoded_vector_obs) - encoded_next_state_list.append(encoded_next_vector_obs) - - encoded_state = tf.concat(encoded_state_list, axis=1) - encoded_next_state = tf.concat(encoded_next_state_list, axis=1) - return encoded_state, encoded_next_state - - def create_inverse_model(self, encoded_state, encoded_next_state): - """ - Creates inverse model TensorFlow ops for Curiosity module. - Predicts action taken given current and future encoded states. - :param encoded_state: Tensor corresponding to encoded current state. - :param encoded_next_state: Tensor corresponding to encoded next state. - """ - combined_input = tf.concat([encoded_state, encoded_next_state], axis=1) - hidden = tf.layers.dense(combined_input, 256, activation=self.swish) - if self.brain.vector_action_space_type == "continuous": - pred_action = tf.layers.dense(hidden, self.act_size[0], activation=None) - squared_difference = tf.reduce_sum(tf.squared_difference(pred_action, self.selected_actions), axis=1) - self.inverse_loss = tf.reduce_mean(tf.dynamic_partition(squared_difference, self.mask, 2)[1]) - else: - pred_action = tf.concat( - [tf.layers.dense(hidden, self.act_size[i], activation=tf.nn.softmax) - for i in range(len(self.act_size))], axis=1) - cross_entropy = tf.reduce_sum(-tf.log(pred_action + 1e-10) * self.selected_actions, axis=1) - self.inverse_loss = tf.reduce_mean(tf.dynamic_partition(cross_entropy, self.mask, 2)[1]) - - def create_forward_model(self, encoded_state, encoded_next_state): - """ - Creates forward model TensorFlow ops for Curiosity module. - Predicts encoded future state based on encoded current state and given action. - :param encoded_state: Tensor corresponding to encoded current state. - :param encoded_next_state: Tensor corresponding to encoded next state. - """ - combined_input = tf.concat([encoded_state, self.selected_actions], axis=1) - hidden = tf.layers.dense(combined_input, 256, activation=self.swish) - # We compare against the concatenation of all observation streams, hence `self.vis_obs_size + int(self.vec_obs_size > 0)`. - pred_next_state = tf.layers.dense(hidden, self.curiosity_enc_size * (self.vis_obs_size + int(self.vec_obs_size > 0)), - activation=None) - - squared_difference = 0.5 * tf.reduce_sum(tf.squared_difference(pred_next_state, encoded_next_state), axis=1) - self.intrinsic_reward = tf.clip_by_value(self.curiosity_strength * squared_difference, 0, 1) - self.forward_loss = tf.reduce_mean(tf.dynamic_partition(squared_difference, self.mask, 2)[1]) - - def create_ppo_optimizer(self, probs, old_probs, value, entropy, beta, epsilon, lr, max_step): - """ - Creates training-specific Tensorflow ops for PPO models. - :param probs: Current policy probabilities - :param old_probs: Past policy probabilities - :param value: Current value estimate - :param beta: Entropy regularization strength - :param entropy: Current policy entropy - :param epsilon: Value for policy-divergence threshold - :param lr: Learning rate - :param max_step: Total number of training steps. - """ - self.returns_holder = tf.placeholder(shape=[None], dtype=tf.float32, name='discounted_rewards') - self.advantage = tf.placeholder(shape=[None, 1], dtype=tf.float32, name='advantages') - self.learning_rate = tf.train.polynomial_decay(lr, self.global_step, max_step, 1e-10, power=1.0) - - self.old_value = tf.placeholder(shape=[None], dtype=tf.float32, name='old_value_estimates') - - decay_epsilon = tf.train.polynomial_decay(epsilon, self.global_step, max_step, 0.1, power=1.0) - decay_beta = tf.train.polynomial_decay(beta, self.global_step, max_step, 1e-5, power=1.0) - optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate) - - clipped_value_estimate = self.old_value + tf.clip_by_value(tf.reduce_sum(value, axis=1) - self.old_value, - - decay_epsilon, decay_epsilon) - - v_opt_a = tf.squared_difference(self.returns_holder, tf.reduce_sum(value, axis=1)) - v_opt_b = tf.squared_difference(self.returns_holder, clipped_value_estimate) - self.value_loss = tf.reduce_mean(tf.dynamic_partition(tf.maximum(v_opt_a, v_opt_b), self.mask, 2)[1]) - - # Here we calculate PPO policy loss. In continuous control this is done independently for each action gaussian - # and then averaged together. This provides significantly better performance than treating the probability - # as an average of probabilities, or as a joint probability. - r_theta = tf.exp(probs - old_probs) - p_opt_a = r_theta * self.advantage - p_opt_b = tf.clip_by_value(r_theta, 1.0 - decay_epsilon, 1.0 + decay_epsilon) * self.advantage - self.policy_loss = -tf.reduce_mean(tf.dynamic_partition(tf.minimum(p_opt_a, p_opt_b), self.mask, 2)[1]) - - self.loss = self.policy_loss + 0.5 * self.value_loss - decay_beta * tf.reduce_mean( - tf.dynamic_partition(entropy, self.mask, 2)[1]) - - if self.use_curiosity: - self.loss += 10 * (0.2 * self.forward_loss + 0.8 * self.inverse_loss) - self.update_batch = optimizer.minimize(self.loss) diff --git a/animalai_bkp/trainers/ppo/policy.py b/animalai_bkp/trainers/ppo/policy.py deleted file mode 100644 index 925043e4..00000000 --- a/animalai_bkp/trainers/ppo/policy.py +++ /dev/null @@ -1,214 +0,0 @@ -import logging -import numpy as np - -from animalai.trainers.ppo.models import PPOModel -from animalai.trainers.policy import Policy - -logger = logging.getLogger("mlagents.trainers") - - -class PPOPolicy(Policy): - def __init__(self, seed, brain, trainer_params, is_training, load): - """ - Policy for Proximal Policy Optimization Networks. - :param seed: Random seed. - :param brain: Assigned Brain object. - :param trainer_params: Defined training parameters. - :param is_training: Whether the model should be trained. - :param load: Whether a pre-trained model will be loaded or a new one created. - """ - super().__init__(seed, brain, trainer_params) - self.has_updated = False - self.use_curiosity = bool(trainer_params['use_curiosity']) - - with self.graph.as_default(): - self.model = PPOModel(brain, - lr=float(trainer_params['learning_rate']), - h_size=int(trainer_params['hidden_units']), - epsilon=float(trainer_params['epsilon']), - beta=float(trainer_params['beta']), - max_step=float(trainer_params['max_steps']), - normalize=trainer_params['normalize'], - use_recurrent=trainer_params['use_recurrent'], - num_layers=int(trainer_params['num_layers']), - m_size=self.m_size, - use_curiosity=bool(trainer_params['use_curiosity']), - curiosity_strength=float(trainer_params['curiosity_strength']), - curiosity_enc_size=float(trainer_params['curiosity_enc_size']), - seed=seed) - - if load: - self._load_graph() - else: - self._initialize_graph() - - self.inference_dict = {'action': self.model.output, 'log_probs': self.model.all_log_probs, - 'value': self.model.value, 'entropy': self.model.entropy, - 'learning_rate': self.model.learning_rate} - if self.use_continuous_act: - self.inference_dict['pre_action'] = self.model.output_pre - if self.use_recurrent: - self.inference_dict['memory_out'] = self.model.memory_out - if is_training and self.use_vec_obs and trainer_params['normalize']: - self.inference_dict['update_mean'] = self.model.update_mean - self.inference_dict['update_variance'] = self.model.update_variance - - self.update_dict = {'value_loss': self.model.value_loss, - 'policy_loss': self.model.policy_loss, - 'update_batch': self.model.update_batch} - if self.use_curiosity: - self.update_dict['forward_loss'] = self.model.forward_loss - self.update_dict['inverse_loss'] = self.model.inverse_loss - - def evaluate(self, brain_info): - """ - Evaluates policy for the agent experiences provided. - :param brain_info: BrainInfo object containing inputs. - :return: Outputs from network as defined by self.inference_dict. - """ - feed_dict = {self.model.batch_size: len(brain_info.vector_observations), - self.model.sequence_length: 1} - epsilon = None - if self.use_recurrent: - if not self.use_continuous_act: - feed_dict[self.model.prev_action] = brain_info.previous_vector_actions.reshape( - [-1, len(self.model.act_size)]) - if brain_info.memories.shape[1] == 0: - brain_info.memories = self.make_empty_memory(len(brain_info.agents)) - feed_dict[self.model.memory_in] = brain_info.memories - if self.use_continuous_act: - epsilon = np.random.normal( - size=(len(brain_info.vector_observations), self.model.act_size[0])) - feed_dict[self.model.epsilon] = epsilon - feed_dict = self._fill_eval_dict(feed_dict, brain_info) - run_out = self._execute_model(feed_dict, self.inference_dict) - if self.use_continuous_act: - run_out['random_normal_epsilon'] = epsilon - return run_out - - def update(self, mini_batch, num_sequences): - """ - Updates model using buffer. - :param num_sequences: Number of trajectories in batch. - :param mini_batch: Experience batch. - :return: Output from update process. - """ - feed_dict = {self.model.batch_size: num_sequences, - self.model.sequence_length: self.sequence_length, - self.model.mask_input: mini_batch['masks'].flatten(), - self.model.returns_holder: mini_batch['discounted_returns'].flatten(), - self.model.old_value: mini_batch['value_estimates'].flatten(), - self.model.advantage: mini_batch['advantages'].reshape([-1, 1]), - self.model.all_old_log_probs: mini_batch['action_probs'].reshape( - [-1, sum(self.model.act_size)])} - if self.use_continuous_act: - feed_dict[self.model.output_pre] = mini_batch['actions_pre'].reshape( - [-1, self.model.act_size[0]]) - feed_dict[self.model.epsilon] = mini_batch['random_normal_epsilon'].reshape( - [-1, self.model.act_size[0]]) - else: - feed_dict[self.model.action_holder] = mini_batch['actions'].reshape( - [-1, len(self.model.act_size)]) - if self.use_recurrent: - feed_dict[self.model.prev_action] = mini_batch['prev_action'].reshape( - [-1, len(self.model.act_size)]) - feed_dict[self.model.action_masks] = mini_batch['action_mask'].reshape( - [-1, sum(self.brain.vector_action_space_size)]) - if self.use_vec_obs: - feed_dict[self.model.vector_in] = mini_batch['vector_obs'].reshape( - [-1, self.vec_obs_size]) - if self.use_curiosity: - feed_dict[self.model.next_vector_in] = mini_batch['next_vector_in'].reshape( - [-1, self.vec_obs_size]) - if self.model.vis_obs_size > 0: - for i, _ in enumerate(self.model.visual_in): - _obs = mini_batch['visual_obs%d' % i] - if self.sequence_length > 1 and self.use_recurrent: - (_batch, _seq, _w, _h, _c) = _obs.shape - feed_dict[self.model.visual_in[i]] = _obs.reshape([-1, _w, _h, _c]) - else: - feed_dict[self.model.visual_in[i]] = _obs - if self.use_curiosity: - for i, _ in enumerate(self.model.visual_in): - _obs = mini_batch['next_visual_obs%d' % i] - if self.sequence_length > 1 and self.use_recurrent: - (_batch, _seq, _w, _h, _c) = _obs.shape - feed_dict[self.model.next_visual_in[i]] = _obs.reshape([-1, _w, _h, _c]) - else: - feed_dict[self.model.next_visual_in[i]] = _obs - if self.use_recurrent: - mem_in = mini_batch['memory'][:, 0, :] - feed_dict[self.model.memory_in] = mem_in - self.has_updated = True - run_out = self._execute_model(feed_dict, self.update_dict) - return run_out - - def get_intrinsic_rewards(self, curr_info, next_info): - """ - Generates intrinsic reward used for Curiosity-based training. - :BrainInfo curr_info: Current BrainInfo. - :BrainInfo next_info: Next BrainInfo. - :return: Intrinsic rewards for all agents. - """ - if self.use_curiosity: - if len(curr_info.agents) == 0: - return [] - - feed_dict = {self.model.batch_size: len(next_info.vector_observations), - self.model.sequence_length: 1} - if self.use_continuous_act: - feed_dict[self.model.selected_actions] = next_info.previous_vector_actions - else: - feed_dict[self.model.action_holder] = next_info.previous_vector_actions - for i in range(self.model.vis_obs_size): - feed_dict[self.model.visual_in[i]] = curr_info.visual_observations[i] - feed_dict[self.model.next_visual_in[i]] = next_info.visual_observations[i] - if self.use_vec_obs: - feed_dict[self.model.vector_in] = curr_info.vector_observations - feed_dict[self.model.next_vector_in] = next_info.vector_observations - if self.use_recurrent: - if curr_info.memories.shape[1] == 0: - curr_info.memories = self.make_empty_memory(len(curr_info.agents)) - feed_dict[self.model.memory_in] = curr_info.memories - intrinsic_rewards = self.sess.run(self.model.intrinsic_reward, - feed_dict=feed_dict) * float(self.has_updated) - return intrinsic_rewards - else: - return None - - def get_value_estimate(self, brain_info, idx): - """ - Generates value estimates for bootstrapping. - :param brain_info: BrainInfo to be used for bootstrapping. - :param idx: Index in BrainInfo of agent. - :return: Value estimate. - """ - feed_dict = {self.model.batch_size: 1, self.model.sequence_length: 1} - for i in range(len(brain_info.visual_observations)): - feed_dict[self.model.visual_in[i]] = [brain_info.visual_observations[i][idx]] - if self.use_vec_obs: - feed_dict[self.model.vector_in] = [brain_info.vector_observations[idx]] - if self.use_recurrent: - if brain_info.memories.shape[1] == 0: - brain_info.memories = self.make_empty_memory(len(brain_info.agents)) - feed_dict[self.model.memory_in] = [brain_info.memories[idx]] - if not self.use_continuous_act and self.use_recurrent: - feed_dict[self.model.prev_action] = brain_info.previous_vector_actions[idx].reshape( - [-1, len(self.model.act_size)]) - value_estimate = self.sess.run(self.model.value, feed_dict) - return value_estimate - - def get_last_reward(self): - """ - Returns the last reward the trainer has had - :return: the new last reward - """ - return self.sess.run(self.model.last_reward) - - def update_reward(self, new_reward): - """ - Updates reward value for policy. - :param new_reward: New reward to save. - """ - self.sess.run(self.model.update_reward, - feed_dict={self.model.new_reward: new_reward}) diff --git a/animalai_bkp/trainers/ppo/trainer.py b/animalai_bkp/trainers/ppo/trainer.py deleted file mode 100644 index f5b4b422..00000000 --- a/animalai_bkp/trainers/ppo/trainer.py +++ /dev/null @@ -1,386 +0,0 @@ -# # Unity ML-Agents Toolkit -# ## ML-Agent Learning (PPO) -# Contains an implementation of PPO as described (https://arxiv.org/abs/1707.06347). - -import logging -import os -from collections import deque - -import numpy as np -import tensorflow as tf - -from animalai.envs import AllBrainInfo, BrainInfo -from animalai.trainers.buffer import Buffer -from animalai.trainers.ppo.policy import PPOPolicy -from animalai.trainers.trainer import Trainer - -logger = logging.getLogger("mlagents.trainers") - - -class PPOTrainer(Trainer): - """The PPOTrainer is an implementation of the PPO algorithm.""" - - def __init__(self, brain, reward_buff_cap, trainer_parameters, training, load, seed, run_id): - """ - Responsible for collecting experiences and training PPO model. - :param trainer_parameters: The parameters for the trainer (dictionary). - :param training: Whether the trainer is set for training. - :param load: Whether the model should be loaded. - :param seed: The seed the model will be initialized with - :param run_id: The The identifier of the current run - """ - super(PPOTrainer, self).__init__(brain, trainer_parameters, training, run_id) - self.param_keys = ['batch_size', 'beta', 'buffer_size', 'epsilon', 'gamma', 'hidden_units', 'lambd', - 'learning_rate', 'max_steps', 'normalize', 'num_epoch', 'num_layers', - 'time_horizon', 'sequence_length', 'summary_freq', 'use_recurrent', - 'summary_path', 'memory_size', 'use_curiosity', 'curiosity_strength', - 'curiosity_enc_size', 'model_path'] - - self.check_param_keys() - self.use_curiosity = bool(trainer_parameters['use_curiosity']) - self.step = 0 - self.policy = PPOPolicy(seed, brain, trainer_parameters, - self.is_training, load) - - stats = {'Environment/Cumulative Reward': [], 'Environment/Episode Length': [], - 'Policy/Value Estimate': [], 'Policy/Entropy': [], 'Losses/Value Loss': [], - 'Losses/Policy Loss': [], 'Policy/Learning Rate': []} - if self.use_curiosity: - stats['Losses/Forward Loss'] = [] - stats['Losses/Inverse Loss'] = [] - stats['Policy/Curiosity Reward'] = [] - self.intrinsic_rewards = {} - self.stats = stats - - self.training_buffer = Buffer() - self.cumulative_rewards = {} - self._reward_buffer = deque(maxlen=reward_buff_cap) - self.episode_steps = {} - self.summary_path = trainer_parameters['summary_path'] - if not os.path.exists(self.summary_path): - os.makedirs(self.summary_path) - - self.summary_writer = tf.summary.FileWriter(self.summary_path) - - def __str__(self): - return '''Hyperparameters for the PPO Trainer of brain {0}: \n{1}'''.format( - self.brain_name, '\n'.join(['\t{0}:\t{1}'.format(x, self.trainer_parameters[x]) for x in self.param_keys])) - - @property - def parameters(self): - """ - Returns the trainer parameters of the trainer. - """ - return self.trainer_parameters - - @property - def get_max_steps(self): - """ - Returns the maximum number of steps. Is used to know when the trainer should be stopped. - :return: The maximum number of steps of the trainer - """ - return float(self.trainer_parameters['max_steps']) - - @property - def get_step(self): - """ - Returns the number of steps the trainer has performed - :return: the step count of the trainer - """ - return self.step - - @property - def reward_buffer(self): - """ - Returns the reward buffer. The reward buffer contains the cumulative - rewards of the most recent episodes completed by agents using this - trainer. - :return: the reward buffer. - """ - return self._reward_buffer - - def increment_step_and_update_last_reward(self): - """ - Increment the step count of the trainer and Updates the last reward - """ - if len(self.stats['Environment/Cumulative Reward']) > 0: - mean_reward = np.mean(self.stats['Environment/Cumulative Reward']) - self.policy.update_reward(mean_reward) - self.policy.increment_step() - self.step = self.policy.get_current_step() - - def take_action(self, all_brain_info: AllBrainInfo): - """ - Decides actions given observations information, and takes them in environment. - :param all_brain_info: A dictionary of brain names and BrainInfo from environment. - :return: a tuple containing action, memories, values and an object - to be passed to add experiences - """ - curr_brain_info = all_brain_info[self.brain_name] - if len(curr_brain_info.agents) == 0: - return [], [], [], None, None - - run_out = self.policy.evaluate(curr_brain_info) - self.stats['Policy/Value Estimate'].append(run_out['value'].mean()) - self.stats['Policy/Entropy'].append(run_out['entropy'].mean()) - self.stats['Policy/Learning Rate'].append(run_out['learning_rate']) - if self.policy.use_recurrent: - return run_out['action'], run_out['memory_out'], None, \ - run_out['value'], run_out - else: - return run_out['action'], None, None, run_out['value'], run_out - - def construct_curr_info(self, next_info: BrainInfo) -> BrainInfo: - """ - Constructs a BrainInfo which contains the most recent previous experiences for all agents info - which correspond to the agents in a provided next_info. - :BrainInfo next_info: A t+1 BrainInfo. - :return: curr_info: Reconstructed BrainInfo to match agents of next_info. - """ - visual_observations = [[]] - vector_observations = [] - text_observations = [] - memories = [] - rewards = [] - local_dones = [] - max_reacheds = [] - agents = [] - prev_vector_actions = [] - prev_text_actions = [] - for agent_id in next_info.agents: - agent_brain_info = self.training_buffer[agent_id].last_brain_info - if agent_brain_info is None: - agent_brain_info = next_info - agent_index = agent_brain_info.agents.index(agent_id) - for i in range(len(next_info.visual_observations)): - visual_observations[i].append(agent_brain_info.visual_observations[i][agent_index]) - vector_observations.append(agent_brain_info.vector_observations[agent_index]) - text_observations.append(agent_brain_info.text_observations[agent_index]) - if self.policy.use_recurrent: - if len(agent_brain_info.memories > 0): - memories.append(agent_brain_info.memories[agent_index]) - else: - memories.append(self.policy.make_empty_memory(1)) - rewards.append(agent_brain_info.rewards[agent_index]) - local_dones.append(agent_brain_info.local_done[agent_index]) - max_reacheds.append(agent_brain_info.max_reached[agent_index]) - agents.append(agent_brain_info.agents[agent_index]) - prev_vector_actions.append(agent_brain_info.previous_vector_actions[agent_index]) - prev_text_actions.append(agent_brain_info.previous_text_actions[agent_index]) - if self.policy.use_recurrent: - memories = np.vstack(memories) - curr_info = BrainInfo(visual_observations, vector_observations, text_observations, - memories, rewards, agents, local_dones, prev_vector_actions, - prev_text_actions, max_reacheds) - return curr_info - - def add_experiences(self, curr_all_info: AllBrainInfo, next_all_info: AllBrainInfo, take_action_outputs): - """ - Adds experiences to each agent's experience history. - :param curr_all_info: Dictionary of all current brains and corresponding BrainInfo. - :param next_all_info: Dictionary of all current brains and corresponding BrainInfo. - :param take_action_outputs: The outputs of the take action method. - """ - curr_info = curr_all_info[self.brain_name] - next_info = next_all_info[self.brain_name] - - for agent_id in curr_info.agents: - self.training_buffer[agent_id].last_brain_info = curr_info - self.training_buffer[agent_id].last_take_action_outputs = take_action_outputs - - if curr_info.agents != next_info.agents: - curr_to_use = self.construct_curr_info(next_info) - else: - curr_to_use = curr_info - - intrinsic_rewards = self.policy.get_intrinsic_rewards(curr_to_use, next_info) - - for agent_id in next_info.agents: - stored_info = self.training_buffer[agent_id].last_brain_info - stored_take_action_outputs = self.training_buffer[agent_id].last_take_action_outputs - if stored_info is not None: - idx = stored_info.agents.index(agent_id) - next_idx = next_info.agents.index(agent_id) - if not stored_info.local_done[idx]: - for i, _ in enumerate(stored_info.visual_observations): - self.training_buffer[agent_id]['visual_obs%d' % i].append( - stored_info.visual_observations[i][idx]) - self.training_buffer[agent_id]['next_visual_obs%d' % i].append( - next_info.visual_observations[i][next_idx]) - if self.policy.use_vec_obs: - self.training_buffer[agent_id]['vector_obs'].append(stored_info.vector_observations[idx]) - self.training_buffer[agent_id]['next_vector_in'].append( - next_info.vector_observations[next_idx]) - if self.policy.use_recurrent: - if stored_info.memories.shape[1] == 0: - stored_info.memories = np.zeros((len(stored_info.agents), self.policy.m_size)) - self.training_buffer[agent_id]['memory'].append(stored_info.memories[idx]) - actions = stored_take_action_outputs['action'] - if self.policy.use_continuous_act: - actions_pre = stored_take_action_outputs['pre_action'] - self.training_buffer[agent_id]['actions_pre'].append(actions_pre[idx]) - epsilons = stored_take_action_outputs['random_normal_epsilon'] - self.training_buffer[agent_id]['random_normal_epsilon'].append( - epsilons[idx]) - else: - self.training_buffer[agent_id]['action_mask'].append( - stored_info.action_masks[idx], padding_value=1) - a_dist = stored_take_action_outputs['log_probs'] - value = stored_take_action_outputs['value'] - self.training_buffer[agent_id]['actions'].append(actions[idx]) - self.training_buffer[agent_id]['prev_action'].append(stored_info.previous_vector_actions[idx]) - self.training_buffer[agent_id]['masks'].append(1.0) - if self.use_curiosity: - self.training_buffer[agent_id]['rewards'].append(next_info.rewards[next_idx] + - intrinsic_rewards[next_idx]) - else: - self.training_buffer[agent_id]['rewards'].append(next_info.rewards[next_idx]) - self.training_buffer[agent_id]['action_probs'].append(a_dist[idx]) - self.training_buffer[agent_id]['value_estimates'].append(value[idx][0]) - if agent_id not in self.cumulative_rewards: - self.cumulative_rewards[agent_id] = 0 - self.cumulative_rewards[agent_id] += next_info.rewards[next_idx] - if self.use_curiosity: - if agent_id not in self.intrinsic_rewards: - self.intrinsic_rewards[agent_id] = 0 - self.intrinsic_rewards[agent_id] += intrinsic_rewards[next_idx] - if not next_info.local_done[next_idx]: - if agent_id not in self.episode_steps: - self.episode_steps[agent_id] = 0 - self.episode_steps[agent_id] += 1 - - def process_experiences(self, current_info: AllBrainInfo, new_info: AllBrainInfo): - """ - Checks agent histories for processing condition, and processes them as necessary. - Processing involves calculating value and advantage targets for model updating step. - :param current_info: Dictionary of all current brains and corresponding BrainInfo. - :param new_info: Dictionary of all next brains and corresponding BrainInfo. - """ - - info = new_info[self.brain_name] - for l in range(len(info.agents)): - agent_actions = self.training_buffer[info.agents[l]]['actions'] - if ((info.local_done[l] or len(agent_actions) > self.trainer_parameters['time_horizon']) - and len(agent_actions) > 0): - agent_id = info.agents[l] - if info.local_done[l] and not info.max_reached[l]: - value_next = 0.0 - else: - if info.max_reached[l]: - bootstrapping_info = self.training_buffer[agent_id].last_brain_info - idx = bootstrapping_info.agents.index(agent_id) - else: - bootstrapping_info = info - idx = l - value_next = self.policy.get_value_estimate(bootstrapping_info, idx) - - self.training_buffer[agent_id]['advantages'].set( - get_gae( - rewards=self.training_buffer[agent_id]['rewards'].get_batch(), - value_estimates=self.training_buffer[agent_id]['value_estimates'].get_batch(), - value_next=value_next, - gamma=self.trainer_parameters['gamma'], - lambd=self.trainer_parameters['lambd'])) - self.training_buffer[agent_id]['discounted_returns'].set( - self.training_buffer[agent_id]['advantages'].get_batch() - + self.training_buffer[agent_id]['value_estimates'].get_batch()) - - self.training_buffer.append_update_buffer(agent_id, batch_size=None, - training_length=self.policy.sequence_length) - - self.training_buffer[agent_id].reset_agent() - if info.local_done[l]: - self.stats['Environment/Cumulative Reward'].append( - self.cumulative_rewards.get(agent_id, 0)) - self.reward_buffer.appendleft(self.cumulative_rewards.get(agent_id, 0)) - self.stats['Environment/Episode Length'].append( - self.episode_steps.get(agent_id, 0)) - self.cumulative_rewards[agent_id] = 0 - self.episode_steps[agent_id] = 0 - if self.use_curiosity: - self.stats['Policy/Curiosity Reward'].append( - self.intrinsic_rewards.get(agent_id, 0)) - self.intrinsic_rewards[agent_id] = 0 - - def end_episode(self): - """ - A signal that the Episode has ended. The buffer must be reset. - Get only called when the academy resets. - """ - self.training_buffer.reset_local_buffers() - for agent_id in self.cumulative_rewards: - self.cumulative_rewards[agent_id] = 0 - for agent_id in self.episode_steps: - self.episode_steps[agent_id] = 0 - if self.use_curiosity: - for agent_id in self.intrinsic_rewards: - self.intrinsic_rewards[agent_id] = 0 - - def is_ready_update(self): - """ - Returns whether or not the trainer has enough elements to run update model - :return: A boolean corresponding to whether or not update_model() can be run - """ - size_of_buffer = len(self.training_buffer.update_buffer['actions']) - return size_of_buffer > max(int(self.trainer_parameters['buffer_size'] / self.policy.sequence_length), 1) - - def update_policy(self): - """ - Uses demonstration_buffer to update the policy. - """ - n_sequences = max(int(self.trainer_parameters['batch_size'] / self.policy.sequence_length), 1) - value_total, policy_total, forward_total, inverse_total = [], [], [], [] - advantages = self.training_buffer.update_buffer['advantages'].get_batch() - self.training_buffer.update_buffer['advantages'].set( - (advantages - advantages.mean()) / (advantages.std() + 1e-10)) - num_epoch = self.trainer_parameters['num_epoch'] - for k in range(num_epoch): - self.training_buffer.update_buffer.shuffle() - buffer = self.training_buffer.update_buffer - for l in range(len(self.training_buffer.update_buffer['actions']) // n_sequences): - start = l * n_sequences - end = (l + 1) * n_sequences - run_out = self.policy.update(buffer.make_mini_batch(start, end), n_sequences) - value_total.append(run_out['value_loss']) - policy_total.append(np.abs(run_out['policy_loss'])) - if self.use_curiosity: - inverse_total.append(run_out['inverse_loss']) - forward_total.append(run_out['forward_loss']) - self.stats['Losses/Value Loss'].append(np.mean(value_total)) - self.stats['Losses/Policy Loss'].append(np.mean(policy_total)) - if self.use_curiosity: - self.stats['Losses/Forward Loss'].append(np.mean(forward_total)) - self.stats['Losses/Inverse Loss'].append(np.mean(inverse_total)) - self.training_buffer.reset_update_buffer() - - -def discount_rewards(r, gamma=0.99, value_next=0.0): - """ - Computes discounted sum of future rewards for use in updating value estimate. - :param r: List of rewards. - :param gamma: Discount factor. - :param value_next: T+1 value estimate for returns calculation. - :return: discounted sum of future rewards as list. - """ - discounted_r = np.zeros_like(r) - running_add = value_next - for t in reversed(range(0, r.size)): - running_add = running_add * gamma + r[t] - discounted_r[t] = running_add - return discounted_r - - -def get_gae(rewards, value_estimates, value_next=0.0, gamma=0.99, lambd=0.95): - """ - Computes generalized advantage estimate for use in updating policy. - :param rewards: list of rewards for time-steps t to T. - :param value_next: Value estimate for time-step T+1. - :param value_estimates: list of value estimates for time-steps t to T. - :param gamma: Discount factor. - :param lambd: GAE weighing factor. - :return: list of advantage estimates for time-steps t to T. - """ - value_estimates = np.asarray(value_estimates.tolist() + [value_next]) - delta_t = rewards + gamma * value_estimates[1:] - value_estimates[:-1] - advantage = discount_rewards(r=delta_t, gamma=gamma * lambd) - return advantage diff --git a/animalai_bkp/trainers/tensorflow_to_barracuda.py b/animalai_bkp/trainers/tensorflow_to_barracuda.py deleted file mode 100644 index f33f3402..00000000 --- a/animalai_bkp/trainers/tensorflow_to_barracuda.py +++ /dev/null @@ -1,1034 +0,0 @@ -from __future__ import print_function -import numpy as np -import struct # convert from Python values and C structs -import tensorflow as tf -import re -#import barracuda -#from barracuda import Struct -from animalai.trainers import barracuda -from animalai.trainers.barracuda import Struct -from google.protobuf import descriptor -from google.protobuf.json_format import MessageToJson - - -if __name__ == '__main__': - # Handle command line argumengts - args = barracuda.parse_args( - description = 'Convert Tensorflow model to Barracuda binary', - source_extension = '.pb', - help = 'input Tensorflow serialized .pb file') - # Te following code can be used as an example of API used from another module - # convert() is the main entry point for converter - import tensorflow_to_barracuda as tf2bc - tf2bc.convert(args.source_file, args.target_file, args.trim_unused_by_output, args) - - -# TODO: support more than 1 LSTM layer per model - prepend scope to names and inputs -# TODO: support different activation functions in LSTM -# TODO: strip output Identity node, instead patch upstream layer names -# TODO: use ScaleBias and Pow with alpha when input is constant Tensor -# TODO: support all data format types (curretly only NHWC) -# TODO: support all data types (currently only FLOAT, INT32, BOOL) -# TODO: implement FusedResizeAndPadConv2D - -# Important ProtoBuf definitions: -# https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/framework/types.proto -# https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/framework/tensor.proto -# https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/framework/node_def.proto -# -# Node descriptions: -# https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/ops/nn_ops.cc -# https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/ops/math_ops.cc -# https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/ops/random_ops.cc -# -# Class doc: -# https://www.tensorflow.org/api_docs/cc/ -# -known_classes = { - 'Dense': Struct( - id = 1, - out_shapes = lambda shapes: [ - [shapes[0][0], 1, 1, shapes[0][1]], # W - [1, 1, 1, shapes[-1][-1]] # B - ], - patch_data = lambda data: [ - data[0], - data[1] - ]), - 'MatMul': Struct( - id = 1, - out_shapes = lambda shapes: [ - [shapes[0][0], 1, 1, shapes[0][1]], # W - [1, 1, 1, shapes[0][1]] # B - ], - patch_data = lambda data: [ - data[0], - np.zeros(np.shape(data[1])) - ]), - 'BiasAdd': Struct( - id = 51, # implemented as ScaleBias - out_shapes = lambda shapes: [ - [1, 1, 1, shapes[0][0]], # ONE - [1, 1, 1, shapes[0][0]], # B - ], - patch_data = lambda data: [ - np.ones(np.shape(data[0])), - data[0] - ]), - - # TODO: NCHW - 'Conv2D': Struct( - id = 20, - out_shapes = lambda shapes: [ - shapes[0], # K - [1, 1, 1, shapes[-1][-1]] # B - ], - patch_data = lambda data: [ - data[0], - data[1] - ]), - 'DepthwiseConv2dNative': Struct( # DepthwiseConv2D - id = 21, - out_shapes = lambda s: [ - [s[0][0], s[0][1], s[0][3], s[0][2]], # K TF:[H, W, in_channels, channel_multiplier] => [H, W, 1, in_channels] - [1, 1, 1, s[-1][-1]] if len(s) > 1 else - [1, 1, 1, s[0][2]] # B - ], - patch_data = lambda data: [ - np.transpose(data[0], (0,1,3,2)), - data[1] - ]), - 'Conv2DBackpropInput': Struct( # Conv2DTranspose - id = 22, - out_shapes = lambda shapes: [ - shapes[0], # K - [1, 1, 1, shapes[-1][-1]] # B - ], - patch_data = lambda data: [ - data[0], - data[1] - ]), - - # TODO: 3D - - 'ResizeNearestNeighbor': - 23, # implemented as Upsample2D - 'ResizeBilinear': 23, # implemented as Upsample2D - 'ResizeBicubic': 23, # implemented as Upsample2D - 'MaxPool': 25, - 'AvgPool': 26, - - 'GlobalAveragePool':28, - - 'Activation': 50, - - 'BatchNormalization': Struct( - id = 51, # after fusion implemented as ScaleBias - out_shapes = lambda shapes: [ - [1, 1, 1, shapes[0][0]], # S - [1, 1, 1, shapes[0][0]], # B - ], - patch_data = lambda data: - # fuse [gamma, beta, mean, var, epsilon] => [scale, bias] - # TODO: double-check if epsilon is the last data argument and not the 1st? - barracuda.fuse_batchnorm_weights(data[0], data[1], data[2], data[3], data[4]) if len(data) == 5 else - # fuse [ONE, beta, mean, var, epsilon] => [scale, bias] - # TODO: double-check if epsilon is the last data argument and not the 1st? - barracuda.fuse_batchnorm_weights(np.ones(np.shape(data[0])), data[0], data[1], data[2], data[3]) - ), - 'FusedBatchNorm': Struct( - id = 51, # after fusion implemented as ScaleBias - out_shapes = lambda shapes: [ - [1, 1, 1, shapes[0][0]], # S - [1, 1, 1, shapes[0][0]], # B - ], - patch_data = lambda data, layer: - # fuse [gamma, beta, mean, var, epsilon] => [scale, bias] - barracuda.fuse_batchnorm_weights(data[0], data[1], data[2], data[3], get_epsilon(layer)) - ), - 'LRN': 53, - - 'RandomStandardNormal': - 64, - 'RandomUniform': 65, - 'Multinomial': 66, - 'OneHot': 67, - - # Broadcast ops - 'Add': 100, - 'Sub': 101, - 'Mul': 102, - 'RealDiv': 103, - 'Pow': 104, - 'Minimum': 110, - 'Maximum': 111, - - # Reduce ops - 'Max': 124, - 'Mean': 125, - 'Min': 126, - 'Prod': 127, - 'Sum': 128, - - 'Flatten': 200, - 'Reshape': 201, - #'Squeeze': 203, - #'Unsqueeze': 204, - 'Concat': 210, - 'StridedSlice': 211, -} - -requires_runtime_flag = { - 'Dropout' : 'DropoutRuntime', - 'BatchNormalization' : 'BatchNormalizationRuntime', -} - -known_activations = { - 'Linear' : 0, - 'Relu' : 1, - 'Softmax' : 2, - 'Tanh' : 3, - 'Sigmoid' : 4, - 'Elu' : 5, - 'Relu6' : 6, - 'LeakyRelu' : 7, - 'Selu' : 8, - 'Swish' : 9, - - 'LogSoftmax' : 10, - 'Softplus' : 11, - 'Softsign' : 12, - - 'Abs' : 100, - 'Neg' : 101, - 'Ceil' : 102, - 'Floor' : 104, - - 'Sqrt' : 111, - 'Exp' : 113, - 'Log' : 114, - - 'Acos' : 200, - 'Acosh' : 201, - 'Asin' : 202, - 'Asinh' : 203, - 'Atan' : 204, - 'Atanh' : 205, - 'Cos' : 206, - 'Cosh' : 207, - 'Sin' : 208, - 'Sinh' : 209, - 'Tan' : 210 -} - -known_paddings = { - 'VALID' : [0,0,0,0], - 'SAME' : [-1] # SameUpper -} - -supported_data_formats = { - 'NHWC' -} - -known_patterns = { - # TODO: Flatten pattern using namespace regexp - repr(['Shape', 'StridedSlice', 'Pack', 'Reshape']) : "Flatten", - repr(['Shape', 'StridedSlice', 'Prod', 'Pack', 'Reshape']) : "Flatten", - repr(['Shape', 'Slice', 'Slice', 'Prod', - 'ExpandDims', 'ConcatV2', 'Reshape']) : "Flatten", - repr(['Const', 'Reshape']) : 'Reshape', - - repr(['Add', 'Rsqrt', 'Mul', 'Mul', 'Sub', 'Add']) : 'BatchNormalization', - repr(['Add', 'Rsqrt', 'Mul', 'Mul', 'Mul', 'Sub', 'Add']) : 'BatchNormalization', - - repr(['ConcatV2']) : 'ConcatV2', - repr(['Mean']) : 'Mean', - repr(['Multinomial']) : 'Multinomial', - repr(['OneHot']) : 'OneHot', - repr(['Square']) : 'Square', - - repr(['MatMul', 'BiasAdd']) : 'Dense', - repr(['Conv2D', 'BiasAdd']) : 'Conv2D', - repr(['DepthwiseConv2dNative', 'BiasAdd']) : 'DepthwiseConv2dNative', - repr(['Conv2DBackpropInput', 'BiasAdd']) : 'Conv2DBackpropInput', - - - repr(['Pack', 'Reshape']) : 'Flatten$', # for now we assume that this combination is trivial Flatten - # for exmaple it is used in ML-agents LSTM nets with sequence_length==1 - - repr(['StridedSlice', 'Reshape', - re.compile('^lstm/'), - 'Reshape', 'ConcatV2', 'Identity']) : 'BasicLSTM', - - repr([re.compile('^lstm/'), - 'Reshape', 'ConcatV2', 'Identity']) : 'BasicLSTM', - - repr(['Sigmoid', 'Mul']) : "Swish", - - # TODO: FusedResizeAndPadConv2D -} - -def by_name(args, name): - for a in args: - if a.name.endswith(name): - return a - -def by_op(args, op): - for a in args: - if a.op == op: - return a - -def order_by(args, names): - ordered = [] - arg_count = len(args) - for name in names: - ordered += [a for a in args if a.endswith(name)] - args = [a for a in args if not a.endswith(name)] - ordered += args # append what is left - assert(len(ordered) == arg_count) - return ordered - -transform_patterns = { - 'Flatten' : lambda nodes, inputs, tensors, _: - Struct( - op = 'Flatten', - input = inputs - ), - 'Flatten$' : lambda nodes, inputs, tensors, _: - Struct( - op = 'Flatten', - input = [inputs[-1]] # take only the last input, assume all other arguments are trivial (like sequence_length==1 always in ML-agents LSTM nets) - ), - 'Reshape' : lambda nodes, inputs, tensors, _: - Struct( - op = 'Reshape', - input = inputs, - shape = [tensors[0].data[0], tensors[0].data[1], tensors[0].data[2], tensors[0].data[3]] if len(tensors[0].data) == 4 else - [tensors[0].data[0], 1, tensors[0].data[1], tensors[0].data[2]] if len(tensors[0].data) == 3 else - [tensors[0].data[0], 1, 1, tensors[0].data[1]] - # tensor.name = 'shape' - ), - 'Multinomial' : lambda nodes, inputs, tensors, _: - Struct( - op = 'Multinomial', - input = inputs, - shape = [int(by_name(tensors, '/num_samples').data[0])], - #seed = get_attr(nodes[0], 'seed'), - ), - 'OneHot' : lambda nodes, inputs, tensors, _: - Struct( - op = 'OneHot', - input = inputs, - shape = [int(by_name(tensors, '/depth').data[0])], - alpha = by_name(tensors, '/on_value').data[0], - beta = by_name(tensors, '/off_value').data[0], - ), - 'Square' : lambda nodes, inputs, tensors, _: - Struct( - op = 'Mul', - input = [i for i in inputs] + [i for i in inputs], # input * input - ), - 'ConcatV2' : lambda nodes, inputs, tensors, _: - Struct( - op = 'Concat', - input = inputs, - - # TEMPORARY: until we implemented rank detection and axis remapping (hopefully in exporter) - # HACK: assume Concat is always for last channel - axis = int(-1) - #axis = int(by_name(tensors, '/axis').data[0]) - ), - 'BatchNormalization' : lambda nodes, inputs, tensors, _: - Struct( - op = 'BatchNormalization', - input = [i for i in inputs] + - order_by([t.name for t in tensors], ['gamma', 'beta', 'mean', 'variance']), - ), - 'Mean' : lambda nodes, inputs, tensors, _: - Struct( - # TODO: use data_frmt of the input instead of hardcoded [1,2] for HW - op = 'GlobalAveragePool' if np.array_equal(tensors[0].data, [1,2]) else 'MeanWithUnsupportedReductionTensor', - input = [i for i in inputs], - ), - 'Dense' : lambda nodes, inputs, tensors, _: - Struct( - op = 'Dense', - input = [i for i in inputs] + [t.name for t in tensors], - data_frmt = get_attr(by_op(nodes, 'Dense') or by_op(nodes, 'MatMul'), 'data_format'), - ), - 'Conv2D' : lambda nodes, inputs, tensors, _: - Struct( - op = 'Conv2D', - input = [i for i in inputs] + [t.name for t in tensors], - padding = get_attr(by_op(nodes, 'Conv2D'), 'padding'), - strides = get_attr(by_op(nodes, 'Conv2D'), 'strides'), - dilations = get_attr(by_op(nodes, 'Conv2D'), 'dilations'), - data_frmt = get_attr(by_op(nodes, 'Conv2D'), 'data_format'), - ), - 'DepthwiseConv2dNative' : lambda nodes, inputs, tensors, _: - Struct( - op = 'DepthwiseConv2dNative', - input = [i for i in inputs] + [t.name for t in tensors], - padding = get_attr(by_op(nodes, 'DepthwiseConv2dNative'), 'padding'), - strides = get_attr(by_op(nodes, 'DepthwiseConv2dNative'), 'strides'), - dilations = get_attr(by_op(nodes, 'DepthwiseConv2dNative'), 'dilations'), - data_frmt = get_attr(by_op(nodes, 'DepthwiseConv2dNative'), 'data_format'), - ), - 'Conv2DBackpropInput' : lambda nodes, inputs, tensors, _: - Struct( - op = 'Conv2DBackpropInput', - input = [i for i in inputs] + [t.name for t in tensors], - padding = get_attr(by_op(nodes, 'Conv2DBackpropInput'), 'padding'), - strides = get_attr(by_op(nodes, 'Conv2DBackpropInput'), 'strides'), - dilations = get_attr(by_op(nodes, 'Conv2DBackpropInput'), 'dilations'), - data_frmt = get_attr(by_op(nodes, 'Conv2DBackpropInput'), 'data_format'), - ), - 'BasicLSTM' : lambda nodes, inputs, tensors, context: - basic_lstm(nodes, inputs, tensors, context), - - 'Swish' : lambda nodes, inputs, tensors, _: - Struct( - op = 'Swish', - input = inputs - ), - - # TODO:'Round' - # TODO:'Rsqrt' -} - -# Parse -def get_attr(node, attr_name, default=None): - if type(node) == Struct: - if hasattr(node, attr_name): - return getattr(node, attr_name) - else: - return default - - # See: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/framework/attr_value.proto - val = node.attr[attr_name] - - if val.HasField("list"): - return val.list.i - # NOTE: can't find way to identify type of list BUT it is almost always list(int) - # except list(float) in FractionalAvg/MaxPool - if val.HasField("b"): - return val.b - if val.HasField("i"): - return val.i - if val.HasField("f"): - return val.f - if val.HasField("s"): - return val.s.decode("utf-8") - if val.HasField("shape"): - return val.shape - if val.HasField("tensor"): - return val.tensor - return default - -def get_epsilon(layer): - return get_attr(layer, 'epsilon', default=0.001) # default epsilon taken from tf.layers.batch_normalization - -def get_layer_shape(layer): - shape = get_attr(layer, 'shape') - if not shape: - return [-1, -1, -1, -1] - shape = [dim.size for dim in shape.dim] - if len(shape) == 1: - return [1, 1, 1, shape[0]] - if len(shape) == 2: - return [shape[0], 1, 1, shape[1]] - return shape - -def get_tensor_dims(tensor): - if isinstance(tensor, np.ndarray): - return np.shape(tensor) - - dims = [] - if tensor.tensor_shape: - dims = [v.size for v in tensor.tensor_shape.dim] - if tensor.float_val: - dims = np.shape(tensor.float_val) - if tensor.int_val: - dims = np.shape(tensor.int_val) - if tensor.bool_val: - dims = np.shape(tensor.bool_val) - return dims - -def get_tensor_dtype(tensor): - if isinstance(tensor, np.ndarray): - return tensor.dtype - - dataType = '' - fields = tensor.ListFields() - - for field, value in fields: - if field.name == 'dtype' and field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_ENUM: - dataType = field.enum_type.values_by_number.get(value, None).name - - return dataType - -def get_tensor_data(tensor): - if isinstance(tensor, np.ndarray): - return tensor.astype(float) - - dims = get_tensor_dims(tensor) - elems = np.product(dims) - - if tensor.tensor_content: - # TODO: support other types - dataType = get_tensor_dtype(tensor) - if dataType == "DT_FLOAT": - data = struct.unpack('<'+str(elems)+'f', tensor.tensor_content) - elif dataType == "DT_INT32": - data = struct.unpack('<'+str(elems)+'i', tensor.tensor_content) - elif dataType == "DT_BOOL": - data = struct.unpack('<'+str(elems)+'?', tensor.tensor_content) - else: - print('UNSUPPORTED: data type', dataType) - if tensor.float_val: - data = tensor.float_val - if tensor.int_val: - data = np.array(tensor.int_val, dtype=float) - if tensor.bool_val: - data = np.array(tensor.bool_val, dtype=float) - return np.array(data).reshape(dims) - -def flatten(items,enter=lambda x:isinstance(x, list)): - # http://stackoverflow.com/a/40857703 - # https://github.com/ctmakro/canton/blob/master/canton/misc.py - """Yield items from any nested iterable; see REF.""" - for x in items: - if enter(x): - yield from flatten(x) - else: - yield x - -def replace_strings_in_list(array_of_strigs, replace_with_strings): - "A value in replace_with_strings can be either single string or list of strings" - potentially_nested_list = [replace_with_strings.get(s) or s for s in array_of_strigs] - return list(flatten(potentially_nested_list)) - -def remove_duplicates_from_list(array): - "Preserves the order of elements in the list" - output = [] - unique = set() - for a in array: - if a not in unique: - unique.add(a) - output.append(a) - return output - -######################################################### - -def pool_to_HW(shape, data_frmt): - """ Convert from NHWC|NCHW => HW - """ - if len(shape) != 4: - return shape # Not NHWC|NCHW, return as is - if data_frmt == 'NCHW': - return [shape[2], shape[3]] - return [shape[1], shape[2]] - -def strides_to_HW(shape, format): - return pool_to_HW(shape, format) - -######################################################### - -def gru(nodes, inputs, tensors, context): - assert(len(inputs) == 2) - - def find_tensor_by_name(name, default=None): - nonlocal tensors - candidates = [t for t in tensors if t.name.endswith(name)] - return candidates[0].data if candidates else default - - input = inputs[-1] - state = inputs[0] - gates_kernel = find_tensor_by_name('/gates/kernel') - gates_bias = find_tensor_by_name('/gates/bias', default=np.zeros(np.shape(gates_kernel)[-1])) - candidate_kernel = find_tensor_by_name('/candidate/kernel') - candidate_bias = find_tensor_by_name('/candidate/bias', default=np.zeros(np.shape(candidate_kernel)[-1])) - new_state = nodes[-1].name + '_h' - - assert(np.shape(gates_kernel)[-1] == np.shape(gates_bias)[-1]) - assert(np.shape(candidate_kernel)[-1] == np.shape(candidate_bias)[-1]) - - num_gates = 2 - seq_length = 1 - hidden_size = np.shape(gates_kernel)[-1] // num_gates - - gate_kernels = np.split(gates_kernel, num_gates, axis=-1) - gate_biases = np.split(gates_bias, num_gates, axis=-1) - - context.model_tensors['kernel_r'] = gate_kernels[0] - context.model_tensors['kernel_u'] = gate_kernels[1] - context.model_tensors['kernel_c'] = candidate_kernel - context.model_tensors['bias_r'] = gate_biases[0] - context.model_tensors['bias_u'] = gate_biases[1] - context.model_tensors['bias_c'] = candidate_bias - - new_layers = barracuda.gru('gru', input, state, - 'kernel_r', 'kernel_u', 'kernel_c', - 'bias_r', 'bias_u', 'bias_c', - new_state) - - state_shape = [1, 1, seq_length, hidden_size] - context.model_memories += [state_shape, state, new_state] - - # map exptected output of the replaced pattern to output from our GRU cell - actual_output_node = nodes[-4] - assert(actual_output_node.op == 'Reshape') - context.map_ignored_layer_to_its_input[actual_output_node.name] = new_state - - return new_layers - -def basic_lstm(nodes, inputs, tensors, context): - assert(len(inputs) == 2) - - def find_tensor_by_name(name, default=None): - nonlocal tensors - candidates = [t for t in tensors if t.name.endswith(name)] - return candidates[0].data if candidates else default - - def find_forget_bias(): - nonlocal nodes - nonlocal tensors - # TODO: make it more fault-tolerant - # search for scalar float constant that is input to Add node - # and hope it is not a constant for some complex activation function - for t in tensors: - if np.prod(t.shape) == 1 and get_tensor_dtype(t.obj) == "DT_FLOAT": - for n in nodes: - if n.op == 'Add' and t.name in n.input: - return t.data - return np.zeros(1) - - input = inputs[-1] - state_c = inputs[0] + '_c' - state_h = inputs[0] + '_h' - kernel = find_tensor_by_name('/kernel') - bias = find_tensor_by_name('/bias', default=np.zeros(np.shape(kernel)[-1])) - forget_bias = find_forget_bias() - new_state_c = nodes[-1].name + '_c' - new_state_h = nodes[-1].name + '_h' - - assert(np.shape(kernel)[-1] == np.shape(bias)[-1]) - - num_gates = 4 - seq_length = 1 - hidden_size = np.shape(kernel)[-1] // num_gates - - kernels = np.split(kernel, num_gates, axis=-1) - biases = np.split(bias, num_gates, axis=-1) - - context.model_tensors['kernel_i'] = kernels[0] - context.model_tensors['kernel_j'] = kernels[1] - context.model_tensors['kernel_f'] = kernels[2] - context.model_tensors['kernel_o'] = kernels[3] - context.model_tensors['bias_i'] = biases[0] - context.model_tensors['bias_j'] = biases[1] - context.model_tensors['bias_f'] = biases[2] + forget_bias - context.model_tensors['bias_o'] = biases[3] - - new_layers = barracuda.lstm('lstm', input, state_c, state_h, - 'kernel_i', 'kernel_j', 'kernel_f', 'kernel_o', - 'bias_i', 'bias_j', 'bias_f', 'bias_o', - new_state_c, new_state_h) - - state_shape = [1, 1, seq_length, hidden_size] - context.model_memories += [state_shape, state_c, new_state_c] - context.model_memories += [state_shape, state_h, new_state_h] - - # map expected output of the replaced pattern to output from our LSTM cell - actual_output_node = nodes[-4] - assert(actual_output_node.op == 'Reshape') - context.map_ignored_layer_to_its_input[actual_output_node.name] = new_state_h - - return new_layers - -######################################################### - -def process_layer(layer, context, args): - model_tensors = context.model_tensors - input_shapes = context.input_shapes - map_ignored_layer_to_its_input = context.map_ignored_layer_to_its_input - - name = layer.name - class_name = layer.op - inputs = layer.input # Tensorflow inputs are always explicit, but in case of Keras we had 'inputs = layer.input or [prev_layer_name]' - inputs = replace_strings_in_list(inputs, map_ignored_layer_to_its_input) - - if class_name == 'Const': - model_tensors[name] = layer.attr["value"].tensor - return - - if class_name == 'Placeholder': - assert(inputs == []) - map_ignored_layer_to_its_input[name] = inputs - input_shapes[name] = get_layer_shape(layer) - return - - if class_name == 'Identity': - connected_to_const = len(inputs) == 1 and inputs[0] in model_tensors - if connected_to_const: - map_ignored_layer_to_its_input[name] = inputs - return - else: - # treat Identity layer that are connected to processing nodes - # as output from the network - class_name = 'Linear' - - # TEMPORARY: until we implemented rank detection and StidedSlice at runtime - # HACK: skips trivial StridedSlices for rank=2 tensors - if class_name == 'StridedSlice' and get_attr(layer, 'begin_mask') == 1 and get_attr(layer, 'end_mask') == 1: - map_ignored_layer_to_its_input[name] = inputs[0] - return - - if args.print_layers or args.verbose: - var_tensors = [i for i in inputs if i not in model_tensors] - const_tensors = [i for i in inputs if i in model_tensors] - print("'%s' %s Vars:%s Const:%s" % (name, class_name, var_tensors, const_tensors)) - - if class_name in known_activations: - activation = class_name - class_name = 'Activation' - else: - activation = 'Linear' - - if not class_name in known_classes: - if class_name in requires_runtime_flag: - print('SKIP:', class_name, 'layer is used only for training') - else: - print('IGNORED:', class_name, 'unknown layer') - map_ignored_layer_to_its_input[name] = inputs - return - - klass = known_classes[class_name] - if type(klass) == int: - klass = Struct(id = klass) - - o_l = Struct() - o_l.type = klass.id - o_l.class_name = class_name - o_l.name = name - - padding = get_attr(layer, 'padding') # layer.attr['padding'].s.decode("utf-8") - strides = get_attr(layer, 'strides') # layer.attr['strides'].list.i - dilations = get_attr(layer, 'dilations') # layer.attr['dilations'].list.i - pool_size = get_attr(layer, 'ksize') # layer.attr['ksize'].list.i - shape = get_attr(layer, 'shape', default=[]) - data_frmt = get_attr(layer, 'data_format') # layer.attr['data_format'].s.decode("utf-8") - axis = get_attr(layer, 'axis') - alpha = get_attr(layer, 'alpha') - beta = get_attr(layer, 'beta') - - if activation and not activation in known_activations: - print('IGNORED: unknown activation', activation) - if padding and not padding in known_paddings: - print('IGNORED: unknown padding', padding) - if data_frmt and not data_frmt in supported_data_formats: - print('UNSUPPORTED: data format', data_frmt) - - o_l.activation = known_activations.get(activation) or 0 - o_l.pads = known_paddings.get(padding) or [0,0,0,0] - o_l.strides = strides_to_HW(strides, data_frmt) if strides else [] - o_l.pool_size = pool_to_HW(pool_size, data_frmt) if pool_size else shape - o_l.axis = axis or -1 - o_l.alpha = alpha or 1 - o_l.beta = beta or 0 - - tensor_names = [i for i in inputs if i in model_tensors] - o_l.tensors = [Struct(name = x, shape = get_tensor_dims(model_tensors[x]), data = get_tensor_data(model_tensors[x])) - for x in tensor_names] - # Patch shapes & data - layer_has_model_tensors = len(o_l.tensors) > 0 - if hasattr(klass, 'out_shapes') and layer_has_model_tensors: - shapes = klass.out_shapes([x.shape for x in o_l.tensors]) - - # if we have more shapes than actual tensors, - # then create & fill missing tensors with zeros - in_tensor_num = len(o_l.tensors) - for index, new_shape in enumerate(shapes): - if index >= in_tensor_num: - new_tensor = Struct(name = ('%s/patch:%i') % (name, index-in_tensor_num), - shape = new_shape, - data = np.zeros(new_shape)) - o_l.tensors.append(new_tensor) - assert(len(shapes) <= len(o_l.tensors)) - - if hasattr(klass, 'patch_data'): - data = [x.data for x in o_l.tensors] - - patch_data_fn = klass.patch_data - patch_data_expected_arg_count = patch_data_fn.__code__.co_argcount - patch_data_args = (data, layer) if patch_data_expected_arg_count > 1 else (data,) - tensor_data = patch_data_fn(*patch_data_args) - o_l.tensors = o_l.tensors[:len(tensor_data)] # resize tensor array to match patched data - patching might reduce number of tensors - for x, data in zip(o_l.tensors, tensor_data): - x.data = data - - # after this point we should have equal amount of shapes and tensors - assert(len(o_l.tensors) == len(shapes)) - - for x, shape in zip(o_l.tensors, shapes): - x.shape = shape - - o_l.inputs = [i for i in inputs if i not in model_tensors] - - else: - # no 'patch_data' lambda was specified, op does not require tensor args - o_l.tensors = [] - o_l.inputs = inputs - - # Force all tensors to float32 - for x in o_l.tensors: - x.data = x.data.astype(np.float32) - - # Layer is ready - context.layers.append(o_l) - -class ModelBuilderContext: - def __init__(self): - self.layers = [] - self.input_shapes = {} - self.model_tensors = {} - self.model_memories = [] - self.map_ignored_layer_to_its_input = {} - -def process_model(model, args): - o_context = ModelBuilderContext() - - # Find node patterns - nodes_as_array = [node for node in model.node] - - node_index = 0 - while node_index < len(nodes_as_array): - node = nodes_as_array[node_index] - match = False - for pattern_repr, pattern_name in known_patterns.items(): - pattern = eval(pattern_repr) - if node_index + len(pattern) > len(nodes_as_array): - continue # pattern too long, skip - - require_exact_match = (pattern[0] == 'Const' or pattern[0] == 'Identity') - pattern_end = node_index - - def match_node(node, pattern): - return node.op == pattern or (hasattr(pattern, 'match') and pattern.match(node.name)) - - for p in pattern: - if not require_exact_match: - while pattern_end < len(nodes_as_array) and nodes_as_array[pattern_end].op != p and ( - nodes_as_array[pattern_end].op == 'Const' or - nodes_as_array[pattern_end].op == 'Identity'): - pattern_end += 1 - if pattern_end >= len(nodes_as_array): - break - - match = False - if (hasattr(p, 'match')): # regexp - while pattern_end < len(nodes_as_array) and p.match(nodes_as_array[pattern_end].name): - match = True - pattern_end += 1 - else: # exact string - match = nodes_as_array[pattern_end].op == p - pattern_end += 1 - - if not match: - break - - def get_tensors(pattern_nodes): - nonlocal o_context - map_ignored_layer_to_its_input = o_context.map_ignored_layer_to_its_input - - # tensors <= all Const nodes within this pattern - tensor_nodes = [n for n in pattern_nodes if n.op == 'Const'] - tensors = [Struct(name = n.name, obj = n.attr["value"].tensor, shape = get_tensor_dims(n.attr["value"].tensor), data = get_tensor_data(n.attr["value"].tensor)) - for n in tensor_nodes] - - # TODO: unify / reuse code from process_layer - identity_nodes = [n for n in pattern_nodes if n.op == 'Identity'] - for i in identity_nodes: - inputs = replace_strings_in_list(i.input, map_ignored_layer_to_its_input) - map_ignored_layer_to_its_input[i.name] = inputs - - # gather inputs from Op nodes (not Const, not Identity) - op_nodes = [n for n in pattern_nodes if n not in tensor_nodes and n not in identity_nodes] - inputs_to_op_nodes = list(flatten([list(flatten(n.input)) for n in op_nodes])) - inputs_to_op_nodes = replace_strings_in_list(inputs_to_op_nodes, map_ignored_layer_to_its_input) - inputs_to_op_nodes = [i.split(':')[0] for i in inputs_to_op_nodes] - - # filter only inputs that are coming from nodes that are outside this pattern - # preserve the order - pattern_nodes = [n.name for n in pattern_nodes] - #inputs_from_outside_pattern = remove_duplicates_from_list([i for i in inputs_to_op_nodes if nodes_by_name[i] not in pattern_nodes]) - inputs_from_outside_pattern = remove_duplicates_from_list([i for i in inputs_to_op_nodes if i not in pattern_nodes]) - - return inputs_from_outside_pattern, tensors - - if match: - nodes = nodes_as_array[node_index:pattern_end] - name = nodes[-1].name - var_tensors, const_tensors = get_tensors(nodes) - if args.print_patterns or args.verbose: - print('PATTERN:', name, '~~', pattern_name, pattern, '<-', var_tensors, '+', [t.name for t in const_tensors]) - for n in nodes: - if n.op == 'Const' or n.op == 'Identity': - process_layer(n, o_context, args) - - new_layers = transform_patterns[pattern_name](nodes, var_tensors, const_tensors, o_context) - if not isinstance(new_layers, list): - if not hasattr(new_layers, name): new_layers.name = name - new_layers = [new_layers] - - for l in new_layers: - # TODO: prefix new layer names with scope, patch inputs - #l.name = name + '/' + l.name - process_layer(l, o_context, args) - - node_index = pattern_end - break # pattern found & processed - - if not match: - # TODO: gather tensors in the same way as patterns do - process_layer(node, o_context, args) - node_index += 1 - - return o_context.layers, o_context.input_shapes, o_context.model_tensors, o_context.model_memories - -######################################################### - -def convert(source_file, target_file, trim_unused_by_output="", verbose=False, compress_f16=False): - """ - Converts a TensorFlow model into a Barracuda model. - :param source_file: The TensorFlow Model - :param target_file: The name of the file the converted model will be saved to - :param trim_unused_by_output: The regexp to match output nodes to remain in the model. All other uconnected nodes will be removed. - :param verbose: If True, will display debug messages - :param compress_f16: If true, the float values will be converted to f16 - :return: - """ - if (type(verbose)==bool): - args = Struct() - args.verbose = verbose - args.print_layers = verbose - args.print_source_json = verbose - args.print_barracuda_json = verbose - args.print_layer_links = verbose - args.print_patterns = verbose - args.print_tensors = verbose - else: - args = verbose - - # Load Tensorflow model - print("Converting %s to %s" % (source_file, target_file)) - f = open(source_file, 'rb') - i_model = tf.GraphDef() - i_model.ParseFromString(f.read()) - - if args.verbose: - print('OP_TYPES:', {layer.op for layer in i_model.node}) - - if args.print_source_json or args.verbose: - for layer in i_model.node: - if not layer.op == 'Const': - print('MODEL:', MessageToJson(layer) + ",") - - # Convert - o_model = barracuda.Model() - o_model.layers, o_input_shapes, o_model.tensors, o_model.memories = \ - process_model(i_model, args) - - # Cleanup unconnected Identities (they might linger after processing complex node patterns like LSTM) - def cleanup_layers(layers): - all_layers = {l.name for l in layers} - all_inputs = {i for l in layers for i in l.inputs} - - def is_unconnected_identity(layer): - if layer.class_name == 'Activation' and layer.activation == 0: # Identity - assert(len(layer.inputs) == 1) - if layer.inputs[0] not in all_layers and layer.name not in all_inputs: - return True; - return False; - - return [l for l in layers if not is_unconnected_identity(l)] - o_model.layers = cleanup_layers(o_model.layers) - - all_inputs = {i for l in o_model.layers for i in l.inputs} - embedded_tensors = {t.name for l in o_model.layers for t in l.tensors} - - # Find global tensors - def dims_to_barracuda_shape(dims): - shape = list(dims) - while len(shape) < 4: - shape = [1] + shape - return shape - o_model.globals = [t for t in o_model.tensors if t not in all_inputs and t not in embedded_tensors] - #for x in global_tensors: - # shape = dims_to_barracuda_shape(get_tensor_dims(o_model.tensors[x])) - # o_globals += [Struct( - # name = x, - # shape = shape, - # data = np.reshape(get_tensor_data(o_model.tensors[x]), shape).astype(np.float32))] - - # Trim - if trim_unused_by_output: - o_model.layers = barracuda.trim(o_model.layers, trim_unused_by_output, args.verbose) - - # Create load layers for constants - const_tensors = [i for i in all_inputs if i in o_model.tensors] - const_tensors += o_model.globals - for x in const_tensors: - shape = dims_to_barracuda_shape(get_tensor_dims(o_model.tensors[x])) - - o_l = Struct( - type = 255, # Load - class_name = "Const", - name = x, - pads = [0,0,0,0], - strides = [], - pool_size = [], - axis = -1, - alpha = 1, - beta = 0, - activation = 0, - inputs = [], - tensors = [Struct( - name = x, - shape = shape, - data = np.reshape(get_tensor_data(o_model.tensors[x]), shape).astype(np.float32))] - ) - o_model.layers.insert(0, o_l) - - # Find model inputs & outputs - all_layers = {l.name for l in o_model.layers} - # global inputs => are inputs that are NOT connected to any layer in the network - # global outputs => are outputs that are NOT feeding any layer in the network OR are coming from Identity layers - o_model.inputs = {i:o_input_shapes[i] for l in o_model.layers for i in l.inputs if i not in all_layers and i not in o_model.memories} - - def is_output_layer(layer): - if layer.class_name == 'Const': # Constants never count as global output even when unconnected - return False; - if layer.name not in all_inputs: # this layer is not inputing to any other layer - return True - if layer.class_name == 'Activation' and layer.activation == 0: # Identity marks global output - return True - return False - o_model.outputs = [l.name for l in o_model.layers if is_output_layer(l)] - - # Compress - if compress_f16: - o_model = barracuda.compress(o_model) - - # Sort model so that layer inputs are always ready upfront - o_model.layers = barracuda.sort(o_model.layers, o_model.inputs, o_model.memories, args.verbose) - - # Summary - barracuda.summary(o_model, - print_layer_links = args.print_layer_links or args.verbose, - print_barracuda_json = args.print_barracuda_json or args.verbose, - print_tensors = args.print_tensors or args.verbose) - - # Write to file - barracuda.write(o_model, target_file) - print('DONE: wrote', target_file, 'file.') diff --git a/animalai_bkp/trainers/trainer.py b/animalai_bkp/trainers/trainer.py deleted file mode 100644 index 6abd8ca8..00000000 --- a/animalai_bkp/trainers/trainer.py +++ /dev/null @@ -1,198 +0,0 @@ -# # Unity ML-Agents Toolkit -import logging - -import tensorflow as tf -import numpy as np - -from animalai.envs import UnityException, AllBrainInfo - -logger = logging.getLogger("mlagents.trainers") - - -class UnityTrainerException(UnityException): - """ - Related to errors with the Trainer. - """ - pass - - -class Trainer(object): - """This class is the base class for the mlagents.trainers""" - - def __init__(self, brain, trainer_parameters, training, run_id): - """ - Responsible for collecting experiences and training a neural network model. - :BrainParameters brain: Brain to be trained. - :dict trainer_parameters: The parameters for the trainer (dictionary). - :bool training: Whether the trainer is set for training. - :int run_id: The identifier of the current run - """ - self.param_keys = [] - self.brain_name = brain.brain_name - self.run_id = run_id - self.trainer_parameters = trainer_parameters - self.is_training = training - self.stats = {} - self.summary_writer = None - self.policy = None - - def __str__(self): - return '''{} Trainer'''.format(self.__class__) - - def check_param_keys(self): - for k in self.param_keys: - if k not in self.trainer_parameters: - raise UnityTrainerException( - "The hyper-parameter {0} could not be found for the {1} trainer of " - "brain {2}.".format(k, self.__class__, self.brain_name)) - - @property - def parameters(self): - """ - Returns the trainer parameters of the trainer. - """ - raise UnityTrainerException("The parameters property was not implemented.") - - @property - def graph_scope(self): - """ - Returns the graph scope of the trainer. - """ - raise UnityTrainerException("The graph_scope property was not implemented.") - - @property - def get_max_steps(self): - """ - Returns the maximum number of steps. Is used to know when the trainer should be stopped. - :return: The maximum number of steps of the trainer - """ - raise UnityTrainerException("The get_max_steps property was not implemented.") - - @property - def get_step(self): - """ - Returns the number of training steps the trainer has performed - :return: the step count of the trainer - """ - raise UnityTrainerException("The get_step property was not implemented.") - - @property - def get_last_reward(self): - """ - Returns the last reward the trainer has had - :return: the new last reward - """ - raise UnityTrainerException("The get_last_reward property was not implemented.") - - def increment_step_and_update_last_reward(self): - """ - Increment the step count of the trainer and updates the last reward - """ - raise UnityTrainerException( - "The increment_step_and_update_last_reward method was not implemented.") - - def take_action(self, all_brain_info: AllBrainInfo): - """ - Decides actions given state/observation information, and takes them in environment. - :param all_brain_info: A dictionary of brain names and BrainInfo from environment. - :return: a tuple containing action, memories, values and an object - to be passed to add experiences - """ - raise UnityTrainerException("The take_action method was not implemented.") - - def add_experiences(self, curr_info: AllBrainInfo, next_info: AllBrainInfo, - take_action_outputs): - """ - Adds experiences to each agent's experience history. - :param curr_info: Current AllBrainInfo. - :param next_info: Next AllBrainInfo. - :param take_action_outputs: The outputs of the take action method. - """ - raise UnityTrainerException("The add_experiences method was not implemented.") - - def process_experiences(self, current_info: AllBrainInfo, next_info: AllBrainInfo): - """ - Checks agent histories for processing condition, and processes them as necessary. - Processing involves calculating value and advantage targets for model updating step. - :param current_info: Dictionary of all current-step brains and corresponding BrainInfo. - :param next_info: Dictionary of all next-step brains and corresponding BrainInfo. - """ - raise UnityTrainerException("The process_experiences method was not implemented.") - - def end_episode(self): - """ - A signal that the Episode has ended. The buffer must be reset. - Get only called when the academy resets. - """ - raise UnityTrainerException("The end_episode method was not implemented.") - - def is_ready_update(self): - """ - Returns whether or not the trainer has enough elements to run update model - :return: A boolean corresponding to wether or not update_model() can be run - """ - raise UnityTrainerException("The is_ready_update method was not implemented.") - - def update_policy(self): - """ - Uses demonstration_buffer to update model. - """ - raise UnityTrainerException("The update_model method was not implemented.") - - def save_model(self): - """ - Saves the model - """ - self.policy.save_model(self.get_step) - - def export_model(self): - """ - Exports the model - """ - self.policy.export_model() - - def write_summary(self, global_step, lesson_num=0): - """ - Saves training statistics to Tensorboard. - :param lesson_num: Current lesson number in curriculum. - :param global_step: The number of steps the simulation has been going for - """ - if global_step % self.trainer_parameters['summary_freq'] == 0 and global_step != 0: - is_training = "Training." if self.is_training and self.get_step <= self.get_max_steps else "Not Training." - if len(self.stats['Environment/Cumulative Reward']) > 0: - mean_reward = np.mean(self.stats['Environment/Cumulative Reward']) - logger.info(" {}: {}: Step: {}. Mean Reward: {:0.3f}. Std of Reward: {:0.3f}. {}" - .format(self.run_id, self.brain_name, - min(self.get_step, self.get_max_steps), - mean_reward, np.std(self.stats['Environment/Cumulative Reward']), - is_training)) - else: - logger.info(" {}: {}: Step: {}. No episode was completed since last summary. {}" - .format(self.run_id, self.brain_name, self.get_step, is_training)) - summary = tf.Summary() - for key in self.stats: - if len(self.stats[key]) > 0: - stat_mean = float(np.mean(self.stats[key])) - summary.value.add(tag='{}'.format(key), simple_value=stat_mean) - self.stats[key] = [] - summary.value.add(tag='Environment/Lesson', simple_value=lesson_num) - self.summary_writer.add_summary(summary, self.get_step) - self.summary_writer.flush() - - def write_tensorboard_text(self, key, input_dict): - """ - Saves text to Tensorboard. - Note: Only works on tensorflow r1.2 or above. - :param key: The name of the text. - :param input_dict: A dictionary that will be displayed in a table on Tensorboard. - """ - try: - with tf.Session() as sess: - s_op = tf.summary.text(key, tf.convert_to_tensor( - ([[str(x), str(input_dict[x])] for x in input_dict]))) - s = sess.run(s_op) - self.summary_writer.add_summary(s, self.get_step) - except: - logger.info( - "Cannot write text summary for Tensorboard. Tensorflow version must be r1.2 or above.") - pass diff --git a/animalai_bkp/trainers/trainer_controller.py b/animalai_bkp/trainers/trainer_controller.py deleted file mode 100644 index 0618815d..00000000 --- a/animalai_bkp/trainers/trainer_controller.py +++ /dev/null @@ -1,301 +0,0 @@ -# # Unity ML-Agents Toolkit -# ## ML-Agent Learning -"""Launches trainers for each External Brains in a Unity Environment.""" - -import os -import logging -import shutil -import sys -if sys.platform.startswith('win'): - import win32api - import win32con -from typing import * - -import numpy as np -import tensorflow as tf - -from animalai.envs import BrainInfo -from animalai.envs.exception import UnityEnvironmentException -from animalai.trainers.ppo.trainer import PPOTrainer -from animalai.trainers.bc.offline_trainer import OfflineBCTrainer -from animalai.trainers.bc.online_trainer import OnlineBCTrainer -from animalai.trainers.meta_curriculum import MetaCurriculum - - -class TrainerController(object): - def __init__(self, model_path: str, summaries_dir: str, - run_id: str, save_freq: int, meta_curriculum: Optional[MetaCurriculum], - load: bool, train: bool, keep_checkpoints: int, lesson: Optional[int], - external_brains: Dict[str, BrainInfo], training_seed: int, config=None): - """ - :param model_path: Path to save the model. - :param summaries_dir: Folder to save training summaries. - :param run_id: The sub-directory name for model and summary statistics - :param save_freq: Frequency at which to save model - :param meta_curriculum: MetaCurriculum object which stores information about all curricula. - :param load: Whether to load the model or randomly initialize. - :param train: Whether to train model, or only run inference. - :param keep_checkpoints: How many model checkpoints to keep. - :param lesson: Start learning from this lesson. - :param external_brains: dictionary of external brain names to BrainInfo objects. - :param training_seed: Seed to use for Numpy and Tensorflow random number generation. - """ - - self.model_path = model_path - self.summaries_dir = summaries_dir - self.external_brains = external_brains - self.external_brain_names = external_brains.keys() - self.logger = logging.getLogger('mlagents.envs') - self.run_id = run_id - self.save_freq = save_freq - self.lesson = lesson - self.load_model = load - self.train_model = train - self.keep_checkpoints = keep_checkpoints - self.trainers = {} - self.global_step = 0 - self.meta_curriculum = meta_curriculum - self.seed = training_seed - self.config = config - self.update_config = True - np.random.seed(self.seed) - tf.set_random_seed(self.seed) - - def _get_measure_vals(self): - if self.meta_curriculum: - brain_names_to_measure_vals = {} - for brain_name, curriculum \ - in self.meta_curriculum.brains_to_curriculums.items(): - if curriculum.measure == 'progress': - measure_val = (self.trainers[brain_name].get_step / - self.trainers[brain_name].get_max_steps) - brain_names_to_measure_vals[brain_name] = measure_val - elif curriculum.measure == 'reward': - measure_val = np.mean(self.trainers[brain_name] - .reward_buffer) - brain_names_to_measure_vals[brain_name] = measure_val - return brain_names_to_measure_vals - else: - return None - - def _save_model(self, steps=0): - """ - Saves current model to checkpoint folder. - :param steps: Current number of steps in training process. - :param saver: Tensorflow saver for session. - """ - for brain_name in self.trainers.keys(): - self.trainers[brain_name].save_model() - self.logger.info('Saved Model') - - def _save_model_when_interrupted(self, steps=0): - self.logger.info('Learning was interrupted. Please wait ' - 'while the graph is generated.') - self._save_model(steps) - - def _win_handler(self, event): - """ - This function gets triggered after ctrl-c or ctrl-break is pressed - under Windows platform. - """ - if event in (win32con.CTRL_C_EVENT, win32con.CTRL_BREAK_EVENT): - self._save_model_when_interrupted(self.global_step) - self._export_graph() - sys.exit() - return True - return False - - def _export_graph(self): - """ - Exports latest saved models to .nn format for Unity embedding. - """ - for brain_name in self.trainers.keys(): - self.trainers[brain_name].export_model() - - def initialize_trainers(self, trainer_config): - """ - Initialization of the trainers - :param trainer_config: The configurations of the trainers - """ - trainer_parameters_dict = {} - - for brain_name in self.external_brains: - trainer_parameters = trainer_config['default'].copy() - trainer_parameters['summary_path'] = '{basedir}/{name}'.format( - basedir=self.summaries_dir, - name=str(self.run_id) + '_' + brain_name) - trainer_parameters['model_path'] = '{basedir}/{name}'.format( - basedir=self.model_path, - name=brain_name) - trainer_parameters['keep_checkpoints'] = self.keep_checkpoints - if brain_name in trainer_config: - _brain_key = brain_name - while not isinstance(trainer_config[_brain_key], dict): - _brain_key = trainer_config[_brain_key] - for k in trainer_config[_brain_key]: - trainer_parameters[k] = trainer_config[_brain_key][k] - trainer_parameters_dict[brain_name] = trainer_parameters.copy() - for brain_name in self.external_brains: - if trainer_parameters_dict[brain_name]['trainer'] == 'offline_bc': - self.trainers[brain_name] = OfflineBCTrainer( - self.external_brains[brain_name], - trainer_parameters_dict[brain_name], self.train_model, - self.load_model, self.seed, self.run_id) - elif trainer_parameters_dict[brain_name]['trainer'] == 'online_bc': - self.trainers[brain_name] = OnlineBCTrainer( - self.external_brains[brain_name], - trainer_parameters_dict[brain_name], self.train_model, - self.load_model, self.seed, self.run_id) - elif trainer_parameters_dict[brain_name]['trainer'] == 'ppo': - self.trainers[brain_name] = PPOTrainer( - self.external_brains[brain_name], - self.meta_curriculum - .brains_to_curriculums[brain_name] - .min_lesson_length if self.meta_curriculum else 0, - trainer_parameters_dict[brain_name], - self.train_model, self.load_model, self.seed, self.run_id) - else: - raise UnityEnvironmentException('The trainer config contains ' - 'an unknown trainer type for ' - 'brain {}' - .format(brain_name)) - - @staticmethod - def _create_model_path(model_path): - try: - if not os.path.exists(model_path): - os.makedirs(model_path) - except Exception: - raise UnityEnvironmentException('The folder {} containing the ' - 'generated model could not be ' - 'accessed. Please make sure the ' - 'permissions are set correctly.' - .format(model_path)) - - def _reset_env(self, env): - """Resets the environment. - - Returns: - A Data structure corresponding to the initial reset state of the - environment. - """ - if self.meta_curriculum is not None: - return env.reset(config=self.meta_curriculum.get_config()) - else: - if self.update_config: - return env.reset(arenas_configurations=self.config) - self.update_config = False - else: - return env.reset() - - def start_learning(self, env, trainer_config): - # TODO: Should be able to start learning at different lesson numbers - # for each curriculum. - if self.meta_curriculum is not None: - self.meta_curriculum.set_all_curriculums_to_lesson_num(self.lesson) - self._create_model_path(self.model_path) - - tf.reset_default_graph() - - # Prevent a single session from taking all GPU memory. - self.initialize_trainers(trainer_config) - for _, t in self.trainers.items(): - self.logger.info(t) - - curr_info = self._reset_env(env) - if self.train_model: - for brain_name, trainer in self.trainers.items(): - trainer.write_tensorboard_text('Hyperparameters', - trainer.parameters) - if sys.platform.startswith('win'): - # Add the _win_handler function to the windows console's handler function list - win32api.SetConsoleCtrlHandler(self._win_handler, True) - try: - while any([t.get_step <= t.get_max_steps \ - for k, t in self.trainers.items()]) \ - or not self.train_model: - new_info = self.take_step(env, curr_info) - self.global_step += 1 - if self.global_step % self.save_freq == 0 and self.global_step != 0 \ - and self.train_model: - # Save Tensorflow model - self._save_model(steps=self.global_step) - curr_info = new_info - # Final save Tensorflow model - if self.global_step != 0 and self.train_model: - self._save_model(steps=self.global_step) - except KeyboardInterrupt: - if self.train_model: - self._save_model_when_interrupted(steps=self.global_step) - pass - env.close() - - if self.train_model: - self._export_graph() - - def take_step(self, env, curr_info): - if self.meta_curriculum: - # Get the sizes of the reward buffers. - reward_buff_sizes = {k: len(t.reward_buffer) \ - for (k, t) in self.trainers.items()} - # Attempt to increment the lessons of the brains who - # were ready. - lessons_incremented = \ - self.meta_curriculum.increment_lessons( - self._get_measure_vals(), - reward_buff_sizes=reward_buff_sizes) - - # If any lessons were incremented or the environment is - # ready to be reset - if (self.meta_curriculum - and any(lessons_incremented.values())): - curr_info = self._reset_env(env) - for brain_name, trainer in self.trainers.items(): - trainer.end_episode() - for brain_name, changed in lessons_incremented.items(): - if changed: - self.trainers[brain_name].reward_buffer.clear() - elif env.global_done: - curr_info = self._reset_env(env) - for brain_name, trainer in self.trainers.items(): - trainer.end_episode() - - # Decide and take an action - take_action_vector, \ - take_action_memories, \ - take_action_text, \ - take_action_value, \ - take_action_outputs \ - = {}, {}, {}, {}, {} - for brain_name, trainer in self.trainers.items(): - (take_action_vector[brain_name], - take_action_memories[brain_name], - take_action_text[brain_name], - take_action_value[brain_name], - take_action_outputs[brain_name]) = \ - trainer.take_action(curr_info) - new_info = env.step(vector_action=take_action_vector, - memory=take_action_memories, - text_action=take_action_text, - value=take_action_value) - for brain_name, trainer in self.trainers.items(): - trainer.add_experiences(curr_info, new_info, - take_action_outputs[brain_name]) - trainer.process_experiences(curr_info, new_info) - if trainer.is_ready_update() and self.train_model \ - and trainer.get_step <= trainer.get_max_steps: - # Perform gradient descent with experience buffer - trainer.update_policy() - # Write training statistics to Tensorboard. - if self.meta_curriculum is not None: - trainer.write_summary( - self.global_step, - lesson_num=self.meta_curriculum - .brains_to_curriculums[brain_name] - .lesson_num) - else: - trainer.write_summary(self.global_step) - if self.train_model \ - and trainer.get_step <= trainer.get_max_steps: - trainer.increment_step_and_update_last_reward() - return new_info From f0ccd596e55ab6e592cb1b651adba88d872aa964 Mon Sep 17 00:00:00 2001 From: Benjamin Beyret Date: Fri, 31 May 2019 18:47:16 +0100 Subject: [PATCH 07/23] rename animalai_package to animalai --- .gitignore | 3 ++- {animalai_package => animalai}/animalai/LICENSE | 0 {animalai_package => animalai}/animalai/README.md | 0 {animalai_package => animalai}/animalai/animalai/__init__.py | 0 .../animalai/animalai/communicator_objects/__init__.py | 0 .../animalai/communicator_objects/agent_action_proto_pb2.py | 0 .../animalai/communicator_objects/agent_info_proto_pb2.py | 0 .../communicator_objects/arena_parameters_proto_pb2.py | 0 .../communicator_objects/brain_parameters_proto_pb2.py | 0 .../animalai/communicator_objects/command_proto_pb2.py | 0 .../communicator_objects/demonstration_meta_proto_pb2.py | 0 .../communicator_objects/engine_configuration_proto_pb2.py | 0 .../animalai/animalai/communicator_objects/header_pb2.py | 0 .../animalai/communicator_objects/resolution_proto_pb2.py | 0 .../animalai/communicator_objects/space_type_proto_pb2.py | 0 .../animalai/animalai/communicator_objects/unity_input_pb2.py | 0 .../animalai/communicator_objects/unity_message_pb2.py | 0 .../animalai/animalai/communicator_objects/unity_output_pb2.py | 0 .../communicator_objects/unity_rl_initialization_input_pb2.py | 0 .../communicator_objects/unity_rl_initialization_output_pb2.py | 0 .../animalai/communicator_objects/unity_rl_input_pb2.py | 0 .../animalai/communicator_objects/unity_rl_output_pb2.py | 0 .../animalai/communicator_objects/unity_rl_reset_input_pb2.py | 0 .../animalai/communicator_objects/unity_rl_reset_output_pb2.py | 0 .../animalai/communicator_objects/unity_to_external_pb2.py | 0 .../communicator_objects/unity_to_external_pb2_grpc.py | 0 .../animalai/animalai/envs/__init__.py | 0 .../animalai/animalai/envs/arena_config.py | 0 {animalai_package => animalai}/animalai/animalai/envs/brain.py | 0 .../animalai/animalai/envs/communicator.py | 0 .../animalai/animalai/envs/environment.py | 0 .../animalai/animalai/envs/exception.py | 0 .../animalai/animalai/envs/gym/environment.py | 0 .../animalai/animalai/envs/rpc_communicator.py | 0 .../animalai/animalai/envs/socket_communicator.py | 0 {animalai_package => animalai}/animalai/setup.py | 0 36 files changed, 2 insertions(+), 1 deletion(-) rename {animalai_package => animalai}/animalai/LICENSE (100%) rename {animalai_package => animalai}/animalai/README.md (100%) rename {animalai_package => animalai}/animalai/animalai/__init__.py (100%) rename {animalai_package => animalai}/animalai/animalai/communicator_objects/__init__.py (100%) rename {animalai_package => animalai}/animalai/animalai/communicator_objects/agent_action_proto_pb2.py (100%) rename {animalai_package => animalai}/animalai/animalai/communicator_objects/agent_info_proto_pb2.py (100%) rename {animalai_package => animalai}/animalai/animalai/communicator_objects/arena_parameters_proto_pb2.py (100%) rename {animalai_package => animalai}/animalai/animalai/communicator_objects/brain_parameters_proto_pb2.py (100%) rename {animalai_package => animalai}/animalai/animalai/communicator_objects/command_proto_pb2.py (100%) rename {animalai_package => animalai}/animalai/animalai/communicator_objects/demonstration_meta_proto_pb2.py (100%) rename {animalai_package => animalai}/animalai/animalai/communicator_objects/engine_configuration_proto_pb2.py (100%) rename {animalai_package => animalai}/animalai/animalai/communicator_objects/header_pb2.py (100%) rename {animalai_package => animalai}/animalai/animalai/communicator_objects/resolution_proto_pb2.py (100%) rename {animalai_package => animalai}/animalai/animalai/communicator_objects/space_type_proto_pb2.py (100%) rename {animalai_package => animalai}/animalai/animalai/communicator_objects/unity_input_pb2.py (100%) rename {animalai_package => animalai}/animalai/animalai/communicator_objects/unity_message_pb2.py (100%) rename {animalai_package => animalai}/animalai/animalai/communicator_objects/unity_output_pb2.py (100%) rename {animalai_package => animalai}/animalai/animalai/communicator_objects/unity_rl_initialization_input_pb2.py (100%) rename {animalai_package => animalai}/animalai/animalai/communicator_objects/unity_rl_initialization_output_pb2.py (100%) rename {animalai_package => animalai}/animalai/animalai/communicator_objects/unity_rl_input_pb2.py (100%) rename {animalai_package => animalai}/animalai/animalai/communicator_objects/unity_rl_output_pb2.py (100%) rename {animalai_package => animalai}/animalai/animalai/communicator_objects/unity_rl_reset_input_pb2.py (100%) rename {animalai_package => animalai}/animalai/animalai/communicator_objects/unity_rl_reset_output_pb2.py (100%) rename {animalai_package => animalai}/animalai/animalai/communicator_objects/unity_to_external_pb2.py (100%) rename {animalai_package => animalai}/animalai/animalai/communicator_objects/unity_to_external_pb2_grpc.py (100%) rename {animalai_package => animalai}/animalai/animalai/envs/__init__.py (100%) rename {animalai_package => animalai}/animalai/animalai/envs/arena_config.py (100%) rename {animalai_package => animalai}/animalai/animalai/envs/brain.py (100%) rename {animalai_package => animalai}/animalai/animalai/envs/communicator.py (100%) rename {animalai_package => animalai}/animalai/animalai/envs/environment.py (100%) rename {animalai_package => animalai}/animalai/animalai/envs/exception.py (100%) rename {animalai_package => animalai}/animalai/animalai/envs/gym/environment.py (100%) rename {animalai_package => animalai}/animalai/animalai/envs/rpc_communicator.py (100%) rename {animalai_package => animalai}/animalai/animalai/envs/socket_communicator.py (100%) rename {animalai_package => animalai}/animalai/setup.py (100%) diff --git a/.gitignore b/.gitignore index 8ccb7e08..a1fc126d 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,5 @@ venv/ build/ dist/ *.egg-info* -*.eggs* \ No newline at end of file +*.eggs* +animalai_bkp/ \ No newline at end of file diff --git a/animalai_package/animalai/LICENSE b/animalai/animalai/LICENSE similarity index 100% rename from animalai_package/animalai/LICENSE rename to animalai/animalai/LICENSE diff --git a/animalai_package/animalai/README.md b/animalai/animalai/README.md similarity index 100% rename from animalai_package/animalai/README.md rename to animalai/animalai/README.md diff --git a/animalai_package/animalai/animalai/__init__.py b/animalai/animalai/animalai/__init__.py similarity index 100% rename from animalai_package/animalai/animalai/__init__.py rename to animalai/animalai/animalai/__init__.py diff --git a/animalai_package/animalai/animalai/communicator_objects/__init__.py b/animalai/animalai/animalai/communicator_objects/__init__.py similarity index 100% rename from animalai_package/animalai/animalai/communicator_objects/__init__.py rename to animalai/animalai/animalai/communicator_objects/__init__.py diff --git a/animalai_package/animalai/animalai/communicator_objects/agent_action_proto_pb2.py b/animalai/animalai/animalai/communicator_objects/agent_action_proto_pb2.py similarity index 100% rename from animalai_package/animalai/animalai/communicator_objects/agent_action_proto_pb2.py rename to animalai/animalai/animalai/communicator_objects/agent_action_proto_pb2.py diff --git a/animalai_package/animalai/animalai/communicator_objects/agent_info_proto_pb2.py b/animalai/animalai/animalai/communicator_objects/agent_info_proto_pb2.py similarity index 100% rename from animalai_package/animalai/animalai/communicator_objects/agent_info_proto_pb2.py rename to animalai/animalai/animalai/communicator_objects/agent_info_proto_pb2.py diff --git a/animalai_package/animalai/animalai/communicator_objects/arena_parameters_proto_pb2.py b/animalai/animalai/animalai/communicator_objects/arena_parameters_proto_pb2.py similarity index 100% rename from animalai_package/animalai/animalai/communicator_objects/arena_parameters_proto_pb2.py rename to animalai/animalai/animalai/communicator_objects/arena_parameters_proto_pb2.py diff --git a/animalai_package/animalai/animalai/communicator_objects/brain_parameters_proto_pb2.py b/animalai/animalai/animalai/communicator_objects/brain_parameters_proto_pb2.py similarity index 100% rename from animalai_package/animalai/animalai/communicator_objects/brain_parameters_proto_pb2.py rename to animalai/animalai/animalai/communicator_objects/brain_parameters_proto_pb2.py diff --git a/animalai_package/animalai/animalai/communicator_objects/command_proto_pb2.py b/animalai/animalai/animalai/communicator_objects/command_proto_pb2.py similarity index 100% rename from animalai_package/animalai/animalai/communicator_objects/command_proto_pb2.py rename to animalai/animalai/animalai/communicator_objects/command_proto_pb2.py diff --git a/animalai_package/animalai/animalai/communicator_objects/demonstration_meta_proto_pb2.py b/animalai/animalai/animalai/communicator_objects/demonstration_meta_proto_pb2.py similarity index 100% rename from animalai_package/animalai/animalai/communicator_objects/demonstration_meta_proto_pb2.py rename to animalai/animalai/animalai/communicator_objects/demonstration_meta_proto_pb2.py diff --git a/animalai_package/animalai/animalai/communicator_objects/engine_configuration_proto_pb2.py b/animalai/animalai/animalai/communicator_objects/engine_configuration_proto_pb2.py similarity index 100% rename from animalai_package/animalai/animalai/communicator_objects/engine_configuration_proto_pb2.py rename to animalai/animalai/animalai/communicator_objects/engine_configuration_proto_pb2.py diff --git a/animalai_package/animalai/animalai/communicator_objects/header_pb2.py b/animalai/animalai/animalai/communicator_objects/header_pb2.py similarity index 100% rename from animalai_package/animalai/animalai/communicator_objects/header_pb2.py rename to animalai/animalai/animalai/communicator_objects/header_pb2.py diff --git a/animalai_package/animalai/animalai/communicator_objects/resolution_proto_pb2.py b/animalai/animalai/animalai/communicator_objects/resolution_proto_pb2.py similarity index 100% rename from animalai_package/animalai/animalai/communicator_objects/resolution_proto_pb2.py rename to animalai/animalai/animalai/communicator_objects/resolution_proto_pb2.py diff --git a/animalai_package/animalai/animalai/communicator_objects/space_type_proto_pb2.py b/animalai/animalai/animalai/communicator_objects/space_type_proto_pb2.py similarity index 100% rename from animalai_package/animalai/animalai/communicator_objects/space_type_proto_pb2.py rename to animalai/animalai/animalai/communicator_objects/space_type_proto_pb2.py diff --git a/animalai_package/animalai/animalai/communicator_objects/unity_input_pb2.py b/animalai/animalai/animalai/communicator_objects/unity_input_pb2.py similarity index 100% rename from animalai_package/animalai/animalai/communicator_objects/unity_input_pb2.py rename to animalai/animalai/animalai/communicator_objects/unity_input_pb2.py diff --git a/animalai_package/animalai/animalai/communicator_objects/unity_message_pb2.py b/animalai/animalai/animalai/communicator_objects/unity_message_pb2.py similarity index 100% rename from animalai_package/animalai/animalai/communicator_objects/unity_message_pb2.py rename to animalai/animalai/animalai/communicator_objects/unity_message_pb2.py diff --git a/animalai_package/animalai/animalai/communicator_objects/unity_output_pb2.py b/animalai/animalai/animalai/communicator_objects/unity_output_pb2.py similarity index 100% rename from animalai_package/animalai/animalai/communicator_objects/unity_output_pb2.py rename to animalai/animalai/animalai/communicator_objects/unity_output_pb2.py diff --git a/animalai_package/animalai/animalai/communicator_objects/unity_rl_initialization_input_pb2.py b/animalai/animalai/animalai/communicator_objects/unity_rl_initialization_input_pb2.py similarity index 100% rename from animalai_package/animalai/animalai/communicator_objects/unity_rl_initialization_input_pb2.py rename to animalai/animalai/animalai/communicator_objects/unity_rl_initialization_input_pb2.py diff --git a/animalai_package/animalai/animalai/communicator_objects/unity_rl_initialization_output_pb2.py b/animalai/animalai/animalai/communicator_objects/unity_rl_initialization_output_pb2.py similarity index 100% rename from animalai_package/animalai/animalai/communicator_objects/unity_rl_initialization_output_pb2.py rename to animalai/animalai/animalai/communicator_objects/unity_rl_initialization_output_pb2.py diff --git a/animalai_package/animalai/animalai/communicator_objects/unity_rl_input_pb2.py b/animalai/animalai/animalai/communicator_objects/unity_rl_input_pb2.py similarity index 100% rename from animalai_package/animalai/animalai/communicator_objects/unity_rl_input_pb2.py rename to animalai/animalai/animalai/communicator_objects/unity_rl_input_pb2.py diff --git a/animalai_package/animalai/animalai/communicator_objects/unity_rl_output_pb2.py b/animalai/animalai/animalai/communicator_objects/unity_rl_output_pb2.py similarity index 100% rename from animalai_package/animalai/animalai/communicator_objects/unity_rl_output_pb2.py rename to animalai/animalai/animalai/communicator_objects/unity_rl_output_pb2.py diff --git a/animalai_package/animalai/animalai/communicator_objects/unity_rl_reset_input_pb2.py b/animalai/animalai/animalai/communicator_objects/unity_rl_reset_input_pb2.py similarity index 100% rename from animalai_package/animalai/animalai/communicator_objects/unity_rl_reset_input_pb2.py rename to animalai/animalai/animalai/communicator_objects/unity_rl_reset_input_pb2.py diff --git a/animalai_package/animalai/animalai/communicator_objects/unity_rl_reset_output_pb2.py b/animalai/animalai/animalai/communicator_objects/unity_rl_reset_output_pb2.py similarity index 100% rename from animalai_package/animalai/animalai/communicator_objects/unity_rl_reset_output_pb2.py rename to animalai/animalai/animalai/communicator_objects/unity_rl_reset_output_pb2.py diff --git a/animalai_package/animalai/animalai/communicator_objects/unity_to_external_pb2.py b/animalai/animalai/animalai/communicator_objects/unity_to_external_pb2.py similarity index 100% rename from animalai_package/animalai/animalai/communicator_objects/unity_to_external_pb2.py rename to animalai/animalai/animalai/communicator_objects/unity_to_external_pb2.py diff --git a/animalai_package/animalai/animalai/communicator_objects/unity_to_external_pb2_grpc.py b/animalai/animalai/animalai/communicator_objects/unity_to_external_pb2_grpc.py similarity index 100% rename from animalai_package/animalai/animalai/communicator_objects/unity_to_external_pb2_grpc.py rename to animalai/animalai/animalai/communicator_objects/unity_to_external_pb2_grpc.py diff --git a/animalai_package/animalai/animalai/envs/__init__.py b/animalai/animalai/animalai/envs/__init__.py similarity index 100% rename from animalai_package/animalai/animalai/envs/__init__.py rename to animalai/animalai/animalai/envs/__init__.py diff --git a/animalai_package/animalai/animalai/envs/arena_config.py b/animalai/animalai/animalai/envs/arena_config.py similarity index 100% rename from animalai_package/animalai/animalai/envs/arena_config.py rename to animalai/animalai/animalai/envs/arena_config.py diff --git a/animalai_package/animalai/animalai/envs/brain.py b/animalai/animalai/animalai/envs/brain.py similarity index 100% rename from animalai_package/animalai/animalai/envs/brain.py rename to animalai/animalai/animalai/envs/brain.py diff --git a/animalai_package/animalai/animalai/envs/communicator.py b/animalai/animalai/animalai/envs/communicator.py similarity index 100% rename from animalai_package/animalai/animalai/envs/communicator.py rename to animalai/animalai/animalai/envs/communicator.py diff --git a/animalai_package/animalai/animalai/envs/environment.py b/animalai/animalai/animalai/envs/environment.py similarity index 100% rename from animalai_package/animalai/animalai/envs/environment.py rename to animalai/animalai/animalai/envs/environment.py diff --git a/animalai_package/animalai/animalai/envs/exception.py b/animalai/animalai/animalai/envs/exception.py similarity index 100% rename from animalai_package/animalai/animalai/envs/exception.py rename to animalai/animalai/animalai/envs/exception.py diff --git a/animalai_package/animalai/animalai/envs/gym/environment.py b/animalai/animalai/animalai/envs/gym/environment.py similarity index 100% rename from animalai_package/animalai/animalai/envs/gym/environment.py rename to animalai/animalai/animalai/envs/gym/environment.py diff --git a/animalai_package/animalai/animalai/envs/rpc_communicator.py b/animalai/animalai/animalai/envs/rpc_communicator.py similarity index 100% rename from animalai_package/animalai/animalai/envs/rpc_communicator.py rename to animalai/animalai/animalai/envs/rpc_communicator.py diff --git a/animalai_package/animalai/animalai/envs/socket_communicator.py b/animalai/animalai/animalai/envs/socket_communicator.py similarity index 100% rename from animalai_package/animalai/animalai/envs/socket_communicator.py rename to animalai/animalai/animalai/envs/socket_communicator.py diff --git a/animalai_package/animalai/setup.py b/animalai/animalai/setup.py similarity index 100% rename from animalai_package/animalai/setup.py rename to animalai/animalai/setup.py From 4277083be24237d176902dc305c9ec6982a3be9f Mon Sep 17 00:00:00 2001 From: Benjamin Beyret Date: Fri, 31 May 2019 18:48:50 +0100 Subject: [PATCH 08/23] delete empty animalai folder --- animalai/{animalai => }/LICENSE | 0 animalai/{animalai => }/README.md | 0 animalai/animalai/{animalai => }/__init__.py | 0 animalai/animalai/{animalai => }/communicator_objects/__init__.py | 0 .../{animalai => }/communicator_objects/agent_action_proto_pb2.py | 0 .../{animalai => }/communicator_objects/agent_info_proto_pb2.py | 0 .../communicator_objects/arena_parameters_proto_pb2.py | 0 .../communicator_objects/brain_parameters_proto_pb2.py | 0 .../{animalai => }/communicator_objects/command_proto_pb2.py | 0 .../communicator_objects/demonstration_meta_proto_pb2.py | 0 .../communicator_objects/engine_configuration_proto_pb2.py | 0 .../animalai/{animalai => }/communicator_objects/header_pb2.py | 0 .../{animalai => }/communicator_objects/resolution_proto_pb2.py | 0 .../{animalai => }/communicator_objects/space_type_proto_pb2.py | 0 .../{animalai => }/communicator_objects/unity_input_pb2.py | 0 .../{animalai => }/communicator_objects/unity_message_pb2.py | 0 .../{animalai => }/communicator_objects/unity_output_pb2.py | 0 .../communicator_objects/unity_rl_initialization_input_pb2.py | 0 .../communicator_objects/unity_rl_initialization_output_pb2.py | 0 .../{animalai => }/communicator_objects/unity_rl_input_pb2.py | 0 .../{animalai => }/communicator_objects/unity_rl_output_pb2.py | 0 .../communicator_objects/unity_rl_reset_input_pb2.py | 0 .../communicator_objects/unity_rl_reset_output_pb2.py | 0 .../{animalai => }/communicator_objects/unity_to_external_pb2.py | 0 .../communicator_objects/unity_to_external_pb2_grpc.py | 0 animalai/animalai/{animalai => }/envs/__init__.py | 0 animalai/animalai/{animalai => }/envs/arena_config.py | 0 animalai/animalai/{animalai => }/envs/brain.py | 0 animalai/animalai/{animalai => }/envs/communicator.py | 0 animalai/animalai/{animalai => }/envs/environment.py | 0 animalai/animalai/{animalai => }/envs/exception.py | 0 animalai/animalai/{animalai => }/envs/gym/environment.py | 0 animalai/animalai/{animalai => }/envs/rpc_communicator.py | 0 animalai/animalai/{animalai => }/envs/socket_communicator.py | 0 animalai/{animalai => }/setup.py | 0 35 files changed, 0 insertions(+), 0 deletions(-) rename animalai/{animalai => }/LICENSE (100%) rename animalai/{animalai => }/README.md (100%) rename animalai/animalai/{animalai => }/__init__.py (100%) rename animalai/animalai/{animalai => }/communicator_objects/__init__.py (100%) rename animalai/animalai/{animalai => }/communicator_objects/agent_action_proto_pb2.py (100%) rename animalai/animalai/{animalai => }/communicator_objects/agent_info_proto_pb2.py (100%) rename animalai/animalai/{animalai => }/communicator_objects/arena_parameters_proto_pb2.py (100%) rename animalai/animalai/{animalai => }/communicator_objects/brain_parameters_proto_pb2.py (100%) rename animalai/animalai/{animalai => }/communicator_objects/command_proto_pb2.py (100%) rename animalai/animalai/{animalai => }/communicator_objects/demonstration_meta_proto_pb2.py (100%) rename animalai/animalai/{animalai => }/communicator_objects/engine_configuration_proto_pb2.py (100%) rename animalai/animalai/{animalai => }/communicator_objects/header_pb2.py (100%) rename animalai/animalai/{animalai => }/communicator_objects/resolution_proto_pb2.py (100%) rename animalai/animalai/{animalai => }/communicator_objects/space_type_proto_pb2.py (100%) rename animalai/animalai/{animalai => }/communicator_objects/unity_input_pb2.py (100%) rename animalai/animalai/{animalai => }/communicator_objects/unity_message_pb2.py (100%) rename animalai/animalai/{animalai => }/communicator_objects/unity_output_pb2.py (100%) rename animalai/animalai/{animalai => }/communicator_objects/unity_rl_initialization_input_pb2.py (100%) rename animalai/animalai/{animalai => }/communicator_objects/unity_rl_initialization_output_pb2.py (100%) rename animalai/animalai/{animalai => }/communicator_objects/unity_rl_input_pb2.py (100%) rename animalai/animalai/{animalai => }/communicator_objects/unity_rl_output_pb2.py (100%) rename animalai/animalai/{animalai => }/communicator_objects/unity_rl_reset_input_pb2.py (100%) rename animalai/animalai/{animalai => }/communicator_objects/unity_rl_reset_output_pb2.py (100%) rename animalai/animalai/{animalai => }/communicator_objects/unity_to_external_pb2.py (100%) rename animalai/animalai/{animalai => }/communicator_objects/unity_to_external_pb2_grpc.py (100%) rename animalai/animalai/{animalai => }/envs/__init__.py (100%) rename animalai/animalai/{animalai => }/envs/arena_config.py (100%) rename animalai/animalai/{animalai => }/envs/brain.py (100%) rename animalai/animalai/{animalai => }/envs/communicator.py (100%) rename animalai/animalai/{animalai => }/envs/environment.py (100%) rename animalai/animalai/{animalai => }/envs/exception.py (100%) rename animalai/animalai/{animalai => }/envs/gym/environment.py (100%) rename animalai/animalai/{animalai => }/envs/rpc_communicator.py (100%) rename animalai/animalai/{animalai => }/envs/socket_communicator.py (100%) rename animalai/{animalai => }/setup.py (100%) diff --git a/animalai/animalai/LICENSE b/animalai/LICENSE similarity index 100% rename from animalai/animalai/LICENSE rename to animalai/LICENSE diff --git a/animalai/animalai/README.md b/animalai/README.md similarity index 100% rename from animalai/animalai/README.md rename to animalai/README.md diff --git a/animalai/animalai/animalai/__init__.py b/animalai/animalai/__init__.py similarity index 100% rename from animalai/animalai/animalai/__init__.py rename to animalai/animalai/__init__.py diff --git a/animalai/animalai/animalai/communicator_objects/__init__.py b/animalai/animalai/communicator_objects/__init__.py similarity index 100% rename from animalai/animalai/animalai/communicator_objects/__init__.py rename to animalai/animalai/communicator_objects/__init__.py diff --git a/animalai/animalai/animalai/communicator_objects/agent_action_proto_pb2.py b/animalai/animalai/communicator_objects/agent_action_proto_pb2.py similarity index 100% rename from animalai/animalai/animalai/communicator_objects/agent_action_proto_pb2.py rename to animalai/animalai/communicator_objects/agent_action_proto_pb2.py diff --git a/animalai/animalai/animalai/communicator_objects/agent_info_proto_pb2.py b/animalai/animalai/communicator_objects/agent_info_proto_pb2.py similarity index 100% rename from animalai/animalai/animalai/communicator_objects/agent_info_proto_pb2.py rename to animalai/animalai/communicator_objects/agent_info_proto_pb2.py diff --git a/animalai/animalai/animalai/communicator_objects/arena_parameters_proto_pb2.py b/animalai/animalai/communicator_objects/arena_parameters_proto_pb2.py similarity index 100% rename from animalai/animalai/animalai/communicator_objects/arena_parameters_proto_pb2.py rename to animalai/animalai/communicator_objects/arena_parameters_proto_pb2.py diff --git a/animalai/animalai/animalai/communicator_objects/brain_parameters_proto_pb2.py b/animalai/animalai/communicator_objects/brain_parameters_proto_pb2.py similarity index 100% rename from animalai/animalai/animalai/communicator_objects/brain_parameters_proto_pb2.py rename to animalai/animalai/communicator_objects/brain_parameters_proto_pb2.py diff --git a/animalai/animalai/animalai/communicator_objects/command_proto_pb2.py b/animalai/animalai/communicator_objects/command_proto_pb2.py similarity index 100% rename from animalai/animalai/animalai/communicator_objects/command_proto_pb2.py rename to animalai/animalai/communicator_objects/command_proto_pb2.py diff --git a/animalai/animalai/animalai/communicator_objects/demonstration_meta_proto_pb2.py b/animalai/animalai/communicator_objects/demonstration_meta_proto_pb2.py similarity index 100% rename from animalai/animalai/animalai/communicator_objects/demonstration_meta_proto_pb2.py rename to animalai/animalai/communicator_objects/demonstration_meta_proto_pb2.py diff --git a/animalai/animalai/animalai/communicator_objects/engine_configuration_proto_pb2.py b/animalai/animalai/communicator_objects/engine_configuration_proto_pb2.py similarity index 100% rename from animalai/animalai/animalai/communicator_objects/engine_configuration_proto_pb2.py rename to animalai/animalai/communicator_objects/engine_configuration_proto_pb2.py diff --git a/animalai/animalai/animalai/communicator_objects/header_pb2.py b/animalai/animalai/communicator_objects/header_pb2.py similarity index 100% rename from animalai/animalai/animalai/communicator_objects/header_pb2.py rename to animalai/animalai/communicator_objects/header_pb2.py diff --git a/animalai/animalai/animalai/communicator_objects/resolution_proto_pb2.py b/animalai/animalai/communicator_objects/resolution_proto_pb2.py similarity index 100% rename from animalai/animalai/animalai/communicator_objects/resolution_proto_pb2.py rename to animalai/animalai/communicator_objects/resolution_proto_pb2.py diff --git a/animalai/animalai/animalai/communicator_objects/space_type_proto_pb2.py b/animalai/animalai/communicator_objects/space_type_proto_pb2.py similarity index 100% rename from animalai/animalai/animalai/communicator_objects/space_type_proto_pb2.py rename to animalai/animalai/communicator_objects/space_type_proto_pb2.py diff --git a/animalai/animalai/animalai/communicator_objects/unity_input_pb2.py b/animalai/animalai/communicator_objects/unity_input_pb2.py similarity index 100% rename from animalai/animalai/animalai/communicator_objects/unity_input_pb2.py rename to animalai/animalai/communicator_objects/unity_input_pb2.py diff --git a/animalai/animalai/animalai/communicator_objects/unity_message_pb2.py b/animalai/animalai/communicator_objects/unity_message_pb2.py similarity index 100% rename from animalai/animalai/animalai/communicator_objects/unity_message_pb2.py rename to animalai/animalai/communicator_objects/unity_message_pb2.py diff --git a/animalai/animalai/animalai/communicator_objects/unity_output_pb2.py b/animalai/animalai/communicator_objects/unity_output_pb2.py similarity index 100% rename from animalai/animalai/animalai/communicator_objects/unity_output_pb2.py rename to animalai/animalai/communicator_objects/unity_output_pb2.py diff --git a/animalai/animalai/animalai/communicator_objects/unity_rl_initialization_input_pb2.py b/animalai/animalai/communicator_objects/unity_rl_initialization_input_pb2.py similarity index 100% rename from animalai/animalai/animalai/communicator_objects/unity_rl_initialization_input_pb2.py rename to animalai/animalai/communicator_objects/unity_rl_initialization_input_pb2.py diff --git a/animalai/animalai/animalai/communicator_objects/unity_rl_initialization_output_pb2.py b/animalai/animalai/communicator_objects/unity_rl_initialization_output_pb2.py similarity index 100% rename from animalai/animalai/animalai/communicator_objects/unity_rl_initialization_output_pb2.py rename to animalai/animalai/communicator_objects/unity_rl_initialization_output_pb2.py diff --git a/animalai/animalai/animalai/communicator_objects/unity_rl_input_pb2.py b/animalai/animalai/communicator_objects/unity_rl_input_pb2.py similarity index 100% rename from animalai/animalai/animalai/communicator_objects/unity_rl_input_pb2.py rename to animalai/animalai/communicator_objects/unity_rl_input_pb2.py diff --git a/animalai/animalai/animalai/communicator_objects/unity_rl_output_pb2.py b/animalai/animalai/communicator_objects/unity_rl_output_pb2.py similarity index 100% rename from animalai/animalai/animalai/communicator_objects/unity_rl_output_pb2.py rename to animalai/animalai/communicator_objects/unity_rl_output_pb2.py diff --git a/animalai/animalai/animalai/communicator_objects/unity_rl_reset_input_pb2.py b/animalai/animalai/communicator_objects/unity_rl_reset_input_pb2.py similarity index 100% rename from animalai/animalai/animalai/communicator_objects/unity_rl_reset_input_pb2.py rename to animalai/animalai/communicator_objects/unity_rl_reset_input_pb2.py diff --git a/animalai/animalai/animalai/communicator_objects/unity_rl_reset_output_pb2.py b/animalai/animalai/communicator_objects/unity_rl_reset_output_pb2.py similarity index 100% rename from animalai/animalai/animalai/communicator_objects/unity_rl_reset_output_pb2.py rename to animalai/animalai/communicator_objects/unity_rl_reset_output_pb2.py diff --git a/animalai/animalai/animalai/communicator_objects/unity_to_external_pb2.py b/animalai/animalai/communicator_objects/unity_to_external_pb2.py similarity index 100% rename from animalai/animalai/animalai/communicator_objects/unity_to_external_pb2.py rename to animalai/animalai/communicator_objects/unity_to_external_pb2.py diff --git a/animalai/animalai/animalai/communicator_objects/unity_to_external_pb2_grpc.py b/animalai/animalai/communicator_objects/unity_to_external_pb2_grpc.py similarity index 100% rename from animalai/animalai/animalai/communicator_objects/unity_to_external_pb2_grpc.py rename to animalai/animalai/communicator_objects/unity_to_external_pb2_grpc.py diff --git a/animalai/animalai/animalai/envs/__init__.py b/animalai/animalai/envs/__init__.py similarity index 100% rename from animalai/animalai/animalai/envs/__init__.py rename to animalai/animalai/envs/__init__.py diff --git a/animalai/animalai/animalai/envs/arena_config.py b/animalai/animalai/envs/arena_config.py similarity index 100% rename from animalai/animalai/animalai/envs/arena_config.py rename to animalai/animalai/envs/arena_config.py diff --git a/animalai/animalai/animalai/envs/brain.py b/animalai/animalai/envs/brain.py similarity index 100% rename from animalai/animalai/animalai/envs/brain.py rename to animalai/animalai/envs/brain.py diff --git a/animalai/animalai/animalai/envs/communicator.py b/animalai/animalai/envs/communicator.py similarity index 100% rename from animalai/animalai/animalai/envs/communicator.py rename to animalai/animalai/envs/communicator.py diff --git a/animalai/animalai/animalai/envs/environment.py b/animalai/animalai/envs/environment.py similarity index 100% rename from animalai/animalai/animalai/envs/environment.py rename to animalai/animalai/envs/environment.py diff --git a/animalai/animalai/animalai/envs/exception.py b/animalai/animalai/envs/exception.py similarity index 100% rename from animalai/animalai/animalai/envs/exception.py rename to animalai/animalai/envs/exception.py diff --git a/animalai/animalai/animalai/envs/gym/environment.py b/animalai/animalai/envs/gym/environment.py similarity index 100% rename from animalai/animalai/animalai/envs/gym/environment.py rename to animalai/animalai/envs/gym/environment.py diff --git a/animalai/animalai/animalai/envs/rpc_communicator.py b/animalai/animalai/envs/rpc_communicator.py similarity index 100% rename from animalai/animalai/animalai/envs/rpc_communicator.py rename to animalai/animalai/envs/rpc_communicator.py diff --git a/animalai/animalai/animalai/envs/socket_communicator.py b/animalai/animalai/envs/socket_communicator.py similarity index 100% rename from animalai/animalai/animalai/envs/socket_communicator.py rename to animalai/animalai/envs/socket_communicator.py diff --git a/animalai/animalai/setup.py b/animalai/setup.py similarity index 100% rename from animalai/animalai/setup.py rename to animalai/setup.py From c84b67722a3078989e8c8e5677602e9f9ba5f2a2 Mon Sep 17 00:00:00 2001 From: Benjamin Beyret Date: Fri, 31 May 2019 19:41:58 +0100 Subject: [PATCH 09/23] fix typos visualize + package for PyPI --- animalai/setup.py | 4 ++-- examples/animalai_train/setup.py | 13 ++++++++----- examples/visualizeLightsOff.py | 6 +++--- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/animalai/setup.py b/animalai/setup.py index 0be8087e..0fec0db5 100644 --- a/animalai/setup.py +++ b/animalai/setup.py @@ -2,7 +2,7 @@ setup( name='animalai', - version='0.4.0', + version='0.4.2', description='Animal AI competition interface', url='https://github.com/beyretb/AnimalAI-Olympics', author='Benjamin Beyret', @@ -15,7 +15,7 @@ 'Programming Language :: Python :: 3.6' ], - packages=['animalai.envs', 'animalai.communicator_objects'], # Required + packages=['animalai.envs', 'animalai.envs.gym', 'animalai.communicator_objects'], # Required zip_safe=False, install_requires=[ diff --git a/examples/animalai_train/setup.py b/examples/animalai_train/setup.py index 6c31c5b6..501e4cd0 100644 --- a/examples/animalai_train/setup.py +++ b/examples/animalai_train/setup.py @@ -2,7 +2,7 @@ setup( name='animalai_train', - version='0.4.0', + version='0.4.2', description='Animal AI competition training library', url='https://github.com/beyretb/AnimalAI-Olympics', author='Benjamin Beyret', @@ -15,19 +15,22 @@ 'Programming Language :: Python :: 3.6' ], - packages=['animalai_train.trainers', 'animalai_train.trainers.bc', 'animalai_train.trainers.ppo'], # Required + packages=['animalai_train.trainers', 'animalai_train.trainers.bc', 'animalai_train.trainers.ppo', + 'animalai_train.dopamine'], # Required zip_safe=False, install_requires=[ - 'animalai>=0.4.0', - 'tensorflow>=1.7,<1.8', + 'animalai>=0.4.2', + 'dopamine-rl', + 'tensorflow==1.12', 'matplotlib', 'Pillow>=4.2.1,<=5.4.1', 'numpy>=1.13.3,<=1.14.5', 'protobuf>=3.6,<3.7', 'grpcio>=1.11.0,<1.12.0', 'pyyaml>=5.1', + 'atari-py', 'jsonpickle>=1.2', 'pypiwin32==223;platform_system=="Windows"'], python_requires=">=3.5,<3.8", -) \ No newline at end of file +) diff --git a/examples/visualizeLightsOff.py b/examples/visualizeLightsOff.py index 3c14995a..b1a55d49 100644 --- a/examples/visualizeLightsOff.py +++ b/examples/visualizeLightsOff.py @@ -1,11 +1,11 @@ -from animalai.envs import UnityEnvironment +from animalai.envs.environment import UnityEnvironment from animalai.envs.arena_config import ArenaConfig import random import numpy as np from matplotlib import pyplot as plt from matplotlib import animation -env_path = 'env/AnimalAI' +env_path = '../env/AnimalAI' worker_id = random.randint(1, 100) seed = 10 @@ -34,7 +34,7 @@ play=False ) -arena_config_in = ArenaConfig('examples/configs/lightsOff.yaml') +arena_config_in = ArenaConfig('configs/lightsOff.yaml') env.reset(arenas_configurations=arena_config_in) fig, axes = plt.subplots(2, 2) imshows = [] From fbb6a704ddf49923b27798df28cae711f00425eb Mon Sep 17 00:00:00 2001 From: Benjamin Date: Sat, 1 Jun 2019 15:56:50 +0100 Subject: [PATCH 10/23] update README with new setup + train.py -> trainMLAgents.py --- README.md | 91 ++++++++++++++++++------- examples/{train.py => trainMLAgents.py} | 0 2 files changed, 68 insertions(+), 23 deletions(-) rename examples/{train.py => trainMLAgents.py} (100%) diff --git a/README.md b/README.md index 7c4110d0..33eccc52 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,24 @@ ## Overview Welcome to the repository for the Animal-AI Olympics competition where you will find all the code needed to compete in -this new challenge. Note that for the moment this repo contains **only the training environment** (v0.1) that will be used for the competition and **does not contain any competition tests or information for entering**. If everything goes well the competition will be live on June 30th. Until then we will be continually updating with bug fixes and small changes to environment. However, the general structure will stay the same so it's not too early to start working with the environment. For more information on the competition itself and to stay updated with any developments, head to the [Competition Website](http://www.animalaiolympics.com/) and follow [@MacroPhilosophy](https://twitter.com/MacroPhilosophy) and [@BenBeyret](https://twitter.com/BenBeyret) on twitter. - -The environment contains an agent enclosed in a fixed sized arena. Objects can spawn in this arena, including positive and negative rewards (green, yellow and red spheres). All of the hidden tests that will appear in the competition are made using the objects in the training environment. We have provided some sample environment configurations that should be useful for training, but part of the challenge will be experimenting and designing new configurations. - -The goal of this first release is to **seek feedback from the community** as well as to provide the environment for research prior to the launch of the competition itself. The competition version of the environment will be similar to this one, however we are open to suggestion (for minor changes) and especially bug reports! Head over to the [issues page](https://github.com/beyretb/AnimalAI-Olympics/issues) and open a ticket using the `suggestion` or `bug` labels -respectively. +this new challenge. Note that for the moment this repo contains **only the training environment** (v0.5) that will be +used for the competition and **does not contain any competition tests or information for entering**. If everything goes +well the competition will be live on June 30th. Until then we will be continually updating with bug fixes and small +changes to the environment. However, the general structure will stay the same so it's not too early to start working with +the environment. For more information on the competition itself and to stay updated with any developments, head to the +[Competition Website](http://www.animalaiolympics.com/) and follow [@MacroPhilosophy](https://twitter.com/MacroPhilosophy) +and [@BenBeyret](https://twitter.com/BenBeyret) on twitter. + +The environment contains an agent enclosed in a fixed sized arena. Objects can spawn in this arena, including positive +and negative rewards (green, yellow and red spheres). All of the hidden tests that will appear in the competition are +made using the objects in the training environment. We have provided some sample environment configurations that should +be useful for training, but part of the challenge will be experimenting and designing new configurations. + +The goal of this first release is to **seek feedback from the community** as well as to provide the environment for +research prior to the launch of the competition itself. The competition version of the environment will be similar to +this one, however we are open to suggestion (for minor changes) and especially bug reports! Head over to the +[issues page](https://github.com/beyretb/AnimalAI-Olympics/issues) and open a ticket using the `suggestion` or `bug` +labels respectively. To get started install the requirements below, and then follow the [Quick Start Guide](documentation/quickstart.md). A more in depth documentation can be found on the @@ -16,7 +28,8 @@ A more in depth documentation c ## Development Blog -You can read the development blog [here](https://mdcrosby.com/blog). It covers further details about the competition as well as part of the development process. +You can read the development blog [here](https://mdcrosby.com/blog). It covers further details about the competition as +well as part of the development process. 1. [Why Animal-AI?](https://mdcrosby.com/blog/animalai1.html) @@ -24,21 +37,32 @@ You can read the development blog [here](https://mdcrosby.com/blog). It covers f ## Requirements -The Animal-AI package works on most platforms. +The Animal-AI package works on most platforms. + -First of all your will need `python3.6` installed. You will find a list of requirements in the `requirements*.txt` files. -Using `pip` you can run: +First of all your will need `python3.6` installed, we recommend using virtual environments. We provide two packages for +this competition: -on Linux and mac: +- The main one is an API for interfacing with the Unity environment. It contains both a +[gym environment](https://github.com/openai/gym) as well as an extension of Unity's +[ml-agents environments](https://github.com/Unity-Technologies/ml-agents/tree/master/ml-agents-envs). You can install it + via pip: ``` -pip install -r requirementsOthers.txt +pip install animalai ``` - -on windows: +Or you can install it from the source, head to `animalai/` folder and run `pip install -e .`. + +- We also provide a package that can be used as a starting point for training, and which is required to run most of the +example scripts found in the `examples/` folder. It contains an extension of +[ml-agents' training environment](https://github.com/Unity-Technologies/ml-agents/tree/master/ml-agents) that relies on +[OpenAI's PPO](https://openai.com/blog/openai-baselines-ppo/), as well as +[Google's dopamine](https://github.com/google/dopamine) which implements +[Rainbow](https://www.aaai.org/ocs/index.php/AAAI/AAAI18/paper/download/17204/16680) (among others). You can also install +this package using pip: ``` -pip install -r requirementsWindows.txt +pip install animalai-train ``` -**Note:** `python3.6` is required to install `tensorflow>=1.7,<1.8` which is only used for the training script we provide as an example. Should you wish to use another version of python you can remove the first line from the requirement files. You will still be able to use the `visualizeArena.py` script, but not the `train.py` one. +Or you can install it from source, head to `examples/animalai_train` and run `pip install -e .`. Finally download the environment for your system: @@ -71,20 +95,29 @@ mode for better performance. ## Competition Tests -We will be releasing further details about the tests in the competition over the coming weeks. The tests will be split into multiple categories from the very simple (e.g. **food retrieval**, **preferences**, and **basic obstacles**) to the more complex (e.g. **working memory**, **spatial memory**, **object permanence**, and **object manipulation**). For now we have included multiple example config files that each relate to a different category. As we release further details we will also specify the rules for the type of tests that can appear in each category. Note that the example config files are just simple examples to be used as a guide. An agent that solves even all of these perfectly may still not be able to solve all the tests in the categories but it would be off to a very good start. +We will be releasing further details about the tests in the competition over the coming weeks. The tests will be split +into multiple categories from the very simple (e.g. **food retrieval**, **preferences**, and **basic obstacles**) to +the more complex (e.g. **working memory**, **spatial memory**, **object permanence**, and **object manipulation**). For +now we have included multiple example config files that each relate to a different category. As we release further +details we will also specify the rules for the type of tests that can appear in each category. Note that the example +config files are just simple examples to be used as a guide. An agent that solves even all of these perfectly may still +not be able to solve all the tests in the categories but it would be off to a very good start. ## Citing For now please cite the [Nature: Machine Intelligence piece](https://rdcu.be/bBCQt): -Crosby, M., Beyret, B., Halina M. [The Animal-AI Olympics](https://www.nature.com/articles/s42256-019-0050-3) Nature Machine Intelligence 1 (5) p257 2019. +Crosby, M., Beyret, B., Halina M. [The Animal-AI Olympics](https://www.nature.com/articles/s42256-019-0050-3) Nature +Machine Intelligence 1 (5) p257 2019. ## Unity ML-Agents The Animal-AI Olympics was built using [Unity's ML-Agents Toolkit.](https://github.com/Unity-Technologies/ml-agents) The Python library located in [animalai](animalai) is almost identical to -[ml-agents v0.7](https://github.com/Unity-Technologies/ml-agents/tree/master/ml-agents-envs). We only added the possibility to change the configuration of arenas between episodes. The documentation for ML-Agents can be found [here](https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Python-API.md). +[ml-agents v0.7](https://github.com/Unity-Technologies/ml-agents/tree/master/ml-agents-envs). We only added the +possibility to change the configuration of arenas between episodes. The documentation for ML-Agents can be found +[here](https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Python-API.md). Juliani, A., Berges, V., Vckay, E., Gao, Y., Henry, H., Mattar, M., Lange, D. (2018). [Unity: A General Platform for Intelligent Agents.](https://arxiv.org/abs/1809.02627) *arXiv preprint arXiv:1809.02627* @@ -97,8 +130,8 @@ Occasional slow frame rates in play mode. Temporary fix: reduce screen size. ## TODO -- [ ] Offer a gym wrapper for training - [ ] Add protobuf for arena spawning feedback +- [x] Offer a gym wrapper for training - [x] Improve the way the agent spawns - [x] Add lights out configurations. - [x] Improve environment framerates @@ -106,17 +139,29 @@ Occasional slow frame rates in play mode. Temporary fix: reduce screen size. ## Version History +- v0.5 + - Separate environment API and training API in Python + - Release both as `animalai` and `animalai-train` PyPI packages (for `pip` installs) + - Agent speed in play-mode constant across various platforms + - Provide Gym environment + - Add `trainBaselines,py` to train using `dopamine` and the Gym wrapper + - Create the `agent.py` interface for agents submission + - Add the `HotZone` object (equivalent to the red zone but without death) + - v0.4 - Lights off moved to Unity, colors configurations, proportional goals, bugs fixes - The light is now directly switched on/off within Unity, configuration files stay the same - Blackouts now work with infinite episodes (`t=0`) - - The `rand_colors` configurations have been removed and the user can now pass `RGB` values, see [here](documentation/configFile.md#objects) - - Rewards for goals are now proportional to their size (except for the `DeathZone`), see [here](documentation/definitionsOfObjects.md#rewards) + - The `rand_colors` configurations have been removed and the user can now pass `RGB` values, see + [here](documentation/configFile.md#objects) + - Rewards for goals are now proportional to their size (except for the `DeathZone`), see + [here](documentation/definitionsOfObjects.md#rewards) - The agent is now a ball rather than a cube - Increased safety for spawning the agent to avoid infinite loops - Bugs fixes - v0.3 - Lights off, remove Beams and add cylinder - - We added the possibility to switch the lights off at given intervals, see [here](documentation/configFile.md#blackouts) + - We added the possibility to switch the lights off at given intervals, see + [here](documentation/configFile.md#blackouts) - visualizeLightsOff.py displays an example of lights off, from the agent's point of view - Beams objects have been removed - A `Cylinder` object has been added (similar behaviour to the `Woodlog`) diff --git a/examples/train.py b/examples/trainMLAgents.py similarity index 100% rename from examples/train.py rename to examples/trainMLAgents.py From 3725cb7a521b137befd521a0b722ae6c46abf325 Mon Sep 17 00:00:00 2001 From: Benjamin Date: Sat, 1 Jun 2019 16:52:03 +0100 Subject: [PATCH 11/23] update quickstart.md with new structure --- README.md | 18 ++--- documentation/quickstart.md | 66 ++++++++++++------- .../{trainBaselines.py => trainDopamine.py} | 0 3 files changed, 53 insertions(+), 31 deletions(-) rename examples/{trainBaselines.py => trainDopamine.py} (100%) diff --git a/README.md b/README.md index 33eccc52..a35eb75e 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ well as part of the development process. ## Requirements -The Animal-AI package works on most platforms. +The Animal-AI package works on Linux, Mac and Windows, as well as most Cloud providers. First of all your will need `python3.6` installed, we recommend using virtual environments. We provide two packages for @@ -47,10 +47,10 @@ this competition: [gym environment](https://github.com/openai/gym) as well as an extension of Unity's [ml-agents environments](https://github.com/Unity-Technologies/ml-agents/tree/master/ml-agents-envs). You can install it via pip: -``` -pip install animalai -``` -Or you can install it from the source, head to `animalai/` folder and run `pip install -e .`. + ``` + pip install animalai + ``` + Or you can install it from the source, head to `animalai/` folder and run `pip install -e .` - We also provide a package that can be used as a starting point for training, and which is required to run most of the example scripts found in the `examples/` folder. It contains an extension of @@ -59,10 +59,10 @@ example scripts found in the `examples/` folder. It contains an extension of [Google's dopamine](https://github.com/google/dopamine) which implements [Rainbow](https://www.aaai.org/ocs/index.php/AAAI/AAAI18/paper/download/17204/16680) (among others). You can also install this package using pip: -``` -pip install animalai-train -``` -Or you can install it from source, head to `examples/animalai_train` and run `pip install -e .`. + ``` + pip install animalai-train + ``` + Or you can install it from source, head to `examples/animalai_train` and run `pip install -e .` Finally download the environment for your system: diff --git a/documentation/quickstart.md b/documentation/quickstart.md index f20012f9..3b51ad1b 100644 --- a/documentation/quickstart.md +++ b/documentation/quickstart.md @@ -1,38 +1,60 @@ # Quick Start Guide -You can run the Animal AI environment in three different ways: -- running the standalone `AnimalAI` executable -- running a configuration file via `visualizeArena.py` -- start training using `train.py` +The format of this competition is rather different to what you might be used to. We do provide a single training set that +you can train on out of the box, instead you are invited to include the design of a training environment as part of the +whole training process. To make this new step as smooth as possible, we created tools you can use to easily setup your +training environment and visualize what these configurations look like. ## Running the standalone arena -Running the executable `AnimalAI` that you should have separately downloaded and added to the `envs` folder starts a -playable environment with default configurations in a single arena. You can toggle the camera between First Person and -Bird's eye view using the `C` key on your keyboard. The agent can then be controlled using `W,A,S,D` on your keyboard. -The objects present in the configuration are randomly sampled from the list of objects that can be spawned, their -location is random too. Hitting `R` or collecting rewards will reset the arena. +The basic environment is made of a single agent in an enclosed arena, that resembles the environment we would use for +experimenting with animals. In this environment you can add objects the agents can interact with, as well as goals or +rewards the agent must collect or avoid. To see what this looks like, run the executable environment you downloaded, you +will spawn in an arena with lots of objects randomly spawned. + +You can toggle the camera between First Person and Bird's eye view using the `C` key on your keyboard. The agent can +then be controlled using `W,A,S,D` on your keyboard. Hitting `R` or collecting rewards will reset the arena. **Note**: on some platforms, running the standalone arena in full screen makes the environment slow, keep the environment in window mode for better performance. ## Running a specific configuration file -The `visualizeArena.py` script found in the main folder allows you to visualize an arena configuration file. We provide -sample configuration files for you to experiment with. To make your own environment configuration file we advise to read -thoroughly the [configuration file documentation page](configFile.md). You will find a detailed list of all the objects on the [definitions of objects page](definitionsOfObjects.md). Running this script only allows for a single arena to be visualized at once, as there can only be a single agent you control. - -For example, to run an environment that contains the agent, a goal, and some randomly placed walls use: +Once you are familiarized with the environment and its physics, you can start building and visualizing your own. Assuming +you followed the [installation instruction](../README.md#requirements), go to the `examples/` folder and run +`python visualizeArena.py configs/exampleConfig.yaml`. This loads the `configs/exampleConfig.yaml` configuration for the +arena and lets you play as the agent. -``` -python visualizeArena.py configs/obstacles.yaml -``` +Have a look at the [configuration file](configs/exampleConfig.yaml) for a first look behind the scene. You can select +objects, their size, location, rotation and color, randomizing any of these parameters as you like. We provide +documentation section that we recommend you read thoroughly: + - The [configuration file documentation page](configFile.md) which explains how to write these configuration files. + - The [definitions of objects page](definitionsOfObjects.md) which contains a detailed list of all the objects and their + characteristics. ## Start training your agent -Once you're happy with your arena configuration you can start training your agent. This can be done in a way very similar -to a regular [gym](https://github.com/openai/gym) environment. We provide a template training file `train.py` you can run -out of the box, it uses the [ML agents' PPO](https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Training-PPO.md) -for training. We added the ability for participants to **change the environment configuration between episodes**. You can -find more details about that in the [training documentation](training.md). +Once you're happy with your arena configurations you can start training your agent. The `animalai` presents several features +that we think will improve training speed and performance: + +- Participants can **change the environment configuration between episodes** (allowing for techniques such as curriculum + learning) +- You can choose the length of length of each episode as part of the configuration files, even having infinite episodes +- You can have several arenas in a single environment instance, each with an agent you control independently from the other, + and each with its own configuration allowing for collecting observations faster + +We provide examples of training using the `animalai-train` package, you can of course start from scratch and submit agents +that do not rely on this library. To understand how training an `animalai` environment we provide scripts in the +`examples/` folder: + +- `trainDopamine.py` uses the `dopamine` implementation of Rainbow to train a single agent using the gym interface. This +is a good starting point if you want to try another training algorithm that works as a plug-and-play with Gym. **Note that +as such it only allows for training on environment with a single agent.** We do offer to train with several agents in a +gym environment but this will require modifying your code to accept more than one observation at a time. +- `trainMLAgents.py` uses the `ml-agents` implementation of PPO to train one or more agents at a time, using the +`UnityEnvironment`. This is a great starting point if you don't mind reading some code as it directly allows to use the +functionalities described above, out of the box. + + +You can find more details about this in the [training documentation](training.md). diff --git a/examples/trainBaselines.py b/examples/trainDopamine.py similarity index 100% rename from examples/trainBaselines.py rename to examples/trainDopamine.py From 17a422b85872b4d921653074a99a4e1f63f8c15e Mon Sep 17 00:00:00 2001 From: Benjamin Date: Sat, 1 Jun 2019 17:42:18 +0100 Subject: [PATCH 12/23] update documentation --- README.md | 2 +- documentation/configFile.md | 10 ++++++---- documentation/quickstart.md | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index a35eb75e..0dcd6567 100644 --- a/README.md +++ b/README.md @@ -139,7 +139,7 @@ Occasional slow frame rates in play mode. Temporary fix: reduce screen size. ## Version History -- v0.5 +- v0.5 Package `animalai`, gym compatible, dopamine example, bug fixes - Separate environment API and training API in Python - Release both as `animalai` and `animalai-train` PyPI packages (for `pip` installs) - Agent speed in play-mode constant across various platforms diff --git a/documentation/configFile.md b/documentation/configFile.md index 33a3f979..1854d35c 100644 --- a/documentation/configFile.md +++ b/documentation/configFile.md @@ -14,7 +14,8 @@ To configure training arenas you can use a simple **YAML file** and/or the **Are - on the fly changes of configuration of one or more arenas between episodes, allowing for easy curriculum learning for example - share configurations between participants -We provide a few custom configurations, but we expect designing good environments will be an important component of doing well in the competition. +We provide a few custom configurations, but we expect designing good environments will be an important component of doing + well in the competition. We describe below the structure of the configuration file for an instance of the training environment, as well as all the parameters and the values they can take. For how to change the configuration during training see `animalai/envs/ArenaConfig.py`. @@ -25,15 +26,16 @@ parameters and the values they can take. For how to change the configuration dur

-A single arena is as shown above, it comes with a single agent (blue cube, black dot showing the front), a floor and four walls. It is a square of size 40x40, the -origin of the arena is `(0,0)`, therefore you can provide coordinates for objects in the range `[0,40]x[0,40]` as floats. +A single arena is as shown above, it comes with a single agent (blue sphere, black dot showing the front), a floor and +four walls. It is a square of size 40x40, the origin of the arena is `(0,0)`, therefore you can provide coordinates for +objects in the range `[0,40]x[0,40]` as floats. For visualization you can only configure a single arena, however during training you can configure as many as you want, each will have its local set of coordinates as described above. For a single arena you can provide the following parameters: - `t` an `int`, the length of an episode which can change from one episode to the other. A value of `0` means that the episode will -not terminate unlti a reward has been collected (setting `t=0` and having no reward will lead to an infinite episode) +not terminate until a reward has been collected (setting `t=0` and having no reward will lead to an infinite episode) - `blackouts` [see below](#blackouts) diff --git a/documentation/quickstart.md b/documentation/quickstart.md index 3b51ad1b..c4233019 100644 --- a/documentation/quickstart.md +++ b/documentation/quickstart.md @@ -40,8 +40,8 @@ that we think will improve training speed and performance: - Participants can **change the environment configuration between episodes** (allowing for techniques such as curriculum learning) -- You can choose the length of length of each episode as part of the configuration files, even having infinite episodes -- You can have several arenas in a single environment instance, each with an agent you control independently from the other, +- You can **choose the length of length of each episode** as part of the configuration files, even having infinite episodes +- You can **have several arenas in a single environment instance**, each with an agent you control independently from the other, and each with its own configuration allowing for collecting observations faster We provide examples of training using the `animalai-train` package, you can of course start from scratch and submit agents From ce11fdc2ea9235ca1e12ba166abb67c8e278acb7 Mon Sep 17 00:00:00 2001 From: Benjamin Beyret Date: Mon, 3 Jun 2019 11:25:34 +0100 Subject: [PATCH 13/23] training doc + add HotZone doc --- .../PrefabsPictures/Rewards/HotZone.png | Bin 0 -> 71977 bytes documentation/definitionsOfObjects.md | 13 ++++- documentation/training.md | 55 +++++++++++++----- 3 files changed, 51 insertions(+), 17 deletions(-) create mode 100644 documentation/PrefabsPictures/Rewards/HotZone.png diff --git a/documentation/PrefabsPictures/Rewards/HotZone.png b/documentation/PrefabsPictures/Rewards/HotZone.png new file mode 100644 index 0000000000000000000000000000000000000000..cdebd2dfbc6b5b744b6b9f6b3f06a5df6433f8dc GIT binary patch literal 71977 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

gi0 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 literal 0 HcmV?d00001 diff --git a/documentation/definitionsOfObjects.md b/documentation/definitionsOfObjects.md index c0610a8f..da9dadb6 100644 --- a/documentation/definitionsOfObjects.md +++ b/documentation/definitionsOfObjects.md @@ -139,9 +139,16 @@ components of the provided sizes are ignored and only the `x` one counts - name: `GoodGoalMultiBounce` - size range `1-3` - Deathzone: - - a a deathzone with reward -1 + - a a red zone with reward -1 that end an + episode - name: `DeathZone` - size range `(1,0,1)-(40,0,40)` - **the deathzone is always flat and located on the ground** - - terminates episode - + - terminates an episode +- HotZone: + - a an orange zone with reward + `min(-3/T,-1e-5)` that **does not** end an episode + - name: `HotZone` + - size range `(1,0,1)-(40,0,40)` + - **the hotzone is always flat and located on the ground** + - does not terminate and episode \ No newline at end of file diff --git a/documentation/training.md b/documentation/training.md index 7ff0ae86..0a3a7d0e 100644 --- a/documentation/training.md +++ b/documentation/training.md @@ -2,33 +2,43 @@ ## Overview -Training happens very much like with a regular gym environment. We provide you with both the compiled -environment and the Python libraries needed for training. You will also find an example of training agent -using [ML-Agents' PPO](https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Training-PPO.md). +The `animalai` packages offers two kind of interfaces to use for training: a gym environment and an ml-agents one. We +also provide the `animalai-train` package to showcase how training and submissions work. It can also serve as a starting + point for your own code, however, you are not required to use this package at all for submissions. + +If you are not familiar with these algorithms, have a look at +[ML-Agents' PPO](https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Training-PPO.md), as well as +[dopamine's Rainbow](https://google.github.io/dopamine/). ## Observations and actions Before looking at the environment itself, we define here the actions the agent can take and the observations it collects: - **Actions**: the agent can move forward/backward and rotate left/right, just like in play mode. Therefore the -actions are discrete of dimension `2`, each component can take 3 values (`(nothing, forward, backward)` and `(nothing, left,right)`). +actions are discrete of dimension `2`, each component can take 3 values (`(nothing, forward, backward)` and `(nothing, +left,right)`). - **Observations** are made of two components: visual observations which are pixel based and of dimension `84x84x3`, as well as the speed of the agent which is continuous of dimension `3` (speed along axes `(x,y,z)` in this order). - **Rewards**: in case of an episode of finite length `T`, each step carries a small negative reward `-1/T`. In case of -an episode with no time limite (`T=0`), no reward is returned for each step. Other rewards come from the rewards objects +an episode with no time limit (`T=0`), no reward is returned for each step. Other rewards come from the rewards objects (see details [here](definitionsOfObjects.md)). ## The Unity Environment Much like a gym environment, you can create a `UnityEnvironment` that manages all communications with -the environment. You will first need to instantiate the environement, you can then reset it, take steps and collect -observations. All the codebase for this is in `animalai/envs/environment.py`. Below is a quick description of these components. +the environment. You will first need to instantiate the environment, you can then reset it, take steps and collect +observations. All the codebase for this is in `animalai/envs/environment.py`. Below is a quick description of these +components. + +We provide an example of training using `UnityEnvironment` in `examples/trainMLAgents.py`. ### Instantiation For example, you can call:: ``` +from animalai.envs import UnityEnvironment + env= UnityEnvironment( file_name='env/AnimalAI', # Path to the environment worker_id=1, # Unique ID for running the environment (used for connection) @@ -41,17 +51,17 @@ env= UnityEnvironment( ``` Note that the path to the executable file should be stripped of its extension. The `no_graphics` parameter should always -be set to `False` as it impacts the collection of visual obeservations, which we rely on. +be set to `False` as it impacts the collection of visual observations, which we rely on. ### Reset -We have modified this functionality compared to the mlagents codebase. Here we add the possibility to pass a new `ArenaConfiguration` -as an argument to reset the environment. The environment will use the new configuration for this reset, as well as all the -following ones until a new configuration is passed. The syntax is: +We have modified this functionality compared to the mlagents codebase. Here we add the possibility to pass a new +`ArenaConfiguration` as an argument to reset the environment. The environment will use the new configuration for this +reset, as well as all the following ones until a new configuration is passed. The syntax is: ``` env.reset(arenas_configurations=arena_config, # A new ArenaConfig to use for reset, leave empty to use the last one provided - train_mode=True # True for training + train_mode=True # True for training ) ``` @@ -65,8 +75,6 @@ For example, if you only want to modify arena number 3, you could create an `Are arenas: 3: !Arena t: 0 - rand_all_colors: true - rand_all_sizes: true items: - !Item (...) @@ -81,6 +89,17 @@ all the information returned by the environment after taking a step, including t info = env.step(vector_action=take_action_vector) ``` +In a nutshell, this line will return all the data needed for training, in our case where `n_arenas=4` you will get: + +``` +brain = info['Learner'] + +brain.visual_observations # list of 4 pixel observations, each of size (84x84x3) +brain.vector_observation # list of 4 speeds, each of size 3 +brain.reward # list of 4 float rewards +brain.local_done # list of 4 booleans to flag if each agent is done or not +``` + You can pass more parameters to the environment depending on what you need for training, to learn about this and the format of the `BrainInfo`, see the [official mal-agents' documentation](https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Python-API.md#interacting-with-a-unity-environment). @@ -93,6 +112,14 @@ are not left open (which can prevent future connections). env.close() ``` +## Gym wrapper + +We also provide a gym wrapper to implement the OpenAI interface in order to directly plug baselines and start training. +One limitation of this implementation is the use of a single agent per environment. This will let you collect less +observations per episode and therefore make training slower. A later release might fix this and allow for multiple agents. + +We provide an example of training using gym in `examples/trainDopamine.py`. + ## Notes Some important points to note for training: From 1babf07ec9eea979d06d860671f1be9046d306d0 Mon Sep 17 00:00:00 2001 From: Benjamin Beyret Date: Mon, 3 Jun 2019 13:17:55 +0100 Subject: [PATCH 14/23] link v0.5 --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0dcd6567..fb9eccd1 100644 --- a/README.md +++ b/README.md @@ -68,9 +68,9 @@ Finally download the environment for your system: | OS | Environment link | | --- | --- | -| Linux | [download v0.4](https://www.doc.ic.ac.uk/~bb1010/animalAI/env_linux_v0.4.zip) | -| MacOS | [download v0.4](https://www.doc.ic.ac.uk/~bb1010/animalAI/env_mac_v0.4.zip) | -| Windows | [download v0.4](https://www.doc.ic.ac.uk/~bb1010/animalAI/env_windows_v0.4.zip) | +| Linux | [download v0.5](https://www.doc.ic.ac.uk/~bb1010/animalAI/env_linux_v0.5.zip) | +| MacOS | [download v0.5](https://www.doc.ic.ac.uk/~bb1010/animalAI/env_mac_v0.5.zip) | +| Windows | [download v0.5](https://www.doc.ic.ac.uk/~bb1010/animalAI/env_windows_v0.5.zip) | You can now unzip the content of the archive to the `env` folder and you're ready to go! Make sure the executable `AnimalAI.*` is in `env/`. On linux you may have to make the file executable by running `chmod +x env/AnimalAI.x86_64`. From 4b51fa10649c9e0d00f4b6704ccf6fdb7a2cfe48 Mon Sep 17 00:00:00 2001 From: Matthew Crosby Date: Mon, 3 Jun 2019 13:46:31 +0100 Subject: [PATCH 15/23] Added blog 3 and some minor tweaks to main readme --- README.md | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index fb9eccd1..c8f42117 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,8 @@ Welcome to the repository for the Animal-AI Olympics competition where you will find all the code needed to compete in this new challenge. Note that for the moment this repo contains **only the training environment** (v0.5) that will be used for the competition and **does not contain any competition tests or information for entering**. If everything goes -well the competition will be live on June 30th. Until then we will be continually updating with bug fixes and small -changes to the environment. However, the general structure will stay the same so it's not too early to start working with -the environment. For more information on the competition itself and to stay updated with any developments, head to the +well the competition will be live on July 1st. Until then we will be continually updating with bug fixes and small +changes to the environment. However, the general structure will stay the same so it's not too early to start working with the environment. For more information on the competition itself and to stay updated with any developments, head to the [Competition Website](http://www.animalaiolympics.com/) and follow [@MacroPhilosophy](https://twitter.com/MacroPhilosophy) and [@BenBeyret](https://twitter.com/BenBeyret) on twitter. @@ -35,12 +34,14 @@ well as part of the development process. 2. [The Syllabus (Part 1)](https://mdcrosby.com/blog/animalai2.html) +3. [The Syllabus (Part 2): Lights Out](https://mdcrosby.com/blog/animalai3.html) + ## Requirements The Animal-AI package works on Linux, Mac and Windows, as well as most Cloud providers. -First of all your will need `python3.6` installed, we recommend using virtual environments. We provide two packages for +First of all your will need `python3.6` installed. We recommend using a virtual environment specifically for the competition. We provide two packages for this competition: - The main one is an API for interfacing with the Unity environment. It contains both a @@ -90,9 +91,6 @@ mode. Here you can control the agent with the following: | C | switch camera | | R | reset environment | -**Note**: on some platforms, playing manually in full screen makes the environment slow, keep the environment in window -mode for better performance. - ## Competition Tests We will be releasing further details about the tests in the competition over the coming weeks. The tests will be split @@ -105,7 +103,7 @@ not be able to solve all the tests in the categories but it would be off to a ve ## Citing -For now please cite the [Nature: Machine Intelligence piece](https://rdcu.be/bBCQt): +For now please cite the [Nature: Machine Intelligence piece](https://rdcu.be/bBCQt) for any work involving the competition environment: Crosby, M., Beyret, B., Halina M. [The Animal-AI Olympics](https://www.nature.com/articles/s42256-019-0050-3) Nature Machine Intelligence 1 (5) p257 2019. @@ -124,9 +122,7 @@ Intelligent Agents.](https://arxiv.org/abs/1809.02627) *arXiv preprint arXiv:180 ## Known Bugs -Occasionally will spawn an empty arena in play mode. Temporary fix: just press R to respawn. - -Occasional slow frame rates in play mode. Temporary fix: reduce screen size. +... ## TODO From c7993a064f59dac4987e4a926a26bd07c6690d70 Mon Sep 17 00:00:00 2001 From: Benjamin Beyret Date: Mon, 3 Jun 2019 13:53:22 +0100 Subject: [PATCH 16/23] add readme for both packages + readme for examples --- animalai/README.md | 13 +++++++++-- examples/README.md | 39 +++++++++++++++++++++++++++++++ examples/animalai_train/README.md | 7 ++++-- 3 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 examples/README.md diff --git a/animalai/README.md b/animalai/README.md index 1dd411bf..9df4cf5a 100644 --- a/animalai/README.md +++ b/animalai/README.md @@ -1,5 +1,14 @@ # AnimalAI Python API -This package provides the Python API used for training agents for the Animal AI Olympics competition. +This package provides the Python API used for training agents for the Animal AI Olympics competition. It is mostly an +extension of [Unity's MLAgents env](https://github.com/Unity-Technologies/ml-agents/tree/master/ml-agents-envs). -This library is mostly the same as [Unity's MLAgents](https://github.com/Unity-Technologies/ml-agents). \ No newline at end of file +It contains two ways of interfacing with the Unity environments: + +- `animalai.envs.environment` contains the `UnityEnvironment` which is similar to the one found in `mlagents` but with +a few adaptations to allow for more custom communications between Python and Unity. + +- `animalai.envs.gym.environment` contains the `AnimalAIEnv` which provides a gym environment to use directly with +baselines. + +For more details and documentation have a look at the [AnimalAI documentation](../documentation) \ No newline at end of file diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 00000000..d36f3455 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,39 @@ +# Visualization and Training + +We provide in this folder a few examples for competing in the AnimalAI Olympics. You will first of all need to setup +a training environment with a specific configuration. For this part we provide a script to visualize your configurations. +You will then need to train an agent on this configuration, which can be done however you prefer, we provide here two +examples, one for each interface provided. + +## Visualizing configurations + +Once you have [created a configuration file](../documentation/configFile.md), you may want to see what it actually look +like. To do so you can simply run: + +``` +python visualizeArena.py configs/exampleCondig.yaml +``` + +replacing `exampleConfig.yaml` with the name of your file(s). Once this is launched, you can control the agent using the +same keystrokes as described [here](../README.md#manual-control). + +We also provide an example of what switching lights on/off looks like for the agent and how to configure this feature. +Run `python visualizeLightsOff.py` and read `configs/lightsOff.yaml` to see how four different agents in the same +environment can have different lights setups. + +## Training agents + +We strongly encourage you to read the code in the training files to familiarize yourself with the syntax of the two +packages we provide. We will also release Jupyter notebooks in a future release to make this step more straightforward. + +### Using ML Agents interface + +You can run `python trainMLAgents.py` to start training using PPO and the default configuration +`configs/exampleTraining.yaml`. This scripts instantiates 4 agents in a single environment, therefore collecting more +observations at once and speeding up training. + +### Using the Gym interface + +Run `python trainDopamine.py` to run Rainbow a single agent using the Gym interface and Dopamine. The default Gym +implementation does not support multiple agents and it might therefore be much slower to train on. We plan on adapting +our library to allow for this feature while still being compatible with baselines. \ No newline at end of file diff --git a/examples/animalai_train/README.md b/examples/animalai_train/README.md index 1dd411bf..85bbd236 100644 --- a/examples/animalai_train/README.md +++ b/examples/animalai_train/README.md @@ -1,5 +1,8 @@ # AnimalAI Python API -This package provides the Python API used for training agents for the Animal AI Olympics competition. +This package provides training libraries for training agents for the Animal AI Olympics competition. It is not required +to use this as part of submissions, it is however useful for running the [examples provided](../README.md). We provide +an extension of [Unity's MLAgents](https://github.com/Unity-Technologies/ml-agents/tree/master/ml-agents) as well as +[dopamine](https://github.com/google/dopamine). -This library is mostly the same as [Unity's MLAgents](https://github.com/Unity-Technologies/ml-agents). \ No newline at end of file +For more details and documentation have a look at the [AnimalAI documentation](../documentation) \ No newline at end of file From 5874cb5545d586bee0bc41f8f25445244779470f Mon Sep 17 00:00:00 2001 From: Matthew Crosby Date: Mon, 3 Jun 2019 13:57:05 +0100 Subject: [PATCH 17/23] Improved quickstart documentation --- documentation/quickstart.md | 46 ++++++++++++------------------------- 1 file changed, 15 insertions(+), 31 deletions(-) diff --git a/documentation/quickstart.md b/documentation/quickstart.md index c4233019..7d2b0634 100644 --- a/documentation/quickstart.md +++ b/documentation/quickstart.md @@ -1,60 +1,44 @@ # Quick Start Guide -The format of this competition is rather different to what you might be used to. We do provide a single training set that -you can train on out of the box, instead you are invited to include the design of a training environment as part of the -whole training process. To make this new step as smooth as possible, we created tools you can use to easily setup your -training environment and visualize what these configurations look like. +The format of this competition may be a little different to the standard machine learning model. We do not provide a single training set that you can train on out of the box and we do not provide full information about the testing set in advance. Instead, you will need to choose for yourself what you expect to be useful configurations of our training environment in order to train an agent capable of robust food retrieval behaviour. + +To facilitate working with this new paradigm we created tools you can use to easily setup and visualize your training environment. ## Running the standalone arena -The basic environment is made of a single agent in an enclosed arena, that resembles the environment we would use for -experimenting with animals. In this environment you can add objects the agents can interact with, as well as goals or -rewards the agent must collect or avoid. To see what this looks like, run the executable environment you downloaded, you -will spawn in an arena with lots of objects randomly spawned. +The basic environment is made of a single agent in an enclosed arena that resembles an environment that could be used for experimenting with animals. In this environment you can add objects the agents can interact with, as well as goals or rewards the agent must collect or avoid. To see what this looks like, you can run the executable environment directly. This will spawn an arena filled with randomly placed objects. Of course, this is a very messy environment to begin training on, so we provide a configuration file where you choose what to spawn (see below). You can toggle the camera between First Person and Bird's eye view using the `C` key on your keyboard. The agent can -then be controlled using `W,A,S,D` on your keyboard. Hitting `R` or collecting rewards will reset the arena. - -**Note**: on some platforms, running the standalone arena in full screen makes the environment slow, keep the -environment in window mode for better performance. +then be controlled using `W,A,S,D` on your keyboard. Hitting `R` or collecting certain rewards (green or red) will reset the arena. ## Running a specific configuration file -Once you are familiarized with the environment and its physics, you can start building and visualizing your own. Assuming -you followed the [installation instruction](../README.md#requirements), go to the `examples/` folder and run +Once you are familiarized with the environment and its physics, you can start building and visualizing your own. Assuming you followed the [installation instruction](../README.md#requirements), go to the `examples/` folder and run `python visualizeArena.py configs/exampleConfig.yaml`. This loads the `configs/exampleConfig.yaml` configuration for the arena and lets you play as the agent. -Have a look at the [configuration file](configs/exampleConfig.yaml) for a first look behind the scene. You can select -objects, their size, location, rotation and color, randomizing any of these parameters as you like. We provide -documentation section that we recommend you read thoroughly: - - The [configuration file documentation page](configFile.md) which explains how to write these configuration files. +Have a look at the [configuration file](configs/exampleConfig.yaml) which specifies the objects to place. You can select +objects, their size, location, rotation and color, randomizing any of these parameters as you like. For more details on the configuration options and syntax please read the relevant documentation: + - The [configuration file documentation page](configFile.md) which explains how to write the configuration files. - The [definitions of objects page](definitionsOfObjects.md) which contains a detailed list of all the objects and their characteristics. ## Start training your agent -Once you're happy with your arena configurations you can start training your agent. The `animalai` presents several features -that we think will improve training speed and performance: +Once you're happy with your arena configurations you can start training your agent. The `animalai` package includes several features to help with this: -- Participants can **change the environment configuration between episodes** (allowing for techniques such as curriculum - learning) -- You can **choose the length of length of each episode** as part of the configuration files, even having infinite episodes -- You can **have several arenas in a single environment instance**, each with an agent you control independently from the other, - and each with its own configuration allowing for collecting observations faster +- It is possible to **change the environment configuration between episodes** (allowing for techniques such as curriculum learning). +- You can **choose the length of length of each episode** as part of the configuration files, even having infinite episodes. +- You can **have several arenas in a single environment instance**, each with an agent you control independently from the other, and each with its own configuration allowing for collecting observations faster. -We provide examples of training using the `animalai-train` package, you can of course start from scratch and submit agents -that do not rely on this library. To understand how training an `animalai` environment we provide scripts in the +We provide examples of training using the `animalai-train` package, you can of course start from scratch and submit agents that do not rely on this library. To understand how training an `animalai` environment we provide scripts in the `examples/` folder: - `trainDopamine.py` uses the `dopamine` implementation of Rainbow to train a single agent using the gym interface. This -is a good starting point if you want to try another training algorithm that works as a plug-and-play with Gym. **Note that -as such it only allows for training on environment with a single agent.** We do offer to train with several agents in a -gym environment but this will require modifying your code to accept more than one observation at a time. +is a good starting point if you want to try another training algorithm that works as a plug-and-play with Gym. **Note that using the gym interface only allows for training with a single arena and agent in the environment at a time.** We do offer to train with several agents in a gym environment but this will require modifying your code to accept more than one observation at a time. - `trainMLAgents.py` uses the `ml-agents` implementation of PPO to train one or more agents at a time, using the `UnityEnvironment`. This is a great starting point if you don't mind reading some code as it directly allows to use the functionalities described above, out of the box. - You can find more details about this in the [training documentation](training.md). From 9618a0d988431c5f9085057e4bd2fd49e6319ea8 Mon Sep 17 00:00:00 2001 From: Matthew Crosby Date: Mon, 3 Jun 2019 13:59:59 +0100 Subject: [PATCH 18/23] Minor updates to exmamples readme --- examples/README.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/examples/README.md b/examples/README.md index d36f3455..fa509c82 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,13 +1,13 @@ # Visualization and Training -We provide in this folder a few examples for competing in the AnimalAI Olympics. You will first of all need to setup +We provide in this folder a few examples for competing in the AnimalAI Olympics. You will first of all need to set up a training environment with a specific configuration. For this part we provide a script to visualize your configurations. You will then need to train an agent on this configuration, which can be done however you prefer, we provide here two -examples, one for each interface provided. +examples, one for each interface. ## Visualizing configurations -Once you have [created a configuration file](../documentation/configFile.md), you may want to see what it actually look +Once you have [created a configuration file](../documentation/configFile.md), you may want to see what it actually looks like. To do so you can simply run: ``` @@ -34,6 +34,4 @@ observations at once and speeding up training. ### Using the Gym interface -Run `python trainDopamine.py` to run Rainbow a single agent using the Gym interface and Dopamine. The default Gym -implementation does not support multiple agents and it might therefore be much slower to train on. We plan on adapting -our library to allow for this feature while still being compatible with baselines. \ No newline at end of file +Run `python trainDopamine.py` to run Rainbow, a single agent using the Gym interface and Dopamine. From 6b3ce6cb7a416a07f9495dafb23555a5dcefcaaa Mon Sep 17 00:00:00 2001 From: Matthew Crosby Date: Mon, 3 Jun 2019 14:05:40 +0100 Subject: [PATCH 19/23] Fix typos/wording in training readme --- documentation/training.md | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/documentation/training.md b/documentation/training.md index 0a3a7d0e..1c9980a8 100644 --- a/documentation/training.md +++ b/documentation/training.md @@ -3,7 +3,7 @@ ## Overview The `animalai` packages offers two kind of interfaces to use for training: a gym environment and an ml-agents one. We -also provide the `animalai-train` package to showcase how training and submissions work. It can also serve as a starting +also provide the `animalai-train` package to showcase how training and submissions work. This can serve as a starting point for your own code, however, you are not required to use this package at all for submissions. If you are not familiar with these algorithms, have a look at @@ -14,11 +14,11 @@ If you are not familiar with these algorithms, have a look at Before looking at the environment itself, we define here the actions the agent can take and the observations it collects: -- **Actions**: the agent can move forward/backward and rotate left/right, just like in play mode. Therefore the -actions are discrete of dimension `2`, each component can take 3 values (`(nothing, forward, backward)` and `(nothing, +- **Actions**: the agent can move forward/backward and rotate left/right, just like in play mode. The +actions are discrete and of dimension `2`, each component can take 3 values (`(nothing, forward, backward)` and `(nothing, left,right)`). - **Observations** are made of two components: visual observations which are pixel based and of dimension `84x84x3`, as -well as the speed of the agent which is continuous of dimension `3` (speed along axes `(x,y,z)` in this order). +well as the speed of the agent which is continuous of dimension `3` (speed along axes `(x,y,z)` in this order). Of course, you may want to process and/or scale down the input before use with your approach. - **Rewards**: in case of an episode of finite length `T`, each step carries a small negative reward `-1/T`. In case of an episode with no time limit (`T=0`), no reward is returned for each step. Other rewards come from the rewards objects (see details [here](definitionsOfObjects.md)). @@ -82,14 +82,13 @@ arenas: ### Step -Taking a step returns a data structure named `BrainInfo` which is defined in `animalai/envs/brain` and basically contains -all the information returned by the environment after taking a step, including the observations. For example: +Taking a step returns a data structure named `BrainInfo` which is defined in `animalai/envs/brain` and basically contains all the information returned by the environment including the observations. For example: ``` info = env.step(vector_action=take_action_vector) ``` -In a nutshell, this line will return all the data needed for training, in our case where `n_arenas=4` you will get: +This line will return all the data needed for training, in our case where `n_arenas=4` you will get: ``` brain = info['Learner'] @@ -100,12 +99,12 @@ brain.reward # list of 4 float rewards brain.local_done # list of 4 booleans to flag if each agent is done or not ``` -You can pass more parameters to the environment depending on what you need for training, to learn about this and the +You can pass more parameters to the environment depending on what you need for training. To learn about this and the format of the `BrainInfo`, see the [official mal-agents' documentation](https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Python-API.md#interacting-with-a-unity-environment). ### Close -Don't forget to close the environment once training is done so that all communications are closed properly and ports +Don't forget to close the environment once training is done so that all communications are terminated properly and ports are not left open (which can prevent future connections). ``` From bd945b3e367c2fe1129124dc3634a6c5f9eb322c Mon Sep 17 00:00:00 2001 From: Matthew Crosby Date: Mon, 3 Jun 2019 14:19:02 +0100 Subject: [PATCH 20/23] Update config file documentation --- documentation/configFile.md | 66 ++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 38 deletions(-) diff --git a/documentation/configFile.md b/documentation/configFile.md index 1854d35c..a06a30ad 100644 --- a/documentation/configFile.md +++ b/documentation/configFile.md @@ -27,7 +27,7 @@ parameters and the values they can take. For how to change the configuration dur

A single arena is as shown above, it comes with a single agent (blue sphere, black dot showing the front), a floor and -four walls. It is a square of size 40x40, the origin of the arena is `(0,0)`, therefore you can provide coordinates for +four walls. It is a square of size 40x40, the origin of the arena is `(0,0)`. You can provide coordinates for objects in the range `[0,40]x[0,40]` as floats. For visualization you can only configure a single arena, however during training you can configure as many as you want, @@ -38,6 +38,7 @@ For a single arena you can provide the following parameters: not terminate until a reward has been collected (setting `t=0` and having no reward will lead to an infinite episode) - `blackouts` [see below](#blackouts) +Note that in Unity the **y** axis is the vertical axis. In the above picture with the agent on the ground in the center of the environment its coordinates are (20, 0, 20). ## Objects @@ -45,29 +46,28 @@ not terminate until a reward has been collected (setting `t=0` and having no rew All the objects that will be used during training are provided to you for training. All objects can be configured in the same manner, using a set of parameters for each item: -- `name`: the name of the object you want to spawn +- `name`: the name of the object you want to spawn. - `positions`: a list of `Vector3` positions within the arena where you want to spawn items, if the list -is empty the position will be sampled randomly in the arena -- `sizes`: a list of `Vector3` sizes, if the list is empty the size will be sampled randomly -- `rotations`: a list of `float` in the range `[0,360]`, if the list is empty the rotation is sampled randomly -- `colors`: a list of `RGB` values (integers in the range `[0,255]`), if the list is empty the color is sampled randomly +is empty the position will be sampled randomly in the aren. Any position dimension set to -1 will spawn randomly. +- `sizes`: a list of `Vector3` sizes, if the list is empty the size will be sampled randomly. You can set any size to -1 to spawn randomly along that dimension only. +- `rotations`: a list of `float` in the range `[0,360]`, if the list is empty the rotation is sampled randomly. +- `colors`: a list of `RGB` values (integers in the range `[0,255]`), if the list is empty the color is sampled randomly. -Any of these fields can be omitted in the configuration files, in which case the omitted fields are automatically randomized. +Any of these fields can be omitted in the configuration files, in which case the omitted fields are automatically randomized. Any Vector3 that contains a -1 for any of its dimensions will spawn that dimension randomly. This can be used to spawn, for example, multiple walls of a set width and height but random lengths. -**All values for the above fields can be found in [the definitions](definitionsOfObjects.md)**. +**All value ranges for the above fields can be found in [the definitions](definitionsOfObjects.md)**. If you go above or below the range for size it will automatically be set to the max or min respectively. If you try to spawn outside the arena (or overlapping with another object) then nothing will spawn. ## Blackouts -Blackouts are parameters you can pass to each arena, which define between which frames of an episode should the lights -be on or off. If omitted, this parameter automatically sets to have lights on for the entire episode. You can otherwise +Blackouts are parameters you can pass to each arena, which define between which frames of an episode the lights are +on or off. If omitted, this parameter automatically sets to have lights on for the entire episode. You can otherwise pass two types of arguments for this parameter: - passing a list of frames `[5,10,15,20,25]` will start with the lights on, switch them off from frames 5 to 9 included, then back on from 15 to 19 included etc... - passing a single negative argument `[-20]` will automatically switch lights on and off every 20 frames. -**Note**: for infinite episodes (where `t=0`), the first point above would leave the light off after frame `25` while the -second point would keep switching the lights every `20` frame indefinitely. +**Note**: for infinite episodes (where `t=0`), the first point above would leave the light off after frame `25` while the second point would keep switching the lights every `20` frames indefinitely. ## Rules and Notes @@ -75,25 +75,19 @@ There are certain rules to follow when configuring and arena as well as some des configuration file does not behave as you expect make sure you're not breaking one of the following: - Spawning objects: - - **Objects can only spawn if they do not overlap with each other** - - Attempting to spawn an object where another object already is will discard the latter. - - The environment will attempt to spawn objects in the order they are provided in the file. In the case where any of the - components is randomized we attempt to spawn the object **up to 20 times**. if no valid spawning spot is found the object is discarded. - - Due to the above point, the first objects in the list are more likely to spawn than the last ones + - **Objects can only spawn if they do not overlap with each other**. Attempting to spawn an object where another object already is will discard the latter. + - The environment will attempt to spawn objects in the order they are provided in the file. In the case where any of the components is randomized we attempt to spawn the object **up to 20 times**. if no valid spawning spot is found the object is discarded. + - Due to the above point, the first objects in the list are more likely to spawn than the last ones. - The `Agent` does not have to be provided in the configuration file, in which case it will spawn randomly. - - If an `Agent` position is provided, be aware that the **agent spawns last** therefore it might cause problems if other objects - randomly spawn where the agent should be - - In case an object is present where the `Agent` should spawn the arena resets and the process starts all over - - You can **spawn some objects on top of each others**, however be aware there is a `0.1` buffer automatically added to any height - you provide (to make sure things fall on each others nicely). + - If an `Agent` position is provided, be aware that the **agent spawns last** therefore it might cause problems if other objects randomly spawn where the agent should be. + - In case an object is present where the `Agent` should spawn the arena resets and the process starts all over. + - You can **spawn some objects on top of each others**, however be aware there is a `0.1` buffer automatically added to any height you provide (to make sure things fall on each others nicely). - Configuration file values: - - Objects' `name` have to match one of the names provided in [the definitions](definitionsOfObjects.md), if the name provided is not - found in this list, the object is ignored - - Any component of `positions`, `sizes` and `rotations` can be randomized by providing a value sof `-1`. + - Objects' `name` have to match one of the names provided in [the definitions](definitionsOfObjects.md), if the name provided is not found in this list, the object is ignored. + - Any component of `positions`, `sizes` and `rotations` can be randomized by providing a value of `-1`. - Note that setting `positions.y = -1` will spawn the object at ground level. - - Goals (except for the red zone) can only be scaled equally on all axes, therefore they will always remain spheres. If - a `Vector3` is provided for the scale of a sphere goal only the `x` component is used to scale all axes equally. + - Goals (except for the red zone) can only be scaled equally on all axes, therefore they will always remain spheres. If a `Vector3` is provided for the scale of a sphere goal only the `x` component is used to scale all axes equally. ## Detailed example @@ -125,15 +119,11 @@ arenas: name: GoodGoal ``` -First of all, we can see that the number of parameters for `positions`, `rotations` and `sizes` do not need to match. The -environment will spawn `max( len(positions), len(rotations), len(sizes) )` objects, where `len()` is the length of the list. -Any parameter missing will be sampled randomly. +First of all, we can see that the number of parameters for `positions`, `rotations` and `sizes` do not need to match. The environment will spawn `max( len(positions), len(rotations), len(sizes) )` objects, where `len()` is the length of the list. Any mising parameter will correspond to a randomly generated value. -In this case this will lead to: -- a pink `Cube` spawned in `[10,10]` on the ground with rotation `45` and a size randomized on both `x` and `z` and of `y=5` -- a `Cube` spawned on the ground, with a random `x` and `z=30`, its rotation, size and color will be random -- three pink `CylinderTunnel` completely randomized -- a `GoodGoal` randomized -- the agent which position and rotation are randomized too - -The arena will spawn these objects in this order. \ No newline at end of file +In this case this will lead to (in order that they will spawn): +- a pink `Cube` spawned at `[10,10]` on the ground with rotation `45` and a size randomized on both `x` and `z` and of `y=5`. +- a `Cube` spawned on the ground, with a random `x` and `z=30`. Its rotation, size and color will be random. +- three pink `CylinderTunnel` completely randomized. +- a `GoodGoal` randomized. +- the agent with position and rotation randomized. From 739fb81f570498c5322f5c5c44ea1565abd736ed Mon Sep 17 00:00:00 2001 From: Matthew Crosby Date: Mon, 3 Jun 2019 14:23:33 +0100 Subject: [PATCH 21/23] Update object definitions readme --- documentation/definitionsOfObjects.md | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/documentation/definitionsOfObjects.md b/documentation/definitionsOfObjects.md index da9dadb6..19173534 100644 --- a/documentation/definitionsOfObjects.md +++ b/documentation/definitionsOfObjects.md @@ -5,21 +5,18 @@ The objects you can spawn in an arena are split among three categories: - immovable - rewards -Below is a list of objects you can spawn. For each we describe the name you should use to refer to in your configuration files -or in Python directly, as well as their default characteristics and range of values you can assign to them. **All objects can -be rotated `360` degrees.** +Below is a list of objects you can spawn. For each we describe the name you should use in your configuration files +or in Python directly, as well as their default characteristics and the range of values you can assign to them. **All objects can be rotated `360` degrees.** -Each object has an orientation, we provide the three axes for all of those that are not symmetrical. The color code of the -axes is as depicted below: +Each object has an orientation, we provide the three axes for all of those that are not symmetrical. The color code of the axes is as depicted below: -**Note:** as depicted above the vertical axis is th **Y axis**, we will use Z as the forward axis (both conventions are -the ones used in Unity). +**Note:** the **Y axis** is the vertical axis and **Z** is the forward axis (following conventions used in Unity). #### Immovable -These are objects that are fixed and will not be impacted by the agent or other objects: +These objects are fixed and cannot be moved: - a rectangular tunnel - name: `CubeTunnel` @@ -50,7 +47,7 @@ These are objects that are fixed and will not be impacted by the agent or other #### Movable -These are objects the agent can move and which will be affected by each other, fixed objects and rewards if they collide +These are objects the agent can move and which will be affected by each other, fixed objects and rewards if they collide. Note that different object types weight different amounts. It is easier to push a cardboard box than a cube that's like a wall. - a cube that can be pushed - name: `Cube` @@ -87,8 +84,7 @@ These are objects the agent can move and which will be affected by each other, f #### Rewards -Objects that may terminate the event if the agents collides with one. **Important note:** for sphere goals the `y` and `z` -components of the provided sizes are ignored and only the `x` one counts +Objects that give a reward and may terminate the event if the agents collides with one. **Important note:** for sphere goals the `y` and `z` components of the provided sizes are ignored and only the `x` one counts - Good goals: green spheres with a positive reward equal to their size, terminate an episode @@ -151,4 +147,4 @@ components of the provided sizes are ignored and only the `x` one counts - name: `HotZone` - size range `(1,0,1)-(40,0,40)` - **the hotzone is always flat and located on the ground** - - does not terminate and episode \ No newline at end of file + - does not terminate and episode From 321329e95a43ed14ed66b354f7ee6a38c880a222 Mon Sep 17 00:00:00 2001 From: Benjamin Beyret Date: Mon, 3 Jun 2019 14:35:28 +0100 Subject: [PATCH 22/23] new arean picture --- documentation/PrefabsPictures/Arena.png | Bin 878838 -> 635273 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/documentation/PrefabsPictures/Arena.png b/documentation/PrefabsPictures/Arena.png index 299e0e7ffcef71a379b83a08e209371511536236..0523197a72a7fdb1f33aede275fdf968fa7788b9 100644 GIT binary patch literal 635273 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

-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%0A@^6kiB(YUW3i?nABreLDr2O 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 z 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%0DS!Ngg<}( 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

Egdd+0_aj_^K0E))4KQlcy|U>CZW=V#Di_$ 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%0A%yv_jY}A1E&^JkXSUP z6_C)A0Fxn|S&J_c8Y<446$`x4a1vTKzJ#%nDK0y(cQ_s~FY|D>?8XED=Pn@QxXhAT zkx7-O7!zGXgIZ&(=L>%Lj=)RBG|9V4x9$3l`@6f?l2;+-?f?MKFDHC`KH>5H5Y@Dm zCAG?fC_eRSR`Z~j5F3v7!&&-z&~CO&<7kISXGm$q+RbI4cR-)|arNWN3! zo|r;-d0O%Edcq$*-ittF1DGs^XlEHq59zZizgn!k@CvZZ1xyvotkLtDX0~&8gAxu3 zIB_rV`Rg-ImlgMSGq#?>i;~d$@HnHh7?e}dEP;XvQENp%Z|K}Gl>?f2Sc%~E1_*fn zcm$zettWe5Ym8D0zW?-q%hn{ddI}>U0C)FCSgz+wYrxhNkjZCXo?o$T8wf`?Oifvt z_wn)msJmp!AA^x&-eSTuO;~%!Jd=kiSYL%dD(1?*_5XFdg;Wdf?;bEs z1z^%*pL(7~Q*%GPp25B0!{ZTWT?fL;@cDVTKVsV=6Wg}6@U#-)a%rfw;dq!pg~3a8 z{$LGpd3d--PBj$rLq0hF@)f-|OjC6S%l`WK{t>+iIC1{y(rm32+v^1r5vEdbZni%F z=Z^})$9G2%b<8#Tk~Q_Zb}aKO@(_(RSbu=9sGZC+2S)bN@GaMvl4L|9vQL?~Rm_QY@|jby&>jtf40dZ+vmlWRL% zkN3@YY(*c)?`0AX_Lr9v4pYH=oCp5UmjGbg9~Z1z7YJaH7ix?V5l-h7cgG`+hY7Ob zCSh*WqXyf%#|NJZw)J8F7r^uDub3wi{^*IOepM{X|17d#wiaR#Ptc&br7Btm@7}cs;Fn z|Bi5XoG`T%%BlKgUM9SM_W&2rCO;C#e11CP@lLY5W@nFGQw0vR=ot;;_sbt~NTp>|WsyiQu441AqMT`5B+y z-C@#{`uSpr&;0Hvj??1wKp1okoX)R!d^n;`1;j;5#RbSP96~6VCJpc;j61<;4iC!$ zM#t&pEW78szR7HuHJAIWIw{RpW90$vxLnSt<>-+N#d%czp6nbnfVOqKzOFc5Qo6?9 z$@O2t!08%jEgEORw0=Xot%LIoN zrc=gY^FT|>1q3Q)WHhYYfZotsY**Ggp|@3&0Wg{>3z#>7%(IY%ji?P%vXq|jSZh>_7lj&YrG^2$=Z^qTc4h$D zXV$ra^A%NH3naT4&L4*<(Od{VFB7&^*GS6t=wT){liG&$PYM@WM!F5u8QeDY{=&z% zHE1m%J$pfArwG%|g)R$|9f?Ks7nLmLF64j>x+eh1c0j1eV=)>6T-cT8$X`Y?;g7i% zY-J8Xe{t;)Ka(odR5#kyCQA7Fb#d=@V)Ak;xCA6L%_^v|uEP zDt{QoG?cVMGaKqnY7iA7sc)h3>Tpm{pR$9_a}Ax6=~i-Rb%ef{2iDGY5DA!*?d9fU z0Z213cGM}!4|94Y$ON!=NXWk9jm#@x@5^$wQ;jj#Z^sKWU-gmj>gYeE^ zS*F2p1tk6;V80XMbkm7Y3d>)LML;4eYAKkD>{wf9=MG{5Fu7)@+E|m$WZ4=&xdPlL zbn5N|vp$$9lcAi6Yam2m@3JGat{Wa79#OgC>&r<=LQ-_R6p;+@Y<+OUjKU+CM`K}jmU+%<516pGGag1eH=24# z1>btsca3Mj@}Wneg&%-V2Jp}>Aqmtt8vqMGR3%}dOcqD(N=KiGL)7E|aun8?KjQgY zoNmCSkkZiZb3@i>F!GEGO*0G>oS4wf33u|kwQxdj$9QLFtmmC9zdvgUHsEeNA>x=K=fPz;R6TPB7&weaw_Ui^;Vnu0-jM=5`+&0rGqrf3Sh4 zTd*L@3k=`;Z<)8US2V35e;?;{!TC|=Z{I~o&&IqO$c{5zK7Y>7X^1!IYsGo(4A^yO z^^J!@L=Iv&^VPnMn6FWs?yI@fNsVVci6d z&fHq8yS@(@u`uw>c;~IB$8St-!S(p?rki{hk6#h+22C?9$KAVqlUH-8{GDau8v{!G zA^+^>Z#3d)*FZM^vqrqlT{#QujRbVsAJThE7%NK5d74%4NT}~ri=10Zj!Sni<^HqD z{g7$Q5t3U{_SR{tU`V7*t<}dvI;^>hBk|qc4A5J6`XBfD<^~RI@zC%|FvCvNiT8sr zO$(-ZPM|+sNw)l!sK{2k9q`(=ZIl>#*%qVKHId9W60XoSO|tEx0J0F9#$d|N5a@E4 z9U7ZiQtSY0F~2Sv1FrhsTUl3P*TOvHWZtJ7(idYYvzk)7rUKs%Gg}CxAGg1t-H7Wvk8vv_(XSDQj?G|bnZ#wS< z!}{835(g``W^{uaNE;A4Q=XDMDcInTY$WRao^^3g zS9adshf~;YC6Q#LYi@{V5E(y3)>uJNn--n_Bp^+G#Oo+{--t3!Q2aXlJ>F@y>T7ywEhjojo#-@g_~e+q)F@o!j{9Z&aOdP3~$fQ(E}gc0BAk^J!g|} zq>(QHn-4a+SX;?ROEPG1sz3oGQKS>6QGS@gV=r@=lCzqzwwCAE4Cw^Gg7(+fTc2l= zx)Y4yV;P=Ppw`k3l{7$uT)p+Oeb3yPVmzce#dLuV1~#lb6iUJ(Z2Ub|-49=Mlx4~* zrQmox;N>LIJ?qw>M<0FcS3i{u8DrVEmMv|bW-tNUY4iDSy@^33QW#rftWAENTbDDb zw+h$(gJ0j=z+uhO(p%HKdd4Dq(?%}hj>AM~3fA7HpEhZbga3NEu286`;DYZu37_vipvFbWYW)KVA zav|=LPrIUuD0{U0?Pi1|CCzr9($CHejS5vWw{)wo5*c*%bhd?NdZE^$hr5dd1Opvb z!QEr@6F|!7LfC}|fML6Dj>$||7~M>X8UP^OLN-9-k}V7G*r6$vWKK*u^f-85EH$!w zQVI&QgdW)V8DO@vEaZK(9Ved;1NA!GxSs)z{@M;l2-xnKnheY^X?Tkfre{BvN&ays zAYX%?*3MAoFQ4B~s1`<4wB7^bnm4o%EJwBuE!Je*oyk0DAk=mVMjB?`3!V*r(GbsFh>3vS zw8kj_fc5v_Rob7uVraA-R?gTa{E8->=`PM-JcU5NC# zs~ii(P3^fn7)&v_uGUF{1`6h1?lip9)Z;2qr!c!?&Y6=mZ zfXsH<4a6J3O%+mv1`HQPp7^nHxvEmC3Mp|vrD zDLIAyxUvD@9w0zymjrJ%8vHYj#SR6e;DX{zOnwg%0JHioqahbyRI+19?64bRD){`| zgic5pB$^zdN}>s7J>W-C3x<)3Tn$sH@AuTCv4dpA3K@M+kijX4+B`b{9h^SPV4q`G zsgb5|)!l+h5^G%}uG`Z;TdGN85jBKNFtgI9P8GyGj4<1J)(XZ2kb~vUQ>xIdUCNon zFeoIWhq4C}wouxQM$G^WCkuQL-oWS>pveFGdWgqr!lv_uB+k1GupsDAx5> zjo)p~lGi$k_u@NhqV{Ok){vtzvOA4~8;gcce6vdwU~ zlA$1up2EfO1Cbv!zAV#~7|VH71`(8IHAF8q3$K*Q`*~97sqr_*^MSv>&$dm55-bQA zKg4Jx=&E_GCHT&d!PU2O2t6ePr#JiO5@wr4W%s;X3PsoP#aifxOBEGMv?RKopSunpwi`mL>XN076`XQEEtEtV;wr+e)-D^G$+u z?4{nl0Vvs+NJ+Z{5DE(Qf!TOyo8Dvu$M(MWj(M66*7xv~`2Om%r38E=?942UF((2^ zlCcWauIsVjNA6ux9d`)5Hy3mV{BVIWCBi19!<&q%AanGG638v)pS%3r$wZy`xzegl zS}nH+2tmmjh1wbcxN_sCk*wTn%)%K1>p4|x+t$RW;BZdWacrz$2;}{h;Lr<0K`HDMs0C}e=S-0^A<)hYfzY&iq6stvav?g;#mPrH->d>@;Kw+Z5vqsrURl!dd$Leq z|Cm*lz0J`e5<_7a&Jeh6Yv=fLe6M#J0iWZ~!$M!3^>OUO zxzP7zd>jTyuQNrssO-=){WNlrpL^x%>^mXD<|0j;*E61ZS1$a)SpD&=*ddB0tH+~40}{dfTYZAdQ_in~_E>@0kbsNiL!D03btQfgxbFh z1*dATd~+es7?`tK7hIlRb}Y+`>vavQ1V-FtBfLBm6tj_T-VaC;77(FR`LbqpX3d2n zy$h1g1%Sd<6Cc=8I*&0s56c3E+#R!y6NC|IkyK}3Sy*9^Cukd^@dL*2F%1Yt>@v}2 zM5tUr#P8bSEmR_jE`>a0ug2b_T(p&ZUDpk*H%!wscm_go3Trzbl)9+|qc9Q$7;Q@j zoI)ug5=D2alL$C~GsxI@cH9|oz?ClBABbm$t;a}evX-n}rr28Z!=h^#y#Vo^9QFfN zh3JN1h44mc48sq=;-y)CPxztFcB`?@45lbsDspJxM;0EOK_ofBr5U8KIWw`l@WZ}u zM5LAILIE@xVhmekTvsVay-c(7Z6I9F)q8sYnN+S3{5o^AHk_Vyf}$ql8L_?>$6=Xj~EnU9`Or;Zo_xAd#vNqYQl0 zhLERu*89gqv8QS4FG{pyU^XNNBj$IbCpVOxuaJ^CTxp-cDxibP-YS{M|eGBDa2 zbjzCV4&HCeDf|)1&l1UHu4L87509|(pR5?0a3(Zfs*@EeD2D=gJK!880LM0V0r9}PY_@h|`Fz65)ElXs22vp~id8$OI)EXRORbrGQjnkX{!(jawl- zErj}6_zIDh&McAlV@%!V76hGr9S(qjAOwLlhGU0{(s*)TSaBqFGv=D%VQX909rG+3 zG0hVu9?QEn6}*`x0o_8oJlw5IsEsKs0K7N@e0~wqQ;5(hiaSWjTv1NV(w-TKRqV{j zVPGspa#qB0-F@9=na_$@rmmu(3X_oD5%9bV&r?#uV^-|$&x+;5lp}|25xnmj6KgOu z{4fQ#re`c{EOrk!Oh;D6uB3`w$xfu>!N3g@UFV^2fj%sE$Fz#&+4_{>gB(q+@ zkKzV`e2pFl;3hmWDH`@ln}WliNSKeF;cP4z!uuc$t#fye7N>Cvgzk`rB@KeoAWJf` zMDHr_APMRor*&kS!1kFNfFj&wkS-_-T9QX+xIa&m(?45_9cKH_a=(rWmW5&v9Xv_n z=7jN}N1mnkY9atk3JRI{(Tig1gu}w*41gKBGI9C6sQ>^V07*naRBXuT=PhvJPh~Jt zA>qfl&nB5M$==Hccz)&zdZO#(Snpth7!;EzFP}Z)wy%Xs?DLJ(et-cXZafl29K@0I z{D?#B_yHW?oS%PXPJthXn-ko}Df4inz4l~`^FNDCvds%Z} zfUN^NH}%w;7hCs^)42h>Wkw-sui|*4Ld|KeIL`%7pH?X#uwKFFm@8wMNW*_+m7N*i zeg6ZlXTlGk*3b4y``3K^i%@VLAI{h|vD{gX4KO0O{oZ@WJXdUu$Hcx7U!54G;ReRw zziFNKTBR{urCSfqzVBLMPlToD)*Q^(OZ1sC5-&h41(l>rZB-^}6Q@e3(~Q#lxE_#u zP|Tu~nO#>T)y`@#5t{t}1awi38Y)<0=Yx5h6*q`XrJ@2gd&lWos|!ZO>d?>8S%Mg@ zsK}|853Rvv)#^>XbuYoq-Mj;`o*XNmtumG;vFjR3C18ut8%|Q7R|iwd*Okzica353 zC?Uf6e@fiCHcFHD`{cnf=2uA?8<5ULJxF_ta4cJ+y~pNdI8lt-IqVfbP#tfxRhNjQ zZ&DAt8mI4!ebJHF3U;bd+43tAQgZ={gsgN_A>xjfta%%wuvts-JgwH77r`**NQ&!y zMr@*nX1Wkx3|lp6*Et_l8omXU#!D0g>lG_&Dhjk8eduIeKG4 zwKT#T%h$ul3W1T}o*@R@pQS{AIk=^${gdDbAo!7C$MMsJ8HR_WGBSPytcn_RTJ^y| zc1{rq|JhRpQaIXNZT@Wg5(>gmSg*Ax-HG!7HV=x@4?uJe-PsWuO1b(@TH`PGKzzu(KIJnSiag3B`f`L`(Of#=y%*t~+i9k~_HypJwN4;NgzINla9-9O%jp3-CagT6F==;L3_EKF@47Y2a}}?FAutEg z2qpP)o(ucC@zRyC2?r zZx%2Q7=Agq>!Qc$Q0BPGJVuIO#Y z^UGB#o^?&a*MnstS$C%sDm5pnZhcJ6=ia@4l71f`%=3ixDq%;pR6Jjn?EAd71a7ch*kn6^tAb(!gkH`4BjL z`~5rYO+wsqs6gw|oqU>$SLza>LI`Xv6_@LZZQJm}$4@G_7u}nVsff4k>9XSPG;2PH zF-~?xptT*nv*Jg1j7)(hlEm7F#}h2<$uP$Z0qeGc(It-TEnH?X^gH^3br|zMIOa2Ic)X5boVIorG zq?Cfabv(axeEa=7G(Ri1_%SbaDBTVg*p^bTURP}UigzC^M(=8UaId!p1~8v0_Px2%hfW#-U9hh^b~Nm5^?8^8 zW**Py%ZkT`6D+~r_A3g0bUa;b9udZz@uPLYk8NunDwy%3_Z>ULyP0v!`IFL*c_znE z+0*K07j4IN?O-&eU3B9aU}ikt-3>)*x)$&0%$RD$~1i)KuzshKz7@^Zy8mDG|T z_!2W?UpMeh*wyf1^q|9Xq2#^GB8@c#KPJZyYnHk14OiL*VccYf&ccgJHaaoD*c8tz zdhht~=^58`1M@KlkDX>ri=2CRS}?+py6_`rs#5)L$8SA>^{=CR}X|mp?#uN$B z?fCTcjBVZhY}@$kFtlkzPPrc%M&;2w+K z@N&Ik+odIjc+*XJ>k41O{rMdD0Y>k;hmX!v#nbZ@*L4>frEuC?_p@_dS4=gk+GhR& z0K7L`p0A4grl1DC+p(FK>axgGgilP`OuW{Db=wg(Zc|!ik3~ildKTx9!4Q0!YKYvI z>x$FqBycjAbI3;Ca@&TXWW4at!k|t>xNc3?rujU@lpeobX|IGs&jpyLf;aaww*8pU z@vr~-*%h2m&ntfT^PlnI(=-13-6ucjuPG?T>f;p_hoi7lCfYd^h1V&#**VJ6MGZ_O|1^q}&^|Tvo(=@7_P*;r@hq zp0HC`!Y!0(o+jL#Pnf0!L4~^Te1`Npg6o z<>KYK;n#2PFwZkuV`rqxBJuE>hSpg#LqM2NEtB8-!-r?QnP+A4Dy+8d43(V6Z-V`mDZI!GZ_Z{orfLbuw-V#aNEyUaQm+#);K|5VriDHTO z7osS_QwRdBjoEd~jQ1a(@%HUKEZ@O#hymt~WvZwTck0y=rq-(|g(AFf`wPB$Govbz zH2jeK6=0cWP0%-Dq|DZoKLFo-`h+jPyaOouAelv8ygL=lcc@jFwkoiW9{|4n{ypx_ zvnmTBR4}T*g9xMyX{wA`O%b={%1&J_7yP?lKL8Lxxph(G=6M1GxW7{Y%9>EB5IdDg z7(*%e%l98~cRGtAIN+eLfLaJ;nNe#&twGf}oz}~zXZ-e?uhom93NTqXDB`*T81GE=uhANfUnMz3WMFY6@>(&rrO=J1WqAwMpGDg_u&(M{p&aJnc<=`?ej8W znTr+~D845q%n$)TY#03MBm!*44+$#+=4tjrQY)oBfivazA3x%oZyrIEs!Hmb!Gy;L zQvhY3c)$(W>yO{P!{hzg`z_T{z+7SF=pIT1&`>Kx(6PyaVP*24o}cl*{?!|-TNq-d zsk*>%e=q0I3JbUr?8XJc(|7OjaDKpb+dZrhX{~duK&`@@4dw(e7Zv`2k1rSe^>2QS zeHVeODABFjXz%`fFXC=0iE81RA}}?4e14Cw?tDSA z^JvvIy7uPrUY@7wc*SWh+urc};UgaJXKV^|QA(U|NqtnQg( zY4&|@xLmLJ=KKh2D`$h4ap3Xp1co+kL=s{ZU$=e7OW*Nuf5yJUwXgv{>LdzNDX1ls z8r$1--|=!;@%HTlqVcW~C_%X|9`8}g1goVgM!JCPy6(6>KjUEu0om}wh|%NYBWh(7 zV!;oEW&s0SvA2fS8E?OQgX_9GjHHN>!2aR>-i5&dKa`JL*A43?boZ+G;f4i8=kqe5 zXpZ&pJp$Kz@A%c1U#UUaLinTvbL(C3qZ)oB;;(CZSy!x=EAGy-gq)>)_u@xjRb1_? zvD23%()zqj7Ir?PheR>M9tX2TlYF{dv9$(9bvzcbE0E6>-9#zw!)L#w>t|PRrb_tV zf4kt_M+Vvx{`8m7R){jumJOYX%36*zTHnC`C7x!sd zP?eZ5LLep-Ec1-hvWTUo5ZvXe(D^){m zQuky6+(Ig6j<75Xdef?SMkv|h(TiFRM$3v-m6Pj=^XZK9bW%%WFdJsZTqjIZ$7;{& z_tRvS+8LeSYw-g@X-4D%t`ah&ic>&9OJfSt+xM=PjtOi<7C6Gerb-|ZOK~ylysn@% z*+)XbvMi`&a-qWhiBc$4zDNn52%Uiz3_U(`4K^sF}WqnlpIpV%=`h< zRP}om_Gkh_6s@^bfEx(AD&JagA)TDw8K=_%Fb#sRSDu@u0YB`~DIH8^;B;DWUDsrF zf`lw`2h~tkK6_$WEPYlSIV+$H#ym~fI%7k45HnG)6Qgyg;KXR1^c;{2D3)w%;dr(; z%1%JFVBHLdOgSM98xkgEA&Z2-bylvG_vWSRBF$0kK%D|U zJoAVjI!RKczV(jA!09xL;5h8Lyu-$`+<+W*B?b#QgAaFi*w!3g8MJ(v7&|k}FCax? z65lA&E?}M~loq*7;7JS_+*Me!Vj)Q{A;Hhej7@XTrioy}v7|SKk~HFn?Tx~dIzR=d z(}J@0z>NT%o_z~H#Lf5nF7P;?7VHh7Su_6#euTmx@YvB=ys?%oB9$&D4eb-2MA$(d zre#)WRV+XNZ@9ZVqj#C_JTa!p@&^?c$pWo|hLBslH!y@pUAH~Xg2J4^n3U#^`ABgQ zHPE`_@$L>+>Yl%rz=G4fU}HuDULB`HJYUN+fhe>S5rQW)Zm29?ekjMBQ;8pozD)M)24A6#UuGk4_|0gMi)P(XBBHW)B zkx@#)sgN(mS4bu+hP?IK)%D)a9eZa?^9hY#aM@k}G+4^(-Yw77bw!s~x2+9^nqSKG zvnx3F=NSdS-BNI#tsFDl6XTm|pV>L36c>we^E1P-P=;IN7zsvKfnwkHTZ=wI*ktZN z32UBsTO`KSkcEo4j5QimnVKAdELb?bP+gqT;*8*$)fZL{7K}n2R7^1L?us-K3`o(@ z3bg#G5h5=`tpt#nB^RSg2#Q!1%_ER=K=g1IfNIJWA|+e|7pP6RlREFIU;$x(zcF30 z5Os9wXv`?gL)AHE7Wgwe;Q?6U*i}IwFea;_Wd*V# zxFMo34pU|g!Fumn=?eb6muybY!C*CDtRbTb2YMD507Vf7hqWom03a+`ay6)X(@CI% zh+WXMJt63Qh8qM}&P68pS-=60Uvm5(s{X(ptf=kU!`tV9bTEv-H%Fw5SjghaLllC(dmGaSO=t%I>vw zI-Vo#vxP$>Ie@G=tbZVg#@5~T6{Y5gE~G+J7>4YCrf>% z^uzK*pcSGMo+`eWkXEXTLP|FoJ}G;Ggnr~XTWFe<=C>DGkENiQ2fSdT&q+bBH~Cp( z$92nLu@E2wbEgghV^-m}=zg;vL=!jdd>eRTGa#WohMQ^4phP=?!1F8yQ^3h^k&gIb zxIhURj6k_E$MH|AwYefkmn z!PAvH+em{A!Fx!Vk}rj2ZVez-SmGF#l&`=M!w>cfZVb5cZZx-0&?jrrP(;PSR3u^B z6a`X7lKFTPuS~orKU8uclXI0aEc2#{U)nG$U;yLbG~JR;m;%#v{e8QV827ilv0? z1;jE29Os(%&i-$BZ3^^2Czbx0-Kh7j2J4Pxo<-as!rp&*b)tWE1*aCV4zmNoi(Tv&w@aQ|CDFpwh^oI0fPPe(`Ps-7GMYlw_@uZJo&=4Mf$ zbt+O8wfnwjVjDt_S%YO!`kk6Y^4v{O^P$q(GM}$gao!+;Kp8ASHpRlb8mfGZc~gW`Eyp>sRu+RI6a+tf!HOSd6*pF#UD@Vd&!pBo9fqsk>qMWi z{Gy>kk6I71(#st1J|11>4labo*66ZCWi})74yf+I6~atK0j@>DIeFmaCXOTlFj-Zh ziXr!4*Df}*@-Zb?4yHr{$neI#BF)9(1WN^i848RsXBZY0P;>Z{pEVAM4d)xp-)S^b zgcJQoMU)zUt<5(hT-qlkVD_JlD@I6i!4H-<<{%`WugbjwLkk!6g!7;ZOoYN(K`r6M z>z67+u&_cJN|ied(-RTC0Zx%=wg8diQ~~nebxkBP0>d9pq_^iV9Cd}8513M;#Mpp0G-VA#>wy^ z%gS_>9Kd?!^kr^%18ZN8P~h#Vz+l8e`u>J~Km^#X@EiIk>A+4iK#m`x;|2XN9Z&2! z0ox+q*IM|pjYzm}tR;8BW58D9rpo`33i($6qQOeC7@ zB4*%(G1{W|Q3_C^?u0@FYE+8zB{^Li_Qq(9aX?{*RZ6Rq)jH|FrH1>y1Fqy7zbA(W zbBBfXmQu8OC4N#y{?~Z@>alvi@^2#vf_MN((`a;c6{1hlm|X-&)H>4 z3Y8+R|8%ohzr~6~D)4x&O)&vhnl(1=T97FihU1u7#!3+U#Mj)C1w<7uS3DeH32s5B z_#XPV)2^f(WktiRw$A8P(93Xei>W8OAKybNXrx$H9^dQlw)YoNwm2!Mb`Pg9ZPU$j z72!RyH-%YCSKITpkC}Pf&+)|GoL@$iOjcS@3WhlZ$j&h9&SUL_sQiBBTg}K3jqvQe1f?vm-Y=i|Dt3$gAX6f$puIgj!Jb$`iJc1@5nTTq8GK9V5Hag)bP(hD^cUS&v(!K`RFaJK_`4wc+hd9-KwfsD zK`ICz&V+?nzQ)gA&@v6KeB?9;4+>Ig{g);oARD%wd=F5 z&T+i&^#$F2&YUqJ?hZUidy`}PUKw7FTjIru4;eAz439kAVTzewyn0dW^(&JfKjQeD z(#wLc{q!}U@!|8=Ue4)#fr|w|8*V>NHxyGI==Sh^exCSs9R7*5+)VqQ`i$bL^N;lS z=dsKNp@CNa_`GR&$M8^k;qjf}feXCO-Vfqi7{;3Dm9bu#>njT-(C5DLe7no#q9L)2 zraTC@<@g2~iN;m;npOwxpohw^0^&^lh(U79hEPv#CC>f77zzd zQ@Y10qS@H46u$!VtmMd+n`Iu357y5q-}l;C0&*@;*Xl&!br|MpKvejHaKMk(FSGjD z&!Fdlzc#y2DmnCy1UER2kLVGr3S2BIyb>vXP~P9etl4*H2&c`Xn|A@Apm}LNts)i4RKWnJkoq*B%_+lHieU8}2=<lE2ul6gq-G9DH)80>D=_WH*r z-<4V=M67qLJ)$LS4Xs;sMDgJG(T4opk;<~OMAJxB--22S-b@wf;nNN8jlQ3PuK^gU z`~Fg{pWTBq7htXyt7|2U$Aiign+OQeUp1%WHG-6Hb_STg;lu>>+M8AXX{foPgd&#- zdXlRn))y0UjNwutQ1etwNBkg9#@LmWDzWff7zF7U4!KP_eP%zyV-W%(0a`62$H76@ z*S+LuhN+ApfMPpQ`gI3Dodaf0Y?L{4uLutdlVBC@+|sT0S&S>|q{ldCQbkOZjACJS zx-Ju#^TZ9tQtRIuhU(`7Q6!%;05?7oOtC8}Fss(D0$WG;A~#Ud?q?9#lB;(o|nv64QIo0$^ygmQYs<%+Eq)DSmxwe0#Y@rEW9Q>gq;^U22TWB zM)@`b(4#QIoux9HD)-m4z2zZtq7bDrx9QEw zkme(L9Q4&QBTXuyys|h8fZwKOMb@wHf5Tk7n9LZmm4X=%oKzX;6b|&2Z`h7 z^UD=)9wr}mnWv<{un1m?znb1CYryzRfL#86U03nY#7Ba&TGHDZ(F0m6394-W@@fqH z{0a^MQfGgfG_jNqhvfE*F-I?%O!Nd1c{t!9hz0|=Iq&v7fb%lrCP~d}iC6T!p+dsh z%y;7gf>1LjsKz7>Ni96g4m=}5GK!X|w8KXfr9-KtWcCDum^)zJ2a6k>YSrQg-HE&P z(lO%NxT7XvjP+0zCbVt>L%^y~^+Y==lB?jkLDq+aw6T~HaS)+s!GUd;Lu%_ZYi)!Z z3H+w1s=~sV&oB#kI07*naR3({H>)p!}8?H`;P&x!ZK%R3i3@DT)PryXi_1oUS zL%Z15R&@LhvW9{OX)X3yD&=$l{g6`-7Dg4^6y(RsN$K<1bW!F3p5Hy5^;Z;FZHQ+^|8p$)9&V?C?z5H>9(AoE^q%Wot9tg{z&Wh?CCQYI7WAh8(FdPZO?tL!hpOS!bS_ zc#^%J3?Jc1_I~ADy|fo*@L=Xae$3urQ=BZf4$$)@H^Phzq5uefSW5|4r_RXjb9Uk4)r%wC;7I5WH~Md_Gv;Z=JVn{#{Jb<#+)*LTrHT^py){@6oC@h1?3wk=))@UprJ^K(#c)!=G$?;AJQz%s3uf3l!%?Nk-c*Yyx88leh!QKqYUmtH zC`yzPVG$+Lvd;?nrX@TLzluvEapv>ho8s7q5GHvh&Os=3=E)In2E)W3%YEqPg0&BI z{t3B#9s_#F_6#LL{eGuOhv9L9Di4HQ z+0Ys{8UxMvG3>qLkgajVp$q^XzJu?L?W5s`{Vs9i@MlZ_&bE1{tK8iPVWoPlQLX3f zlEKqsjRn(sH~}i( z>w>5l2D&TN0+dpvOuONRnRcm2Sq9de^CRCg0hgGxUz*}85;`BX-b_R3@U`RAtq^JS z&4qaVJbFPHeFaoA@aHUShP6+8?2Fo2infwE_5sA`VnX^Y_kZQ1P@p-T+dvTg z+5POuGXm($Te8x_U==(Sju|PAih{}v;N!PGL6rmGrKin+b_~m|wRoEcTa)p{!P|4# z%;1++6}BH>mClV%{4m>$4s@V1nHM_@v(X^vxP2#wx;X9;i5$hY9|~9IK34OD9t#KQ zK^Z0Td}upIM=#p|Q$6&}L-~wmkkd_ex_?xR6ZAMdh#kObo zHNLRa>edOnvb)!WyeQQeBl(YvB#_dzO_dknY*4-u$-&;B(Btq6&ZiSzu%YvY-i-0Z z;dPg|ubCamOiZ+KYl`cyH5vqR?{2Gb%cXmUGQE)l>($^`y8fC%1Jba%Qn2!-3J|=U zu{6Y!x$nJ8C{hvvdh6~{G9qTBnoTGOORXp;``$b*bZ@Ll+67zhVz*;XUa~T*%Q^-d z(ID-+(pnHn-+zeGK}6EgS$kD5LE#tuD_o&Kl=iO4YF$;JthItokZz2&cV|kDNE~kJ zP&yPprYgO3uF}c4ad^~h|Feg|EakptWz<>WuzQDQVHpa_O>GW#rs7~LW04 zp~dq%d+6!F{4MVfg8LS>!K8{8*vscr5qz+BiE=@Djxf+d7+vBNwq-&sVz1!>QWQ9u z=NZ?vftjRqZ66c53*~);^DDau6vaUFIa3}-9bYD%6`eQ-`nt?)S>RZ#EVv**!m{xA z89c0TOTZ=FFM&5VSBhdDw+<`0TF!D;!3AGWT>tjd8z5ST&34Y7A|iJ=-!*s zj)GbU8?@T1Mz^%R;hV4CVB1zbPe^A0NU71sV;G8bm)=*W(;1&G8(x|kW3@VJt<{aQ zK7XYb^Hft~)nCr_v#)4x9cyC^hpEm)hs$u0jiEC-G*`xXY0^{^!TemM7as021dSW> zBlA4r?tH@Yo>ef0Y^8f%|Va+XEQ%k_$$J?#V07mj3yT+3&?{G)vw1CZ_43`NsB&ZB0KmZTOBD-BsTKEkC$VBM*M_$rdn}bH}uw2FqBfZA=ug6 z%u&SJD6kAlPSpYkrAR{Iy6sr68%)`>5XIgZ^K67I6buXRXsKza5##ebsbD8c#6CrJ z!29!}%+wefq0|E2cVVg=f|H!fn($TjYMJ9RYs6|HZlx5U0^7dBm<}evIdPpUe$10I zck$YBZ~=yv!44xvHU>gcja^~EtR7Kv zdg6PH?)U*n!&U;oq@j}9Kce*(LZj|^@sj53R?$g~L%G_ZScwAwJnXfGZK61C_D-%O zT0TuyQcYktp;v^%j;R$qoEPkyHT+d2fg^O)lnJA4MGXqv8FiA%mgkc+qm|fvM(;8Q zD;m&xa~coj4^|-#hIh53b+Y5P%v-!~=1n{rOKL5s6o#MRkMf?}uvzdh6b{21@n$pb z&WqCISU(XfeKkuw+{lJOHI_Bb+H~4zJxBzYy(xYq1rZ4EhKFfE!WTtYHMn5Fr4Cl> zzVexL!&D1;DVV3?o^ES&e5#WVV#<+ucTIc&s(QA8{WQCh1jPY5RIp?zg1qjco zg>YJ?L<4kRN%s^{QrirMoh8b^U?@DE2E&&uxx1m!yoH80Mjs4@wS-cT<)_xVo+r6~ zo~w`H3YX>7&eaW9+2corHSDwKxmDv?Rs1j^olKUBO1M?wUMsMvft6M0Goy0$wh(|m zF^U>1YcYk;wqHDh-UJmPhZuj6^F}J~2~JxIK&f-!fgZ(DBpPU{1=nqt^3HRXK&=Jyd{X*SQR~0;!TD#uIsLNsTQ^D@(dcp7i z^sNwRb^BNC5p!KvY}<~xS|d z6Xr=ew{QE7w_lv`>9X1&?rm^W3|nuRt1uc8p|sY5_aC2exo$Y0D@xT51 ze?<1!b`{(K!n#Q#)?a=3;4WhmfIdCHz(P>I|30i%@*eUycB{Vk_RBLoagzmymSw`W z?&!?;_~|0=*AP7J>cKLlpc20R>J6SQSD43YTEuFztx_fLzy0A)pz>$M4@iiJT9U8p zDgtjUlG8%KJSl$c4V&V}Uw(Ke-V+rldh1x%hP^dh*9}0&?uW2fxbiG_xIn%1Jnj(EV zP1sw}xrofqt_yATQxE-zOwgeLtz|NTz@Tla7Y ziR^mbo-ZqwrQq>?@iN7>pO#-C*j=a%isUuFODCj5Zd1T_jTLxaDT%2yy)3c zc+Ns+WDMYMfB!#%Jh2GDqP%rnt}D#G)Vl~X%RFIOChVINaEX#~Sgs00DcjpOHC0y6tdCK6OCc=kJ&Y_3iFynLp$3Qs0ny_sR?>}8I z&qd*5yhGk&MjsI4KmFI=g)tN%5E6iomlwRbTX455o&#$5{c_!WFW$fZ2$S9!f`cZ4 zJilys%2`>yl@z@Pr|y$HiZ&bzj4M`z&q@`5iOPJ=hX(W#y6g*6{Rv!MhJn_{}$O&^cMPxZ#8dH!|y@StFNe(&To=hfmM=;r&P4ollsT zuuw4==etu9Hf_!1gdZw^ysSH}+m3(#+qZanz6McIt4LTP+s&9FW$9Mo`))_fO5I4I4z6h z0U>baoAcsI6%b)`W7%!O%etX=#$W&TEqd3=c%?`eb0RH!9o95&_@!y&4B+Ycg3gTp z?ce_vPpa@SGp^g}0^Vd+8&3G4|5|H!|M3ae>x!?xdO+`_f=Wk2#{vx2y}UP5tK++$%$Ng{*Ue>5NjOe6D!Gc36%NYC+o@-rO(P_S8hBm{O)5DZ`JZy?78+ z-#&hNLGKNx)9m!bD9HJ|ByG-yys_vQLMGIaa z!jL|Edd7K~@mIh3RT7*T>%RFM<~qB8lrO`N@85j{!1(g<&J|$uUK{;z7}@?7X+~@` z@4I&&z}#_np1m=$(bxO?lg}m7%%HylkB?6;xI3Tl_RD)*lJZJP`SUT7fyD6xA_$*P z3%-8)fU5~?PP-zs6F3dwUCg4uGc!67rb4(s&o}sC_X9xHue^Nr0Aa#h3r?pcigxHQ z_xC3lB9ZQ`n|TQv{2v2(xkK}@2D4L0S$cUhxecG)fW$V`_&h? zUIiYVJNC9aF3)uy1$=!!n6dYUzkK%|=cVG|?gT50sr}a-7X}wW`^@k+w2tURa1%6-v5CGu&_fPoEufN1RRjhXQ-E1AWVHhP*0)+g!@(esaoUy2J=Xja- z8kilXqBOkt`qtj@_RXDq-qMDd2NsZU=p+xxY3jbN>$c;xESRTylmGOH1dt5gv^Ie7 z?VmpY>H&1widZ6Ts-_5}&r=;#4d;VXBOp9y%n>?0*9l+URs8AOk4lRfdjs~)SgOFb zY2?lq4>K;83wryvA_M=QT=O)8@uG+ccpRn)AqkJx20TtOZF6Ue1tsn=t7|=+HDh$- z|Br{JX#yh}Y-ZdwL87&WX_Bx3^XLEt>$bUo)7g4|NIAY~5?4BRvCgl@_*RIE*>fUD z6OYXTrQu9s9gJjFi_`7u8ZzSMUM&ruC`6cAN9#qDf*t5AiSMg2qs+Yc@V85W%9N(5 zVo%AUrr?>dQpyC&Nr?{8rl2b13xS$YjXm+)}qf*7XZ(1S8tldqCQPEx* zGOtpUXsWf|h;*%0!%++;7@$acWu0?HD01fc912&YHCeA8vBHZ>|FkUFHueGmW;t}F zTC_F&Ovhq)v(&(kp5AHUl!g-(%$d0dBXG8=&w+F=Qr-~}q=PuWf*XdX7}rWZ-%wUU z&`-~%_g4+kBn`=y@{TYuTOAg+c(V9e2X7_2UzpbYIT|@XCsC5D%_}8 zHMWG~j#=<|^mH6Px0fMI+df#ho_KS2?Y&iqysF#~mdE)WmSYj`5TjYoTqB@J@w?Ua z0Fmd07>o^u&c6;hN>EzhO^*|97;ed)9ccsxdL{crhv(sR%Z-itUay3j;9&Snuc=>J+)NNFnzIh^%OFoF@mXowmQ`ha$( zzw4mG#p(ZcLy%_q+&mD=azZ(j%Oiq^p;*$IxZjHlgHl3PN(7feD5#LgCN0rh?4Dre z<`voZ-33rq>m0QFvbo8rkXskbt0D+au9(D_dQccv*vTuL3G=CVxxN62I6J}B56p_< zaoI{lqzFPw#Sa>&5M~lWD~d_cIAl(Q&Ip&yKL{)-lXGHtV7~SsdzC7L@aB8uB;@8v z+i`zFl>%#UmK790l!98K@|j_mDH93MLyUDMY(*0anWcR2t{x1-4?vY0+J)G$hQgVE zq%i9YptWE~DgZaF$YKR6Tu8OOG^UTR5)N}G8k9e49BZ&zw{0No#+d0qy+_XuBI%w@ zuwfVSn^tU*_W_0TIf%KL<;>qt!`Bj2cs%0_XIh+a$u5(1hF7I`49ilBtcOpz(8;ba zdO-?~WPg+PkAkB!{RGQeRH=rPpWpU<2t%|SGHAzXZcu{?68%tET0D-^&vZJBRv3OT zhe7{Li+7@T8@vd6+k$=|j05(t(>!&#?TdOK9+GA~Fxaaskwe#U#bn$9ipYpP5Fb$&Hz{RIF|Dh!VpOZ=6Y_ zxry=?%6J^=iT`|U?Z#WOQkb8!x&9Q?EblA&+1&tOq&veLLKzu9*Lz3e9>1!=(0SvJ zp245IVW6#f4nb31$NOP^qF1-ZpGnn_iHR{lJ(D*o7wD$lSxj zTzAG*b<6eJ+hfOv&+nG%h+=|-T`w#&$&fJ*gBLu`U7Ye`-g>pI%5y>A(Z28u<6R>8~M zt;*P$8C%&s^o%<^8IX0JAVyOhsAhTZES29lD}u5YEm=w2>dwGKk`UU#s&GVU?QGq- zyj-!an+r72_>~;J0zUu=ry|D>K$XCvf+>afqo{Ys=$utRG5oM|LY1IZO99r<4J&O+ zvDZU|F=n{E$jbFL@jL=!!ns#1J6IAOKZ+2{0-#dGOcT1UhpL^`j2~)2qYmQm&Qz-C z)YYqJ3ZSfQYfYZFaDfg`)#Of0j{8$7*i{SS7EM>X?i(Wnb?dvuphM3Tp#g>;#RXYH zB?(cRN-mCi=Uu_DN>m`l4@RYmiK^3IOI=`Q z4MFUnJrNSHqp8Le41`>HaDhO7Lg&CMi6?&Q~Zb6TZaf_yO)e@79 zgu61#7P?~IPTeLDs7Nm?>nUO9=4ko0YuBP93Z~=%4&LSXAy}sPk+@s|vSC2=l~HLk zfk=%G=HUfF=!f1)2_7bqg?AlZw83Xc1hU557A}gQABL+zKR9R?tB1W%&<|8p4LKE> zZun(NS@d3FW`T>+`AQX)BnPKBykw%DlcDfrW!{AdlZrtMU{cSv@fTMfZ8sg#a))epnul$%My^-u4~SG{f3pysQmp zuVfYqjlG*0a&9|=srcAdB*flXRav?_F~0jCrK0!Fm`I8qaLVEN?b`*VR{St+nCRa^ z)c)D8tr5QX>J63^cz9@N{U1@3VA_?DscDYPwl`1KBSe)6N7!^=ZZ94O1~4xZYMoGc z#oqUuCxpq0pzod)PF|4`g1#LYv#xv0rx6=tKvpq?jrbhbts*dqz}1=&PH5bDxZzDP zvH9b22N?hWAOJ~3K~xxl=pESi9j$dVO@4Kfz#+VY$rUqaAX+sl1a_FcVzGsYh~U+=(v+{un0W%O z5gf6~n^jHrSeS?~BM%W$CT$jC=sfq7Pmq-fQ!Z}sLxo^=xFi86;j6*d$Floj;gNB_ zSqHs0iBoI%A+Y(G5G=Zp;F9%9YU*J$p@3NuQ}Y2dLRxx!P!`g~zEq#Tm#)?irRtxH zyMa-*Kdu1wu{o%(U+ELb_tfyijVylp?G5a&G0oHza;F>mkCo}Wz@vf|Th3bMwv>`t zbzWiU0m!mC)aq(X*UqZb4}CtGACuD$sUj!m$&kxn08_##;Fv>$yxA}Z®=7bYRX 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 z

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�b>QPR)6fs(*cSfy*(TndJ`MHSV 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

{Qat@EdTWJ702FO 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 pWGp(gIY)j#CZ=QHMDSP_)F_ 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 z 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

T&s^^o@UQYK%pcMj@isLvSQhZES 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 f9~iM#JZbB-QIEk#5; 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 oMf`W2P5kpe417!f|MYkuj7_x{Qv*} From 074769f469ebdca3b2ddcb63291a8b32f7c19f59 Mon Sep 17 00:00:00 2001 From: Benjamin Beyret Date: Mon, 3 Jun 2019 14:56:33 +0100 Subject: [PATCH 23/23] update v0.5 for PyPI --- animalai/setup.py | 2 +- examples/animalai_train/setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/animalai/setup.py b/animalai/setup.py index 0fec0db5..6a334ded 100644 --- a/animalai/setup.py +++ b/animalai/setup.py @@ -2,7 +2,7 @@ setup( name='animalai', - version='0.4.2', + version='0.5.0', description='Animal AI competition interface', url='https://github.com/beyretb/AnimalAI-Olympics', author='Benjamin Beyret', diff --git a/examples/animalai_train/setup.py b/examples/animalai_train/setup.py index 501e4cd0..b50ea730 100644 --- a/examples/animalai_train/setup.py +++ b/examples/animalai_train/setup.py @@ -2,7 +2,7 @@ setup( name='animalai_train', - version='0.4.2', + version='0.5.0', description='Animal AI competition training library', url='https://github.com/beyretb/AnimalAI-Olympics', author='Benjamin Beyret',