diff --git a/.gitignore b/.gitignore index 9b8cdbb631388b4f2414bab16e5a444950cf461a..d52395cd553fc23e9e2b921727c61bbc1e0c4ac2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,16 +1,52 @@ -env/* -!env/README.md -examples/submission/test_submission/env/* -!examples/submission/test_submission/env/README.md +examples/env/* +!examples/env/README.md + +# Tensorflow Model Info models/ summaries/ -/.idea -__pycache__/ -UnitySDK.log -venv/ -*/venv -/dev -build/ -dist/ +logs/ + +# Environemnt logfile +*Project.log + +# Builds +*.apk +*.unitypackage +*.app +*.exe +*.x86_64 +*.x86 + +# Mac hidden files +*.DS_Store +*/.ipynb_checkpoints +*/.idea +*.pyc +*.idea/misc.xml +*.idea/modules.xml +*.idea/ +*.iml +*.cache +*/build/ +*/dist/ *.egg-info* *.eggs* +*.gitignore.swp + +# VSCode hidden files +*.vscode/ + +.DS_Store +.ipynb_checkpoints + +# pytest cache +*.pytest_cache/ + +# Ignore PyPi build files. +dist/ +build/ + +# Python virtual environment +venv/ +.mypy_cache/ + diff --git a/README.md b/README.md index 69d8d9b20940e70e1735b152627ba60b44135c51..3ba5c78d8ff53ce2215d85ef110a3ac0c53f179c 100644 --- a/README.md +++ b/README.md @@ -1,62 +1,28 @@ -# Animal-AI Olympics - -## The competition is now over - -Congratulations to our winners! - -1st: Trrrrr -2nd: ironbar -3rd: sirius - -Results [here](http://animalaiolympics.com) - -Full paper, release of testing configurations, results analsysis and write-up and WBA prize announcment to come. - -We will also reopen submissions in the coming days in order to allow you to keep working on the Animal-AI Olympics until we disclose the test sets, these new submissions will not count as part of the competition. +# Animal-AI 2.0.0 (beta)

-**July 1st - November 1st** - -The Animal-AI Olympics is an AI competition with tests inspired by animal cognition. Participants are given a small environment with just seven different classes of objects that can be placed inside. In each test, the agent needs to retrieve the food in the environment, but to do so there are obstacles to overcome, ramps to climb, boxes to push, and areas that must be avoided. The real challenge is that we don't provide the tests in advance. It's up to you to explore the possibilities with the environment and build interesting configurations that can help create an agent that understands how the environment's physics work and the affordances that it has. The final submission should be an agent capable of robust food retrieval behaviour similar to that of many kinds of animals. We know the animals can pass these tests, it's time to see if AI can too. - -## Prizes $32,000 (equivalent value) - -* Overall Prizes - * 1st place overall: **$7,500 total value** - $6,500 with up to $1,000 travel to speak at NeurIPS 2019. - * 2nd place overall: **$6,000 total value** - $5,000 with up to $1,000 travel to speak at NeurIPS 2019. - * 3rd place overall: **$1,500**. -* WBA-Prize: **$5,000 total value** - $4,000 with up to $1,000 travel to speak at NeurIPS 2019 -* Category Prizes: **$200** For best performance in each category (cannot combine with other prizes - max 1 per team). -* ~~**Mid-way AWS Research Credits**: The top 20 entries as of **September 1st** will be awarded **$500** of AWS credits.~~ (already awarded) - See [competition launch page](https://mdcrosby.com/blog/animalailaunch.html) and official rules for further details. -**Important** Please check the competition rules [here](http://animalaiolympics.com/rules.html). **To submit to the competition and be considered for prizes you must also fill in [this form](https://forms.gle/PKCgp2JAWvjf4c9i6)**. Entry to the competition ([via EvalAI](https://evalai.cloudcv.org/web/challenges/challenge-page/396/overview)) constitutes agreement with all competition rules. - ## Overview -Here you will find all the code needed to compete in this new challenge. This repo contains **the training environment** (v1.0) that will be used for the competition. Information for entering can be found in the [submission documentation](documentation/submission.md). Please check back during the competition for minor bug-fixes and updates, but as of v1.0 the major features and contents are set in place. +The [Animal-AI](http://animalaiolympics.com/AAI) is a project which introduces the study of animal cognition to the world of AI. +The aim is to provide an environment for testing agents on tasks taken from or inspired by the animal cognition literature. +Decades of research in this field allow us to train and test for cognitive skills in Artificial Intelligence agents. -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. +This repo contains the [training environment](animalai), a [training library](animalai_train) as well as [900 tasks](competition_configurations) for testing and/or training agents. +The experiments are divided into categories meant to reflect various cognitive skills, the details can be found on the [website](http://animalaiolympics.com/AAI/testbed). -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) that the agent must obtain (or avoid). 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 (see examples/configs), but part of the challenge is to experiment and design new configurations. +We ran a competition using this environment and the associated tests, more details about the results can be found [here](http://animalaiolympics.com/AAI/2019) + +The environment is built using [Unity ml-agents](https://github.com/Unity-Technologies/ml-agents/tree/master/docs) and 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) that the agent must obtain (or avoid). All of the hidden tests that will appear in the competition are made using the objects in the training environment. To get started install the requirements below, and then follow the [Quick Start Guide](documentation/quickstart.md). More in depth documentation can be found on the [Documentation Page](documentation/README.md). -## Evaluation - -The competition has 300 tests, split over ten categories. The categories range from the very simple (e.g. **food retrieval**, **preferences**, and **basic obstacles**) to the more complex (e.g. **spatial reasoning**, **internal models**, **object permanence**, and **causal reasoning**). We have included example config files for the first seven categories. 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 category, but it would be off to a good start. - -The submission website allows you to submit an agent that will be run on all 300 tests and it returns the overall score (number of tests passed) and score per category. We cannot offer infinite compute, so instances will be timed out after ~90 minutes and only tests performed up to that point counted (all others will be considered failed). See the [submission documentation](documentation/submission.md) for more information. - -For the mid-way and final evaluation we will (resources permitting) run more extensive testing with 3 variations per test (so 900 tests total). The variations will include minor perturbations to the configurations. The agent will have to pass all 3 variations to pass each individual test, giving a total score out of 300. This means that **your final test score might be lower than the score achieved during the competition** and that **the competition leaderboard on EvalAI may not exactly match the final results**. - ## Development Blog You can read the launch posts - with information about prizes and the categories in the competition here: @@ -78,12 +44,9 @@ well as part of the development process. ## Requirements -The Animal-AI package works on Linux, Mac and Windows, as well as most Cloud providers. Note that for submission to the competition we only support linux-based Docker files. - +The Animal-AI package works on Linux, Mac and Windows, as well as most Cloud providers, and requires python 3. -We recommend using a virtual environment specifically for the competition. You will need `python3.6` installed (we currently only support **python3.6**). Clone this repository to run the examples we provide. - -We offer two packages for this competition: +We offer two packages: - The main package 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 @@ -92,7 +55,7 @@ We offer two packages for this competition: ``` pip install animalai ``` - Or you can install it from the source, head to `animalai/` folder and run `pip install -e .` + Or you can install it from the source by running `pip install -e animalai` from the repo folder In case you wish to create a conda environment you can do so by running the below command from the `animalai` folder: ``` @@ -100,32 +63,27 @@ We offer two packages for this competition: ``` - 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. At the moment **we only support Linux and Max** for the training examples. It contains an extension of +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: +[OpenAI's PPO](https://openai.com/blog/openai-baselines-ppo/) and [BAIR's SAC](https://bair.berkeley.edu/blog/2018/12/14/sac/). 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 .` + Or you can install it from source by running `pip install -e animalai_train` from the repo folder -Finally download the environment for your system: +Finally **download the environment** for your system: | OS | Environment link | | --- | --- | -| Linux | [download v1.0.0](https://www.doc.ic.ac.uk/~bb1010/animalAI/env_linux_v1.0.0.zip) | -| MacOS | [download v1.0.0](https://www.doc.ic.ac.uk/~bb1010/animalAI/env_mac_v1.0.0.zip) | -| Windows | [download v1.0.0](https://www.doc.ic.ac.uk/~bb1010/animalAI/env_windows_v1.0.0.zip) | +| Linux | [download v2.0.0b0](https://www.doc.ic.ac.uk/~bb1010/animalAI/env_linux_v2.0.0b0.zip) | +| MacOS | [download v2.0.0b0](https://www.doc.ic.ac.uk/~bb1010/animalAI/env_mac_v2.0.0b0.zip) | +| Windows | [download v2.0.0b0](https://www.doc.ic.ac.uk/~bb1010/animalAI/env_windows_v2.0.0b0.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`. Head over to [Quick Start Guide](documentation/quickstart.md) for a quick overview of how the environment works. -The Unity source files for the environment can be find on the [AnimalAI-Environment repository](https://github.com/beyretb/AnimalAI-Environment). -Due to a lack of resources we cannot provide support on this part of the project at the moment. We recommend reading the documentation on the -[ML-Agents repo](https://github.com/Unity-Technologies/ml-agents) too. +The Unity source files for the environment can be found on our [ml-agents fork](https://github.com/beyretb/ml-agents). ## Manual Control @@ -160,37 +118,33 @@ Paper with all the details of the test battery will be released after the compet 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). +The Python library located in [animalai](animalai) extends [ml-agents v0.15.0](https://github.com/Unity-Technologies/ml-agents/tree/0.15.0). Mainly, we add the +possibility to change the configuration of arenas between episodes. 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* ## EvalAI -The competition is kindly hosted on [EvalAI](https://github.com/Cloud-CV/EvalAI), an open source web application for AI competitions. Special thanks to [Rishabh Jain](https://rishabhjain.xyz/) for his help in settting this up. +The competition was kindly hosted on [EvalAI](https://github.com/Cloud-CV/EvalAI), an open source web application for AI competitions. Special thanks to [Rishabh Jain](https://rishabhjain.xyz/) for his help in setting this up. +We will aim to reopen submissions with new hidden files in order to keep some form of competition going. Deshraj Yadav, Rishabh Jain, Harsh Agrawal, Prithvijit Chattopadhyay, Taranjeet Singh, Akash Jain, Shiv Baran Singh, Stefan Lee and Dhruv Batra (2019) [EvalAI: Towards Better Evaluation Systems for AI Agents](https://arxiv.org/abs/1902.03570) -## Known Issues - -In play mode pressing `R` or `C` does nothing sometimes. This is due to the fact that we have synchronized these -features with the agent's frames in order to have frames in line with the configuration files for elements such as blackouts. **Solution**: press the key again, several times if needed. - -## TODO - -- [x] Add custom resolutions -- [x] Add inference viewer to the environment -- [x] Offer a gym wrapper for training -- [x] Improve the way the agent spawns -- [x] Add lights out configurations. -- [x] Improve environment framerates -- [x] Add moving food ## Version History +- v2.0.0b0 (beta) + - Bump ml-agents from 0.7 to 0.15 which: + - allows multiple parallel environments for training + - adds Soft actor critic (SAC) trainer + - has a new kind of actions/observations loop (on demand decisions) + - removes brains and some protobufs + - adds side-channels to replace some protobufs + - refactoring of the codebase + - GoodGoalMulti are now yellow with the same texture (light emitting) as GoodGoal and BadGoal + - The whole project including the Unity source is now available on [our ml-agents fork](https://github.com/beyretb/ml-agents) + - v1.1.1 - Hotfix curriculum loading in the wrong order diff --git a/agent.py b/agent.py deleted file mode 100644 index 9becd370c582c8337a59b454b014c857d161dff1..0000000000000000000000000000000000000000 --- a/agent.py +++ /dev/null @@ -1,34 +0,0 @@ -class Agent(object): - - def __init__(self): - """ - Load your agent here and initialize anything needed - WARNING: any path to files you wish to access on the docker should be ABSOLUTE PATHS - """ - pass - - def reset(self, t=250): - """ - Reset is called before each episode begins - Leave blank if nothing needs to happen there - :param t the number of timesteps in the episode - """ - - def step(self, obs, reward, done, info): - """ - A single step the agent should take based on the current state of the environment - We will run the Gym environment (AnimalAIEnv) and pass the arguments returned by env.step() to - the agent. - - Note that should if you prefer using the BrainInfo object that is usually returned by the Unity - environment, it can be accessed from info['brain_info']. - - :param obs: agent's observation of the current environment - :param reward: amount of reward returned after previous action - :param done: whether the episode has ended. - :param info: contains auxiliary diagnostic information, including BrainInfo. - :return: the action to take, a list or size 2 - """ - action = [0, 0] - - return action diff --git a/animalai/LICENSE b/animalai/LICENSE deleted file mode 100644 index 7ff5035efc3d2ab21234973537c35aa10e623655..0000000000000000000000000000000000000000 --- a/animalai/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - 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/README.md b/animalai/README.md deleted file mode 100644 index 9df4cf5a66d026966a66e645e264a210063f8c16..0000000000000000000000000000000000000000 --- a/animalai/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# AnimalAI Python API - -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). - -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/animalai/animalai/__init__.py b/animalai/animalai/__init__.py deleted file mode 100644 index c088da9f823d87884899a787fced1e61d716ead6..0000000000000000000000000000000000000000 --- a/animalai/animalai/__init__.py +++ /dev/null @@ -1 +0,0 @@ -name= "animalai" diff --git a/animalai/animalai/communicator_objects/__init__.py b/animalai/animalai/communicator_objects/__init__.py index 571ec13b47aa0bb206a373fafc0f5d7002cdfd6c..e878330a2e6fbecc53a274ff3c0a08fbec745cc6 100644 --- a/animalai/animalai/communicator_objects/__init__.py +++ b/animalai/animalai/communicator_objects/__init__.py @@ -1,22 +1,5 @@ -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 .arenas_configurations_proto_pb2 import * +from .arena_configuration_proto_pb2 import * +from .items_to_spawn_proto_pb2 import * +from .vector_proto_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/animalai/communicator_objects/agent_action_proto_pb2.py b/animalai/animalai/communicator_objects/agent_action_proto_pb2.py deleted file mode 100644 index 8d19593e1f11b3d09213b1769ae7d90b68b895c9..0000000000000000000000000000000000000000 --- a/animalai/animalai/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/animalai/communicator_objects/agent_info_proto_pb2.py b/animalai/animalai/communicator_objects/agent_info_proto_pb2.py deleted file mode 100644 index 0dad7e85c656a9e46fca48bf34ea177a68354425..0000000000000000000000000000000000000000 --- a/animalai/animalai/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/animalai/communicator_objects/arena_configuration_proto_pb2.py b/animalai/animalai/communicator_objects/arena_configuration_proto_pb2.py new file mode 100644 index 0000000000000000000000000000000000000000..83e7edabf8b780378cc3ef6d4833181590503d1b --- /dev/null +++ b/animalai/animalai/communicator_objects/arena_configuration_proto_pb2.py @@ -0,0 +1,152 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: animalai/communicator_objects/arena_configuration_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 +from google.protobuf import descriptor_pb2 + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from animalai.communicator_objects import ( + items_to_spawn_proto_pb2 as animalai_dot_communicator__objects_dot_items__to__spawn__proto__pb2, +) + + +DESCRIPTOR = _descriptor.FileDescriptor( + name="animalai/communicator_objects/arena_configuration_proto.proto", + package="communicator_objects", + syntax="proto3", + serialized_pb=_b( + '\n=animalai/communicator_objects/arena_configuration_proto.proto\x12\x14\x63ommunicator_objects\x1a\x38\x61nimalai/communicator_objects/items_to_spawn_proto.proto"\x81\x01\n\x17\x41renaConfigurationProto\x12\t\n\x01t\x18\x01 \x01(\x05\x12\x11\n\tpass_mark\x18\x02 \x01(\x02\x12\x35\n\x05items\x18\x03 \x03(\x0b\x32&.communicator_objects.ItemToSpawnProto\x12\x11\n\tblackouts\x18\x04 \x03(\x05\x42\x14\xaa\x02\x11\x41\x41IOCommunicatorsb\x06proto3' + ), + dependencies=[ + animalai_dot_communicator__objects_dot_items__to__spawn__proto__pb2.DESCRIPTOR, + ], +) + + +_ARENACONFIGURATIONPROTO = _descriptor.Descriptor( + name="ArenaConfigurationProto", + full_name="communicator_objects.ArenaConfigurationProto", + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name="t", + full_name="communicator_objects.ArenaConfigurationProto.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, + options=None, + file=DESCRIPTOR, + ), + _descriptor.FieldDescriptor( + name="pass_mark", + full_name="communicator_objects.ArenaConfigurationProto.pass_mark", + 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, + options=None, + file=DESCRIPTOR, + ), + _descriptor.FieldDescriptor( + name="items", + full_name="communicator_objects.ArenaConfigurationProto.items", + index=2, + 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, + options=None, + file=DESCRIPTOR, + ), + _descriptor.FieldDescriptor( + name="blackouts", + full_name="communicator_objects.ArenaConfigurationProto.blackouts", + index=3, + number=4, + 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, + options=None, + file=DESCRIPTOR, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=146, + serialized_end=275, +) + +_ARENACONFIGURATIONPROTO.fields_by_name[ + "items" +].message_type = ( + animalai_dot_communicator__objects_dot_items__to__spawn__proto__pb2._ITEMTOSPAWNPROTO +) +DESCRIPTOR.message_types_by_name["ArenaConfigurationProto"] = _ARENACONFIGURATIONPROTO +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +ArenaConfigurationProto = _reflection.GeneratedProtocolMessageType( + "ArenaConfigurationProto", + (_message.Message,), + dict( + DESCRIPTOR=_ARENACONFIGURATIONPROTO, + __module__="animalai.communicator_objects.arena_configuration_proto_pb2" + # @@protoc_insertion_point(class_scope:communicator_objects.ArenaConfigurationProto) + ), +) +_sym_db.RegisterMessage(ArenaConfigurationProto) + + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions( + descriptor_pb2.FileOptions(), _b("\252\002\021AAIOCommunicators") +) +# @@protoc_insertion_point(module_scope) diff --git a/animalai/animalai/communicator_objects/arena_configuration_proto_pb2.pyi b/animalai/animalai/communicator_objects/arena_configuration_proto_pb2.pyi new file mode 100644 index 0000000000000000000000000000000000000000..85c16879489453771e39727bc0359b7363fc49c3 --- /dev/null +++ b/animalai/animalai/communicator_objects/arena_configuration_proto_pb2.pyi @@ -0,0 +1,81 @@ +# @generated by generate_proto_mypy_stubs.py. Do not edit! +import sys +from animalai.communicator_objects.items_to_spawn_proto_pb2 import ( + ItemToSpawnProto as animalai___communicator_objects___items_to_spawn_proto_pb2___ItemToSpawnProto, +) + +from google.protobuf.descriptor import ( + Descriptor as google___protobuf___descriptor___Descriptor, +) + +from google.protobuf.internal.containers import ( + RepeatedCompositeFieldContainer as google___protobuf___internal___containers___RepeatedCompositeFieldContainer, + RepeatedScalarFieldContainer as google___protobuf___internal___containers___RepeatedScalarFieldContainer, +) + +from google.protobuf.message import Message as google___protobuf___message___Message + +from typing import ( + Iterable as typing___Iterable, + Optional as typing___Optional, + Union as typing___Union, +) + +from typing_extensions import Literal as typing_extensions___Literal + +builtin___bool = bool +builtin___bytes = bytes +builtin___float = float +builtin___int = int +if sys.version_info < (3,): + builtin___buffer = buffer + builtin___unicode = unicode + +class ArenaConfigurationProto(google___protobuf___message___Message): + DESCRIPTOR: google___protobuf___descriptor___Descriptor = ... + t = ... # type: builtin___int + pass_mark = ... # type: builtin___float + blackouts = ( + ... + ) # type: google___protobuf___internal___containers___RepeatedScalarFieldContainer[builtin___int] + @property + def items( + self, + ) -> google___protobuf___internal___containers___RepeatedCompositeFieldContainer[ + animalai___communicator_objects___items_to_spawn_proto_pb2___ItemToSpawnProto + ]: ... + def __init__( + self, + *, + t: typing___Optional[builtin___int] = None, + pass_mark: typing___Optional[builtin___float] = None, + items: typing___Optional[ + typing___Iterable[ + animalai___communicator_objects___items_to_spawn_proto_pb2___ItemToSpawnProto + ] + ] = None, + blackouts: typing___Optional[typing___Iterable[builtin___int]] = None, + ) -> None: ... + if sys.version_info >= (3,): + @classmethod + def FromString(cls, s: builtin___bytes) -> ArenaConfigurationProto: ... + else: + @classmethod + def FromString( + cls, s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode] + ) -> ArenaConfigurationProto: ... + def MergeFrom(self, other_msg: google___protobuf___message___Message) -> None: ... + def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ... + def ClearField( + self, + field_name: typing_extensions___Literal[ + "blackouts", + b"blackouts", + "items", + b"items", + "pass_mark", + b"pass_mark", + "t", + b"t", + ], + ) -> None: ... diff --git a/animalai/animalai/communicator_objects/arena_parameters_proto_pb2.py b/animalai/animalai/communicator_objects/arena_parameters_proto_pb2.py deleted file mode 100644 index 930b300c9557448bfdfd95b80aa6f198d9498bfa..0000000000000000000000000000000000000000 --- a/animalai/animalai/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/animalai/communicator_objects/arenas_configurations_proto_pb2.py b/animalai/animalai/communicator_objects/arenas_configurations_proto_pb2.py new file mode 100644 index 0000000000000000000000000000000000000000..c4067f24c00b55df7dd185016c08cf23d75b09d2 --- /dev/null +++ b/animalai/animalai/communicator_objects/arenas_configurations_proto_pb2.py @@ -0,0 +1,192 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: animalai/communicator_objects/arenas_configurations_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 +from google.protobuf import descriptor_pb2 + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from animalai.communicator_objects import ( + arena_configuration_proto_pb2 as animalai_dot_communicator__objects_dot_arena__configuration__proto__pb2, +) + + +DESCRIPTOR = _descriptor.FileDescriptor( + name="animalai/communicator_objects/arenas_configurations_proto.proto", + package="communicator_objects", + syntax="proto3", + serialized_pb=_b( + '\n?animalai/communicator_objects/arenas_configurations_proto.proto\x12\x14\x63ommunicator_objects\x1a=animalai/communicator_objects/arena_configuration_proto.proto"\xd4\x01\n\x19\x41renasConfigurationsProto\x12K\n\x06\x61renas\x18\x01 \x03(\x0b\x32;.communicator_objects.ArenasConfigurationsProto.ArenasEntry\x12\x0c\n\x04seed\x18\x02 \x01(\x05\x1a\\\n\x0b\x41renasEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12<\n\x05value\x18\x02 \x01(\x0b\x32-.communicator_objects.ArenaConfigurationProto:\x02\x38\x01\x42\x14\xaa\x02\x11\x41\x41IOCommunicatorsb\x06proto3' + ), + dependencies=[ + animalai_dot_communicator__objects_dot_arena__configuration__proto__pb2.DESCRIPTOR, + ], +) + + +_ARENASCONFIGURATIONSPROTO_ARENASENTRY = _descriptor.Descriptor( + name="ArenasEntry", + full_name="communicator_objects.ArenasConfigurationsProto.ArenasEntry", + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name="key", + full_name="communicator_objects.ArenasConfigurationsProto.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, + options=None, + file=DESCRIPTOR, + ), + _descriptor.FieldDescriptor( + name="value", + full_name="communicator_objects.ArenasConfigurationsProto.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, + options=None, + file=DESCRIPTOR, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b("8\001")), + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=273, + serialized_end=365, +) + +_ARENASCONFIGURATIONSPROTO = _descriptor.Descriptor( + name="ArenasConfigurationsProto", + full_name="communicator_objects.ArenasConfigurationsProto", + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name="arenas", + full_name="communicator_objects.ArenasConfigurationsProto.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, + options=None, + file=DESCRIPTOR, + ), + _descriptor.FieldDescriptor( + name="seed", + full_name="communicator_objects.ArenasConfigurationsProto.seed", + 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, + options=None, + file=DESCRIPTOR, + ), + ], + extensions=[], + nested_types=[_ARENASCONFIGURATIONSPROTO_ARENASENTRY,], + enum_types=[], + options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=153, + serialized_end=365, +) + +_ARENASCONFIGURATIONSPROTO_ARENASENTRY.fields_by_name[ + "value" +].message_type = ( + animalai_dot_communicator__objects_dot_arena__configuration__proto__pb2._ARENACONFIGURATIONPROTO +) +_ARENASCONFIGURATIONSPROTO_ARENASENTRY.containing_type = _ARENASCONFIGURATIONSPROTO +_ARENASCONFIGURATIONSPROTO.fields_by_name[ + "arenas" +].message_type = _ARENASCONFIGURATIONSPROTO_ARENASENTRY +DESCRIPTOR.message_types_by_name[ + "ArenasConfigurationsProto" +] = _ARENASCONFIGURATIONSPROTO +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +ArenasConfigurationsProto = _reflection.GeneratedProtocolMessageType( + "ArenasConfigurationsProto", + (_message.Message,), + dict( + ArenasEntry=_reflection.GeneratedProtocolMessageType( + "ArenasEntry", + (_message.Message,), + dict( + DESCRIPTOR=_ARENASCONFIGURATIONSPROTO_ARENASENTRY, + __module__="animalai.communicator_objects.arenas_configurations_proto_pb2" + # @@protoc_insertion_point(class_scope:communicator_objects.ArenasConfigurationsProto.ArenasEntry) + ), + ), + DESCRIPTOR=_ARENASCONFIGURATIONSPROTO, + __module__="animalai.communicator_objects.arenas_configurations_proto_pb2" + # @@protoc_insertion_point(class_scope:communicator_objects.ArenasConfigurationsProto) + ), +) +_sym_db.RegisterMessage(ArenasConfigurationsProto) +_sym_db.RegisterMessage(ArenasConfigurationsProto.ArenasEntry) + + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions( + descriptor_pb2.FileOptions(), _b("\252\002\021AAIOCommunicators") +) +_ARENASCONFIGURATIONSPROTO_ARENASENTRY.has_options = True +_ARENASCONFIGURATIONSPROTO_ARENASENTRY._options = _descriptor._ParseOptions( + descriptor_pb2.MessageOptions(), _b("8\001") +) +# @@protoc_insertion_point(module_scope) diff --git a/animalai/animalai/communicator_objects/arenas_configurations_proto_pb2.pyi b/animalai/animalai/communicator_objects/arenas_configurations_proto_pb2.pyi new file mode 100644 index 0000000000000000000000000000000000000000..f3513e752b08dd7cf609419cf3ef642e61b90e44 --- /dev/null +++ b/animalai/animalai/communicator_objects/arenas_configurations_proto_pb2.pyi @@ -0,0 +1,103 @@ +# @generated by generate_proto_mypy_stubs.py. Do not edit! +import sys +from animalai.communicator_objects.arena_configuration_proto_pb2 import ( + ArenaConfigurationProto as animalai___communicator_objects___arena_configuration_proto_pb2___ArenaConfigurationProto, +) + +from google.protobuf.descriptor import ( + Descriptor as google___protobuf___descriptor___Descriptor, +) + +from google.protobuf.message import Message as google___protobuf___message___Message + +from typing import ( + Mapping as typing___Mapping, + MutableMapping as typing___MutableMapping, + Optional as typing___Optional, + Union as typing___Union, +) + +from typing_extensions import Literal as typing_extensions___Literal + +builtin___bool = bool +builtin___bytes = bytes +builtin___float = float +builtin___int = int +if sys.version_info < (3,): + builtin___buffer = buffer + builtin___unicode = unicode + +class ArenasConfigurationsProto(google___protobuf___message___Message): + DESCRIPTOR: google___protobuf___descriptor___Descriptor = ... + class ArenasEntry(google___protobuf___message___Message): + DESCRIPTOR: google___protobuf___descriptor___Descriptor = ... + key = ... # type: builtin___int + @property + def value( + self, + ) -> animalai___communicator_objects___arena_configuration_proto_pb2___ArenaConfigurationProto: ... + def __init__( + self, + *, + key: typing___Optional[builtin___int] = None, + value: typing___Optional[ + animalai___communicator_objects___arena_configuration_proto_pb2___ArenaConfigurationProto + ] = None, + ) -> None: ... + if sys.version_info >= (3,): + @classmethod + def FromString( + cls, s: builtin___bytes + ) -> ArenasConfigurationsProto.ArenasEntry: ... + else: + @classmethod + def FromString( + cls, + s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode], + ) -> ArenasConfigurationsProto.ArenasEntry: ... + def MergeFrom( + self, other_msg: google___protobuf___message___Message + ) -> None: ... + def CopyFrom( + self, other_msg: google___protobuf___message___Message + ) -> None: ... + def HasField( + self, field_name: typing_extensions___Literal["value", b"value"] + ) -> builtin___bool: ... + def ClearField( + self, + field_name: typing_extensions___Literal["key", b"key", "value", b"value"], + ) -> None: ... + seed = ... # type: builtin___int + @property + def arenas( + self, + ) -> typing___MutableMapping[ + builtin___int, + animalai___communicator_objects___arena_configuration_proto_pb2___ArenaConfigurationProto, + ]: ... + def __init__( + self, + *, + arenas: typing___Optional[ + typing___Mapping[ + builtin___int, + animalai___communicator_objects___arena_configuration_proto_pb2___ArenaConfigurationProto, + ] + ] = None, + seed: typing___Optional[builtin___int] = None, + ) -> None: ... + if sys.version_info >= (3,): + @classmethod + def FromString(cls, s: builtin___bytes) -> ArenasConfigurationsProto: ... + else: + @classmethod + def FromString( + cls, s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode] + ) -> ArenasConfigurationsProto: ... + def MergeFrom(self, other_msg: google___protobuf___message___Message) -> None: ... + def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ... + def ClearField( + self, + field_name: typing_extensions___Literal["arenas", b"arenas", "seed", b"seed"], + ) -> None: ... diff --git a/animalai/animalai/communicator_objects/brain_parameters_proto_pb2.py b/animalai/animalai/communicator_objects/brain_parameters_proto_pb2.py deleted file mode 100644 index 07091b4fccff448611c431e1176ad094431f26ed..0000000000000000000000000000000000000000 --- a/animalai/animalai/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/animalai/communicator_objects/command_proto_pb2.py b/animalai/animalai/communicator_objects/command_proto_pb2.py deleted file mode 100644 index 4912301ffd9118323d524c52cb8fda35cc872885..0000000000000000000000000000000000000000 --- a/animalai/animalai/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/animalai/communicator_objects/demonstration_meta_proto_pb2.py b/animalai/animalai/communicator_objects/demonstration_meta_proto_pb2.py deleted file mode 100644 index 107b1335cf6c419d061242c9a8e2fe8b79353b90..0000000000000000000000000000000000000000 --- a/animalai/animalai/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/animalai/communicator_objects/header_pb2.py b/animalai/animalai/communicator_objects/header_pb2.py deleted file mode 100644 index 6c40f6cc89b1979b409f24479e2d44e92b580698..0000000000000000000000000000000000000000 --- a/animalai/animalai/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/animalai/communicator_objects/items_to_spawn_proto_pb2.py b/animalai/animalai/communicator_objects/items_to_spawn_proto_pb2.py new file mode 100644 index 0000000000000000000000000000000000000000..dd65832ec1f9eab41487859176b30573613300f4 --- /dev/null +++ b/animalai/animalai/communicator_objects/items_to_spawn_proto_pb2.py @@ -0,0 +1,174 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: animalai/communicator_objects/items_to_spawn_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 +from google.protobuf import descriptor_pb2 + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from animalai.communicator_objects import ( + vector_proto_pb2 as animalai_dot_communicator__objects_dot_vector__proto__pb2, +) + + +DESCRIPTOR = _descriptor.FileDescriptor( + name="animalai/communicator_objects/items_to_spawn_proto.proto", + package="communicator_objects", + syntax="proto3", + serialized_pb=_b( + '\n8animalai/communicator_objects/items_to_spawn_proto.proto\x12\x14\x63ommunicator_objects\x1a\x30\x61nimalai/communicator_objects/vector_proto.proto"\xce\x01\n\x10ItemToSpawnProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x34\n\tpositions\x18\x03 \x03(\x0b\x32!.communicator_objects.VectorProto\x12\x11\n\trotations\x18\x04 \x03(\x02\x12\x30\n\x05sizes\x18\x05 \x03(\x0b\x32!.communicator_objects.VectorProto\x12\x31\n\x06\x63olors\x18\x06 \x03(\x0b\x32!.communicator_objects.VectorProtoB\x14\xaa\x02\x11\x41\x41IOCommunicatorsb\x06proto3' + ), + dependencies=[ + animalai_dot_communicator__objects_dot_vector__proto__pb2.DESCRIPTOR, + ], +) + + +_ITEMTOSPAWNPROTO = _descriptor.Descriptor( + name="ItemToSpawnProto", + full_name="communicator_objects.ItemToSpawnProto", + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name="name", + full_name="communicator_objects.ItemToSpawnProto.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, + options=None, + file=DESCRIPTOR, + ), + _descriptor.FieldDescriptor( + name="positions", + full_name="communicator_objects.ItemToSpawnProto.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, + options=None, + file=DESCRIPTOR, + ), + _descriptor.FieldDescriptor( + name="rotations", + full_name="communicator_objects.ItemToSpawnProto.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, + options=None, + file=DESCRIPTOR, + ), + _descriptor.FieldDescriptor( + name="sizes", + full_name="communicator_objects.ItemToSpawnProto.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, + options=None, + file=DESCRIPTOR, + ), + _descriptor.FieldDescriptor( + name="colors", + full_name="communicator_objects.ItemToSpawnProto.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, + options=None, + file=DESCRIPTOR, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=133, + serialized_end=339, +) + +_ITEMTOSPAWNPROTO.fields_by_name[ + "positions" +].message_type = animalai_dot_communicator__objects_dot_vector__proto__pb2._VECTORPROTO +_ITEMTOSPAWNPROTO.fields_by_name[ + "sizes" +].message_type = animalai_dot_communicator__objects_dot_vector__proto__pb2._VECTORPROTO +_ITEMTOSPAWNPROTO.fields_by_name[ + "colors" +].message_type = animalai_dot_communicator__objects_dot_vector__proto__pb2._VECTORPROTO +DESCRIPTOR.message_types_by_name["ItemToSpawnProto"] = _ITEMTOSPAWNPROTO +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +ItemToSpawnProto = _reflection.GeneratedProtocolMessageType( + "ItemToSpawnProto", + (_message.Message,), + dict( + DESCRIPTOR=_ITEMTOSPAWNPROTO, + __module__="animalai.communicator_objects.items_to_spawn_proto_pb2" + # @@protoc_insertion_point(class_scope:communicator_objects.ItemToSpawnProto) + ), +) +_sym_db.RegisterMessage(ItemToSpawnProto) + + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions( + descriptor_pb2.FileOptions(), _b("\252\002\021AAIOCommunicators") +) +# @@protoc_insertion_point(module_scope) diff --git a/animalai/animalai/communicator_objects/items_to_spawn_proto_pb2.pyi b/animalai/animalai/communicator_objects/items_to_spawn_proto_pb2.pyi new file mode 100644 index 0000000000000000000000000000000000000000..f462573a87085863b4831036db85fb70eea62145 --- /dev/null +++ b/animalai/animalai/communicator_objects/items_to_spawn_proto_pb2.pyi @@ -0,0 +1,104 @@ +# @generated by generate_proto_mypy_stubs.py. Do not edit! +import sys +from animalai.communicator_objects.vector_proto_pb2 import ( + VectorProto as animalai___communicator_objects___vector_proto_pb2___VectorProto, +) + +from google.protobuf.descriptor import ( + Descriptor as google___protobuf___descriptor___Descriptor, +) + +from google.protobuf.internal.containers import ( + RepeatedCompositeFieldContainer as google___protobuf___internal___containers___RepeatedCompositeFieldContainer, + RepeatedScalarFieldContainer as google___protobuf___internal___containers___RepeatedScalarFieldContainer, +) + +from google.protobuf.message import Message as google___protobuf___message___Message + +from typing import ( + Iterable as typing___Iterable, + Optional as typing___Optional, + Text as typing___Text, + Union as typing___Union, +) + +from typing_extensions import Literal as typing_extensions___Literal + +builtin___bool = bool +builtin___bytes = bytes +builtin___float = float +builtin___int = int +if sys.version_info < (3,): + builtin___buffer = buffer + builtin___unicode = unicode + +class ItemToSpawnProto(google___protobuf___message___Message): + DESCRIPTOR: google___protobuf___descriptor___Descriptor = ... + name = ... # type: typing___Text + rotations = ( + ... + ) # type: google___protobuf___internal___containers___RepeatedScalarFieldContainer[builtin___float] + @property + def positions( + self, + ) -> google___protobuf___internal___containers___RepeatedCompositeFieldContainer[ + animalai___communicator_objects___vector_proto_pb2___VectorProto + ]: ... + @property + def sizes( + self, + ) -> google___protobuf___internal___containers___RepeatedCompositeFieldContainer[ + animalai___communicator_objects___vector_proto_pb2___VectorProto + ]: ... + @property + def colors( + self, + ) -> google___protobuf___internal___containers___RepeatedCompositeFieldContainer[ + animalai___communicator_objects___vector_proto_pb2___VectorProto + ]: ... + def __init__( + self, + *, + name: typing___Optional[typing___Text] = None, + positions: typing___Optional[ + typing___Iterable[ + animalai___communicator_objects___vector_proto_pb2___VectorProto + ] + ] = None, + rotations: typing___Optional[typing___Iterable[builtin___float]] = None, + sizes: typing___Optional[ + typing___Iterable[ + animalai___communicator_objects___vector_proto_pb2___VectorProto + ] + ] = None, + colors: typing___Optional[ + typing___Iterable[ + animalai___communicator_objects___vector_proto_pb2___VectorProto + ] + ] = None, + ) -> None: ... + if sys.version_info >= (3,): + @classmethod + def FromString(cls, s: builtin___bytes) -> ItemToSpawnProto: ... + else: + @classmethod + def FromString( + cls, s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode] + ) -> ItemToSpawnProto: ... + def MergeFrom(self, other_msg: google___protobuf___message___Message) -> None: ... + def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ... + def ClearField( + self, + field_name: typing_extensions___Literal[ + "colors", + b"colors", + "name", + b"name", + "positions", + b"positions", + "rotations", + b"rotations", + "sizes", + b"sizes", + ], + ) -> None: ... diff --git a/animalai/animalai/communicator_objects/resolution_proto_pb2.py b/animalai/animalai/communicator_objects/resolution_proto_pb2.py deleted file mode 100644 index cade7d4921bac40300c3c12441465c14bb48e158..0000000000000000000000000000000000000000 --- a/animalai/animalai/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/animalai/communicator_objects/space_type_proto_pb2.py b/animalai/animalai/communicator_objects/space_type_proto_pb2.py deleted file mode 100644 index 02a9b16e83e5da9cd9c9a0af073b48057a30ff04..0000000000000000000000000000000000000000 --- a/animalai/animalai/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/animalai/communicator_objects/unity_input_pb2.py b/animalai/animalai/communicator_objects/unity_input_pb2.py deleted file mode 100644 index a3f9d1c17fb1dfd79738b8c0d5dcc5939735a429..0000000000000000000000000000000000000000 --- a/animalai/animalai/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/animalai/communicator_objects/unity_message_pb2.py b/animalai/animalai/communicator_objects/unity_message_pb2.py deleted file mode 100644 index 47deefdc2384dea5ef42147cb8c6ccd91dace55b..0000000000000000000000000000000000000000 --- a/animalai/animalai/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/animalai/communicator_objects/unity_output_pb2.py b/animalai/animalai/communicator_objects/unity_output_pb2.py deleted file mode 100644 index 5beed76ee6b663eeb1c3ba193e7a4888bee4224d..0000000000000000000000000000000000000000 --- a/animalai/animalai/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/animalai/communicator_objects/unity_rl_initialization_input_pb2.py b/animalai/animalai/communicator_objects/unity_rl_initialization_input_pb2.py deleted file mode 100644 index 9b16381b7f4594c7d31faaf9af38b2e221d41b2d..0000000000000000000000000000000000000000 --- a/animalai/animalai/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/animalai/communicator_objects/unity_rl_initialization_output_pb2.py b/animalai/animalai/communicator_objects/unity_rl_initialization_output_pb2.py deleted file mode 100644 index 1042578f38e4839b70aaa3bad7094312e756c27a..0000000000000000000000000000000000000000 --- a/animalai/animalai/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/animalai/communicator_objects/unity_rl_input_pb2.py b/animalai/animalai/communicator_objects/unity_rl_input_pb2.py deleted file mode 100644 index 29225764e7d4465f1fc263285cbaae88a4d674b8..0000000000000000000000000000000000000000 --- a/animalai/animalai/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/animalai/communicator_objects/unity_rl_output_pb2.py b/animalai/animalai/communicator_objects/unity_rl_output_pb2.py deleted file mode 100644 index a35cdd2018c487304748712af06444cc37a15d96..0000000000000000000000000000000000000000 --- a/animalai/animalai/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/animalai/communicator_objects/unity_rl_reset_input_pb2.py b/animalai/animalai/communicator_objects/unity_rl_reset_input_pb2.py deleted file mode 100644 index e07a72862ca9abc9603e98082ae503539b22917a..0000000000000000000000000000000000000000 --- a/animalai/animalai/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/animalai/communicator_objects/unity_rl_reset_output_pb2.py b/animalai/animalai/communicator_objects/unity_rl_reset_output_pb2.py deleted file mode 100644 index 4b5a24c234a2e52b04e29d49f387102b7cf4de23..0000000000000000000000000000000000000000 --- a/animalai/animalai/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/animalai/communicator_objects/unity_to_external_pb2.py b/animalai/animalai/communicator_objects/unity_to_external_pb2.py deleted file mode 100644 index 852b381315d263280fc04cf4bab931b2c8a6dd14..0000000000000000000000000000000000000000 --- a/animalai/animalai/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/animalai/communicator_objects/unity_to_external_pb2_grpc.py b/animalai/animalai/communicator_objects/unity_to_external_pb2_grpc.py deleted file mode 100644 index f1406fa180b1980ea23fd31479c55f42f3760734..0000000000000000000000000000000000000000 --- a/animalai/animalai/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/animalai/communicator_objects/vector_proto_pb2.py b/animalai/animalai/communicator_objects/vector_proto_pb2.py new file mode 100644 index 0000000000000000000000000000000000000000..5f245d0cf02dc376137fa0c6d0f8863228f8a1e7 --- /dev/null +++ b/animalai/animalai/communicator_objects/vector_proto_pb2.py @@ -0,0 +1,121 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: animalai/communicator_objects/vector_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 +from google.protobuf import descriptor_pb2 + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +DESCRIPTOR = _descriptor.FileDescriptor( + name="animalai/communicator_objects/vector_proto.proto", + package="communicator_objects", + syntax="proto3", + serialized_pb=_b( + '\n0animalai/communicator_objects/vector_proto.proto\x12\x14\x63ommunicator_objects".\n\x0bVectorProto\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\x14\xaa\x02\x11\x41\x41IOCommunicatorsb\x06proto3' + ), +) + + +_VECTORPROTO = _descriptor.Descriptor( + name="VectorProto", + full_name="communicator_objects.VectorProto", + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name="x", + full_name="communicator_objects.VectorProto.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, + options=None, + file=DESCRIPTOR, + ), + _descriptor.FieldDescriptor( + name="y", + full_name="communicator_objects.VectorProto.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, + options=None, + file=DESCRIPTOR, + ), + _descriptor.FieldDescriptor( + name="z", + full_name="communicator_objects.VectorProto.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, + options=None, + file=DESCRIPTOR, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=74, + serialized_end=120, +) + +DESCRIPTOR.message_types_by_name["VectorProto"] = _VECTORPROTO +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +VectorProto = _reflection.GeneratedProtocolMessageType( + "VectorProto", + (_message.Message,), + dict( + DESCRIPTOR=_VECTORPROTO, + __module__="animalai.communicator_objects.vector_proto_pb2" + # @@protoc_insertion_point(class_scope:communicator_objects.VectorProto) + ), +) +_sym_db.RegisterMessage(VectorProto) + + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions( + descriptor_pb2.FileOptions(), _b("\252\002\021AAIOCommunicators") +) +# @@protoc_insertion_point(module_scope) diff --git a/animalai/animalai/communicator_objects/vector_proto_pb2.pyi b/animalai/animalai/communicator_objects/vector_proto_pb2.pyi new file mode 100644 index 0000000000000000000000000000000000000000..29a0c4fea72b6c30f5ae35345f05560ca15cd4cc --- /dev/null +++ b/animalai/animalai/communicator_objects/vector_proto_pb2.pyi @@ -0,0 +1,48 @@ +# @generated by generate_proto_mypy_stubs.py. Do not edit! +import sys +from google.protobuf.descriptor import ( + Descriptor as google___protobuf___descriptor___Descriptor, +) + +from google.protobuf.message import Message as google___protobuf___message___Message + +from typing import ( + Optional as typing___Optional, + Union as typing___Union, +) + +from typing_extensions import Literal as typing_extensions___Literal + +builtin___bool = bool +builtin___bytes = bytes +builtin___float = float +builtin___int = int +if sys.version_info < (3,): + builtin___buffer = buffer + builtin___unicode = unicode + +class VectorProto(google___protobuf___message___Message): + DESCRIPTOR: google___protobuf___descriptor___Descriptor = ... + x = ... # type: builtin___float + y = ... # type: builtin___float + z = ... # type: builtin___float + def __init__( + self, + *, + x: typing___Optional[builtin___float] = None, + y: typing___Optional[builtin___float] = None, + z: typing___Optional[builtin___float] = None, + ) -> None: ... + if sys.version_info >= (3,): + @classmethod + def FromString(cls, s: builtin___bytes) -> VectorProto: ... + else: + @classmethod + def FromString( + cls, s: typing___Union[builtin___bytes, builtin___buffer, builtin___unicode] + ) -> VectorProto: ... + def MergeFrom(self, other_msg: google___protobuf___message___Message) -> None: ... + def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ... + def ClearField( + self, field_name: typing_extensions___Literal["x", b"x", "y", b"y", "z", b"z"] + ) -> None: ... diff --git a/animalai/animalai/envs/__init__.py b/animalai/animalai/envs/__init__.py index 93960d2f09e2dcf4e612032acd902efe373b3043..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/animalai/animalai/envs/__init__.py +++ b/animalai/animalai/envs/__init__.py @@ -1,3 +0,0 @@ -from .environment import * -from .brain import * -from .exception import * diff --git a/animalai/animalai/envs/arena_config.py b/animalai/animalai/envs/arena_config.py index a756c49359ccad5e84a632840745a54c7cac4e63..f7f12d27a830e5d36bf4c662d3e95af883010776 100644 --- a/animalai/animalai/envs/arena_config.py +++ b/animalai/animalai/envs/arena_config.py @@ -3,96 +3,115 @@ import jsonpickle import yaml import copy -from animalai.communicator_objects import UnityRLResetInput, ArenaParametersProto +from animalai.communicator_objects import ( + ArenasConfigurationsProto, + ArenaConfigurationProto, + ItemToSpawnProto, + VectorProto, +) yaml.Dumper.ignore_aliases = lambda *args: True class Vector3(yaml.YAMLObject): - yaml_tag = u'!Vector3' + 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 + def to_proto(self) -> VectorProto: + vector_proto = VectorProto() + vector_proto.x = self.x + vector_proto.y = self.y + vector_proto.z = self.z - return res + return vector_proto class RGB(yaml.YAMLObject): - yaml_tag = u'!RGB' + 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 + def to_proto(self) -> VectorProto: + rgb_proto = VectorProto() + rgb_proto.x = self.r + rgb_proto.y = self.g + rgb_proto.z = self.b - return res + return rgb_proto class Item(yaml.YAMLObject): - yaml_tag = u'!Item' + yaml_tag = u"!Item" - def __init__(self, name='', positions=None, rotations=None, sizes=None, colors=None): + 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 [] + def to_proto(self) -> ItemToSpawnProto: + item_to_spawn_proto = ItemToSpawnProto() + item_to_spawn_proto.name = self.name + item_to_spawn_proto.positions.extend([v.to_proto() for v in self.positions]) + item_to_spawn_proto.rotations.extend(self.rotations) + item_to_spawn_proto.sizes.extend([v.to_proto() for v in self.sizes]) + item_to_spawn_proto.colors.extend([v.to_proto() for v in self.colors]) + + return item_to_spawn_proto + class Arena(yaml.YAMLObject): - yaml_tag = u'!Arena' + yaml_tag = u"!Arena" - def __init__(self, t=1000, items=None, blackouts=None): + def __init__(self, t=1000, items=None, pass_mark=0, blackouts=None): self.t = t self.items = items if items is not None else {} + self.pass_mark = pass_mark self.blackouts = blackouts if blackouts is not None else [] + def to_proto(self) -> ArenaConfigurationProto: + arena_configuration_proto = ArenaConfigurationProto() + arena_configuration_proto.t = self.t + arena_configuration_proto.pass_mark = self.pass_mark + arena_configuration_proto.blackouts.extend(self.blackouts) + arena_configuration_proto.items.extend([item.to_proto() for item in self.items]) + + return arena_configuration_proto + class ArenaConfig(yaml.YAMLObject): - yaml_tag = u'!ArenaConfig' + 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 + 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) + json.dump(out, open(json_path, "w"), indent=4) - def dict_to_arena_config(self) -> UnityRLResetInput: - config_out = UnityRLResetInput() + def to_proto(self, seed=-1) -> ArenasConfigurationsProto: + arenas_configurations_proto = ArenasConfigurationsProto() + arenas_configurations_proto.seed = seed 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 + arenas_configurations_proto.arenas[k].CopyFrom(self.arenas[k].to_proto()) + + return arenas_configurations_proto def update(self, arenas_configurations): @@ -111,5 +130,5 @@ def constructor_item(loader, node): return Item(**fields) -yaml.add_constructor(u'!Arena', constructor_arena) -yaml.add_constructor(u'!Item', constructor_item) +yaml.add_constructor(u"!Arena", constructor_arena) +yaml.add_constructor(u"!Item", constructor_item) diff --git a/animalai/animalai/envs/brain.py b/animalai/animalai/envs/brain.py deleted file mode 100644 index 06940fd2dbe8f8fb45471debdb93738b2294aa43..0000000000000000000000000000000000000000 --- a/animalai/animalai/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/animalai/envs/communicator.py b/animalai/animalai/envs/communicator.py deleted file mode 100644 index 85b56db1a99a94dbf1baec38bbbe9437408623e7..0000000000000000000000000000000000000000 --- a/animalai/animalai/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/animalai/envs/environment.py b/animalai/animalai/envs/environment.py index f27f74aeb98303ea402439fdec5ea87153f03840..0a7a4a9dad9e0d58b7d35cd1ad89b96779e2ffef 100644 --- a/animalai/animalai/envs/environment.py +++ b/animalai/animalai/envs/environment.py @@ -1,515 +1,149 @@ -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, - inference=False, - resolution=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 +import uuid +from typing import NamedTuple +from typing import Optional, List +from mlagents_envs.environment import UnityEnvironment +from mlagents_envs.rpc_communicator import UnityTimeOutException +from mlagents_envs.side_channel.raw_bytes_channel import RawBytesChannel +from mlagents_envs.side_channel.side_channel import SideChannel +from mlagents_envs.side_channel.engine_configuration_channel import ( + EngineConfig, + EngineConfigurationChannel, +) +from animalai.envs.arena_config import ArenaConfig + + +class PlayTrain(NamedTuple): + play: int + train: int + + +class AnimalAIEnvironment(UnityEnvironment): + # Default values for configuration parameters of the environment, can be changed if needed + # Increasing the timescale value for training might speed up the process on powefull machines + # but take care as the higher the timescale the more likely the physics might break + WINDOW_WIDTH = PlayTrain(play=1200, train=80) + WINDOW_HEIGHT = PlayTrain(play=800, train=80) + QUALITY_LEVEL = PlayTrain(play=5, train=1) + TIMESCALE = PlayTrain(play=1, train=300) + TARGET_FRAME_RATE = PlayTrain(play=60, train=-1) + ARENA_CONFIG_SC_UUID = "9c36c837-cad5-498a-b675-bc19c9370072" + + def __init__( + self, + file_name: Optional[str] = None, + worker_id: int = 0, + base_port: int = 5005, + seed: int = 0, + # docker_training: bool = False, # Will be removed in final version + n_arenas: int = 1, + play: bool = False, + arenas_configurations: ArenaConfig = None, + inference: bool = False, + camera_width: int = None, + camera_height: int = None, + grayscale: bool = False, + side_channels: Optional[List[SideChannel]] = None, + ): + + args = self.executable_args( + n_arenas, play, camera_height, camera_width, grayscale + ) self.play = play self.inference = inference - self.resolution = resolution - self.port = base_port + worker_id - self._buffer_size = 12000 - self._version_ = "1.0" - 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("Launch the environment container (or Play button in the Unity Editor).") - self._loaded = True - - rl_init_parameters_in = UnityRLInitializationInput( - seed=seed + self.timeout = 10 if play else 60 + self.side_channels = side_channels if side_channels else [] + self.arenas_parameters_side_channel = None + + self.configure_side_channels(self.side_channels) + + super().__init__( + file_name=file_name, + worker_id=worker_id, + base_port=base_port, + seed=seed, + no_graphics=False, + timeout_wait=self.timeout, + args=args, + side_channels=self.side_channels, ) - 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( - "There is a version mismatch between the Python API and Unity executable.\n" - "Python API : {0}, Unity executable : {1}.\n" - "Please go to https://github.com/beyretb/AnimalAI-Olympics to download the latest version " - .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 + self.reset(arenas_configurations) - @property - def brains(self): - return self._brains + def configure_side_channels(self, side_channels: List[SideChannel]) -> None: - @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.\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)) - # Launch Unity environment - if not docker_training: - if self.play: - self.proc1 = subprocess.Popen( - [launch_string, '--port', str(self.port)]) - elif self.inference: - self.proc1 = subprocess.Popen( - [launch_string, '--port', str(self.port), '--inference']) - else: - if self.resolution: - self.proc1 = subprocess.Popen( - [launch_string, '--port', str(self.port), '--resolution', str(self.resolution), '--nArenas', - str(self.n_arenas)]) - else: - self.proc1 = subprocess.Popen( - [launch_string, '--port', str(self.port), '--nArenas', str(self.n_arenas)]) - - 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`. - """ - if self.resolution: - docker_ls = ("exec xvfb-run --auto-servernum" - " --server-args='-screen 0 640x480x24'" - " {0} --port {1} --nArenas {2} --resolution {3}").format(launch_string, str(self.port), - str(self.n_arenas), - str(self.resolution)) - else: - 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)) + contains_engine_config_sc = any( + [isinstance(sc, EngineConfigurationChannel) for sc in side_channels] + ) + if not contains_engine_config_sc: + self.side_channels.append(self.create_engine_config_side_channel()) + contains_arena_config_sc = any( + [sc.channel_id == self.ARENA_CONFIG_SC_UUID for sc in side_channels] + ) + if not contains_arena_config_sc: + self.arenas_parameters_side_channel = RawBytesChannel( + channel_id=uuid.UUID(self.ARENA_CONFIG_SC_UUID) + ) + self.side_channels.append(self.arenas_parameters_side_channel) - 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) + def create_engine_config_side_channel(self) -> EngineConfigurationChannel: - outputs = self.communicator.exchange( - self._generate_reset_input(train_mode, arenas_configurations) + if self.play or self.inference: + engine_configuration = EngineConfig( + width=self.WINDOW_WIDTH.play, + height=self.WINDOW_HEIGHT.play, + quality_level=self.QUALITY_LEVEL.play, + time_scale=self.TIMESCALE.play, + target_frame_rate=self.TARGET_FRAME_RATE.play, ) - 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) -> 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() + engine_configuration = EngineConfig( + width=self.WINDOW_WIDTH.train, + height=self.WINDOW_HEIGHT.train, + quality_level=self.QUALITY_LEVEL.train, + time_scale=self.TIMESCALE.train, + target_frame_rate=self.TARGET_FRAME_RATE.train, + ) + engine_configuration_channel = EngineConfigurationChannel() + engine_configuration_channel.set_configuration(engine_configuration) + return engine_configuration_channel + + def reset(self, arenas_configurations: ArenaConfig = None) -> None: + if arenas_configurations: + arenas_configurations_proto = arenas_configurations.to_proto() + arenas_configurations_proto_string = ( + arenas_configurations_proto.SerializeToString() + ) + self.arenas_parameters_side_channel.send_raw_data( + bytearray(arenas_configurations_proto_string) + ) + try: + super().reset() + except UnityTimeOutException as timeoutException: + if self.play: + pass + else: + raise timeoutException + + @staticmethod + def executable_args( + n_arenas: int = 1, + play: bool = False, + camera_height: int = 84, + camera_width: int = 84, + grayscale: bool = False, + ) -> List[str]: + args = ["--playerMode"] + if play: + args.append("1") 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) + args.append("0") + args.append("--numberOfArenas") + args.append(str(n_arenas)) + if camera_width: + args.append("--cameraWidth") + args.append(str(camera_width)) + if camera_height: + args.append("--cameraHeight") + args.append(str(camera_height)) + if grayscale: + args.append("--grayscale") + return args diff --git a/animalai/animalai/envs/exception.py b/animalai/animalai/envs/exception.py deleted file mode 100644 index edf16ff4a978c6ab8f4f0ad19986d3785d62ef4a..0000000000000000000000000000000000000000 --- a/animalai/animalai/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/animalai/envs/gym/environment.py b/animalai/animalai/envs/gym/environment.py index 47ec84cf89e08672cf11f595877f590b9b1651fb..3172090e6085d02bcd89b34bfc5df63400cf327c 100644 --- a/animalai/animalai/envs/gym/environment.py +++ b/animalai/animalai/envs/gym/environment.py @@ -1,362 +1,179 @@ -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, - seed=0, - arenas_configurations=None, - greyscale=False, - retro=True, - inference=False, - resolution=None): +from gym import spaces +from typing import Union, List + +from gym_unity.envs import ( + UnityEnv, + UnityGymException, + GymStepResult, + AgentIdIndexMapper, + BatchedStepResult, + ActionFlattener, + logger, +) + +from animalai.envs.environment import AnimalAIEnvironment +from animalai.envs.arena_config import ArenaConfig + + +class AnimalAIGym(UnityEnv): + def __init__( + self, + environment_filename: str, + worker_id: int = 0, + uint8_visual: bool = False, + flatten_branched: bool = False, + n_arenas: int = 1, + seed: int = 0, + inference: bool = False, + grayscale: bool = False, + arenas_configurations: ArenaConfig = None, + ): """ 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. + :param use_visual: Whether to use visual observation or vector observation. + :param uint8_visual: Return visual observations as uint8 (0-255) matrices instead of float (0.0-1.0). + :param multiagent: Whether to run in multi-agent mode (lists of obs, reward, done). + :param flatten_branched: If True, turn branched discrete action spaces into a Discrete space rather than + MultiDiscrete. + :param no_graphics: Whether to run the Unity simulator in no-graphics mode + :param allow_multiple_visual_obs: If True, return a list of visual observations instead of only one. """ - self._env = UnityEnvironment(file_name=environment_filename, - worker_id=worker_id, - seed=seed, - docker_training=docker_training, - n_arenas=n_arenas, - arenas_configurations=arenas_configurations, - inference=inference, - resolution=resolution) - self.name = 'aaio' - self.vector_obs = None - self.inference = inference - self.resolution = resolution - self._current_state = None - self._n_agents = None + base_port = 5005 + if environment_filename is None: + base_port = AnimalAIEnvironment.DEFAULT_EDITOR_PORT + + self._env = AnimalAIEnvironment( + file_name=environment_filename, + worker_id=worker_id, + base_port=base_port, + seed=seed, + n_arenas=n_arenas, + inference=inference, + arenas_configurations=arenas_configurations, + grayscale=grayscale, + ) + + # Take a single step so that the brain information will be sent over + if not self._env.get_agent_groups(): + self._env.step() + + self.visual_obs = None + self._n_agents = -1 + + self.agent_mapper = AgentIdIndexMapper() + + # Save the step result from the last time all Agents requested decisions. + self._previous_step_result: BatchedStepResult = None + self._multiagent = n_arenas > 1 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 + # Hidden flag used by Atari environments to determine if the game is over + self.game_over = False + self._allow_multiple_visual_obs = n_arenas > 1 # Check brain configuration - if len(self._env.brains) != 1: + if len(self._env.get_agent_groups()) != 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 it is wrapped in a gym." + ) - if brain.number_visual_observations == 0: - raise UnityGymException("Environment provides no visual observations.") + self.brain_name = self._env.get_agent_groups()[0] + self.name = self.brain_name + self.group_spec = self._env.get_agent_group_spec(self.brain_name) - if brain.num_stacked_vector_observations != 1: - raise UnityGymException("Environment provides no vector observations.") + if self._get_n_vis_obs() == 0: + raise UnityGymException( + "`use_visual` was set to True, however there are no" + " visual observations as part of this environment." + ) + self.use_visual = self._get_n_vis_obs() >= 1 + self.uint8_visual = uint8_visual # 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.") + self._env.reset() + step_result = self._env.get_step_result(self.brain_name) + self._check_agents(step_result.n_agents()) + self._previous_step_result = step_result + self.agent_mapper.set_initial_agents(list(self._previous_step_result.agent_id)) # 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 + if self.group_spec.is_action_discrete(): + branches = self.group_spec.discrete_action_branches + if self.group_spec.action_shape == 1: + self._action_space = spaces.Discrete(branches[0]) 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 flatten_branched: + self._flattener = ActionFlattener(branches) + self._action_space = self._flattener.action_space + else: + self._action_space = spaces.MultiDiscrete(branches) - # 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) - ) + if flatten_branched: + logger.warning( + "The environment has a non-discrete action space. It will " + "not be flattened." + ) + high = np.array([1] * self.group_spec.action_shape) + self._action_space = spaces.Box(-high, high, dtype=np.float32) + high = np.array([np.inf] * self._get_vec_obs_size()) + if self.use_visual: + shape = self._get_vis_obs_shape() + if uint8_visual: + self._observation_space = spaces.Box( + 0, 255, dtype=np.uint8, shape=shape + ) + else: + self._observation_space = spaces.Box( + 0, 1, dtype=np.float32, shape=shape + ) - 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 + self._observation_space = spaces.Box(-high, high, dtype=np.float32) - 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): + def reset( + self, arenas_configurations: ArenaConfig = None + ) -> Union[List[np.ndarray], np.ndarray]: """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. + space. """ - info = self._env.reset(arenas_configurations=arenas_configurations)[self.brain_name] - n_agents = len(info.agents) + step_result = self._step(True, arenas_configurations=arenas_configurations) + n_agents = step_result.n_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) + if not self._multiagent: + res: GymStepResult = self._single_step(step_result) 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) + res = self._multi_step(step_result) + return res[0] + + def _step( + self, needs_reset: bool = False, arenas_configurations: ArenaConfig = None + ) -> BatchedStepResult: + if needs_reset: + self._env.reset(arenas_configurations=arenas_configurations) 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] + self._env.step() + info = self._env.get_step_result(self.brain_name) + # Two possible cases here: + # 1) all agents requested decisions (some of which might be done) + # 2) some Agents were marked Done in between steps. + # In case 2, we re-request decisions until all agents request a real decision. + while info.n_agents() - sum(info.done) < self._n_agents: + if not info.done.all(): + raise UnityGymException( + "The environment does not have the expected amount of agents. " + + "Some agents did not request decisions at the same time." + ) + for agent_id, reward in zip(info.agent_id, info.reward): + self.agent_mapper.mark_agent_done(agent_id, reward) + + self._env.step() + info = self._env.get_step_result(self.brain_name) + return self._sanitize_info(info) diff --git a/animalai/animalai/envs/rpc_communicator.py b/animalai/animalai/envs/rpc_communicator.py deleted file mode 100644 index ddc48ffdd44b9158661e8315f0a3833ce17fd296..0000000000000000000000000000000000000000 --- a/animalai/animalai/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(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" - "\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/animalai/envs/socket_communicator.py b/animalai/animalai/envs/socket_communicator.py deleted file mode 100644 index c600e938bb0a855ee55ee372b49fd399f17832c7..0000000000000000000000000000000000000000 --- a/animalai/animalai/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/conda_install.yaml b/animalai/conda_install.yaml deleted file mode 100644 index f4f95bd375c75a63cfc14f138c83672296ef0c69..0000000000000000000000000000000000000000 --- a/animalai/conda_install.yaml +++ /dev/null @@ -1,21 +0,0 @@ -name: animalai -channels: - - defaults - - conda-forge -dependencies: - - python=3.6.* - - pip - - 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 - - pyglet>=1.2.0 - - scipy - - cloudpickle=1.2.* - - future - - pip: - - gym - - animalai - diff --git a/animalai/setup.py b/animalai/setup.py index fb566b5bd2df98bc70a6a1a1b1c81c87af13e918..a4619b2fa32d3f0468011ddcefe771ed9fbc7f5e 100644 --- a/animalai/setup.py +++ b/animalai/setup.py @@ -1,30 +1,24 @@ from setuptools import setup setup( - name='animalai', - version='1.1.1', - description='Animal AI competition interface', - url='https://github.com/beyretb/AnimalAI-Olympics', - author='Benjamin Beyret', - author_email='bb1010@ic.ac.uk', - + name="animalai", + version="2.0.0b0", + 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' + "Intended Audience :: Developers", + "Topic :: Scientific/Engineering :: Artificial Intelligence", + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python :: 3.6", ], - - packages=['animalai.envs', 'animalai.envs.gym', 'animalai.communicator_objects'], # Required + packages=[ + "animalai.envs", + "animalai.envs.gym", + "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', - 'gym'], - python_requires=">=3.5,<3.8", + install_requires=["mlagents-envs==0.15.0", "jsonpickle", "pyyaml"], + python_requires=">=3.5", # ,<3.8", ) diff --git a/animalai_train/animalai_train/__init__.py b/animalai_train/animalai_train/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/animalai_train/animalai_train/curriculum_aai.py b/animalai_train/animalai_train/curriculum_aai.py new file mode 100644 index 0000000000000000000000000000000000000000..89ee9cf78d75d177e5a21b8c66090e4681c34506 --- /dev/null +++ b/animalai_train/animalai_train/curriculum_aai.py @@ -0,0 +1,110 @@ +import json +import math +import os + +from mlagents.trainers.exception import ( + CurriculumConfigError, + CurriculumError, +) +from mlagents.trainers.curriculum import Curriculum +import logging + +from animalai.envs.arena_config import ArenaConfig + +logger = logging.getLogger("mlagents.trainers") + + +class CurriculumAAI(Curriculum): + def __init__(self, brain_name: str, curriculum_file: str): + """ + Initializes a Curriculum object. + :param brain_name: Name of the brain this Curriculum is associated with + :param config: Dictionary of fields needed to configure the Curriculum + """ + self.max_lesson_num = 0 + self.measure = None + self._lesson_num = 0 + self.brain_name = brain_name + + try: + with open(curriculum_file) as data_file: + self.config = json.load(data_file) + except IOError: + raise CurriculumError( + "The file {0} could not be found.".format(curriculum_file) + ) + + self.smoothing_value = 0.0 + for key in [ + "configuration_files", + "measure", + "thresholds", + "min_lesson_length", + "signal_smoothing", + ]: + if key not in self.config: + raise CurriculumConfigError( + f"{brain_name} curriculum config does not contain a {key} field." + ) + self.smoothing_value = 0 + self.measure = self.config["measure"] + self.min_lesson_length = self.config["min_lesson_length"] + self.max_lesson_num = len(self.config["thresholds"]) + + configuration_files = self.config["configuration_files"] + if len(configuration_files) != self.max_lesson_num + 1: + raise CurriculumError( + "The parameter {0} in the Curriculum must have {1} values " + "but {2} were found".format( + key, self.max_lesson_num + 1, len(configuration_files) + ) + ) + folder = os.path.dirname(curriculum_file) + folder_yaml_files = os.listdir(folder) + if not all([file in folder_yaml_files for file in configuration_files]): + raise CurriculumError( + "One or more configuration file(s) in the curriculum could not be found" + ) + self.configurations = [ + ArenaConfig(os.path.join(folder, file)) for file in configuration_files + ] + + def increment_lesson(self, measure_val: float) -> bool: + """ + 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.config or not measure_val or math.isnan(measure_val): + return False + if self.config["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.config["thresholds"][self.lesson_num]: + self.lesson_num += 1 + logger.info( + "{0} lesson changed. Now in lesson {1}: {2}".format( + self.brain_name, + self.lesson_num, + self.config["configuration_files"][self.lesson_num], + ) + ) + return True + return False + + def get_config(self, lesson: int = None) -> ArenaConfig: + """ + 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.config: + return None + if lesson is None: + lesson = self.lesson_num + lesson = max(0, min(lesson, self.max_lesson_num)) + config = self.configurations[lesson] + return config diff --git a/animalai_train/animalai_train/environment_factory_aai.py b/animalai_train/animalai_train/environment_factory_aai.py new file mode 100644 index 0000000000000000000000000000000000000000..9e68ddf378bd083f6a410f9e647085e487fdb1bd --- /dev/null +++ b/animalai_train/animalai_train/environment_factory_aai.py @@ -0,0 +1,61 @@ +import numpy as np +from typing import Callable, Optional, List + +from mlagents_envs.base_env import BaseEnv +from mlagents_envs.side_channel.side_channel import SideChannel +from mlagents_envs.exception import UnityEnvironmentException + +# from mlagents.trainers.learn import prepare_for_docker_run + +from animalai.envs.arena_config import ArenaConfig +from animalai.envs.environment import AnimalAIEnvironment + + +def create_environment_factory_aai( + env_path: Optional[str], + # docker_target_name: Optional[str], + seed: Optional[int], + start_port: int, + n_arenas_per_env: int, + arenas_configurations: ArenaConfig, + camera_width: Optional[int], + camera_height: Optional[int], +) -> Callable[[int, List[SideChannel]], BaseEnv]: + if env_path is not None: + launch_string = AnimalAIEnvironment.validate_environment_path(env_path) + if launch_string is None: + raise UnityEnvironmentException( + f"Couldn't launch the {env_path} environment. Provided filename does not match any environments." + ) + # 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) + seed_count = 10000 + seed_pool = [np.random.randint(0, seed_count) for _ in range(seed_count)] + + def create_unity_environment( + worker_id: int, side_channels: List[SideChannel] + ) -> AnimalAIEnvironment: + env_seed = seed + if not env_seed: + env_seed = seed_pool[worker_id % len(seed_pool)] + return AnimalAIEnvironment( + file_name=env_path, + worker_id=worker_id, + base_port=start_port, + seed=env_seed, + # docker_training=docker_training, + n_arenas=n_arenas_per_env, + arenas_configurations=arenas_configurations, + camera_width=camera_width, + camera_height=camera_height, + side_channels=side_channels, + ) + + return create_unity_environment diff --git a/animalai_train/animalai_train/meta_curriculum_aai.py b/animalai_train/animalai_train/meta_curriculum_aai.py new file mode 100644 index 0000000000000000000000000000000000000000..af9c99dc5b20f7d330fdea9b02aca151532807c1 --- /dev/null +++ b/animalai_train/animalai_train/meta_curriculum_aai.py @@ -0,0 +1,56 @@ +"""Contains the MetaCurriculum class.""" +import os +from typing import Dict +from mlagents.trainers.meta_curriculum import MetaCurriculum +from mlagents.trainers.exception import MetaCurriculumError +from animalai_train.curriculum_aai import CurriculumAAI + +import logging + +logger = logging.getLogger("mlagents.trainers") + + +class MetaCurriculumAAI(MetaCurriculum): + """A MetaCurriculum holds curricula. Each curriculum is associated to a + particular brain in the environment. + """ + + def __init__(self, curriculum_folder: str): + """Initializes a MetaCurriculum object. + + :param curriculum_folder: Dictionary of brain_name to the + Curriculum for each brain. + """ + self._brains_to_curricula: Dict[str, CurriculumAAI] = {} + try: + json_files = [ + file + for file in os.listdir(curriculum_folder) + if ".json" in file.lower() + ] + for curriculum_filename in json_files: + brain_name = curriculum_filename.split(".")[0] + curriculum_filepath = os.path.join( + curriculum_folder, curriculum_filename + ) + curriculum = CurriculumAAI(brain_name, curriculum_filepath) + self._brains_to_curricula[brain_name] = curriculum + except NotADirectoryError: + raise MetaCurriculumError( + curriculum_folder + " is not a " + "directory. Refer to the ML-Agents " + "curriculum learning docs." + ) + + def get_config(self): + """Get the combined configuration of all curricula in this + MetaCurriculum. + + :return: A dict from parameter to value. + """ + config = None + + for _, curriculum in self.brains_to_curricula.items(): + config = curriculum.get_config() + + return config diff --git a/animalai_train/animalai_train/run_options_aai.py b/animalai_train/animalai_train/run_options_aai.py new file mode 100644 index 0000000000000000000000000000000000000000..848c6286833b8d520800e983a855fadbf00d40f5 --- /dev/null +++ b/animalai_train/animalai_train/run_options_aai.py @@ -0,0 +1,51 @@ +from typing import NamedTuple, Dict, Optional +from animalai.envs.arena_config import ArenaConfig + + +class RunOptionsAAI(NamedTuple): + trainer_config: Dict = None + debug: bool = False + seed: int = 0 + env_path: Optional[str] = None + run_id: str = "ppo" + load_model: bool = False + train_model: bool = True + save_freq: int = 50000 + keep_checkpoints: int = 5 + base_port: int = 5005 + num_envs: int = 1 + curriculum_config: str = None + lesson: int = 0 + # multi_gpu: bool = False # Will be added in later version + # docker_target_name: Optional[str] = None + cpu: bool = False + width: int = 84 + height: int = 84 + n_arenas_per_env: int = 1 + arena_config: ArenaConfig = None + camera_width: int = 84 + camera_height: int = 84 + + """ + trainer_config: Hyperparameters for your training model + debug: Whether to run in debug mode with detailed logging + seed: Random seed used for training + env_path: Path to the AnimalAI executable + run_id: The directory name for model and summary statistics + load_model: Whether to load the model or randomly initialize + train_model: Whether to train model, or only run inference + save_freq: Frequency at which to save model + keep_checkpoints: How many model checkpoints to keep + base_port: Base port for environment communication + num_envs: Number of parallel environments to use for training + curriculum_config: Path to curriculum training folder + lesson: Start learning from this lesson if using curriculum + multi_gpu: Whether or not to use multiple GPU (not in current version) + cpu: Run with CPU only + width: The width of the executable window of the environment(s) + height: The height of the executable window of the environment(s) + n_arenas_per_env: Number of arenas (number of agents) per env environment instance + arena_config: Configuration file for the training arenas + camera_width: Width for the visual observation camera of the agent + camera_height: Height for the visual observation camera of the agent + """ diff --git a/animalai_train/animalai_train/run_training_aai.py b/animalai_train/animalai_train/run_training_aai.py new file mode 100644 index 0000000000000000000000000000000000000000..755ea3fa4fe7031b301b0eaa3f72374b7ff96cf7 --- /dev/null +++ b/animalai_train/animalai_train/run_training_aai.py @@ -0,0 +1,122 @@ +from typing import Optional + +from mlagents_envs.timers import hierarchical_timer +from mlagents.trainers.stats import ( + TensorboardWriter, + CSVWriter, + StatsReporter, + GaugeWriter, +) +from mlagents_envs.side_channel.engine_configuration_channel import EngineConfig +from mlagents.trainers.trainer_util import TrainerFactory +from mlagents.trainers.learn import write_timing_tree + +from animalai.envs.environment import AnimalAIEnvironment + +from animalai_train.subprocess_env_manager_aai import SubprocessEnvManagerAAI +from animalai_train.run_options_aai import RunOptionsAAI +from animalai_train.environment_factory_aai import create_environment_factory_aai +from animalai_train.meta_curriculum_aai import MetaCurriculumAAI +from animalai_train.trainer_controller_aai import TrainerControllerAAI + + +def run_training_aai(run_seed: int, options: RunOptionsAAI) -> None: + """ + Launches training session. + :param run_seed: Random seed used for training. + :param options: training parameters + """ + with hierarchical_timer("run_training.setup"): + # Recognize and use docker volume if one is passed as an argument + # if not options.docker_target_name: + model_path = f"./models/{options.run_id}" + summaries_dir = "./summaries" + # else: + # model_path = f"/{options.docker_target_name}/models/{options.run_id}" + # summaries_dir = f"/{options.docker_target_name}/summaries" + port = options.base_port + + # Configure CSV, Tensorboard Writers and StatsReporter + # We assume reward and episode length are needed in the CSV. + csv_writer = CSVWriter( + summaries_dir, + required_fields=[ + "Environment/Cumulative Reward", + "Environment/Episode Length", + ], + ) + tb_writer = TensorboardWriter(summaries_dir) + gauge_write = GaugeWriter() + StatsReporter.add_writer(tb_writer) + StatsReporter.add_writer(csv_writer) + StatsReporter.add_writer(gauge_write) + + if options.env_path is None: + port = AnimalAIEnvironment.DEFAULT_EDITOR_PORT + env_factory = create_environment_factory_aai( + options.env_path, + # options.docker_target_name, + run_seed, + port, + options.n_arenas_per_env, + options.arena_config, + options.camera_width, + options.camera_height, + ) + engine_config = EngineConfig( + options.width, + options.height, + AnimalAIEnvironment.QUALITY_LEVEL.train, + AnimalAIEnvironment.TIMESCALE.train, + AnimalAIEnvironment.TARGET_FRAME_RATE.train, + ) + env_manager = SubprocessEnvManagerAAI( + env_factory, engine_config, options.num_envs + ) + maybe_meta_curriculum = try_create_meta_curriculum( + options.curriculum_config, env_manager, options.lesson + ) + trainer_factory = TrainerFactory( + options.trainer_config, + summaries_dir, + options.run_id, + model_path, + options.keep_checkpoints, + options.train_model, + options.load_model, + run_seed, + maybe_meta_curriculum, + # options.multi_gpu, + ) + # Create controller and begin training. + tc = TrainerControllerAAI( + trainer_factory, + model_path, + summaries_dir, + options.run_id, + options.save_freq, + maybe_meta_curriculum, + options.train_model, + run_seed, + ) + + # Begin training + try: + tc.start_learning(env_manager) + finally: + env_manager.close() + write_timing_tree(summaries_dir, options.run_id) + + +def try_create_meta_curriculum( + curriculum_config: str, env: SubprocessEnvManagerAAI, lesson: int +) -> Optional[MetaCurriculumAAI]: + # TODO: may need rewrite for arena configuration curricula + if curriculum_config is None: + return None + else: + meta_curriculum = MetaCurriculumAAI(curriculum_config) + # TODO: Should be able to start learning at different lesson numbers + # for each curriculum. + meta_curriculum.set_all_curricula_to_lesson_num(lesson) + return meta_curriculum diff --git a/animalai_train/animalai_train/simple_env_manager_aai.py b/animalai_train/animalai_train/simple_env_manager_aai.py new file mode 100644 index 0000000000000000000000000000000000000000..a908c04663cdb3347944f281e0fe1e4f70c53f45 --- /dev/null +++ b/animalai_train/animalai_train/simple_env_manager_aai.py @@ -0,0 +1,25 @@ +from typing import Dict, List + +from mlagents.trainers.env_manager import EnvironmentStep +from mlagents.trainers.simple_env_manager import SimpleEnvManager +from mlagents_envs.side_channel.float_properties_channel import FloatPropertiesChannel +from mlagents.trainers.action_info import ActionInfo + +from animalai.envs.arena_config import ArenaConfig +from animalai.envs.environment import AnimalAIEnvironment + + +class SimpleEnvManagerAAI(SimpleEnvManager): + def __init__( + self, env: AnimalAIEnvironment, float_prop_channel: FloatPropertiesChannel + ): + self.shared_float_properties = float_prop_channel + self.env = env + self.previous_step: EnvironmentStep = EnvironmentStep.empty(0) + self.previous_all_action_info: Dict[str, ActionInfo] = {} + + def _reset_env(self, config: ArenaConfig = None) -> List[EnvironmentStep]: + self.env.reset(arenas_configurations=config) + all_step_result = self._generate_all_results() + self.previous_step = EnvironmentStep(all_step_result, 0, {}) + return [self.previous_step] diff --git a/animalai_train/animalai_train/subprocess_env_manager_aai.py b/animalai_train/animalai_train/subprocess_env_manager_aai.py new file mode 100644 index 0000000000000000000000000000000000000000..c161c4df16d97e6f4bd9667e8bba1bc4ddf38c44 --- /dev/null +++ b/animalai_train/animalai_train/subprocess_env_manager_aai.py @@ -0,0 +1,144 @@ +from typing import List, Callable, Optional, Dict +import cloudpickle + +from multiprocessing import Process, Pipe +from mlagents_envs.exception import UnityCommunicationException, UnityTimeOutException +from multiprocessing import Queue +from multiprocessing.connection import Connection +from mlagents_envs.base_env import BaseEnv +from mlagents.trainers.env_manager import EnvironmentStep, AllStepResult +from mlagents_envs.timers import reset_timers, get_timer_root +from mlagents_envs.side_channel.float_properties_channel import FloatPropertiesChannel +from mlagents_envs.side_channel.engine_configuration_channel import ( + EngineConfigurationChannel, + EngineConfig, +) +from mlagents_envs.side_channel.side_channel import SideChannel +from mlagents.trainers.brain_conversion_utils import group_spec_to_brain_parameters +from mlagents.trainers.subprocess_env_manager import ( + logger, + SubprocessEnvManager, + EnvironmentCommand, + EnvironmentResponse, + StepResponse, + UnityEnvWorker, +) +from animalai.envs.environment import AnimalAIEnvironment + + +def worker_aai( + parent_conn: Connection, + step_queue: Queue, + pickled_env_factory: str, + worker_id: int, + engine_configuration: EngineConfig, +) -> None: + env_factory: Callable[ + [int, List[SideChannel]], AnimalAIEnvironment + ] = cloudpickle.loads(pickled_env_factory) + shared_float_properties = FloatPropertiesChannel() + engine_configuration_channel = EngineConfigurationChannel() + engine_configuration_channel.set_configuration(engine_configuration) + env: AnimalAIEnvironment = env_factory( + worker_id, [shared_float_properties, engine_configuration_channel] + ) + + def _send_response(cmd_name, payload): + parent_conn.send(EnvironmentResponse(cmd_name, worker_id, payload)) + + def _generate_all_results() -> AllStepResult: + all_step_result: AllStepResult = {} + for brain_name in env.get_agent_groups(): + all_step_result[brain_name] = env.get_step_result(brain_name) + return all_step_result + + def external_brains(): + result = {} + for brain_name in env.get_agent_groups(): + result[brain_name] = group_spec_to_brain_parameters( + brain_name, env.get_agent_group_spec(brain_name) + ) + return result + + try: + while True: + cmd: EnvironmentCommand = parent_conn.recv() + if cmd.name == "step": + all_action_info = cmd.payload + for brain_name, action_info in all_action_info.items(): + if len(action_info.action) != 0: + env.set_actions(brain_name, action_info.action) + env.step() + all_step_result = _generate_all_results() + # The timers in this process are independent from all the processes and the "main" process + # So after we send back the root timer, we can safely clear them. + # Note that we could randomly return timers a fraction of the time if we wanted to reduce + # the data transferred. + # TODO get gauges from the workers and merge them in the main process too. + step_response = StepResponse(all_step_result, get_timer_root()) + step_queue.put(EnvironmentResponse("step", worker_id, step_response)) + reset_timers() + elif cmd.name == "external_brains": + _send_response("external_brains", external_brains()) + elif cmd.name == "get_properties": + reset_params = shared_float_properties.get_property_dict_copy() + _send_response("get_properties", reset_params) + elif cmd.name == "reset": + env.reset(arenas_configurations=cmd.payload) + all_step_result = _generate_all_results() + _send_response("reset", all_step_result) + elif cmd.name == "close": + break + except (KeyboardInterrupt, UnityCommunicationException, UnityTimeOutException): + logger.info(f"UnityEnvironment worker {worker_id}: environment stopping.") + step_queue.put(EnvironmentResponse("env_close", worker_id, None)) + finally: + # If this worker has put an item in the step queue that hasn't been processed by the EnvManager, the process + # will hang until the item is processed. We avoid this behavior by using Queue.cancel_join_thread() + # See https://docs.python.org/3/library/multiprocessing.html#multiprocessing.Queue.cancel_join_thread for + # more info. + logger.debug(f"UnityEnvironment worker {worker_id} closing.") + step_queue.cancel_join_thread() + step_queue.close() + env.close() + logger.debug(f"UnityEnvironment worker {worker_id} done.") + + +class SubprocessEnvManagerAAI(SubprocessEnvManager): + @staticmethod + def create_worker( + worker_id: int, + step_queue: Queue, + env_factory: Callable[[int, List[SideChannel]], BaseEnv], + engine_configuration: EngineConfig, + ) -> UnityEnvWorker: + parent_conn, child_conn = Pipe() + + # Need to use cloudpickle for the env factory function since function objects aren't picklable + # on Windows as of Python 3.6. + pickled_env_factory = cloudpickle.dumps(env_factory) + child_process = Process( + target=worker_aai, + args=( + child_conn, + step_queue, + pickled_env_factory, + worker_id, + engine_configuration, + ), + ) + child_process.start() + return UnityEnvWorker(child_process, worker_id, parent_conn) + + def _reset_env(self, config: Optional[Dict] = None) -> List[EnvironmentStep]: + while any(ew.waiting for ew in self.env_workers): + if not self.step_queue.empty(): + step = self.step_queue.get_nowait() + self.env_workers[step.worker_id].waiting = False + # First enqueue reset commands for all workers so that they reset in parallel + for ew in self.env_workers: + ew.send("reset", config) + # Next (synchronously) collect the reset observations from each worker in sequence + for ew in self.env_workers: + ew.previous_step = EnvironmentStep(ew.recv().payload, ew.worker_id, {}) + return list(map(lambda ew: ew.previous_step, self.env_workers)) diff --git a/animalai_train/animalai_train/trainer_controller_aai.py b/animalai_train/animalai_train/trainer_controller_aai.py new file mode 100644 index 0000000000000000000000000000000000000000..4cc7011684ea4cd118caa65c55eb14b312927b56 --- /dev/null +++ b/animalai_train/animalai_train/trainer_controller_aai.py @@ -0,0 +1,48 @@ +from typing import Optional + +from mlagents.trainers.trainer_controller import TrainerController +from mlagents.trainers.env_manager import EnvManager +from mlagents_envs.timers import timed +from mlagents.trainers.trainer_util import TrainerFactory +from mlagents.trainers.sampler_class import SamplerManager +from animalai_train.meta_curriculum_aai import MetaCurriculumAAI + + +class TrainerControllerAAI(TrainerController): + def __init__( + self, + trainer_factory: TrainerFactory, + model_path: str, + summaries_dir: str, + run_id: str, + save_freq: int, + meta_curriculum: Optional[MetaCurriculumAAI], + train: bool, + training_seed: int, + ): + # we remove the sampler manager as it is irrelevant for AAI + super().__init__( + trainer_factory=trainer_factory, + model_path=model_path, + summaries_dir=summaries_dir, + run_id=run_id, + save_freq=save_freq, + meta_curriculum=meta_curriculum, + train=train, + training_seed=training_seed, + sampler_manager=SamplerManager(reset_param_dict={}), + resampling_interval=None, + ) + + @timed + def _reset_env(self, env: EnvManager) -> None: + """Resets the environment. + + Returns: + A Data structure corresponding to the initial reset state of the + environment. + """ + new_meta_curriculum_config = ( + self.meta_curriculum.get_config() if self.meta_curriculum else None + ) + env.reset(config=new_meta_curriculum_config) diff --git a/animalai_train/setup.py b/animalai_train/setup.py new file mode 100644 index 0000000000000000000000000000000000000000..5b8360a7905d93c260eed1b9745dffc38636c6d5 --- /dev/null +++ b/animalai_train/setup.py @@ -0,0 +1,20 @@ +from setuptools import setup + +setup( + name="animalai_train", + version="2.0.0b0", + 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"], # Required + zip_safe=False, + install_requires=["animalai==2.0.0b0", "mlagents==0.15.0"], + python_requires=">=3.5,<3.8", +) diff --git a/competition_configurations/1-1-1.yml b/competition_configurations/1-1-1.yml index b4994a6ededd5702e2bf982ea44681b49c0017d0..0592c66a7a6a733778f08945cb1db150280a68cc 100644 --- a/competition_configurations/1-1-1.yml +++ b/competition_configurations/1-1-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-1-2.yml b/competition_configurations/1-1-2.yml index 8ed4a17f1f6a6c33a8b5541b160b46cb1e01a874..181ceee991c9e39c55440e289163ca3f4a4c1fb7 100644 --- a/competition_configurations/1-1-2.yml +++ b/competition_configurations/1-1-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-1-3.yml b/competition_configurations/1-1-3.yml index 76c9d0358634bfcba47de10fd9c8eaa263432c24..655f6daa508b89c7cb840d3e0b06b94e624356bf 100644 --- a/competition_configurations/1-1-3.yml +++ b/competition_configurations/1-1-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-10-1.yml b/competition_configurations/1-10-1.yml index 1f1041ef304347ace65a241eb43ff078a8ad174a..0fed265931605b818509b05e52895e510267a7ab 100644 --- a/competition_configurations/1-10-1.yml +++ b/competition_configurations/1-10-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 250 items: - !Item diff --git a/competition_configurations/1-10-2.yml b/competition_configurations/1-10-2.yml index 3bde522b372e6fedead95e2d6295231cf75804a5..6ffb17a79a0904aea57f3f46c09342142171b63d 100644 --- a/competition_configurations/1-10-2.yml +++ b/competition_configurations/1-10-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 250 items: - !Item diff --git a/competition_configurations/1-10-3.yml b/competition_configurations/1-10-3.yml index 3e383126d19c88bad079c976ee9a43bbdc3d9fec..1dcd7545b64edeb081a424a64ba9f513e8e9e109 100644 --- a/competition_configurations/1-10-3.yml +++ b/competition_configurations/1-10-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 250 items: - !Item diff --git a/competition_configurations/1-11-1.yml b/competition_configurations/1-11-1.yml index 4dab9759f7db7c00562acb29022076a790deda31..3cb32788ef131815ad62f666486b6c21d40b8b2f 100644 --- a/competition_configurations/1-11-1.yml +++ b/competition_configurations/1-11-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.5 t: 250 items: - !Item diff --git a/competition_configurations/1-11-2.yml b/competition_configurations/1-11-2.yml index 7207e4cabc6f3470b9951e158c335531e1934ee4..8573db837b80d04658f8148f268527df8da6a1ad 100644 --- a/competition_configurations/1-11-2.yml +++ b/competition_configurations/1-11-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.5 t: 250 items: - !Item diff --git a/competition_configurations/1-11-3.yml b/competition_configurations/1-11-3.yml index cd5263542887a940606ecef691905fb9bc6c8586..bc92f714e640929108871a9ca3c1ca4595de9559 100644 --- a/competition_configurations/1-11-3.yml +++ b/competition_configurations/1-11-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.5 t: 250 items: - !Item diff --git a/competition_configurations/1-12-1.yml b/competition_configurations/1-12-1.yml index dbc7bee60c9b1bbfc9c99edbf77dfc29ec9c9db6..10c7979ced47bc2f5a7a826cc8caac51f1c31c79 100644 --- a/competition_configurations/1-12-1.yml +++ b/competition_configurations/1-12-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 250 items: - !Item diff --git a/competition_configurations/1-12-2.yml b/competition_configurations/1-12-2.yml index 05244ba6c96cf0c05c44bb036333ae22dd839b34..d1dec7143e46328de04a4f9a7d64122a086b53e6 100644 --- a/competition_configurations/1-12-2.yml +++ b/competition_configurations/1-12-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 250 items: - !Item diff --git a/competition_configurations/1-12-3.yml b/competition_configurations/1-12-3.yml index 1b0f24920ab76e5bd5a979451935435d1667a177..783327f7eabc1cd30358ef4f44420a87f5138c00 100644 --- a/competition_configurations/1-12-3.yml +++ b/competition_configurations/1-12-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 250 items: - !Item diff --git a/competition_configurations/1-13-1.yml b/competition_configurations/1-13-1.yml index d9debcd683e941255bb42aab50a23b8dc2c15ac2..0f560954d5de06fc62babdb701ab169000d23163 100644 --- a/competition_configurations/1-13-1.yml +++ b/competition_configurations/1-13-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-13-2.yml b/competition_configurations/1-13-2.yml index aee7ae83f22a873ac37450bcfd0b09798c0071fd..60a0c39e45e574d520467d279ef0c217b4f44ad8 100644 --- a/competition_configurations/1-13-2.yml +++ b/competition_configurations/1-13-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-13-3.yml b/competition_configurations/1-13-3.yml index 31a42e00ec7d0cdd78718fba74ebf6c686e70dd1..b82e84ba2ef62ab2c1b5da80259d41c5c51127e1 100644 --- a/competition_configurations/1-13-3.yml +++ b/competition_configurations/1-13-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-14-1.yml b/competition_configurations/1-14-1.yml index e796640a106d33c1b773a771f72d1b6088567c0a..bc22456d2490f3654ff3abbde802ceb0730f82a8 100644 --- a/competition_configurations/1-14-1.yml +++ b/competition_configurations/1-14-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.5 t: 250 items: - !Item diff --git a/competition_configurations/1-14-2.yml b/competition_configurations/1-14-2.yml index f1d77975cc9252992d0bca9267b67ef23e46a582..e8fb1a78ae797052324c9e8ea0a8a153599b9b3a 100644 --- a/competition_configurations/1-14-2.yml +++ b/competition_configurations/1-14-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.5 t: 250 items: - !Item diff --git a/competition_configurations/1-14-3.yml b/competition_configurations/1-14-3.yml index f5f475c206dbdef920b6752f0e2781f0be824bbb..fbe69cd80f117930596c5117661c9a4f76ae4bbc 100644 --- a/competition_configurations/1-14-3.yml +++ b/competition_configurations/1-14-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.5 t: 250 items: - !Item diff --git a/competition_configurations/1-15-1.yml b/competition_configurations/1-15-1.yml index a4d8448b926d275f9675a497b577dc6d85f90849..f7ef633a76eefa2dd905da1f51c9011c476fd94f 100644 --- a/competition_configurations/1-15-1.yml +++ b/competition_configurations/1-15-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-15-2.yml b/competition_configurations/1-15-2.yml index da23375a9d6cb0cc62e2c0dc2a58ef6b8aaed2c2..afbc10baf6721a5c908a09a7718295d75b93eb53 100644 --- a/competition_configurations/1-15-2.yml +++ b/competition_configurations/1-15-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-15-3.yml b/competition_configurations/1-15-3.yml index 0009aaceff116cb84adf8a5c60306a1fe3607495..53ce9049e462ca821bd4ca5d0c06a89c74a569a9 100644 --- a/competition_configurations/1-15-3.yml +++ b/competition_configurations/1-15-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-16-1.yml b/competition_configurations/1-16-1.yml index 9b13b280b7e83887c3099783f02ae990fc6a144c..35dc823eeb16d22522493b5a6c809cb5c47a54e4 100644 --- a/competition_configurations/1-16-1.yml +++ b/competition_configurations/1-16-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.5 t: 250 items: - !Item diff --git a/competition_configurations/1-16-2.yml b/competition_configurations/1-16-2.yml index 51f0dc81ab5fe056e0309d9d7b51656bef09fb5f..3cecc650433010c47a22d317436ba48357bf4353 100644 --- a/competition_configurations/1-16-2.yml +++ b/competition_configurations/1-16-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.5 t: 250 items: - !Item diff --git a/competition_configurations/1-16-3.yml b/competition_configurations/1-16-3.yml index b699eeab6086f1cf93764804f6562d883a40769d..9603e1cacac067d47a5c3286fe1d03f79a7ad50d 100644 --- a/competition_configurations/1-16-3.yml +++ b/competition_configurations/1-16-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.5 t: 250 items: - !Item diff --git a/competition_configurations/1-17-1.yml b/competition_configurations/1-17-1.yml index 57c6d4fbd069c45dffafcfaca58b96e645c5d014..7db4a6e27a0d27ecfa4be1cfe418c35b7535159e 100644 --- a/competition_configurations/1-17-1.yml +++ b/competition_configurations/1-17-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.5 t: 250 items: - !Item diff --git a/competition_configurations/1-17-2.yml b/competition_configurations/1-17-2.yml index 1950e7a06dad0337a9b22796bebec9a501564d46..e5db0562589bb4ace8f85524f7555a56475f15dd 100644 --- a/competition_configurations/1-17-2.yml +++ b/competition_configurations/1-17-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.5 t: 250 items: - !Item diff --git a/competition_configurations/1-17-3.yml b/competition_configurations/1-17-3.yml index 9310a86ccffcc593c3a5269d07693806b3638127..1c16808d627b380877374405ffd11e36629ed39d 100644 --- a/competition_configurations/1-17-3.yml +++ b/competition_configurations/1-17-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.5 t: 250 items: - !Item diff --git a/competition_configurations/1-18-1.yml b/competition_configurations/1-18-1.yml index c91312dcb58085b3cd2230445278c80be0ad2cc3..5c92507170efb9e82b90ed3fe467e5f3844765d2 100644 --- a/competition_configurations/1-18-1.yml +++ b/competition_configurations/1-18-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-18-2.yml b/competition_configurations/1-18-2.yml index bcd718ca050c2d9ee66f5aa16d857c8d481e7472..d160942447742fbed87bd2a082669c4c3b86db98 100644 --- a/competition_configurations/1-18-2.yml +++ b/competition_configurations/1-18-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-18-3.yml b/competition_configurations/1-18-3.yml index 080e28e4e6204172440f91a5f0643280f698199d..f9493dd3a5d3ed1360c00435abb0f91f3dccd8d0 100644 --- a/competition_configurations/1-18-3.yml +++ b/competition_configurations/1-18-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-19-1.yml b/competition_configurations/1-19-1.yml index 9ebad042cd04fb400ccd3c273d5a96a96b3c76c0..f0ef2543241c23613187f3cbb18dda74baf9a432 100644 --- a/competition_configurations/1-19-1.yml +++ b/competition_configurations/1-19-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-19-2.yml b/competition_configurations/1-19-2.yml index b7c564ca3109d1266c70af593510a50248fe641d..e5f8fcd8f3bba4abac20ff0d8fa1d7c46f7f8ed5 100644 --- a/competition_configurations/1-19-2.yml +++ b/competition_configurations/1-19-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-19-3.yml b/competition_configurations/1-19-3.yml index 5a58755145eae84d4efd931cd5861b9313d599c8..4ddfda77f68c6e5bfe70ae217f3782c36601e3de 100644 --- a/competition_configurations/1-19-3.yml +++ b/competition_configurations/1-19-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-2-1.yml b/competition_configurations/1-2-1.yml index b9b2460fb832adf2649efbc5c3cdc3199deb7b9c..9219d03f20c9a22b1ea827278cd8a5b70b14d6d8 100644 --- a/competition_configurations/1-2-1.yml +++ b/competition_configurations/1-2-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-2-2.yml b/competition_configurations/1-2-2.yml index 5ffcfcc5740817f7b1eaba545d1a90c8f152ebdc..e576dd505645d8dcebc53c93e89cb162fe7e0d4e 100644 --- a/competition_configurations/1-2-2.yml +++ b/competition_configurations/1-2-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-2-3.yml b/competition_configurations/1-2-3.yml index d2ac0c3104b7a98addf0069f9441b8de61c745a3..b27f2018e260f280d1396dd2607d60c2c51bbc05 100644 --- a/competition_configurations/1-2-3.yml +++ b/competition_configurations/1-2-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-20-1.yml b/competition_configurations/1-20-1.yml index ee424dd8631d317c2a39d9d4ff8d9e85e67f86b7..60c33f935f53e0816a8c206b1d2dc7b9a23bdad1 100644 --- a/competition_configurations/1-20-1.yml +++ b/competition_configurations/1-20-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 250 items: - !Item diff --git a/competition_configurations/1-20-2.yml b/competition_configurations/1-20-2.yml index ee424dd8631d317c2a39d9d4ff8d9e85e67f86b7..60c33f935f53e0816a8c206b1d2dc7b9a23bdad1 100644 --- a/competition_configurations/1-20-2.yml +++ b/competition_configurations/1-20-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 250 items: - !Item diff --git a/competition_configurations/1-20-3.yml b/competition_configurations/1-20-3.yml index ee424dd8631d317c2a39d9d4ff8d9e85e67f86b7..60c33f935f53e0816a8c206b1d2dc7b9a23bdad1 100644 --- a/competition_configurations/1-20-3.yml +++ b/competition_configurations/1-20-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 250 items: - !Item diff --git a/competition_configurations/1-21-1.yml b/competition_configurations/1-21-1.yml index 12bd903f53bd5e03312eb69ed7a7daae72da4c08..4c5891c7816c7c1ca5f64083d0e2867927979d6b 100644 --- a/competition_configurations/1-21-1.yml +++ b/competition_configurations/1-21-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 9 t: 500 items: - !Item diff --git a/competition_configurations/1-21-2.yml b/competition_configurations/1-21-2.yml index 12bd903f53bd5e03312eb69ed7a7daae72da4c08..4c5891c7816c7c1ca5f64083d0e2867927979d6b 100644 --- a/competition_configurations/1-21-2.yml +++ b/competition_configurations/1-21-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 9 t: 500 items: - !Item diff --git a/competition_configurations/1-21-3.yml b/competition_configurations/1-21-3.yml index 12bd903f53bd5e03312eb69ed7a7daae72da4c08..4c5891c7816c7c1ca5f64083d0e2867927979d6b 100644 --- a/competition_configurations/1-21-3.yml +++ b/competition_configurations/1-21-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 9 t: 500 items: - !Item diff --git a/competition_configurations/1-22-1.yml b/competition_configurations/1-22-1.yml index cf2764198fa45dc841211525b4258df713c2625a..7327f72dc2f0274ce12a471b60609009823c6325 100644 --- a/competition_configurations/1-22-1.yml +++ b/competition_configurations/1-22-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 39 t: 1000 items: - !Item diff --git a/competition_configurations/1-22-2.yml b/competition_configurations/1-22-2.yml index cf2764198fa45dc841211525b4258df713c2625a..7327f72dc2f0274ce12a471b60609009823c6325 100644 --- a/competition_configurations/1-22-2.yml +++ b/competition_configurations/1-22-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 39 t: 1000 items: - !Item diff --git a/competition_configurations/1-22-3.yml b/competition_configurations/1-22-3.yml index cf2764198fa45dc841211525b4258df713c2625a..7327f72dc2f0274ce12a471b60609009823c6325 100644 --- a/competition_configurations/1-22-3.yml +++ b/competition_configurations/1-22-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 39 t: 1000 items: - !Item diff --git a/competition_configurations/1-23-1.yml b/competition_configurations/1-23-1.yml index c46436001b444cc40442132ae6b8f6235d898360..70cc3b06e8ed766acc6afef16bbbceca45a2fffe 100644 --- a/competition_configurations/1-23-1.yml +++ b/competition_configurations/1-23-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 9 t: 500 items: - !Item diff --git a/competition_configurations/1-23-2.yml b/competition_configurations/1-23-2.yml index c46436001b444cc40442132ae6b8f6235d898360..70cc3b06e8ed766acc6afef16bbbceca45a2fffe 100644 --- a/competition_configurations/1-23-2.yml +++ b/competition_configurations/1-23-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 9 t: 500 items: - !Item diff --git a/competition_configurations/1-23-3.yml b/competition_configurations/1-23-3.yml index c46436001b444cc40442132ae6b8f6235d898360..70cc3b06e8ed766acc6afef16bbbceca45a2fffe 100644 --- a/competition_configurations/1-23-3.yml +++ b/competition_configurations/1-23-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 9 t: 500 items: - !Item diff --git a/competition_configurations/1-24-1.yml b/competition_configurations/1-24-1.yml index 85ecfa809860416b7343e4c98e0cf7c4c614c52f..bc9c6e3f955abef9b9d161ea91f0b15f0e643d1c 100644 --- a/competition_configurations/1-24-1.yml +++ b/competition_configurations/1-24-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -1.05 t: 250 items: - !Item diff --git a/competition_configurations/1-24-2.yml b/competition_configurations/1-24-2.yml index 2825e88066184c53ace400fcc2f2d2623664a393..dcb4a77289fdae790cd8948142d7ed34621597d7 100644 --- a/competition_configurations/1-24-2.yml +++ b/competition_configurations/1-24-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -1.05 t: 250 items: - !Item diff --git a/competition_configurations/1-24-3.yml b/competition_configurations/1-24-3.yml index 546034ae6e87fd9d9b5a34a7e210aefd48e516d4..ace1bac0c5ae28ec86c733e389d1b582f4bb5f19 100644 --- a/competition_configurations/1-24-3.yml +++ b/competition_configurations/1-24-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -1.05 t: 250 items: - !Item diff --git a/competition_configurations/1-25-1.yml b/competition_configurations/1-25-1.yml index ef83c5e2f502cdae6c22c6350703e381e9cc5993..dcd940476b44fa76719d67b6edbe798356604772 100644 --- a/competition_configurations/1-25-1.yml +++ b/competition_configurations/1-25-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-25-2.yml b/competition_configurations/1-25-2.yml index 681967c7ff099570235ee90f2db1b94b90e6767a..cbbb926a6ded3fa70edb8aee1ce233b06bfddd4e 100644 --- a/competition_configurations/1-25-2.yml +++ b/competition_configurations/1-25-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-25-3.yml b/competition_configurations/1-25-3.yml index 959447ea83eaba6cb9555c3e3574b804e42fe081..b896ad33a2f32d6e6ac86ffdf63a79ae69afeb4b 100644 --- a/competition_configurations/1-25-3.yml +++ b/competition_configurations/1-25-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-26-1.yml b/competition_configurations/1-26-1.yml index 9605ef2f52d6f3a6acc6973d43171b56401059f3..aa2c515e9fc67f0546636e668a3211c3d9d534f3 100644 --- a/competition_configurations/1-26-1.yml +++ b/competition_configurations/1-26-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-26-2.yml b/competition_configurations/1-26-2.yml index d961a18c5e1064df685ff81f450046d8798408e9..1dda959aa210eee5af2aa5a5bdac8e57d3f3848d 100644 --- a/competition_configurations/1-26-2.yml +++ b/competition_configurations/1-26-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-26-3.yml b/competition_configurations/1-26-3.yml index 4aa86cf005f220547b2d5d850c2e65e1bb72ea14..340e6dc96d40bcc88fab994c70c748948618f9f3 100644 --- a/competition_configurations/1-26-3.yml +++ b/competition_configurations/1-26-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-27-1.yml b/competition_configurations/1-27-1.yml index 785a3b8cf22cd65c61ed2ff4509c17e646b9dbcc..bce8a0b4cc335474cca477c38e92745edbf2e67d 100644 --- a/competition_configurations/1-27-1.yml +++ b/competition_configurations/1-27-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/1-27-2.yml b/competition_configurations/1-27-2.yml index a7eec5ca560fe09242c75cea2464ff9e9a9c0eed..ac36fb085e02a4ca88d7f315aecca53974e5e0a5 100644 --- a/competition_configurations/1-27-2.yml +++ b/competition_configurations/1-27-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/1-27-3.yml b/competition_configurations/1-27-3.yml index 1cbedf4600f00d0b494ff56545a7ed3e36650ca9..cbdd17b4e262174e864a78f79ccc4e9228916b9e 100644 --- a/competition_configurations/1-27-3.yml +++ b/competition_configurations/1-27-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/1-28-1.yml b/competition_configurations/1-28-1.yml index 9eeb8196d38d6010409dd36db1102bb9a4a4beca..1096c94c17897aa4a65190a21192754488950156 100644 --- a/competition_configurations/1-28-1.yml +++ b/competition_configurations/1-28-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 items: - !Item diff --git a/competition_configurations/1-28-2.yml b/competition_configurations/1-28-2.yml index af4092714e57c115640c073e27503d2e4076046b..971609940c663e77f7e96ff03909366e6193e027 100644 --- a/competition_configurations/1-28-2.yml +++ b/competition_configurations/1-28-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 items: - !Item diff --git a/competition_configurations/1-28-3.yml b/competition_configurations/1-28-3.yml index af4092714e57c115640c073e27503d2e4076046b..971609940c663e77f7e96ff03909366e6193e027 100644 --- a/competition_configurations/1-28-3.yml +++ b/competition_configurations/1-28-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 items: - !Item diff --git a/competition_configurations/1-29-1.yml b/competition_configurations/1-29-1.yml index ff15f2b0aeaff836cfc50ae37625dfba22ef00dc..16fc9d03f2407f545aa6f7c44229b3f353f62b9a 100644 --- a/competition_configurations/1-29-1.yml +++ b/competition_configurations/1-29-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 items: - !Item diff --git a/competition_configurations/1-29-2.yml b/competition_configurations/1-29-2.yml index ff15f2b0aeaff836cfc50ae37625dfba22ef00dc..16fc9d03f2407f545aa6f7c44229b3f353f62b9a 100644 --- a/competition_configurations/1-29-2.yml +++ b/competition_configurations/1-29-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 items: - !Item diff --git a/competition_configurations/1-29-3.yml b/competition_configurations/1-29-3.yml index ff15f2b0aeaff836cfc50ae37625dfba22ef00dc..16fc9d03f2407f545aa6f7c44229b3f353f62b9a 100644 --- a/competition_configurations/1-29-3.yml +++ b/competition_configurations/1-29-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 items: - !Item diff --git a/competition_configurations/1-3-1.yml b/competition_configurations/1-3-1.yml index cc3e9210f8a7dc0c8bea3afa4db11993fc3dc02b..f13a9885293ad0e6180350fe176a09c9a4f879ac 100644 --- a/competition_configurations/1-3-1.yml +++ b/competition_configurations/1-3-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-3-2.yml b/competition_configurations/1-3-2.yml index 6ba4c66987b73b994892ac3d8c93b5911f5a4503..2d11410615902dad9e15d0630b38bc2ee8863f8e 100644 --- a/competition_configurations/1-3-2.yml +++ b/competition_configurations/1-3-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-3-3.yml b/competition_configurations/1-3-3.yml index fb8edce57e7265eb516727d4523f9fdf372a81ff..96f6a2038a3e4d716ffa1e986b13079d1fd196cc 100644 --- a/competition_configurations/1-3-3.yml +++ b/competition_configurations/1-3-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-30-1.yml b/competition_configurations/1-30-1.yml index ec016e59ec4c3599835a49edfb88c0997b7fe583..7413763efa21c1fdcf9e5d3eb88b94ee8b83911b 100644 --- a/competition_configurations/1-30-1.yml +++ b/competition_configurations/1-30-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 1000 items: - !Item diff --git a/competition_configurations/1-30-2.yml b/competition_configurations/1-30-2.yml index eefebee73f9b62c4675d1bf2dbb319bae6238800..b5e742dceddd0675ab710495b805bc792edade0a 100644 --- a/competition_configurations/1-30-2.yml +++ b/competition_configurations/1-30-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 7 t: 1000 items: - !Item diff --git a/competition_configurations/1-30-3.yml b/competition_configurations/1-30-3.yml index b6e5f3e0473856665fd482b9c3e127560db85936..ace01c9b5c8cccbc4536326a718479593fa00dff 100644 --- a/competition_configurations/1-30-3.yml +++ b/competition_configurations/1-30-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 10 t: 1000 items: - !Item diff --git a/competition_configurations/1-4-1.yml b/competition_configurations/1-4-1.yml index 50ed5fcd23108867562c0c91c89a136c89d555d0..d95060e3252581c61479d35368cca36e38a7c63d 100644 --- a/competition_configurations/1-4-1.yml +++ b/competition_configurations/1-4-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-4-2.yml b/competition_configurations/1-4-2.yml index 017ad6406a362bc2b3d82b9adc8be6d9f876c140..d386813b822ef8cf96da7ac72a35d153c0ba91f9 100644 --- a/competition_configurations/1-4-2.yml +++ b/competition_configurations/1-4-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-4-3.yml b/competition_configurations/1-4-3.yml index 27e2abb92ce850fd0c133f4bdf2e9e68183a2e2a..5566748c3a77a7b195fa8e520c5498286627a793 100644 --- a/competition_configurations/1-4-3.yml +++ b/competition_configurations/1-4-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-5-1.yml b/competition_configurations/1-5-1.yml index 53b61f14b698182db759d711743d4aaa74aa2fe8..87ddf418e5c95af60d7a99970d4ff976be778050 100644 --- a/competition_configurations/1-5-1.yml +++ b/competition_configurations/1-5-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-5-2.yml b/competition_configurations/1-5-2.yml index 71a006f3ed1434aa18aea99459ab5aa9b328991b..50bf422335110ee68376a0ed05f87b39f92fbbbb 100644 --- a/competition_configurations/1-5-2.yml +++ b/competition_configurations/1-5-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-5-3.yml b/competition_configurations/1-5-3.yml index 4d8410efaaf73c9fa73ebb32d702116e0f2dfa03..bcdada099b97b6b1e009f4b47263a545160e49ca 100644 --- a/competition_configurations/1-5-3.yml +++ b/competition_configurations/1-5-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-6-1.yml b/competition_configurations/1-6-1.yml index 5e7c1811e2072475cf349b2067261803f9ddbde5..d90d95b8a9c8741196872de0f217bb10c3546681 100644 --- a/competition_configurations/1-6-1.yml +++ b/competition_configurations/1-6-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 250 items: - !Item diff --git a/competition_configurations/1-6-2.yml b/competition_configurations/1-6-2.yml index 7511a11769ce0629709f3c472d970c6b3589a39d..c05ac08b85e37d25a596932a2017da36b89ec4be 100644 --- a/competition_configurations/1-6-2.yml +++ b/competition_configurations/1-6-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 250 items: - !Item diff --git a/competition_configurations/1-6-3.yml b/competition_configurations/1-6-3.yml index 4625b7e8a30ce729f2d4567e12c7023e8a904454..cd37f85b2ebad810f7963abfa81eaa4086c898b4 100644 --- a/competition_configurations/1-6-3.yml +++ b/competition_configurations/1-6-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 250 items: - !Item diff --git a/competition_configurations/1-7-1.yml b/competition_configurations/1-7-1.yml index d259411b36c443a5609f5e44bb85a1b1412754fa..fd1d7a4986f6a04c30fd5d8d29c1ab9d019ce4d4 100644 --- a/competition_configurations/1-7-1.yml +++ b/competition_configurations/1-7-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 250 items: - !Item diff --git a/competition_configurations/1-7-2.yml b/competition_configurations/1-7-2.yml index 24765d9e54dbfde246b6f43a976d6dcc962f39e4..fe26402ece4bd495e01b1f48151548046428ba0d 100644 --- a/competition_configurations/1-7-2.yml +++ b/competition_configurations/1-7-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 250 items: - !Item diff --git a/competition_configurations/1-7-3.yml b/competition_configurations/1-7-3.yml index 9c33e4929a6d6997c400ebae57199b350a18aaf3..3477ed25cc9ae18cc60d8489fdb737b4f97b1282 100644 --- a/competition_configurations/1-7-3.yml +++ b/competition_configurations/1-7-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 250 items: - !Item diff --git a/competition_configurations/1-8-1.yml b/competition_configurations/1-8-1.yml index 1f287fe1d6ee6761d407d80e8e9366a2b975312f..f42c522ad5f32138716ec7421e4de97c8d76efb2 100644 --- a/competition_configurations/1-8-1.yml +++ b/competition_configurations/1-8-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.5 t: 250 items: - !Item diff --git a/competition_configurations/1-8-2.yml b/competition_configurations/1-8-2.yml index 44267100d58ab1c2df2bf7dbd7c9cafa5ba0fd07..672ce91acb2fada6a960a4715c0fcbf85bd7c328 100644 --- a/competition_configurations/1-8-2.yml +++ b/competition_configurations/1-8-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.5 t: 250 items: - !Item diff --git a/competition_configurations/1-8-3.yml b/competition_configurations/1-8-3.yml index 31c6027d87a0c85e17c9d1f06220d06d5860cd12..26fd55dd85a030c9c76402d589e529591d6ccb54 100644 --- a/competition_configurations/1-8-3.yml +++ b/competition_configurations/1-8-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.5 t: 250 items: - !Item diff --git a/competition_configurations/1-9-1.yml b/competition_configurations/1-9-1.yml index 58369b922c67fa275b3b638039cdfa30a8fae138..aea2e1c86cb0dac1163699eb684e42b8d5249d2f 100644 --- a/competition_configurations/1-9-1.yml +++ b/competition_configurations/1-9-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-9-2.yml b/competition_configurations/1-9-2.yml index a9613246543075b8cf939671d6c8b3883b2524fd..7fa8cf37d2c402a9be3083825fc668462dac2e4a 100644 --- a/competition_configurations/1-9-2.yml +++ b/competition_configurations/1-9-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/1-9-3.yml b/competition_configurations/1-9-3.yml index a74c3fc9a7bf85209c7f871e9355dc74f6f70be4..ac5c893f8431ac7f5fe9836b0779b113d57c5650 100644 --- a/competition_configurations/1-9-3.yml +++ b/competition_configurations/1-9-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/10-1-1.yml b/competition_configurations/10-1-1.yml index fbd7f26d2d19c14c5163ee60c1ab38d40dec63a0..6e85ffb154ac5539fea1d1b4969ec9c659637785 100644 --- a/competition_configurations/10-1-1.yml +++ b/competition_configurations/10-1-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-1-2.yml b/competition_configurations/10-1-2.yml index 2efa1ee33182fd5455f2f6bb57359249dca0f4f0..4830b8afade989765cc07350e22556c09772ef3e 100644 --- a/competition_configurations/10-1-2.yml +++ b/competition_configurations/10-1-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-1-3.yml b/competition_configurations/10-1-3.yml index 2efa1ee33182fd5455f2f6bb57359249dca0f4f0..4830b8afade989765cc07350e22556c09772ef3e 100644 --- a/competition_configurations/10-1-3.yml +++ b/competition_configurations/10-1-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-10-1.yml b/competition_configurations/10-10-1.yml index 5d4b7b0b4ff01d300e31fb6f1c94036b04db7446..ba107bec2e786b9070f7404cb290f8733082fb43 100644 --- a/competition_configurations/10-10-1.yml +++ b/competition_configurations/10-10-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-10-2.yml b/competition_configurations/10-10-2.yml index 53b343272042626fed81a2fa20a7f432857a9a44..aa7243d2fa038ec698bc66e02f6381ea061993ba 100644 --- a/competition_configurations/10-10-2.yml +++ b/competition_configurations/10-10-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-10-3.yml b/competition_configurations/10-10-3.yml index 63adaa95ee15c72fddc51de9bcaa31bea27635b5..64a5c219d2a438b4b8bd1634d9339a0e451c435a 100644 --- a/competition_configurations/10-10-3.yml +++ b/competition_configurations/10-10-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-11-1.yml b/competition_configurations/10-11-1.yml index 6b627853f39f81f11530ee3bdd23f3f84412ed35..b563d872b3d035d54cfdc144293ffc545382e13e 100644 --- a/competition_configurations/10-11-1.yml +++ b/competition_configurations/10-11-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-11-2.yml b/competition_configurations/10-11-2.yml index 302da05dd4d6807e0c1611cee26e0b7442c42ae3..2e26affdd46dc2dcf1226a7102b3713a99dadb60 100644 --- a/competition_configurations/10-11-2.yml +++ b/competition_configurations/10-11-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-11-3.yml b/competition_configurations/10-11-3.yml index 62efc7e84ca069a271e4beffe5627f9b9a77993f..b568d5bc1416202a6dacbe05af1c6771a39ecac2 100644 --- a/competition_configurations/10-11-3.yml +++ b/competition_configurations/10-11-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-12-1.yml b/competition_configurations/10-12-1.yml index 8143bb2d158d0859b613197defde4c941eadaa6b..e91a9490de621d6b9b8dc6e339f2312545cd9d94 100644 --- a/competition_configurations/10-12-1.yml +++ b/competition_configurations/10-12-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-12-2.yml b/competition_configurations/10-12-2.yml index 44bc34b4aa5b2a37deb5e0028dc7c04d36bf2136..49ce39adefd728c1b23774cf5712fab7bfdb0a3a 100644 --- a/competition_configurations/10-12-2.yml +++ b/competition_configurations/10-12-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-12-3.yml b/competition_configurations/10-12-3.yml index a20c04d63be39f83e87f6030e9f542d4e09a2c09..b81b148cb70c9520bf1db8d871215a54c8ea8115 100644 --- a/competition_configurations/10-12-3.yml +++ b/competition_configurations/10-12-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-13-1.yml b/competition_configurations/10-13-1.yml index e026548648665e41cb3426cca1dd3ce51fda21eb..11ba6c1b60d80f19f17f3d6c8e08ce0ce8234bbf 100644 --- a/competition_configurations/10-13-1.yml +++ b/competition_configurations/10-13-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-13-2.yml b/competition_configurations/10-13-2.yml index 76b2bb2e785f5f7e3c27c71f1eb3072628fd3512..e2a833df747bb75e3784250c4c29ce96923a35dc 100644 --- a/competition_configurations/10-13-2.yml +++ b/competition_configurations/10-13-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-13-3.yml b/competition_configurations/10-13-3.yml index b7941290e45a33d1df962ca9e956a5eed65629d0..ddd4962722134adb26024895b0196d8f4a4f189b 100644 --- a/competition_configurations/10-13-3.yml +++ b/competition_configurations/10-13-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-14-1.yml b/competition_configurations/10-14-1.yml index ee2aabcca3ccbc759640246cc7ea883320b861a3..36413ddb76853721af49c8d915ce13f88ac03526 100644 --- a/competition_configurations/10-14-1.yml +++ b/competition_configurations/10-14-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-14-2.yml b/competition_configurations/10-14-2.yml index 7693da6639ba582d3def71ae07af17880ade6afb..06a46cb8ff99a705479a810006b0806199f90b9b 100644 --- a/competition_configurations/10-14-2.yml +++ b/competition_configurations/10-14-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-14-3.yml b/competition_configurations/10-14-3.yml index 462172e67de1983288b8fcbc977af96a59a5ff33..6db14c45e2807b5cf9f6536964359e7efd000a6b 100644 --- a/competition_configurations/10-14-3.yml +++ b/competition_configurations/10-14-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-15-1.yml b/competition_configurations/10-15-1.yml index 5547090a36bb7d314a8359b99447cd2275a914fc..b6c4f9ceadbeb9e27389590b24ab6ed6e4f5ac24 100644 --- a/competition_configurations/10-15-1.yml +++ b/competition_configurations/10-15-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-15-2.yml b/competition_configurations/10-15-2.yml index 297cadeffbc4c7c5473068542ba497e4d850cf12..7c78dd42ee102b26b34cd2ab3f3008638557f8f8 100644 --- a/competition_configurations/10-15-2.yml +++ b/competition_configurations/10-15-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-15-3.yml b/competition_configurations/10-15-3.yml index 42422326beea57b7907ac4784d4ca9b653e088da..efc99e008b2170a110c3d9fa8eb8108e1c512225 100644 --- a/competition_configurations/10-15-3.yml +++ b/competition_configurations/10-15-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-16-1.yml b/competition_configurations/10-16-1.yml index b947f4632486c572aa2bf6f0c7862a6d2e407920..3e0b52ae1f3314408477dcc0c3107283f9709e5a 100644 --- a/competition_configurations/10-16-1.yml +++ b/competition_configurations/10-16-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-16-2.yml b/competition_configurations/10-16-2.yml index 52692dcdb1f054fe60d17e35065dccbff04a9947..fc00fd99a1c14730b0688200d8a0499ac3020f75 100644 --- a/competition_configurations/10-16-2.yml +++ b/competition_configurations/10-16-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-16-3.yml b/competition_configurations/10-16-3.yml index 458b3c4326e1d3715b86fb6d9ac2659533767eb1..5663c14fd1eacb2e5b9d06f5910861efbe94cca8 100644 --- a/competition_configurations/10-16-3.yml +++ b/competition_configurations/10-16-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-17-1.yml b/competition_configurations/10-17-1.yml index d3efcb73b71c53ab177b6fd7206d58424ac10ba9..164a89ac2757f2482d0a1dd1f5643e8ed24c1311 100644 --- a/competition_configurations/10-17-1.yml +++ b/competition_configurations/10-17-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-17-2.yml b/competition_configurations/10-17-2.yml index 7965a88f27a04c75e661d9460884732d2a3e2314..60596029fd29218be33a9a5686e45f74d5cfac0e 100644 --- a/competition_configurations/10-17-2.yml +++ b/competition_configurations/10-17-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-17-3.yml b/competition_configurations/10-17-3.yml index 26b148ef2bb4a28bb0ce0e1d8d2885195649b966..c8b3ad1fb8447a56794612143406c4bb2d2c403e 100644 --- a/competition_configurations/10-17-3.yml +++ b/competition_configurations/10-17-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-18-1.yml b/competition_configurations/10-18-1.yml index ae9e5659b73df2da7eb978b08c869de3bf3ae5e0..92b7272fd012aebcb139a965640415cfa213ea63 100644 --- a/competition_configurations/10-18-1.yml +++ b/competition_configurations/10-18-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-18-2.yml b/competition_configurations/10-18-2.yml index 41edfcd4b0533f4166c16f8550e45fb061f14e5a..0517e8d878f6b3c43d88ca57d363c85bfdf9a3bc 100644 --- a/competition_configurations/10-18-2.yml +++ b/competition_configurations/10-18-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-18-3.yml b/competition_configurations/10-18-3.yml index c844a2a8f2d49036c8e4390e8997fa3abba7b77e..168f921c29338bbea08b8227e99517f0c53688fb 100644 --- a/competition_configurations/10-18-3.yml +++ b/competition_configurations/10-18-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-19-1.yml b/competition_configurations/10-19-1.yml index 8c8c9162eee2695a6aae5aad3b555d78bdd291e1..b9569beff0bf1b388e550ea75acda2f9c3a986c1 100644 --- a/competition_configurations/10-19-1.yml +++ b/competition_configurations/10-19-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-19-2.yml b/competition_configurations/10-19-2.yml index bc661b373af533ccf7aa7ffc1f544b0369154579..63612aee303a0e6dfd8038b9aa621574c7c3e4fc 100644 --- a/competition_configurations/10-19-2.yml +++ b/competition_configurations/10-19-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-19-3.yml b/competition_configurations/10-19-3.yml index e0805240d3d53fa6fc92e0852ba5518335215afe..10f936c6a07276484ac62f5104619a24d1d9a9ac 100644 --- a/competition_configurations/10-19-3.yml +++ b/competition_configurations/10-19-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-2-1.yml b/competition_configurations/10-2-1.yml index bc328c8eafaaef453c5cbbd54fc1cbb468b0c853..5c6a6c38964fb23d71b0818205013a2fe8956a6a 100644 --- a/competition_configurations/10-2-1.yml +++ b/competition_configurations/10-2-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-2-2.yml b/competition_configurations/10-2-2.yml index bc328c8eafaaef453c5cbbd54fc1cbb468b0c853..5c6a6c38964fb23d71b0818205013a2fe8956a6a 100644 --- a/competition_configurations/10-2-2.yml +++ b/competition_configurations/10-2-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-2-3.yml b/competition_configurations/10-2-3.yml index bc328c8eafaaef453c5cbbd54fc1cbb468b0c853..5c6a6c38964fb23d71b0818205013a2fe8956a6a 100644 --- a/competition_configurations/10-2-3.yml +++ b/competition_configurations/10-2-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-20-1.yml b/competition_configurations/10-20-1.yml index 2b914a4c7cc4e6deae71a9944e729e4325e6eb61..adfb0bb5889c95a0d87491499b97d3346c56a078 100644 --- a/competition_configurations/10-20-1.yml +++ b/competition_configurations/10-20-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-20-2.yml b/competition_configurations/10-20-2.yml index 07bc4aa2b935434259650c2b1331b3a10f73f91e..160573c6a9f360c973632252c5cf3b24ab637867 100644 --- a/competition_configurations/10-20-2.yml +++ b/competition_configurations/10-20-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-20-3.yml b/competition_configurations/10-20-3.yml index 1f4a4e146dfdbcbc0299eb165d4621950621aa36..e80e55b3e08996d19c3e1cb1319cf4aa7774ecc6 100644 --- a/competition_configurations/10-20-3.yml +++ b/competition_configurations/10-20-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-21-1.yml b/competition_configurations/10-21-1.yml index 65b1d65005c9f7a4b8e54603bfc048996c08fa49..a1fed1b1be6bd3bae535bf6817fbb0af6e6ee8bd 100644 --- a/competition_configurations/10-21-1.yml +++ b/competition_configurations/10-21-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-21-2.yml b/competition_configurations/10-21-2.yml index 41c910b73f5517210961c0f14cd09ffd3d901096..6b406a67218a953888b696f2a1bd5fce5b1ec51d 100644 --- a/competition_configurations/10-21-2.yml +++ b/competition_configurations/10-21-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-21-3.yml b/competition_configurations/10-21-3.yml index f4513d66da5c1de29b6398441351ed7d85579550..f662afd9df3dce9f9f1d63dcce4b6c4ccd3b20e8 100644 --- a/competition_configurations/10-21-3.yml +++ b/competition_configurations/10-21-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-22-1.yml b/competition_configurations/10-22-1.yml index ee8b3707b44a4791d0e2ee6cd1e6d5918c7611ca..bc5af72f56f2c4f2d2aeb419576db5d9674c0b0a 100644 --- a/competition_configurations/10-22-1.yml +++ b/competition_configurations/10-22-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-22-3.yml b/competition_configurations/10-22-3.yml index 80495ffa8bae2dd39e9a21e1f76030e5033be1a7..cea009d7a8df22323dd41258b11db46df9f3236d 100644 --- a/competition_configurations/10-22-3.yml +++ b/competition_configurations/10-22-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-23-1.yml b/competition_configurations/10-23-1.yml index 1d3f2054ff806818fb9017209f5b37ed1e86a17b..cb4912ad2dbeee28fbfd71dc676589d2f50e54fb 100644 --- a/competition_configurations/10-23-1.yml +++ b/competition_configurations/10-23-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-23-2.yml b/competition_configurations/10-23-2.yml index 83544f53e708579722913288a64c14a012e2953a..7d2de09b065ef676ef6694a4385542a079e0dcb4 100644 --- a/competition_configurations/10-23-2.yml +++ b/competition_configurations/10-23-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-23-3.yml b/competition_configurations/10-23-3.yml index 83544f53e708579722913288a64c14a012e2953a..7d2de09b065ef676ef6694a4385542a079e0dcb4 100644 --- a/competition_configurations/10-23-3.yml +++ b/competition_configurations/10-23-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-24-1.yml b/competition_configurations/10-24-1.yml index db55e4e18e60c12dc74dbc6382feb18cd9fb9477..cce6b6e7c5873c4fb81846f0046a7e6ee5155a07 100644 --- a/competition_configurations/10-24-1.yml +++ b/competition_configurations/10-24-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 1000 items: - !Item diff --git a/competition_configurations/10-24-2.yml b/competition_configurations/10-24-2.yml index 701f298aa46fbf14cb602c5a7d6400db3331fcca..ab7e513f658f9378ee58601a04a3c40043a62218 100644 --- a/competition_configurations/10-24-2.yml +++ b/competition_configurations/10-24-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 1000 items: - !Item diff --git a/competition_configurations/10-24-3.yml b/competition_configurations/10-24-3.yml index 701f298aa46fbf14cb602c5a7d6400db3331fcca..ab7e513f658f9378ee58601a04a3c40043a62218 100644 --- a/competition_configurations/10-24-3.yml +++ b/competition_configurations/10-24-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 1000 items: - !Item diff --git a/competition_configurations/10-25-1.yml b/competition_configurations/10-25-1.yml index 282dde2f451896db60218437071fb44f93cec48b..df81fe755e014f9aa1c727be8807f504fab0ef04 100644 --- a/competition_configurations/10-25-1.yml +++ b/competition_configurations/10-25-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-25-2.yml b/competition_configurations/10-25-2.yml index fc4bcf3e84347ef4cfd2fe7b65d0d550d9b46299..a351c6ce2fcbb542b4689fce023872983f69ac91 100644 --- a/competition_configurations/10-25-2.yml +++ b/competition_configurations/10-25-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-25-3.yml b/competition_configurations/10-25-3.yml index e7c9c42f8ba4f54c936e54349ab000a3a806e5d6..602184d28bb5e89c6fea231c9b7dbfcba37eeaf5 100644 --- a/competition_configurations/10-25-3.yml +++ b/competition_configurations/10-25-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-26-1.yml b/competition_configurations/10-26-1.yml index c60237c67bee1a0cb3b74c10e4e5be4fc28fd318..c9a4ea2c9cdda7cae4b8c1cfaa5ddbeceb7a6289 100644 --- a/competition_configurations/10-26-1.yml +++ b/competition_configurations/10-26-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-26-2.yml b/competition_configurations/10-26-2.yml index ad9fff4a83875b4e7f4f4b585e1ba33f19475a75..f032a68a7f82376e90610e9cfd9cfee5fa060eaa 100644 --- a/competition_configurations/10-26-2.yml +++ b/competition_configurations/10-26-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-26-3.yml b/competition_configurations/10-26-3.yml index b9944c7e6b9fd152861e17237251fb2bc91adbf4..42f4747e3b54e8c6c6ba48fe6f07b16e3896c2d5 100644 --- a/competition_configurations/10-26-3.yml +++ b/competition_configurations/10-26-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-27-1.yml b/competition_configurations/10-27-1.yml index 2eba560b2d727f99f3e1af787eed0020777103ab..7dd00621715b13f23f904622bcc7cfa07361318f 100644 --- a/competition_configurations/10-27-1.yml +++ b/competition_configurations/10-27-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-27-2.yml b/competition_configurations/10-27-2.yml index be5dac9859959bc562a82e68a0ae47e8350d807b..a2e72a9295959b2174550d4d95ceb59dfc614369 100644 --- a/competition_configurations/10-27-2.yml +++ b/competition_configurations/10-27-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-27-3.yml b/competition_configurations/10-27-3.yml index 6f38c22b904b069542e74ffaa999f01a4e8e1448..1238144828530b12469d59a00aa9bc0c84c92450 100644 --- a/competition_configurations/10-27-3.yml +++ b/competition_configurations/10-27-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-28-1.yml b/competition_configurations/10-28-1.yml index b3f1105cd7ae1b0cf0d2ee15ccb59a858c0247b9..cc02cda80a2f110dc0e11e8d2931c33b0f55ba15 100644 --- a/competition_configurations/10-28-1.yml +++ b/competition_configurations/10-28-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.1 t: 500 items: - !Item diff --git a/competition_configurations/10-28-2.yml b/competition_configurations/10-28-2.yml index edd73ea063df7bde070cf899a5699c14cd7fd2c0..7b6fe997ddbfe14f58b09779c6979a775d96188e 100644 --- a/competition_configurations/10-28-2.yml +++ b/competition_configurations/10-28-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.1 t: 500 items: - !Item diff --git a/competition_configurations/10-28-3.yml b/competition_configurations/10-28-3.yml index edd73ea063df7bde070cf899a5699c14cd7fd2c0..7b6fe997ddbfe14f58b09779c6979a775d96188e 100644 --- a/competition_configurations/10-28-3.yml +++ b/competition_configurations/10-28-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.1 t: 500 items: - !Item diff --git a/competition_configurations/10-29-1.yml b/competition_configurations/10-29-1.yml index 2fd83929e0f6f8facf9f143c9226947f1279750c..1bb01d8d12bb23b57298408c9de89c07c5e1fb1a 100644 --- a/competition_configurations/10-29-1.yml +++ b/competition_configurations/10-29-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.1 t: 500 items: - !Item diff --git a/competition_configurations/10-29-2.yml b/competition_configurations/10-29-2.yml index a59ba1613c368162c7ef69f42b01fc898c904df0..a35bde7d23163540b2423fd87bcf9beee29b3eb7 100644 --- a/competition_configurations/10-29-2.yml +++ b/competition_configurations/10-29-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.1 t: 500 items: - !Item diff --git a/competition_configurations/10-29-3.yml b/competition_configurations/10-29-3.yml index 12407d2ff59d603e22b43fe29e764897e4934cdd..e68c688b0c74b7a9e382ed5b83bd792666e488dc 100644 --- a/competition_configurations/10-29-3.yml +++ b/competition_configurations/10-29-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.1 t: 500 items: - !Item diff --git a/competition_configurations/10-3-1.yml b/competition_configurations/10-3-1.yml index a7db34651ba6a58de97083ca6fa63d2b996276b7..0d21412353090640a4de63b6719fdbb24ffdfa1b 100644 --- a/competition_configurations/10-3-1.yml +++ b/competition_configurations/10-3-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-3-2.yml b/competition_configurations/10-3-2.yml index 61ba7b0396c993c7499cfb9af3db72f0dda59407..cc3ee9b05a2b6cb84af87f2bb4f9e2055963366f 100644 --- a/competition_configurations/10-3-2.yml +++ b/competition_configurations/10-3-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-3-3.yml b/competition_configurations/10-3-3.yml index 61ba7b0396c993c7499cfb9af3db72f0dda59407..cc3ee9b05a2b6cb84af87f2bb4f9e2055963366f 100644 --- a/competition_configurations/10-3-3.yml +++ b/competition_configurations/10-3-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-30-1.yml b/competition_configurations/10-30-1.yml index 82d49956517493dcaec0c46184a78b76a10d1d8c..bcdb946235d9333385cd3c4b5b612caeb83305c4 100644 --- a/competition_configurations/10-30-1.yml +++ b/competition_configurations/10-30-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.1 t: 500 items: - !Item diff --git a/competition_configurations/10-30-2.yml b/competition_configurations/10-30-2.yml index b80990ef9df08dc1b3dd9d36bac199ea6b272132..f50301d51e2d1c1eb4447dfaadf76cdfe7ae56e6 100644 --- a/competition_configurations/10-30-2.yml +++ b/competition_configurations/10-30-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.1 t: 500 items: - !Item diff --git a/competition_configurations/10-30-3.yml b/competition_configurations/10-30-3.yml index e8c6227a533ec8ba8ba3353fe24921ae32acd55f..859443896ff7d2acce8cce11fbf8da9f888d8ddf 100644 --- a/competition_configurations/10-30-3.yml +++ b/competition_configurations/10-30-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.1 t: 500 items: - !Item diff --git a/competition_configurations/10-4-1.yml b/competition_configurations/10-4-1.yml index 555c4928cabe5e19854ddacac31c1d9c24246b45..fa0d6185a3f1771431b0a6e9160fdb3e41552097 100644 --- a/competition_configurations/10-4-1.yml +++ b/competition_configurations/10-4-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-4-2.yml b/competition_configurations/10-4-2.yml index 51300e3f0bca0ab3ffbb8dbcfe173f88977f4938..413363a24deff32e5f753b2e66938e3c78ac9961 100644 --- a/competition_configurations/10-4-2.yml +++ b/competition_configurations/10-4-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-4-3.yml b/competition_configurations/10-4-3.yml index 51300e3f0bca0ab3ffbb8dbcfe173f88977f4938..413363a24deff32e5f753b2e66938e3c78ac9961 100644 --- a/competition_configurations/10-4-3.yml +++ b/competition_configurations/10-4-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-5-1.yml b/competition_configurations/10-5-1.yml index 4dd961b3d86129410903ea25c9d5a798cabde9b3..2bfcc7aaba40adcdd860fdcf7f2e9088c55d2da8 100644 --- a/competition_configurations/10-5-1.yml +++ b/competition_configurations/10-5-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-5-2.yml b/competition_configurations/10-5-2.yml index cd3c5bc75f0103fc5d3753935b31be8cbe536f29..6936f96e2b2b623d0a7742af58cdc8d93a33c074 100644 --- a/competition_configurations/10-5-2.yml +++ b/competition_configurations/10-5-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-5-3.yml b/competition_configurations/10-5-3.yml index cd3c5bc75f0103fc5d3753935b31be8cbe536f29..6936f96e2b2b623d0a7742af58cdc8d93a33c074 100644 --- a/competition_configurations/10-5-3.yml +++ b/competition_configurations/10-5-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-6-1.yml b/competition_configurations/10-6-1.yml index 52ac34e00c5a0faaba2a2e3f8727772c67ebd502..0bf4fd7276f27d0b2fbb4637b696e6466432bb15 100644 --- a/competition_configurations/10-6-1.yml +++ b/competition_configurations/10-6-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-6-2.yml b/competition_configurations/10-6-2.yml index 33815f9ec2d7904da835e72c60d1f0cfc00f52e2..25af6a59a6ad7574a2a5d7e8afbd018e42cdbcfb 100644 --- a/competition_configurations/10-6-2.yml +++ b/competition_configurations/10-6-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-6-3.yml b/competition_configurations/10-6-3.yml index 33815f9ec2d7904da835e72c60d1f0cfc00f52e2..25af6a59a6ad7574a2a5d7e8afbd018e42cdbcfb 100644 --- a/competition_configurations/10-6-3.yml +++ b/competition_configurations/10-6-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-7-1.yml b/competition_configurations/10-7-1.yml index 7e695b159de3291c6351a7c95935e1455caf9015..ef4769238580918e95df94fca13a9c4407d96209 100644 --- a/competition_configurations/10-7-1.yml +++ b/competition_configurations/10-7-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-7-2.yml b/competition_configurations/10-7-2.yml index 5b5bfef4dfd5357d4a5f4eac51af47d209afd638..7b08450e7f4e064643e5ce533cb697e3514182b7 100644 --- a/competition_configurations/10-7-2.yml +++ b/competition_configurations/10-7-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-7-3.yml b/competition_configurations/10-7-3.yml index 1a9577dd3c88835c1298ea897014d4f95866df0d..39fdada3f0e960efd25c7d30e2af6bc63bc1ffa7 100644 --- a/competition_configurations/10-7-3.yml +++ b/competition_configurations/10-7-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-8-1.yml b/competition_configurations/10-8-1.yml index 9f4a110bd2f1e473ccf0e0df1f6f81b60723f37b..5d5ea36c653913b6b21fd8abd6f777a162681c2a 100644 --- a/competition_configurations/10-8-1.yml +++ b/competition_configurations/10-8-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-8-2.yml b/competition_configurations/10-8-2.yml index d71a8373f6c32549a2e4333496f09a89b7712602..daa22bbb8db20c5b1129148564b1f57b9a0c1733 100644 --- a/competition_configurations/10-8-2.yml +++ b/competition_configurations/10-8-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-8-3.yml b/competition_configurations/10-8-3.yml index 55a93f9d26b997acbdce24346c6f32221c6f8383..40886d77d263e7f8cc4503750478a003f84b2fb1 100644 --- a/competition_configurations/10-8-3.yml +++ b/competition_configurations/10-8-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-9-1.yml b/competition_configurations/10-9-1.yml index 165ba68978a1060d842376bfcc07ce44a55dc500..e153b8dc0c851b66368f02f205ce3548c830fc64 100644 --- a/competition_configurations/10-9-1.yml +++ b/competition_configurations/10-9-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-9-2.yml b/competition_configurations/10-9-2.yml index 0bd3099a077d51254f225092074c1ee54e626fe2..cc95690336b44deaac99529a2355d7b586239498 100644 --- a/competition_configurations/10-9-2.yml +++ b/competition_configurations/10-9-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/10-9-3.yml b/competition_configurations/10-9-3.yml index 5125c182776d14289656c881c419163159e965f7..2827e71cd45759241053f49f65855aa027305906 100644 --- a/competition_configurations/10-9-3.yml +++ b/competition_configurations/10-9-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/2-1-1.yml b/competition_configurations/2-1-1.yml index 3565daa34d4a4ddf3e89f2fdd378c2a5bbf4f443..1ed880d40e8c1854c200d1604a0e623e0b8b613b 100644 --- a/competition_configurations/2-1-1.yml +++ b/competition_configurations/2-1-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-1-2.yml b/competition_configurations/2-1-2.yml index 27055dab3b7f2b5e4622f23b71b33044bd52c403..a47d69539c019f25e411aeaa42ade391b0c1d768 100644 --- a/competition_configurations/2-1-2.yml +++ b/competition_configurations/2-1-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-1-3.yml b/competition_configurations/2-1-3.yml index cc795658003d09494b18a84fa735d2918fed4fc6..9cb927b70e58304ae2bff07821ea5b18c2e659cb 100644 --- a/competition_configurations/2-1-3.yml +++ b/competition_configurations/2-1-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-10-1.yml b/competition_configurations/2-10-1.yml index 120cf39da36a100e5fc9ca6d76e5f6918c2537a6..d4f663f524eb1796dd0fa50fd222e3db6e112f04 100644 --- a/competition_configurations/2-10-1.yml +++ b/competition_configurations/2-10-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-10-2.yml b/competition_configurations/2-10-2.yml index 52fde94b42a597de747e044e6f7869d16377c5b8..f5ff92f7f096e157071c56db4799a10b2b33e769 100644 --- a/competition_configurations/2-10-2.yml +++ b/competition_configurations/2-10-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-10-3.yml b/competition_configurations/2-10-3.yml index 12798be54477d124157c1d953b26d062c0a23332..3a28f34a4d97338d09b5c95ab35ba4c897269890 100644 --- a/competition_configurations/2-10-3.yml +++ b/competition_configurations/2-10-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-11-1.yml b/competition_configurations/2-11-1.yml index 05d3f4b6d5515ed913fcb78f5fa5c3e8fad1ed76..345fb1e83d7957ad72f55b61cb053cc7ffe992fd 100644 --- a/competition_configurations/2-11-1.yml +++ b/competition_configurations/2-11-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-11-2.yml b/competition_configurations/2-11-2.yml index f10b4f007af0a45d1ca99015624b648ef2086a41..df58dfc568c747d49f705ffe5d79e84c4eb0d091 100644 --- a/competition_configurations/2-11-2.yml +++ b/competition_configurations/2-11-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-11-3.yml b/competition_configurations/2-11-3.yml index b1cf6b3032452f1226d7c42677bcdf1f6e82f654..b685b694e801c0d34d0ef8a67c735bb4739115d8 100644 --- a/competition_configurations/2-11-3.yml +++ b/competition_configurations/2-11-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-12-1.yml b/competition_configurations/2-12-1.yml index 2357d839b8bd604c54745fba23ca35aa1c4bd1d7..969a6ee42ba15bb0be7c9cb76f70090fd2d9feb9 100644 --- a/competition_configurations/2-12-1.yml +++ b/competition_configurations/2-12-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-12-2.yml b/competition_configurations/2-12-2.yml index 977b727eeae64f56b8c3a412cd25e5f120cac720..01848919ec2b301494686178159b75e6286180bb 100644 --- a/competition_configurations/2-12-2.yml +++ b/competition_configurations/2-12-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-12-3.yml b/competition_configurations/2-12-3.yml index 314196fdc79d79879dd816f940a12525afdc56d7..c9aa75af8a7c951edd07ca48e9cea9ed3aa3dc0d 100644 --- a/competition_configurations/2-12-3.yml +++ b/competition_configurations/2-12-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-13-1.yml b/competition_configurations/2-13-1.yml index 2aa436a31775c8c136603740eccb3109acbe790f..c9f21f627bce9281e20a98b80d1a559fc56eb4dd 100644 --- a/competition_configurations/2-13-1.yml +++ b/competition_configurations/2-13-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/2-13-2.yml b/competition_configurations/2-13-2.yml index bacaba831817570af36ed94e78a1cad003942ab7..890896f15a3fe543995d2afeb75e6cd6a3169cbc 100644 --- a/competition_configurations/2-13-2.yml +++ b/competition_configurations/2-13-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/2-13-3.yml b/competition_configurations/2-13-3.yml index 12e942f4cda34afa0763cbd77f5e3f5347211618..062aed9d8ff8e3ba2c3019b40e32dd3b714817df 100644 --- a/competition_configurations/2-13-3.yml +++ b/competition_configurations/2-13-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/2-14-1.yml b/competition_configurations/2-14-1.yml index 2fbd676706dbe2f070c4b381d274f08c0bf79279..572818d1b70ce6ce07654d31c0f0eb111b47dbeb 100644 --- a/competition_configurations/2-14-1.yml +++ b/competition_configurations/2-14-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/2-14-2.yml b/competition_configurations/2-14-2.yml index 9f3d63428bb0316bea47ecb73aa19d2b11bae932..b719cb2f26e2904856f3ad95803581bd5879332b 100644 --- a/competition_configurations/2-14-2.yml +++ b/competition_configurations/2-14-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/2-14-3.yml b/competition_configurations/2-14-3.yml index 26d5c5899393f24a1bbc043dac2e0ba02f5676f1..b5a79fa901f1517301619c1f6d05230961129fbd 100644 --- a/competition_configurations/2-14-3.yml +++ b/competition_configurations/2-14-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/2-15-1.yml b/competition_configurations/2-15-1.yml index 0986145e4e299e16e13b6dfab2f21d752afac8cd..467f805a73e9babe65677b0efcfbd5771ac501bf 100644 --- a/competition_configurations/2-15-1.yml +++ b/competition_configurations/2-15-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/2-15-2.yml b/competition_configurations/2-15-2.yml index e16d646eade2be6919ed947002bca9712919c04d..1de12138b2b569b914d04f1ee0da2c47aeb98f8d 100644 --- a/competition_configurations/2-15-2.yml +++ b/competition_configurations/2-15-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/2-15-3.yml b/competition_configurations/2-15-3.yml index cc6215cf402f50220707896451d8ffad44040067..aea77fd41efd9d645818946299921ec43349e91f 100644 --- a/competition_configurations/2-15-3.yml +++ b/competition_configurations/2-15-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/2-16-1.yml b/competition_configurations/2-16-1.yml index 0678c259994ce3185191fd5a9fc3c572e4b4db87..373bc372876fbc859a143bf35dccb84cb2bcfda1 100644 --- a/competition_configurations/2-16-1.yml +++ b/competition_configurations/2-16-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/2-16-2.yml b/competition_configurations/2-16-2.yml index 7313f12a9fa77ff2de80234849d8ef4bea3a04f1..c762524642b9a0f7f4ed545589d65fcc77f44e3e 100644 --- a/competition_configurations/2-16-2.yml +++ b/competition_configurations/2-16-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/2-16-3.yml b/competition_configurations/2-16-3.yml index 9e935eb11469229a6484a0b3cfc7f80ae28fa4b2..3b5c728a31f77c629460782e3a4c7b3171760168 100644 --- a/competition_configurations/2-16-3.yml +++ b/competition_configurations/2-16-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/2-17-1.yml b/competition_configurations/2-17-1.yml index a673722c4085f6fbb27632cfc51e8e39ed69ba3c..230f2fcbdc8b5b7b249b5c8d75c1b14df1459cb0 100644 --- a/competition_configurations/2-17-1.yml +++ b/competition_configurations/2-17-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/2-17-2.yml b/competition_configurations/2-17-2.yml index 516acc59b5480386f458c49131b9c8db9f5ec9bf..9b0044c8716fb859885614e32766659f48957c2e 100644 --- a/competition_configurations/2-17-2.yml +++ b/competition_configurations/2-17-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/2-17-3.yml b/competition_configurations/2-17-3.yml index 4f5c9e9f64647e4cdc722a07ce73ca611861e7a8..a77715d202b02b7aab6a66f0bd1a86679e939d44 100644 --- a/competition_configurations/2-17-3.yml +++ b/competition_configurations/2-17-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/2-18-1.yml b/competition_configurations/2-18-1.yml index 00bcbf2261dfcf442c88a4b4bbc6c6ec45a25135..008f796330ed2811697aaa1ccb5c0c052f384aea 100644 --- a/competition_configurations/2-18-1.yml +++ b/competition_configurations/2-18-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/2-18-2.yml b/competition_configurations/2-18-2.yml index e4fe9602ff080711ff8f50b87606049ac0860fa7..ef62006e34dbdef3641d0cd969ec5d010a9637e9 100644 --- a/competition_configurations/2-18-2.yml +++ b/competition_configurations/2-18-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/2-18-3.yml b/competition_configurations/2-18-3.yml index 4974620c773a02023d49c4033473cac45bf25a0a..049d9da0737ddff6b3cd4be171548e0df14cd071 100644 --- a/competition_configurations/2-18-3.yml +++ b/competition_configurations/2-18-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/2-19-1.yml b/competition_configurations/2-19-1.yml index 2272c51cbb8cdd1f12ce377bb796efbee1cd586a..c2cf9394a0f41b38a711ca0ab2db5764dcd85a24 100644 --- a/competition_configurations/2-19-1.yml +++ b/competition_configurations/2-19-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 250 items: - !Item diff --git a/competition_configurations/2-19-2.yml b/competition_configurations/2-19-2.yml index 3c2c48295cfb01eb5f21b9bc510b02151f3bd7ac..9eecb5a9ac63d95c6b4d5de260845b8fe336754c 100644 --- a/competition_configurations/2-19-2.yml +++ b/competition_configurations/2-19-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 250 items: - !Item diff --git a/competition_configurations/2-19-3.yml b/competition_configurations/2-19-3.yml index cf1f0230db049991579c3f1968cec252f0aa6c1d..1d95812ad7b25335309b841518f16824d378e597 100644 --- a/competition_configurations/2-19-3.yml +++ b/competition_configurations/2-19-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 250 items: - !Item diff --git a/competition_configurations/2-2-1.yml b/competition_configurations/2-2-1.yml index 199d9961aaed36e337dc4950acd262ecd3f9adcf..be81d9c547a58516c7ee8b5ff0a0d7498bda834b 100644 --- a/competition_configurations/2-2-1.yml +++ b/competition_configurations/2-2-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-2-2.yml b/competition_configurations/2-2-2.yml index 24735aee1b2506c728948ed4ad4490f8f51485c1..b7b0f927ce9837b1eace1e5b851ecdb8b88a7e1e 100644 --- a/competition_configurations/2-2-2.yml +++ b/competition_configurations/2-2-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-2-3.yml b/competition_configurations/2-2-3.yml index f769ed426d3db005f6540d3e70398895b5bf235c..229a190ba65518e2a81666898cfec401c2acc6c9 100644 --- a/competition_configurations/2-2-3.yml +++ b/competition_configurations/2-2-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-20-1.yml b/competition_configurations/2-20-1.yml index 6b0dcd03889d7e41401f7dfed5cb57ea7688fd07..949e29b4950362dacfc83b4eb65ad7a4bc89888f 100644 --- a/competition_configurations/2-20-1.yml +++ b/competition_configurations/2-20-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 250 items: - !Item diff --git a/competition_configurations/2-20-2.yml b/competition_configurations/2-20-2.yml index a61c819bbbde8ea1fc9f5cf4875fbff47d9ccf16..ee886064fb7468548d834f429246d16a60f27b37 100644 --- a/competition_configurations/2-20-2.yml +++ b/competition_configurations/2-20-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 250 items: - !Item diff --git a/competition_configurations/2-20-3.yml b/competition_configurations/2-20-3.yml index 793772c5ba8b05a965c88e5ea49992ba9734b53c..c0404a2aaa34d71283021df769c7d430a54337eb 100644 --- a/competition_configurations/2-20-3.yml +++ b/competition_configurations/2-20-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 250 items: - !Item diff --git a/competition_configurations/2-21-1.yml b/competition_configurations/2-21-1.yml index a186f296c85518196a6aa5e91173e270d8c5bd8b..065bb16b21c093e511b53d40fad34255f8c06aaa 100644 --- a/competition_configurations/2-21-1.yml +++ b/competition_configurations/2-21-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 items: - !Item diff --git a/competition_configurations/2-21-2.yml b/competition_configurations/2-21-2.yml index 5bf4f5e7e2b986359979f6563286b1ed1d00c41d..9ef113181355befa7dfa7ee272fa0e40b0f175d0 100644 --- a/competition_configurations/2-21-2.yml +++ b/competition_configurations/2-21-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 items: - !Item diff --git a/competition_configurations/2-21-3.yml b/competition_configurations/2-21-3.yml index 3a33e03110b771c0468665bcd04e613e74513a59..80b0279d6b67b1ed3b75fd6a58c7041ee474be99 100644 --- a/competition_configurations/2-21-3.yml +++ b/competition_configurations/2-21-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 items: - !Item diff --git a/competition_configurations/2-22-1.yml b/competition_configurations/2-22-1.yml index 195676a20280f7cbad2b23741f3fc11de37876fe..0f1daec0e694a49df71704d610543f02808f7ef7 100644 --- a/competition_configurations/2-22-1.yml +++ b/competition_configurations/2-22-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 items: - !Item diff --git a/competition_configurations/2-22-2.yml b/competition_configurations/2-22-2.yml index 1eae6945db960ebd545cb07b89c220ec5b608e54..f3e10bcc7d5547b851b0be8295b48daa33acc58f 100644 --- a/competition_configurations/2-22-2.yml +++ b/competition_configurations/2-22-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 items: - !Item diff --git a/competition_configurations/2-22-3.yml b/competition_configurations/2-22-3.yml index e649162995830db05c8fb292603e5e11fed87ae1..e890c43a4d34396785922be21b338ec4f960ff5a 100644 --- a/competition_configurations/2-22-3.yml +++ b/competition_configurations/2-22-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 items: - !Item diff --git a/competition_configurations/2-23-1.yml b/competition_configurations/2-23-1.yml index 7ecc791f03846bb46149bffcc6eaa460fe67aa4d..e4eeac33c7f13b202ed2b8ac54c4dc1651643ca7 100644 --- a/competition_configurations/2-23-1.yml +++ b/competition_configurations/2-23-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 500 items: - !Item diff --git a/competition_configurations/2-23-2.yml b/competition_configurations/2-23-2.yml index 49ee7ceb488f093cbf0f0ce2a05fbc55c58819ca..07222fd33c137e548c88fb84b23e53692113fa11 100644 --- a/competition_configurations/2-23-2.yml +++ b/competition_configurations/2-23-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 500 items: - !Item diff --git a/competition_configurations/2-23-3.yml b/competition_configurations/2-23-3.yml index 0b02cbfe3dd24d7e6255d5865a0c0f36ec07c699..3a496a66b50a9b6fd38053961eec0152862bf6ac 100644 --- a/competition_configurations/2-23-3.yml +++ b/competition_configurations/2-23-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 500 items: - !Item diff --git a/competition_configurations/2-24-1.yml b/competition_configurations/2-24-1.yml index 19b78de9cb9ee1434f65d4bef56f121dfb2bb00a..a775f8c8b45f6b90d5e24d49bb67f6a1ce5847f6 100644 --- a/competition_configurations/2-24-1.yml +++ b/competition_configurations/2-24-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 8 t: 500 items: - !Item diff --git a/competition_configurations/2-24-2.yml b/competition_configurations/2-24-2.yml index 914a46b65e6a38eb0deb079f0311de65bdcb9407..6a3b5d259c83a2b5c0545ef0590a4f97fa46738b 100644 --- a/competition_configurations/2-24-2.yml +++ b/competition_configurations/2-24-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 6 t: 500 items: - !Item diff --git a/competition_configurations/2-24-3.yml b/competition_configurations/2-24-3.yml index b0fb6bdcbac27f820f93e095bb8bc80b2fb6eac8..c1dc46db5bb0f43da29a995957045bf559768283 100644 --- a/competition_configurations/2-24-3.yml +++ b/competition_configurations/2-24-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 10 t: 500 items: - !Item diff --git a/competition_configurations/2-25-1.yml b/competition_configurations/2-25-1.yml index 82ee9312e9580e08ec25cf55ffc7859e5b0c5045..7a60aa20d62d788b021ca363c5c2d29144bb3530 100644 --- a/competition_configurations/2-25-1.yml +++ b/competition_configurations/2-25-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 items: - !Item diff --git a/competition_configurations/2-25-2.yml b/competition_configurations/2-25-2.yml index 7c8918b60dc0c58a07e78c63699ee4ede7777fe2..a34a7d926ab590ab6c0d4b18f9846c07c5169759 100644 --- a/competition_configurations/2-25-2.yml +++ b/competition_configurations/2-25-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 items: - !Item diff --git a/competition_configurations/2-25-3.yml b/competition_configurations/2-25-3.yml index b15bc20db020edad042fe06545b0fb8d8fa01a7b..1c5e310d3ee851f6e10af23bf53e3e2d532749d4 100644 --- a/competition_configurations/2-25-3.yml +++ b/competition_configurations/2-25-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 items: - !Item diff --git a/competition_configurations/2-26-1.yml b/competition_configurations/2-26-1.yml index 37bd084072991230d9adc20595587a5c3012b9c1..4ca66b3ee5a47d633f5af50544b6180e56425eca 100644 --- a/competition_configurations/2-26-1.yml +++ b/competition_configurations/2-26-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 500 items: - !Item diff --git a/competition_configurations/2-26-2.yml b/competition_configurations/2-26-2.yml index 68da83a6c04f7b35789236e9e09a125586b93b89..e8f0112e2524b038f9a99876411740490858a6e4 100644 --- a/competition_configurations/2-26-2.yml +++ b/competition_configurations/2-26-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 500 items: - !Item diff --git a/competition_configurations/2-26-3.yml b/competition_configurations/2-26-3.yml index b75eadc6d6e1dfd7d357e5b4b02f32eac6a3ca72..c156749fe9d1e8ecc1b307e063dd94622d27f946 100644 --- a/competition_configurations/2-26-3.yml +++ b/competition_configurations/2-26-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 500 items: - !Item diff --git a/competition_configurations/2-27-1.yml b/competition_configurations/2-27-1.yml index 74c2495ac677f654c2007e9862dc953c02259b43..628427942361eee8129b8c8a51b959ccddbf77eb 100644 --- a/competition_configurations/2-27-1.yml +++ b/competition_configurations/2-27-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/2-27-2.yml b/competition_configurations/2-27-2.yml index 8c233ad9492f7301be5387d3479cc6c6213946ef..7cd1ab2ef21798408be7fc7d554d56284caf741b 100644 --- a/competition_configurations/2-27-2.yml +++ b/competition_configurations/2-27-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/2-27-3.yml b/competition_configurations/2-27-3.yml index 6dacf6924fec0739d6cfe10e5aec8e6714d9d30a..2a1c27e63d00ab762ca9eb9046f25e0686dec7d4 100644 --- a/competition_configurations/2-27-3.yml +++ b/competition_configurations/2-27-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/2-28-1.yml b/competition_configurations/2-28-1.yml index 3387ccb874b5de9650b13d1d3a499ac83c3d77d2..230d99c924695f6c55173e785c8972aa4d7d39b8 100644 --- a/competition_configurations/2-28-1.yml +++ b/competition_configurations/2-28-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 6 t: 500 items: - !Item diff --git a/competition_configurations/2-28-2.yml b/competition_configurations/2-28-2.yml index b1f224824ff2cf149c775f54f2606c5c451e0fac..8269fdaa5c92a23a0d7c49486f5782d6c9d683f5 100644 --- a/competition_configurations/2-28-2.yml +++ b/competition_configurations/2-28-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 6 t: 500 items: - !Item diff --git a/competition_configurations/2-28-3.yml b/competition_configurations/2-28-3.yml index 8c8641ffd3a75cd083666235b3a5d3301a3ed73a..9ab21eef7a2758d1b45e27079bca7daa6c18b09d 100644 --- a/competition_configurations/2-28-3.yml +++ b/competition_configurations/2-28-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 6 t: 500 items: - !Item diff --git a/competition_configurations/2-29-1.yml b/competition_configurations/2-29-1.yml index 2d24956722a1edd835507e8121c8c8832169a6f3..af1d59ac2131fba4e7e0643838de44528bfcb2c1 100644 --- a/competition_configurations/2-29-1.yml +++ b/competition_configurations/2-29-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 items: - !Item diff --git a/competition_configurations/2-29-2.yml b/competition_configurations/2-29-2.yml index a07072f6286cf2f6dca1d780a7195ac8b645ab4c..235c7e40d7f13bbc36942f69d4c63e67b4e5e904 100644 --- a/competition_configurations/2-29-2.yml +++ b/competition_configurations/2-29-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 500 items: - !Item diff --git a/competition_configurations/2-29-3.yml b/competition_configurations/2-29-3.yml index 5fc91705fc3588d42ed78dfbdb6e1ecf78e522e9..dd6bd8292bf7b74fe8adb1580cee1270e9548969 100644 --- a/competition_configurations/2-29-3.yml +++ b/competition_configurations/2-29-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 6 t: 500 items: - !Item diff --git a/competition_configurations/2-3-1.yml b/competition_configurations/2-3-1.yml index 8daa6bfdca1606f96c06d669374033837645e6e3..e05c254d7c1c3dd1f6fea2b08d2de0e9410cd97d 100644 --- a/competition_configurations/2-3-1.yml +++ b/competition_configurations/2-3-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-3-2.yml b/competition_configurations/2-3-2.yml index 8164d57b1e6a9c70896e13e45952d49f33adab7f..35bd5d1b2d95f22b5667ce537ab22622f9d3fa7e 100644 --- a/competition_configurations/2-3-2.yml +++ b/competition_configurations/2-3-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-3-3.yml b/competition_configurations/2-3-3.yml index d2863b620d12e678413b439cc45ec177a83d2290..4f12186cb2793f44285b81c1bc043867212c0a32 100644 --- a/competition_configurations/2-3-3.yml +++ b/competition_configurations/2-3-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-30-1.yml b/competition_configurations/2-30-1.yml index 0dc1345ef8b2c25586d683e7d25a39990d344300..04d640a02b840cf223ec56e39b3c1e8eef4b1d8b 100644 --- a/competition_configurations/2-30-1.yml +++ b/competition_configurations/2-30-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 500 items: - !Item diff --git a/competition_configurations/2-30-2.yml b/competition_configurations/2-30-2.yml index 72a452f1cefc0f1aade72e2e37b9472f7b818772..92fa46c0a79b85124eae5ea24e3364c394d7765f 100644 --- a/competition_configurations/2-30-2.yml +++ b/competition_configurations/2-30-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 500 items: - !Item diff --git a/competition_configurations/2-30-3.yml b/competition_configurations/2-30-3.yml index c1efb93d703a3a29b53eb50ff7e06756e5897927..d4d24f4e7f818aac73b0d4e932518910120a36d2 100644 --- a/competition_configurations/2-30-3.yml +++ b/competition_configurations/2-30-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 5 t: 500 items: - !Item diff --git a/competition_configurations/2-4-1.yml b/competition_configurations/2-4-1.yml index 74313e10cc26d46846acbe2ce35eda3e4f8f9816..a5b3a10735ccd6d21841f125dca74774fc3f08ab 100644 --- a/competition_configurations/2-4-1.yml +++ b/competition_configurations/2-4-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-4-2.yml b/competition_configurations/2-4-2.yml index 30bfdbcbfea5c79308379c722bf3ec663813fb68..0e4ed201b24fa0089b3b77e47590a0cd8f22d8fd 100644 --- a/competition_configurations/2-4-2.yml +++ b/competition_configurations/2-4-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-4-3.yml b/competition_configurations/2-4-3.yml index 50433bfcf922ca246c6c3bbcd1e10f701f5499df..2cb408a8587c4ffd1a02e4342a6f8bfe5fd41f7b 100644 --- a/competition_configurations/2-4-3.yml +++ b/competition_configurations/2-4-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-5-1.yml b/competition_configurations/2-5-1.yml index c7f8b1f62e78a89a6ecf917a73587a04831bfa68..68f5c33d8dc252186b8d09241e036b1d1660818d 100644 --- a/competition_configurations/2-5-1.yml +++ b/competition_configurations/2-5-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-5-2.yml b/competition_configurations/2-5-2.yml index 9b9c6717410ec92d58b9a29ed6a597538d707c56..3af2f8fee0b88912861d6308b04cb4bff95aa7a5 100644 --- a/competition_configurations/2-5-2.yml +++ b/competition_configurations/2-5-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-5-3.yml b/competition_configurations/2-5-3.yml index b953eeb3fc3b021e4e2106a6d0d7923ed8be1a18..d0104ea18a575473b834b14e24e1adf16c2b25c7 100644 --- a/competition_configurations/2-5-3.yml +++ b/competition_configurations/2-5-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-6-1.yml b/competition_configurations/2-6-1.yml index 69298ddbc0f80353ab4515e66f923291493b1a60..fc93859da53c61e51b3386935c0025f7439e85c1 100644 --- a/competition_configurations/2-6-1.yml +++ b/competition_configurations/2-6-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-6-2.yml b/competition_configurations/2-6-2.yml index b32160e2f0e2dca042ea3ee580d61d3e078b87ab..5c48721a1770e7f4137c3838c0ce819171fc83b6 100644 --- a/competition_configurations/2-6-2.yml +++ b/competition_configurations/2-6-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-6-3.yml b/competition_configurations/2-6-3.yml index aac029f243ecd4506d79b656047556791867e80f..6f271f2cfd8ca6fd3711589bebab3b8d9bbf0db4 100644 --- a/competition_configurations/2-6-3.yml +++ b/competition_configurations/2-6-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-7-1.yml b/competition_configurations/2-7-1.yml index 6f4d0d9295eaa63e1fb02f8f7c33295d80353bc1..0c2e6a725211a54fcbad1725ef60609834036487 100644 --- a/competition_configurations/2-7-1.yml +++ b/competition_configurations/2-7-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-7-2.yml b/competition_configurations/2-7-2.yml index 25140aa25879ab2896be40665e10562c6e1d9ccc..98f6d4067fb9c4d29e75744f673ed468869d6015 100644 --- a/competition_configurations/2-7-2.yml +++ b/competition_configurations/2-7-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-7-3.yml b/competition_configurations/2-7-3.yml index bf2f9ec5a0dac02a4f47ea8657d7553b441dd476..6e5e5e0eed1b526814ce2ef84de2d35d4ae4e978 100644 --- a/competition_configurations/2-7-3.yml +++ b/competition_configurations/2-7-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-8-1.yml b/competition_configurations/2-8-1.yml index 3deec319d856c174c898e8e2744cbf6118fae430..ce733e87d48c6e82a608e88e621fa5959e07e3fb 100644 --- a/competition_configurations/2-8-1.yml +++ b/competition_configurations/2-8-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-8-2.yml b/competition_configurations/2-8-2.yml index 7d6afd808b4bee656908e429ff74770d47216c91..04d6346943bc375e9035e2bcef8986bb10453e29 100644 --- a/competition_configurations/2-8-2.yml +++ b/competition_configurations/2-8-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-8-3.yml b/competition_configurations/2-8-3.yml index 8f2dc1a94874d8a970053ab9f93277d66802eda2..67b634b9e2c99e62c16393aba045a0196b422c5c 100644 --- a/competition_configurations/2-8-3.yml +++ b/competition_configurations/2-8-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-9-1.yml b/competition_configurations/2-9-1.yml index 6b4bf5b0b854b0e53837377bc377946231ae94d7..5364417564078ffea1d65e6797bfec7b8e7e8082 100644 --- a/competition_configurations/2-9-1.yml +++ b/competition_configurations/2-9-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-9-2.yml b/competition_configurations/2-9-2.yml index 906f969b1bc1f5931adbcc6755dbed9dfb0a06df..01911debb13a6a3d120a1deaf9ca6f1bb975fa23 100644 --- a/competition_configurations/2-9-2.yml +++ b/competition_configurations/2-9-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/2-9-3.yml b/competition_configurations/2-9-3.yml index 4afaa7cb43278c411fde5ca1c9c9ab9ef603630c..b130899441d6e628175d8cda0f4e48d126473125 100644 --- a/competition_configurations/2-9-3.yml +++ b/competition_configurations/2-9-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-1-1.yml b/competition_configurations/3-1-1.yml index 5feb58cb75d73580f92ba80decc1ca3e0eae1bf7..e554db30af1de50b8d619baec56f09fe0936d5e4 100644 --- a/competition_configurations/3-1-1.yml +++ b/competition_configurations/3-1-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-1-2.yml b/competition_configurations/3-1-2.yml index 570562a83256d3cfd361d413a2cb618b79db43dd..84618020ceaaf85413978a184dd9bcd564c0d685 100644 --- a/competition_configurations/3-1-2.yml +++ b/competition_configurations/3-1-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-1-3.yml b/competition_configurations/3-1-3.yml index 34f52935f26c049c39ad9444bf6fc341cdefd9de..4b689f397be6733917033df1e3c8a7621a2062a1 100644 --- a/competition_configurations/3-1-3.yml +++ b/competition_configurations/3-1-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-10-1.yml b/competition_configurations/3-10-1.yml index 989a3b075b93d82979e9038adab6b51b5f369a7b..ae394706aa0dad831c5ea09c08e1b36b6af5b591 100644 --- a/competition_configurations/3-10-1.yml +++ b/competition_configurations/3-10-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-10-2.yml b/competition_configurations/3-10-2.yml index fce7f05e93249a48f49cd2252a1437f8f12fe68f..925014099d51e14cf452ab223b02287493283279 100644 --- a/competition_configurations/3-10-2.yml +++ b/competition_configurations/3-10-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-10-3.yml b/competition_configurations/3-10-3.yml index 7138de98504b551c3b96a337a161ee22c4ffc86c..3c8a643e811d6f8b1a5e15c8c00ba8282c29b4cb 100644 --- a/competition_configurations/3-10-3.yml +++ b/competition_configurations/3-10-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-11-1.yml b/competition_configurations/3-11-1.yml index 090df99729ff1db93b9b85ad6899a423c6060732..7644b076f60bfb7f27da761b75611878df268ca3 100644 --- a/competition_configurations/3-11-1.yml +++ b/competition_configurations/3-11-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-11-2.yml b/competition_configurations/3-11-2.yml index 41d3b54df4144c846942d0158b949d06e7c37266..4595c8602b47c32807150e7bdaa1d807c65a3a8d 100644 --- a/competition_configurations/3-11-2.yml +++ b/competition_configurations/3-11-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-11-3.yml b/competition_configurations/3-11-3.yml index 568c04ef1515598330c6dddc00b8d867476e30cc..a45440d3b4c27be47f720378463082636464db58 100644 --- a/competition_configurations/3-11-3.yml +++ b/competition_configurations/3-11-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-12-1.yml b/competition_configurations/3-12-1.yml index 09cc7fa3158da63f18c4c9e0d0df396cc5511f95..ad5a3142b042405f158924da751e7bbce8473b2d 100644 --- a/competition_configurations/3-12-1.yml +++ b/competition_configurations/3-12-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-12-2.yml b/competition_configurations/3-12-2.yml index 90064d5e0f1cf306c6ee0a560368f7b31bf57f9f..89a862e8733aad2f4fd70a2a8a91eb257b8f4df5 100644 --- a/competition_configurations/3-12-2.yml +++ b/competition_configurations/3-12-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-12-3.yml b/competition_configurations/3-12-3.yml index 475cbbd4e0b88768416498e7ad0bd159a65cad60..fa3f642fb495977c12499fe9af3678c40c9cdc09 100644 --- a/competition_configurations/3-12-3.yml +++ b/competition_configurations/3-12-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-13-1.yml b/competition_configurations/3-13-1.yml index 5c293da6c5acc08052b4f2a13622c7367a119a2b..03a479d953f853969953fd223adf8cb5bb19b2ba 100644 --- a/competition_configurations/3-13-1.yml +++ b/competition_configurations/3-13-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-13-2.yml b/competition_configurations/3-13-2.yml index ad49d618fb408d02392d78a5e7e27ebe133939d2..a94311a90bf3951d1e6633c27ae06e9d357ebb99 100644 --- a/competition_configurations/3-13-2.yml +++ b/competition_configurations/3-13-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-13-3.yml b/competition_configurations/3-13-3.yml index 3dff674e5708d36f50ad13801e749b98ead8c70e..db738390e355dfe127b5b61ee1c2f9cc3bd2eda0 100644 --- a/competition_configurations/3-13-3.yml +++ b/competition_configurations/3-13-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-14-1.yml b/competition_configurations/3-14-1.yml index 97f2e8f6a4c43535196057649cd9e08a7fa83009..f61d78007bb079d31f7a205ce5bf7e812ad1a722 100644 --- a/competition_configurations/3-14-1.yml +++ b/competition_configurations/3-14-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-14-2.yml b/competition_configurations/3-14-2.yml index 76798631c6afdfd3c7b8c445fd6a0e1a54f8d70d..eda127cb76f32bd5ac79258653832b1ebb5ce4b7 100644 --- a/competition_configurations/3-14-2.yml +++ b/competition_configurations/3-14-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-14-3.yml b/competition_configurations/3-14-3.yml index 2f8abb45b70435c9bcf242a730dc055013717b7f..689b764ec3cfdf780f372e2dc74cbbaacf5eceab 100644 --- a/competition_configurations/3-14-3.yml +++ b/competition_configurations/3-14-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-15-1.yml b/competition_configurations/3-15-1.yml index 85d01079306a383e845f95c0ee09af94f56e2401..7f5e11612c0dad4550a23420df9fca350690f404 100644 --- a/competition_configurations/3-15-1.yml +++ b/competition_configurations/3-15-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-15-2.yml b/competition_configurations/3-15-2.yml index 1f5c290952f60ed66153f3999fda9ace74023666..bfc0a97319734ef21c9d95b5c6ce9b6bf4789a88 100644 --- a/competition_configurations/3-15-2.yml +++ b/competition_configurations/3-15-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-15-3.yml b/competition_configurations/3-15-3.yml index 3fa48c4052cb149bc9839516eaff8aa4e02158c7..49f4cd628f24299bf81b3604b4ccc042af9635db 100644 --- a/competition_configurations/3-15-3.yml +++ b/competition_configurations/3-15-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-16-1.yml b/competition_configurations/3-16-1.yml index 9fe3dd428214ab7b4b3874efbf668a478801bb0c..7026b012ff7c49fcbc8d91f07633aa99b603f5a3 100644 --- a/competition_configurations/3-16-1.yml +++ b/competition_configurations/3-16-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-16-2.yml b/competition_configurations/3-16-2.yml index 2db8c1e9042ff68d13de9787e1f3dbce75d9c0b5..2193cc3daa68cf83e29dbadb77d2cb28e9156499 100644 --- a/competition_configurations/3-16-2.yml +++ b/competition_configurations/3-16-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-16-3.yml b/competition_configurations/3-16-3.yml index 9f7661a75067896a7ad7facaf56f80cd654b89fb..a65ef8b991ef84b9e00762185596a381059eccdc 100644 --- a/competition_configurations/3-16-3.yml +++ b/competition_configurations/3-16-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-17-1.yml b/competition_configurations/3-17-1.yml index bfbe9344115902824d5e94f064ad09ce55d071f8..8dbf305446cbfe8529b3f98b5f96389ec9c02b44 100644 --- a/competition_configurations/3-17-1.yml +++ b/competition_configurations/3-17-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 250 items: - !Item diff --git a/competition_configurations/3-17-2.yml b/competition_configurations/3-17-2.yml index ec1e221b538abe9e5d87c8ed9ad4a12a9841ab6f..95441d0654cf3c5cbfad73eb03ec0a9a6aed567d 100644 --- a/competition_configurations/3-17-2.yml +++ b/competition_configurations/3-17-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 250 items: - !Item diff --git a/competition_configurations/3-17-3.yml b/competition_configurations/3-17-3.yml index b4891452524f125a72141b9c9896bd67a2a5f8e5..06d14a157e28dcd97415e71abdeda14f352dcdd0 100644 --- a/competition_configurations/3-17-3.yml +++ b/competition_configurations/3-17-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 250 items: - !Item diff --git a/competition_configurations/3-18-1.yml b/competition_configurations/3-18-1.yml index ef486fb35b0132c158d1984dfa0bcb94f50b19cb..19764401582d15e78ba3e6d730a419ad97b41686 100644 --- a/competition_configurations/3-18-1.yml +++ b/competition_configurations/3-18-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/3-18-2.yml b/competition_configurations/3-18-2.yml index aab781266410314a0cb52870f5a14be22af81585..bd94ed93033f5bd83bda575ed15cbfb18f677fa2 100644 --- a/competition_configurations/3-18-2.yml +++ b/competition_configurations/3-18-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/3-18-3.yml b/competition_configurations/3-18-3.yml index 490addd421cdb3f86eb80174a85c0d9a8a59f4b1..b82d4f7512dfe7a54bdb15a7c5b857c6865fc680 100644 --- a/competition_configurations/3-18-3.yml +++ b/competition_configurations/3-18-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/3-19-1.yml b/competition_configurations/3-19-1.yml index 7f63bc0ea1158f2b8d681a9b9090bbf0a3512738..d551949b0dc2d577e2e2f219368ccd9941c576a2 100644 --- a/competition_configurations/3-19-1.yml +++ b/competition_configurations/3-19-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/3-19-2.yml b/competition_configurations/3-19-2.yml index f96d107e188ceb15d37fdb161931ce97e00601ca..c5a991a61f0f2d474856792ca211ef8ade237663 100644 --- a/competition_configurations/3-19-2.yml +++ b/competition_configurations/3-19-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/3-19-3.yml b/competition_configurations/3-19-3.yml index 108aed221a80c4ed187e1640bba10c8288960d96..2234522c93be119c6da617b6fb2997b953039f30 100644 --- a/competition_configurations/3-19-3.yml +++ b/competition_configurations/3-19-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/3-2-1.yml b/competition_configurations/3-2-1.yml index eb08e3f140da4ce8e6c22f28845ba441c340c3e4..0ff833656842becdb29aa065e3873488885d28b0 100644 --- a/competition_configurations/3-2-1.yml +++ b/competition_configurations/3-2-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-2-2.yml b/competition_configurations/3-2-2.yml index 6b90cbcfef65206161de17269cbd5db0b80b0c5f..eac29121d8e4377e06ceddc2c09ec3b2219a9c2b 100644 --- a/competition_configurations/3-2-2.yml +++ b/competition_configurations/3-2-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-2-3.yml b/competition_configurations/3-2-3.yml index c812e152128d9f4df8df7938e2f7bacca7f5b385..d7ae7a6eb92b1a9678a9707324390e528f38f100 100644 --- a/competition_configurations/3-2-3.yml +++ b/competition_configurations/3-2-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-20-1.yml b/competition_configurations/3-20-1.yml index f114bef485a04d7570053d2640d3fd84527a24ac..e6b5b22d8c7f7730996cf70008cdb2c35289b745 100644 --- a/competition_configurations/3-20-1.yml +++ b/competition_configurations/3-20-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-20-2.yml b/competition_configurations/3-20-2.yml index 6f45d1dfcfce733791efc94100490b321f88b82e..26adaaa9c214ac1fa93e937964f83739a0151638 100644 --- a/competition_configurations/3-20-2.yml +++ b/competition_configurations/3-20-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-20-3.yml b/competition_configurations/3-20-3.yml index 112db0b4577906de3ea758537c08c28cac42dc61..695c50aa88ef843ebf051c76bb73ae439fd056b1 100644 --- a/competition_configurations/3-20-3.yml +++ b/competition_configurations/3-20-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-21-1.yml b/competition_configurations/3-21-1.yml index 77fac88f7769095da027d8e33d673c2eb2ac4500..72b2f17e9f90fed59b0651c7d5bfd9ea89c8ef69 100644 --- a/competition_configurations/3-21-1.yml +++ b/competition_configurations/3-21-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/3-21-2.yml b/competition_configurations/3-21-2.yml index 4b12e96932bda9218f05c752105d93e3054519f9..d500ea8eedac4e965d325bb2c78109f311588727 100644 --- a/competition_configurations/3-21-2.yml +++ b/competition_configurations/3-21-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/3-21-3.yml b/competition_configurations/3-21-3.yml index 0928d7f0f4ff15eeb01b30af21b902caf5d1e1aa..f8d6a567b988fd1ffd124bd10cfa5d5afa8207f8 100644 --- a/competition_configurations/3-21-3.yml +++ b/competition_configurations/3-21-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/3-22-1.yml b/competition_configurations/3-22-1.yml index 3045d3e563c5920efb2d74cb4816cec037894ad7..09b0f558b04e0067e1a2f8255abc6547cba7400e 100644 --- a/competition_configurations/3-22-1.yml +++ b/competition_configurations/3-22-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-22-2.yml b/competition_configurations/3-22-2.yml index 8e8ae0b7db1eff9e0326d41c20e139ba7c86eb05..7fbd0357ed76c36744ab5cf1f5e568a52bb234db 100644 --- a/competition_configurations/3-22-2.yml +++ b/competition_configurations/3-22-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-22-3.yml b/competition_configurations/3-22-3.yml index f1716c483a27b7ff92e794533e80274c8feb7420..6ab2ad54b28a0a090cf05cf1e10e73abb87c2194 100644 --- a/competition_configurations/3-22-3.yml +++ b/competition_configurations/3-22-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-23-1.yml b/competition_configurations/3-23-1.yml index 0d719ab65e45c23324b51dfaa28a59e2dccce716..af2faf47c3d838b70e9130587a8deafa86c44e3f 100644 --- a/competition_configurations/3-23-1.yml +++ b/competition_configurations/3-23-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-23-2.yml b/competition_configurations/3-23-2.yml index b53e58fdbad4c8ce8e5843f7d0e5ca0113ce2be3..12078d891fd5c4abcfed8d1e9e169fa717cc2e67 100644 --- a/competition_configurations/3-23-2.yml +++ b/competition_configurations/3-23-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-23-3.yml b/competition_configurations/3-23-3.yml index 05f18a991865ae5d6a91ee4699084c98236f2722..8fef3469485a073f6b64a16151029a6f3a827be2 100644 --- a/competition_configurations/3-23-3.yml +++ b/competition_configurations/3-23-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-24-1.yml b/competition_configurations/3-24-1.yml index befccc1a13c7b1586e467839353825668e28a7f7..2e1e940ca7c2181b158a7b90b1287b0850f597a2 100644 --- a/competition_configurations/3-24-1.yml +++ b/competition_configurations/3-24-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-24-2.yml b/competition_configurations/3-24-2.yml index eefffd200d410fb56bc6e7fc6901d7d42759e0ef..5d2ac49dc7d2e9f131ad0b445c67cfab2c330a88 100644 --- a/competition_configurations/3-24-2.yml +++ b/competition_configurations/3-24-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-24-3.yml b/competition_configurations/3-24-3.yml index 39d61e98d6b18ea7828e02080e391549a7befe99..8c3d9fb98263037c1a877958bf2684954e530982 100644 --- a/competition_configurations/3-24-3.yml +++ b/competition_configurations/3-24-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-25-1.yml b/competition_configurations/3-25-1.yml index 02be56798ace57ff963d8235a9eef3b89c71c52a..cf14115eb973e7cd8d66727ce817aaf60b8a38e8 100644 --- a/competition_configurations/3-25-1.yml +++ b/competition_configurations/3-25-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/3-25-2.yml b/competition_configurations/3-25-2.yml index 02be56798ace57ff963d8235a9eef3b89c71c52a..cf14115eb973e7cd8d66727ce817aaf60b8a38e8 100644 --- a/competition_configurations/3-25-2.yml +++ b/competition_configurations/3-25-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/3-25-3.yml b/competition_configurations/3-25-3.yml index 02be56798ace57ff963d8235a9eef3b89c71c52a..cf14115eb973e7cd8d66727ce817aaf60b8a38e8 100644 --- a/competition_configurations/3-25-3.yml +++ b/competition_configurations/3-25-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/3-26-1.yml b/competition_configurations/3-26-1.yml index 3c72fd3c62b0499aadf8a10394bf2e666b838816..020eb0981c0412d02483f282085f35bf62bb6835 100644 --- a/competition_configurations/3-26-1.yml +++ b/competition_configurations/3-26-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/3-26-2.yml b/competition_configurations/3-26-2.yml index 3c72fd3c62b0499aadf8a10394bf2e666b838816..020eb0981c0412d02483f282085f35bf62bb6835 100644 --- a/competition_configurations/3-26-2.yml +++ b/competition_configurations/3-26-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/3-26-3.yml b/competition_configurations/3-26-3.yml index 3c72fd3c62b0499aadf8a10394bf2e666b838816..020eb0981c0412d02483f282085f35bf62bb6835 100644 --- a/competition_configurations/3-26-3.yml +++ b/competition_configurations/3-26-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/3-27-1.yml b/competition_configurations/3-27-1.yml index 9e6653b6a031f04718bad2524d38fef9c3edcfd8..bfa70e7d772d3eaa4aabbad6b55d480e37498e14 100644 --- a/competition_configurations/3-27-1.yml +++ b/competition_configurations/3-27-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/3-27-2.yml b/competition_configurations/3-27-2.yml index 9e6653b6a031f04718bad2524d38fef9c3edcfd8..bfa70e7d772d3eaa4aabbad6b55d480e37498e14 100644 --- a/competition_configurations/3-27-2.yml +++ b/competition_configurations/3-27-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/3-27-3.yml b/competition_configurations/3-27-3.yml index 9e6653b6a031f04718bad2524d38fef9c3edcfd8..bfa70e7d772d3eaa4aabbad6b55d480e37498e14 100644 --- a/competition_configurations/3-27-3.yml +++ b/competition_configurations/3-27-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/3-28-1.yml b/competition_configurations/3-28-1.yml index d526a14dd8f193cbe12b9df8e6819094b5cb9130..5aa1e25f2c975747286a40eb9f6b6a8081a462be 100644 --- a/competition_configurations/3-28-1.yml +++ b/competition_configurations/3-28-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-28-2.yml b/competition_configurations/3-28-2.yml index ddd76143430bc83f769cf935f886a99fb21db215..7ecccb200e0dd3d5101bdc1c78ae1bb2edd2213e 100644 --- a/competition_configurations/3-28-2.yml +++ b/competition_configurations/3-28-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-28-3.yml b/competition_configurations/3-28-3.yml index 9ae9fe0d81eb356faf1c8735c418587627a1eb27..c94ae36c616b9c28bf69bd1512486888294c469b 100644 --- a/competition_configurations/3-28-3.yml +++ b/competition_configurations/3-28-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-29-1.yml b/competition_configurations/3-29-1.yml index 268c94f666e12569fa493b659075cfcc487159b4..aa008a97be0f29c25c308db6596267888aeb64a3 100644 --- a/competition_configurations/3-29-1.yml +++ b/competition_configurations/3-29-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-29-2.yml b/competition_configurations/3-29-2.yml index 87d1d6a8e3d3ef68ecafa313f56efd23537547e9..3073589a9605fe88951a7e0eb8931c5d126661f3 100644 --- a/competition_configurations/3-29-2.yml +++ b/competition_configurations/3-29-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-29-3.yml b/competition_configurations/3-29-3.yml index 614bbebc371b9529278bea46ed073244c9d220aa..41411b3cfa516bd198d564dbf6e2870e82ac1272 100644 --- a/competition_configurations/3-29-3.yml +++ b/competition_configurations/3-29-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-3-1.yml b/competition_configurations/3-3-1.yml index e0172c82e7bfb3f222d64c6a033791de0e606b0b..1bba71a06f1168ed5123d04baa0feec366b85e36 100644 --- a/competition_configurations/3-3-1.yml +++ b/competition_configurations/3-3-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-3-2.yml b/competition_configurations/3-3-2.yml index 774e0b527f703df6ce0bad377dbe5abc5cb60cbc..df6489251c8ca0e59cc45bbc6ceffcb6b10a94b5 100644 --- a/competition_configurations/3-3-2.yml +++ b/competition_configurations/3-3-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-3-3.yml b/competition_configurations/3-3-3.yml index 0f102cf066b632e94867c413e1e4648742f987a6..04dedad0c99fe9a83ef36528af927444c7712adf 100644 --- a/competition_configurations/3-3-3.yml +++ b/competition_configurations/3-3-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-30-1.yml b/competition_configurations/3-30-1.yml index 7dca04627aa0dbceb2ba2b12a3239183e392d5c7..c801aff800d8b00d9fb9846dbb07b34d0b8fc1ba 100644 --- a/competition_configurations/3-30-1.yml +++ b/competition_configurations/3-30-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-30-2.yml b/competition_configurations/3-30-2.yml index 7dca04627aa0dbceb2ba2b12a3239183e392d5c7..c801aff800d8b00d9fb9846dbb07b34d0b8fc1ba 100644 --- a/competition_configurations/3-30-2.yml +++ b/competition_configurations/3-30-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-30-3.yml b/competition_configurations/3-30-3.yml index 7dca04627aa0dbceb2ba2b12a3239183e392d5c7..c801aff800d8b00d9fb9846dbb07b34d0b8fc1ba 100644 --- a/competition_configurations/3-30-3.yml +++ b/competition_configurations/3-30-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-4-1.yml b/competition_configurations/3-4-1.yml index d22193a17035f710583f549d41bd9ab08f07c74c..85ae25d41a9e46be426572ee35ac56df26676d06 100644 --- a/competition_configurations/3-4-1.yml +++ b/competition_configurations/3-4-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-4-2.yml b/competition_configurations/3-4-2.yml index cb87cffbba97a6bafbfd79531f554f5966582fb7..d4009a8e73823a458eca3a762a72410a1034220d 100644 --- a/competition_configurations/3-4-2.yml +++ b/competition_configurations/3-4-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-4-3.yml b/competition_configurations/3-4-3.yml index e12fcf54c47073a261c2b02e9f565452d909d7a4..bc213bc2e5bf235f8e27da5491eefb8fc1c77960 100644 --- a/competition_configurations/3-4-3.yml +++ b/competition_configurations/3-4-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-5-1.yml b/competition_configurations/3-5-1.yml index 108c2b91a3411b7dd2f338c97294e8447fa2234b..39866806d6c09ce8170941c513eae28328afdb19 100644 --- a/competition_configurations/3-5-1.yml +++ b/competition_configurations/3-5-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-5-2.yml b/competition_configurations/3-5-2.yml index 8b59fe9676bb25cb77454d3135ef131878432f78..9dd04a8acd36c7cb073c0c6d0b1c70f162b8b582 100644 --- a/competition_configurations/3-5-2.yml +++ b/competition_configurations/3-5-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-5-3.yml b/competition_configurations/3-5-3.yml index 1abc26364430ce7fe6673bcaaacefcdf8a8473b4..ee08cdcd957332cd3af5bc091a4a31cff82b3020 100644 --- a/competition_configurations/3-5-3.yml +++ b/competition_configurations/3-5-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-6-1.yml b/competition_configurations/3-6-1.yml index 78682b4ebd6471d637982e18c8e581397fc247ad..e309b7eb6ae761481b2d3ef7935ff7545755239e 100644 --- a/competition_configurations/3-6-1.yml +++ b/competition_configurations/3-6-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-6-2.yml b/competition_configurations/3-6-2.yml index 1bfee0492ad7c4ac75b8780485c357b944a455d3..d4da685c4e89013d67685e24c0d15c32618c6334 100644 --- a/competition_configurations/3-6-2.yml +++ b/competition_configurations/3-6-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-6-3.yml b/competition_configurations/3-6-3.yml index 2f4af5b9fdf921c08e3adfde8c80df29dfe03b5b..44e75d51741de999afb73f6c1ba005b121eaf080 100644 --- a/competition_configurations/3-6-3.yml +++ b/competition_configurations/3-6-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-7-1.yml b/competition_configurations/3-7-1.yml index 9467a44fba7f60614929bd92ff991c6c5777467c..2840a54134b8a85d66e5ca12667a879fbcd5ea37 100644 --- a/competition_configurations/3-7-1.yml +++ b/competition_configurations/3-7-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-7-2.yml b/competition_configurations/3-7-2.yml index 06282700222efe8ed455d034dd8cdf1509eb7db2..5d78de513d35bb6700a96b616097e68d51740e55 100644 --- a/competition_configurations/3-7-2.yml +++ b/competition_configurations/3-7-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-7-3.yml b/competition_configurations/3-7-3.yml index 1787843b9c0e227af724d3080f868aaf3d50879a..350fab05702303025b8ceca06f4e59d44971d1c0 100644 --- a/competition_configurations/3-7-3.yml +++ b/competition_configurations/3-7-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-8-1.yml b/competition_configurations/3-8-1.yml index 666070935bcd7d74beb904930409ee4af8c67b0f..27166ff82b3bd06d2792837c47beef87adcee538 100644 --- a/competition_configurations/3-8-1.yml +++ b/competition_configurations/3-8-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-8-2.yml b/competition_configurations/3-8-2.yml index 1aa6ff88f0ec91479d21b09549585077697ac66b..1229b117c9fe4cf0b82f552d5f8ddf6d1085129a 100644 --- a/competition_configurations/3-8-2.yml +++ b/competition_configurations/3-8-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-8-3.yml b/competition_configurations/3-8-3.yml index c45bfeb3953069d4e19bf2d3364f72b95e441eea..4677670f90c8e23f5e222227f766d5e4fb784b5f 100644 --- a/competition_configurations/3-8-3.yml +++ b/competition_configurations/3-8-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-9-1.yml b/competition_configurations/3-9-1.yml index 6e1453139443435f5a63c6c522f5359a168e3412..90d3572d88fd7f06ca8046903bc7788a98afd89d 100644 --- a/competition_configurations/3-9-1.yml +++ b/competition_configurations/3-9-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-9-2.yml b/competition_configurations/3-9-2.yml index 9bd39556545b82224b4f4e90b1b5301d3cbe153d..8c4d4e6f24dae8a567ea207e4380a21c3a91a9f6 100644 --- a/competition_configurations/3-9-2.yml +++ b/competition_configurations/3-9-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/3-9-3.yml b/competition_configurations/3-9-3.yml index 42c91288cf2615dd9fa83e2b9eb0e725ca96a3c2..a91c009a04883fc2774f4db04fe1718b0e8e15d0 100644 --- a/competition_configurations/3-9-3.yml +++ b/competition_configurations/3-9-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-1-1.yml b/competition_configurations/4-1-1.yml index 07adaf0a6ffcb1627cd128de853765365088dc42..3b276dc227324381df6b12c5f17316d82703a9e8 100644 --- a/competition_configurations/4-1-1.yml +++ b/competition_configurations/4-1-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-1-2.yml b/competition_configurations/4-1-2.yml index b6a684924c17a3d40d4d56bf9f58de0a05dd9f05..ffbffba8b6f03b8c73da9fc3c6ca6e16e18a2b59 100644 --- a/competition_configurations/4-1-2.yml +++ b/competition_configurations/4-1-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-1-3.yml b/competition_configurations/4-1-3.yml index 36717e6cee8a05b96d33a48376bd354f1a8b21f1..bb8392e2016df1e926ea09bb21a1aeade08e3761 100644 --- a/competition_configurations/4-1-3.yml +++ b/competition_configurations/4-1-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-10-1.yml b/competition_configurations/4-10-1.yml index 4b964680c90e8562dd02b1268029ebd8878a2919..3d46a051bec2429e6561f57f285fe9e87738752c 100644 --- a/competition_configurations/4-10-1.yml +++ b/competition_configurations/4-10-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0.05 t: 250 items: - !Item diff --git a/competition_configurations/4-10-2.yml b/competition_configurations/4-10-2.yml index 411fd53ccfc3120226231b9a11578d1764049285..da9d80504f717c6cf271a372fc4b657ac8731742 100644 --- a/competition_configurations/4-10-2.yml +++ b/competition_configurations/4-10-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0.05 t: 250 items: - !Item diff --git a/competition_configurations/4-10-3.yml b/competition_configurations/4-10-3.yml index 04009ce975818f2c1a6d9f458e715f0be20ddb7b..23b7ef7e09024fd46a8a8454879ac391ad0f0644 100644 --- a/competition_configurations/4-10-3.yml +++ b/competition_configurations/4-10-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0.05 t: 250 items: - !Item diff --git a/competition_configurations/4-11-1.yml b/competition_configurations/4-11-1.yml index cc9feb1dc749613fed418644d0240ffb1a508632..e919ab1ab4ccc33bd3acee08c8f52ed2efba1b5f 100644 --- a/competition_configurations/4-11-1.yml +++ b/competition_configurations/4-11-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0.05 t: 250 items: - !Item diff --git a/competition_configurations/4-11-2.yml b/competition_configurations/4-11-2.yml index ee3243383e8196afd01e9016e13008725e931ba5..f4c22a6bb05f18b8c9bb306ba1b7a87e7993f8de 100644 --- a/competition_configurations/4-11-2.yml +++ b/competition_configurations/4-11-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0.05 t: 250 items: - !Item diff --git a/competition_configurations/4-11-3.yml b/competition_configurations/4-11-3.yml index d8ba65bb460117c558c462a87b788369a4c3878d..721c010377f1f5135647661523545d8752a34f25 100644 --- a/competition_configurations/4-11-3.yml +++ b/competition_configurations/4-11-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0.05 t: 250 items: - !Item diff --git a/competition_configurations/4-12-1.yml b/competition_configurations/4-12-1.yml index 27977bb1e32353d0ef000e93b75b4589bd3392d6..954e98c851effd66c3ad0245725f800aaaad2f15 100644 --- a/competition_configurations/4-12-1.yml +++ b/competition_configurations/4-12-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-12-2.yml b/competition_configurations/4-12-2.yml index f37017506ff2b550ca3d5909f44fe8b95d9283da..a68bd0049c45522d26763e781497f63a296cd34e 100644 --- a/competition_configurations/4-12-2.yml +++ b/competition_configurations/4-12-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-12-3.yml b/competition_configurations/4-12-3.yml index 44627d1de86dff950d8563886be7c99e6c2508ce..fbf33831a4f67704bbe9082cdb85e04618153370 100644 --- a/competition_configurations/4-12-3.yml +++ b/competition_configurations/4-12-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-13-1.yml b/competition_configurations/4-13-1.yml index da8c8b3cba41c7acb996559d2aa480be534c82ce..f065ab559e26223bd55a6fde7ed1edce6903cdca 100644 --- a/competition_configurations/4-13-1.yml +++ b/competition_configurations/4-13-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-13-2.yml b/competition_configurations/4-13-2.yml index 179f07a3a4077c5a5a7d163bde76879da37fb566..09e0067a9f150c5dfe99383a7db06327cc82bb9b 100644 --- a/competition_configurations/4-13-2.yml +++ b/competition_configurations/4-13-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-13-3.yml b/competition_configurations/4-13-3.yml index 5099621000dc02fc83edbaa1ee77dc36e6029a2d..39c493600046944fcfe0d3d832ca157e865205d7 100644 --- a/competition_configurations/4-13-3.yml +++ b/competition_configurations/4-13-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-14-1.yml b/competition_configurations/4-14-1.yml index b2cacf6d8a1c2d643a9d61d533ffa99625ff8fba..dd501e0139a07b94f057a0dc1725cdd757019fbf 100644 --- a/competition_configurations/4-14-1.yml +++ b/competition_configurations/4-14-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-14-2.yml b/competition_configurations/4-14-2.yml index fe13ebdae16e3e2ae72c9fd37d71d122c1044c0c..9e2b7c1d35fe170352c73645e6987225189745b3 100644 --- a/competition_configurations/4-14-2.yml +++ b/competition_configurations/4-14-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-14-3.yml b/competition_configurations/4-14-3.yml index 516ae9ab6175e8f752f46657705910e20a1fe2a2..4368dc6472db49c35914f99771493ea7dfef04cf 100644 --- a/competition_configurations/4-14-3.yml +++ b/competition_configurations/4-14-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-15-1.yml b/competition_configurations/4-15-1.yml index 8b261ad036064037e6128421254f232273b6589c..4beb633f7b8fc8da40e26b98ea2942a33a270d9f 100644 --- a/competition_configurations/4-15-1.yml +++ b/competition_configurations/4-15-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-15-2.yml b/competition_configurations/4-15-2.yml index 7c18e05c69298d6fbb500eea1e90133685d1a200..324ad8f1394968507d554598997f9dd7b0f9629a 100644 --- a/competition_configurations/4-15-2.yml +++ b/competition_configurations/4-15-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-15-3.yml b/competition_configurations/4-15-3.yml index aada64e6730b826ad1ed20db874c3bef6ae212e9..62532818f9a058eb069d19085472f36eb5dcf8f8 100644 --- a/competition_configurations/4-15-3.yml +++ b/competition_configurations/4-15-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-16-1.yml b/competition_configurations/4-16-1.yml index 9af83ab33c100f8dd336db3fbb3f15a7e5833b53..01709c0069f0233fc1bb3f5e2715bc6ac944ebf4 100644 --- a/competition_configurations/4-16-1.yml +++ b/competition_configurations/4-16-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0.5 t: 250 items: - !Item diff --git a/competition_configurations/4-16-2.yml b/competition_configurations/4-16-2.yml index 1291480401773a06944d5c75f73365d263b419bb..8a10220a8ec15a110d14f4d3d1803990061b6da5 100644 --- a/competition_configurations/4-16-2.yml +++ b/competition_configurations/4-16-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0.5 t: 250 items: - !Item diff --git a/competition_configurations/4-16-3.yml b/competition_configurations/4-16-3.yml index c1b639686ac9a4ffcb6971e75fce85ede8acc06b..7a2b63bd831d2d6edf0c94e65a89ac7705f54c75 100644 --- a/competition_configurations/4-16-3.yml +++ b/competition_configurations/4-16-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0.5 t: 250 items: - !Item diff --git a/competition_configurations/4-17-1.yml b/competition_configurations/4-17-1.yml index 034a6492605001296920ca65d34dd8d78740fe36..fbdb4e10771e915b4648f33f154daf24a8fc9692 100644 --- a/competition_configurations/4-17-1.yml +++ b/competition_configurations/4-17-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0.5 t: 250 items: - !Item diff --git a/competition_configurations/4-17-2.yml b/competition_configurations/4-17-2.yml index c2f905518631006c70b3a9aa595382f2fa8867f1..1c619bf522a7c554145282bba0df17a8b3915050 100644 --- a/competition_configurations/4-17-2.yml +++ b/competition_configurations/4-17-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0.5 t: 250 items: - !Item diff --git a/competition_configurations/4-17-3.yml b/competition_configurations/4-17-3.yml index ed829236f9d38d5bee6dd4c797df342864124621..1353330ab5c44df8f4c71a643f42976f87e70370 100644 --- a/competition_configurations/4-17-3.yml +++ b/competition_configurations/4-17-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0.5 t: 250 items: - !Item diff --git a/competition_configurations/4-18-1.yml b/competition_configurations/4-18-1.yml index f149568b4feab5728f3a38a6cd4de0b86a1e6a50..47dac44281ab5249fca068a2428cbdcf6fbb7894 100644 --- a/competition_configurations/4-18-1.yml +++ b/competition_configurations/4-18-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/4-18-2.yml b/competition_configurations/4-18-2.yml index f663c226a2d02c3894e9fd2f3b0dd27158a4499f..b9476cd65980f7bfd055c81c1bb89025e46bb1ba 100644 --- a/competition_configurations/4-18-2.yml +++ b/competition_configurations/4-18-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/4-18-3.yml b/competition_configurations/4-18-3.yml index c3cabba693d4dae156fb0289a4e6324e8983c70e..89c4fde420865c5c17baa580a2bd4c9968e0b474 100644 --- a/competition_configurations/4-18-3.yml +++ b/competition_configurations/4-18-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/4-19-1.yml b/competition_configurations/4-19-1.yml index 3983c2278d0e57cc56b622531bee049daf1246e1..b0712304f717f1a16e5f6a0fff097a1ff8ba9aef 100644 --- a/competition_configurations/4-19-1.yml +++ b/competition_configurations/4-19-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-19-2.yml b/competition_configurations/4-19-2.yml index 3983c2278d0e57cc56b622531bee049daf1246e1..b0712304f717f1a16e5f6a0fff097a1ff8ba9aef 100644 --- a/competition_configurations/4-19-2.yml +++ b/competition_configurations/4-19-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-19-3.yml b/competition_configurations/4-19-3.yml index 3983c2278d0e57cc56b622531bee049daf1246e1..b0712304f717f1a16e5f6a0fff097a1ff8ba9aef 100644 --- a/competition_configurations/4-19-3.yml +++ b/competition_configurations/4-19-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-2-1.yml b/competition_configurations/4-2-1.yml index 60c5ba73ce868dd5f32431353c3360dba95049e8..5e2229465c2314d8b3a040b0c0fa0ed01f5057e4 100644 --- a/competition_configurations/4-2-1.yml +++ b/competition_configurations/4-2-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-2-2.yml b/competition_configurations/4-2-2.yml index 555d78c28f27b91a7b3f5d7de3d7f5997516c5a6..7aedf077754ccab76810c7d09efe8bfa11438769 100644 --- a/competition_configurations/4-2-2.yml +++ b/competition_configurations/4-2-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-2-3.yml b/competition_configurations/4-2-3.yml index 2ed9ba57b8507df58aca310b3b68059792a5fa11..843a776558807fc32ebe06ce180a6ea5e5e5065c 100644 --- a/competition_configurations/4-2-3.yml +++ b/competition_configurations/4-2-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-20-1.yml b/competition_configurations/4-20-1.yml index c5e351a677fa4e3204cb4b0ce72f04c40904a83d..697954a9056c2f2b41a8320d4ef6b5205a212836 100644 --- a/competition_configurations/4-20-1.yml +++ b/competition_configurations/4-20-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-20-2.yml b/competition_configurations/4-20-2.yml index 17f622afbc6be691ee5d0919df5f5f7db1f02183..7fa12ed529f1e71b33c0f1e1a93708073662e24c 100644 --- a/competition_configurations/4-20-2.yml +++ b/competition_configurations/4-20-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-20-3.yml b/competition_configurations/4-20-3.yml index 5a55ed90d1774171bdaa2b9d6e5afe4d9f9b1029..8ab32591b088c3419123e664620119cb7af7c817 100644 --- a/competition_configurations/4-20-3.yml +++ b/competition_configurations/4-20-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-21-1.yml b/competition_configurations/4-21-1.yml index b101316974ce961967f86bc36ab422c79d481266..e3a9261c22acbe29de5443ef216530ec1b6cf389 100644 --- a/competition_configurations/4-21-1.yml +++ b/competition_configurations/4-21-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-21-2.yml b/competition_configurations/4-21-2.yml index a7f82b3e998397ea99e23e36c92b34f15f2d6d42..a6e5853827d5f1e9f25361e385262c42a98557c4 100644 --- a/competition_configurations/4-21-2.yml +++ b/competition_configurations/4-21-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-21-3.yml b/competition_configurations/4-21-3.yml index 4ea915bb6fcc263b468ec350dca55e7a1d7f9883..0168fa8e77fa59604440a6c5db4d31e6614e153b 100644 --- a/competition_configurations/4-21-3.yml +++ b/competition_configurations/4-21-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-22-1.yml b/competition_configurations/4-22-1.yml index 9f8aa58a49694a8c6c53d86362d757e1d97c5186..cdbcec9af1f3b7dc563977b38d9340ca12dadf9e 100644 --- a/competition_configurations/4-22-1.yml +++ b/competition_configurations/4-22-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-22-2.yml b/competition_configurations/4-22-2.yml index 2d405bef888620c094475f66d84864a77aaa65e2..da8502414e3368e59b78f0f914fac3b894134dda 100644 --- a/competition_configurations/4-22-2.yml +++ b/competition_configurations/4-22-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-22-3.yml b/competition_configurations/4-22-3.yml index d18f3cb36999266ef7a233f88a3baf02c147ce77..11e7f509f064af1454df19bd486083d648c876bf 100644 --- a/competition_configurations/4-22-3.yml +++ b/competition_configurations/4-22-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-23-1.yml b/competition_configurations/4-23-1.yml index 5586dbb3d5f4b28421afe133167c82e280364414..516aa3faf2b7479a17ae1ff749800dd4b554fa60 100644 --- a/competition_configurations/4-23-1.yml +++ b/competition_configurations/4-23-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-23-2.yml b/competition_configurations/4-23-2.yml index d367357a4584e1d402fdfe393420082d2cb3c66e..9e94d9c8f4d77b4f37d86bb9f59f461522bb61f2 100644 --- a/competition_configurations/4-23-2.yml +++ b/competition_configurations/4-23-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-23-3.yml b/competition_configurations/4-23-3.yml index 141028f8278ba68533325fab0589f6fd89fbcdc4..5893de30be78c6ee095057d607a3417169c6f14d 100644 --- a/competition_configurations/4-23-3.yml +++ b/competition_configurations/4-23-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-24-1.yml b/competition_configurations/4-24-1.yml index 4f9581f8487d3565766a8a6d97b103090eb254ab..d5095a2601d45db4bc3446fd1b105689e9a8b95f 100644 --- a/competition_configurations/4-24-1.yml +++ b/competition_configurations/4-24-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-24-2.yml b/competition_configurations/4-24-2.yml index 70120addf69091c52e0f433d1ea8472ec23feeea..8513cd747110a78db3435c8fef88aad773fc5a8a 100644 --- a/competition_configurations/4-24-2.yml +++ b/competition_configurations/4-24-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-24-3.yml b/competition_configurations/4-24-3.yml index 37f1557bba744cd195319e27af4b59754f199150..0e6aff5bf53b26f8ceca464991b5e5356761a4a9 100644 --- a/competition_configurations/4-24-3.yml +++ b/competition_configurations/4-24-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-25-1.yml b/competition_configurations/4-25-1.yml index 789ce0fffef0e81810e549ed1b6b4a8e44d2213a..7938b3c856213b7547e61a3ed7fb7f355f1df955 100644 --- a/competition_configurations/4-25-1.yml +++ b/competition_configurations/4-25-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-25-2.yml b/competition_configurations/4-25-2.yml index b3e40ce505255b052e3ef03b11bccc72e89b157a..f562d09e8708368aa54be57a96b296e9e076d2ff 100644 --- a/competition_configurations/4-25-2.yml +++ b/competition_configurations/4-25-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-25-3.yml b/competition_configurations/4-25-3.yml index 3db537d9bbd0fe112372a621c9dc2bedd6835dfc..62b97b61474e73be4374d136e042060890c88202 100644 --- a/competition_configurations/4-25-3.yml +++ b/competition_configurations/4-25-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-26-1.yml b/competition_configurations/4-26-1.yml index e61a7e01d19d08dc765b6ec8e865dc9e1f252248..66a3f6a180262b40304a9a956dbfb65b13f840f3 100644 --- a/competition_configurations/4-26-1.yml +++ b/competition_configurations/4-26-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-26-2.yml b/competition_configurations/4-26-2.yml index 81ea96dc49865c469332d09a130fe9ba34636a23..1042ee3313d1d4aa93d1caf7a65d5708eb8f6543 100644 --- a/competition_configurations/4-26-2.yml +++ b/competition_configurations/4-26-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-26-3.yml b/competition_configurations/4-26-3.yml index c64507c709ede64f73490eda44f66c3b59bf1021..cfca6c66881a7f7fce2b89f6b897c2c4442c1aae 100644 --- a/competition_configurations/4-26-3.yml +++ b/competition_configurations/4-26-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-27-1.yml b/competition_configurations/4-27-1.yml index dbc062112aa2683095395e99be491be0bd7dc798..e2a64a7b967079c70ba03c799cd6a239d42a0f7b 100644 --- a/competition_configurations/4-27-1.yml +++ b/competition_configurations/4-27-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-27-2.yml b/competition_configurations/4-27-2.yml index 2fc0d37d37338da16cb4e6e5efd8845ba8e06d8f..0a1a58839beefe662ddc7218433fce3c3d44f708 100644 --- a/competition_configurations/4-27-2.yml +++ b/competition_configurations/4-27-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-27-3.yml b/competition_configurations/4-27-3.yml index 8beba3d17bac2c80c58051628b60ec93b5e9bb69..bdd5b719e61fb0abdf33716c3d4c8b8af84be6d9 100644 --- a/competition_configurations/4-27-3.yml +++ b/competition_configurations/4-27-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-28-1.yml b/competition_configurations/4-28-1.yml index 928e0942d0a7d126b5c987e82568a815d04f149a..6842f98243247dddce46a60146b3446d51e0cbf5 100644 --- a/competition_configurations/4-28-1.yml +++ b/competition_configurations/4-28-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -1.1 t: 250 items: - !Item diff --git a/competition_configurations/4-28-2.yml b/competition_configurations/4-28-2.yml index 6ca440922ac7fe5e624009a5de3b56b140f60861..a206e2f1c784e483ed51b6d7b30fca13adc101d0 100644 --- a/competition_configurations/4-28-2.yml +++ b/competition_configurations/4-28-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -1.1 t: 250 items: - !Item diff --git a/competition_configurations/4-28-3.yml b/competition_configurations/4-28-3.yml index 67e76b45e86af872f5e8acb8fe56f81daa4e3e0b..50cce418f557a22d13d339ceee18bc84453785c5 100644 --- a/competition_configurations/4-28-3.yml +++ b/competition_configurations/4-28-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -1.1 t: 250 items: - !Item diff --git a/competition_configurations/4-29-1.yml b/competition_configurations/4-29-1.yml index a0da7ba52d59ffa560af62b754a9c495b262cded..67d3fb1e5c65e3ac26492043718f5667a22c688e 100644 --- a/competition_configurations/4-29-1.yml +++ b/competition_configurations/4-29-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 5 t: 500 items: - !Item diff --git a/competition_configurations/4-29-2.yml b/competition_configurations/4-29-2.yml index a0da7ba52d59ffa560af62b754a9c495b262cded..67d3fb1e5c65e3ac26492043718f5667a22c688e 100644 --- a/competition_configurations/4-29-2.yml +++ b/competition_configurations/4-29-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 5 t: 500 items: - !Item diff --git a/competition_configurations/4-29-3.yml b/competition_configurations/4-29-3.yml index a0da7ba52d59ffa560af62b754a9c495b262cded..67d3fb1e5c65e3ac26492043718f5667a22c688e 100644 --- a/competition_configurations/4-29-3.yml +++ b/competition_configurations/4-29-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 5 t: 500 items: - !Item diff --git a/competition_configurations/4-3-1.yml b/competition_configurations/4-3-1.yml index 494c5a02a0147c2d395134ae4a55f8200681f0f1..87dd0c201bdb7adaf77f44e0d9a97f592b2d90b7 100644 --- a/competition_configurations/4-3-1.yml +++ b/competition_configurations/4-3-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-3-2.yml b/competition_configurations/4-3-2.yml index 181cc70338471d2110b5d33c8748c2a702e89ae9..422bd72d1b2bd622b47035371b3f4750582a1cae 100644 --- a/competition_configurations/4-3-2.yml +++ b/competition_configurations/4-3-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-3-3.yml b/competition_configurations/4-3-3.yml index fa379ea4955bb958fa98fb731720c1770a5a56a0..d396226cbfc46c16dc96cf273438f154d027d521 100644 --- a/competition_configurations/4-3-3.yml +++ b/competition_configurations/4-3-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-30-1.yml b/competition_configurations/4-30-1.yml index 3804253f6af0ef4aab7151ee497e84fa2bba7c4d..cce3bebd8831b9338e90308f292b0add069c9926 100644 --- a/competition_configurations/4-30-1.yml +++ b/competition_configurations/4-30-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-30-2.yml b/competition_configurations/4-30-2.yml index 2b588d75dd4b9714b9535975c10a4c95106c6624..1cc41bad17a4a9643faf0b857f5f913d24e1d045 100644 --- a/competition_configurations/4-30-2.yml +++ b/competition_configurations/4-30-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-30-3.yml b/competition_configurations/4-30-3.yml index 2b0b5c8eda7b51621b2d494776589d69615fe1f2..ec4ef959f90b155d35b283ed124f1451aeddb02b 100644 --- a/competition_configurations/4-30-3.yml +++ b/competition_configurations/4-30-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-4-1.yml b/competition_configurations/4-4-1.yml index bcdc1040f636d05c7d285309314c51fa5dc77cd5..94b16ea48b8da1505414995c516493e516620c7f 100644 --- a/competition_configurations/4-4-1.yml +++ b/competition_configurations/4-4-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.99 t: 250 items: - !Item diff --git a/competition_configurations/4-4-2.yml b/competition_configurations/4-4-2.yml index 2f7691612f84487033d0d278bed59cc4b5b9ec0c..a5d06ac6d33ef8fdf6a58f2584d881537912b3a9 100644 --- a/competition_configurations/4-4-2.yml +++ b/competition_configurations/4-4-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.99 t: 250 items: - !Item diff --git a/competition_configurations/4-4-3.yml b/competition_configurations/4-4-3.yml index 2ef1cd0714e552c3818fd21f14e74f49d6bd4d5f..43a3a5b81c852089e7417a8bf9f26ad17586bb90 100644 --- a/competition_configurations/4-4-3.yml +++ b/competition_configurations/4-4-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.99 t: 250 items: - !Item diff --git a/competition_configurations/4-5-1.yml b/competition_configurations/4-5-1.yml index a88ea8d7ab8dda56bf858b57c84e6d0920ff3105..247f22ae60c6b1ad24aa943a5d18110f3b6aeb06 100644 --- a/competition_configurations/4-5-1.yml +++ b/competition_configurations/4-5-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-5-2.yml b/competition_configurations/4-5-2.yml index 163aff842e1b69255cdd6ba410e070d5e986604a..d86bb7357085426277ecb9609d692b822656043b 100644 --- a/competition_configurations/4-5-2.yml +++ b/competition_configurations/4-5-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-5-3.yml b/competition_configurations/4-5-3.yml index d36064c5d519f21e0aee0fa2fd1bdc42743257ec..663e0f6635d9039aeef2413a1c49d44e4431dd7e 100644 --- a/competition_configurations/4-5-3.yml +++ b/competition_configurations/4-5-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/4-6-1.yml b/competition_configurations/4-6-1.yml index ce8e853f766a8db0a2f5332fb7907d6c641ed18d..390f8d0964106a959782d216c39751e08559941c 100644 --- a/competition_configurations/4-6-1.yml +++ b/competition_configurations/4-6-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.99 t: 250 items: - !Item diff --git a/competition_configurations/4-6-2.yml b/competition_configurations/4-6-2.yml index abc3b04c60840e6a66c1cb3a8050fb2eeb369c75..3b2f4682c590271ee744372ef369d56d788b499f 100644 --- a/competition_configurations/4-6-2.yml +++ b/competition_configurations/4-6-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.99 t: 250 items: - !Item diff --git a/competition_configurations/4-6-3.yml b/competition_configurations/4-6-3.yml index b60176c65f3d052f9649c25960f84d59d9be6097..751ff6cf7ede772f2f1d101750f5c29d67df64a5 100644 --- a/competition_configurations/4-6-3.yml +++ b/competition_configurations/4-6-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.99 t: 250 items: - !Item diff --git a/competition_configurations/4-7-1.yml b/competition_configurations/4-7-1.yml index fb7277235c8bdbe3b2766bafc5782d4eae81ddc4..087e1a1d4ccba30c09b31eb4f0d2076dbfedfdb8 100644 --- a/competition_configurations/4-7-1.yml +++ b/competition_configurations/4-7-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0.15 t: 250 items: - !Item diff --git a/competition_configurations/4-7-2.yml b/competition_configurations/4-7-2.yml index ac61bbebd3beeb4eb14272811d6bc9fbbff94854..abcadebcd15f342b5f1c1980ce5a4259b891ede5 100644 --- a/competition_configurations/4-7-2.yml +++ b/competition_configurations/4-7-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0.15 t: 250 items: - !Item diff --git a/competition_configurations/4-7-3.yml b/competition_configurations/4-7-3.yml index 76b7cd26da19b057f70c007032a4fef534d15349..dfdc2cad38336878d2189101a5d58297f36307d0 100644 --- a/competition_configurations/4-7-3.yml +++ b/competition_configurations/4-7-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0.15 t: 250 items: - !Item diff --git a/competition_configurations/4-8-1.yml b/competition_configurations/4-8-1.yml index 7d74d59166c14ae8b8841c9e1e86da0edf6d98cc..59619401b8c15a39bd3d8e9f98d6cf9e465b2a0e 100644 --- a/competition_configurations/4-8-1.yml +++ b/competition_configurations/4-8-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0.15 t: 250 items: - !Item diff --git a/competition_configurations/4-8-2.yml b/competition_configurations/4-8-2.yml index 70eec01a8011f5a0e83ee0f5d59f6a0abb12a009..d34be39d384f053b538c458c6902a02dbefc659b 100644 --- a/competition_configurations/4-8-2.yml +++ b/competition_configurations/4-8-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0.15 t: 250 items: - !Item diff --git a/competition_configurations/4-8-3.yml b/competition_configurations/4-8-3.yml index a0a5f22f7a9ffee26603ebf4b813b433f1a4f15f..074a3a347d4891da3d4ccc286ef8374f6dcffe51 100644 --- a/competition_configurations/4-8-3.yml +++ b/competition_configurations/4-8-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0.15 t: 250 items: - !Item diff --git a/competition_configurations/4-9-1.yml b/competition_configurations/4-9-1.yml index 05f209d2b80a8e0cca818ff3b2e3a0a02b84067e..8ad63dd8a2957a9e7743bddd9a04fc8ea1960881 100644 --- a/competition_configurations/4-9-1.yml +++ b/competition_configurations/4-9-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0.2 t: 250 items: - !Item diff --git a/competition_configurations/4-9-2.yml b/competition_configurations/4-9-2.yml index 010eedeba8f82e03b0ff099aa57453651ee0b604..204fc4795232173da5908a1a418cef12b2262e05 100644 --- a/competition_configurations/4-9-2.yml +++ b/competition_configurations/4-9-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0.2 t: 250 items: - !Item diff --git a/competition_configurations/4-9-3.yml b/competition_configurations/4-9-3.yml index 924ce6f13938599d5f4c23f81ee43a2bf4df22f8..2b59ac0dc91ab56bc5779d1a63f0ee2833c92851 100644 --- a/competition_configurations/4-9-3.yml +++ b/competition_configurations/4-9-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0.2 t: 250 items: - !Item diff --git a/competition_configurations/5-1-1.yml b/competition_configurations/5-1-1.yml index ba3d1984b0f6c33c8d1c7531ac1eed5771c2de9b..78e3fd9eb74b019c81973a4318cc66074caa7d47 100644 --- a/competition_configurations/5-1-1.yml +++ b/competition_configurations/5-1-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-1-2.yml b/competition_configurations/5-1-2.yml index ba3d1984b0f6c33c8d1c7531ac1eed5771c2de9b..78e3fd9eb74b019c81973a4318cc66074caa7d47 100644 --- a/competition_configurations/5-1-2.yml +++ b/competition_configurations/5-1-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-1-3.yml b/competition_configurations/5-1-3.yml index ba3d1984b0f6c33c8d1c7531ac1eed5771c2de9b..78e3fd9eb74b019c81973a4318cc66074caa7d47 100644 --- a/competition_configurations/5-1-3.yml +++ b/competition_configurations/5-1-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-10-1.yml b/competition_configurations/5-10-1.yml index 7f81a85050d6130c6a8bc53ccaedbafc9c2b52d8..c97576d746e95a8bf5bd991ae1ca99f688b38622 100644 --- a/competition_configurations/5-10-1.yml +++ b/competition_configurations/5-10-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-10-2.yml b/competition_configurations/5-10-2.yml index f81c3df900ae460c1e278c22f2e8e2cd25e650c6..ae024fc679912fb4a81ae1fc882b2dbed2655894 100644 --- a/competition_configurations/5-10-2.yml +++ b/competition_configurations/5-10-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-10-3.yml b/competition_configurations/5-10-3.yml index ad9f6fbb98ef283c38e7910c1cf37b9fd10d2467..5ca79ba94082c9492d8ce48054db920beec0fbb3 100644 --- a/competition_configurations/5-10-3.yml +++ b/competition_configurations/5-10-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-11-1.yml b/competition_configurations/5-11-1.yml index 55184be54b9fdecae45c3a02aaae00966457c0e3..82b1ac9ea77a0d5f93b7e7f0941f9719e588218d 100644 --- a/competition_configurations/5-11-1.yml +++ b/competition_configurations/5-11-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-11-2.yml b/competition_configurations/5-11-2.yml index 26435803a88b28ddd4b50b9f0adbe64708ea812d..1b598deb5734cfdc07f3dfcc1acee9329d6c4086 100644 --- a/competition_configurations/5-11-2.yml +++ b/competition_configurations/5-11-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-11-3.yml b/competition_configurations/5-11-3.yml index b78c3eb7f71fbaf0f98aeb8c11331f61f2531e81..3ae834107ba89493009e2cefed5c6e5a26bc20b3 100644 --- a/competition_configurations/5-11-3.yml +++ b/competition_configurations/5-11-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-12-1.yml b/competition_configurations/5-12-1.yml index 1e03d1f2e6121b4eef8cd3263266a7616777c64e..ac19f0e91c665339d0f10ccbd324ba09a5e97926 100644 --- a/competition_configurations/5-12-1.yml +++ b/competition_configurations/5-12-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-12-2.yml b/competition_configurations/5-12-2.yml index 545b359c57690052de912125bd56bbebbc3f5a57..6ffc3d1179e4c435a6e6e6dd6d7a15e38e2f1e5f 100644 --- a/competition_configurations/5-12-2.yml +++ b/competition_configurations/5-12-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-12-3.yml b/competition_configurations/5-12-3.yml index d2eb6767eaaea8ceea628423fb028d03c2fbf5f9..3d1ce1d7836ce00922ec58afcff42e86c58384c1 100644 --- a/competition_configurations/5-12-3.yml +++ b/competition_configurations/5-12-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-13-1.yml b/competition_configurations/5-13-1.yml index 5844560d448dea0d1b8da4368e33b4511e92bd08..46f78c7da2743660a9a1986c258d7d11142cf735 100644 --- a/competition_configurations/5-13-1.yml +++ b/competition_configurations/5-13-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-13-2.yml b/competition_configurations/5-13-2.yml index 5844560d448dea0d1b8da4368e33b4511e92bd08..46f78c7da2743660a9a1986c258d7d11142cf735 100644 --- a/competition_configurations/5-13-2.yml +++ b/competition_configurations/5-13-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-13-3.yml b/competition_configurations/5-13-3.yml index 5844560d448dea0d1b8da4368e33b4511e92bd08..46f78c7da2743660a9a1986c258d7d11142cf735 100644 --- a/competition_configurations/5-13-3.yml +++ b/competition_configurations/5-13-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-14-1.yml b/competition_configurations/5-14-1.yml index 273c519985da32479f5d79cca14fa072209e38fb..0d0db133cfb14864802b418759a834a7e73d63fb 100644 --- a/competition_configurations/5-14-1.yml +++ b/competition_configurations/5-14-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.5 t: 250 items: - !Item diff --git a/competition_configurations/5-14-2.yml b/competition_configurations/5-14-2.yml index 273c519985da32479f5d79cca14fa072209e38fb..0d0db133cfb14864802b418759a834a7e73d63fb 100644 --- a/competition_configurations/5-14-2.yml +++ b/competition_configurations/5-14-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.5 t: 250 items: - !Item diff --git a/competition_configurations/5-14-3.yml b/competition_configurations/5-14-3.yml index 273c519985da32479f5d79cca14fa072209e38fb..0d0db133cfb14864802b418759a834a7e73d63fb 100644 --- a/competition_configurations/5-14-3.yml +++ b/competition_configurations/5-14-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: -0.5 t: 250 items: - !Item diff --git a/competition_configurations/5-15-1.yml b/competition_configurations/5-15-1.yml index 55cff56716212a2a5a0199aea286421c9467a511..97b52d9f6726619acca9b9711998e6f2407278d4 100644 --- a/competition_configurations/5-15-1.yml +++ b/competition_configurations/5-15-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/5-15-2.yml b/competition_configurations/5-15-2.yml index 55cff56716212a2a5a0199aea286421c9467a511..97b52d9f6726619acca9b9711998e6f2407278d4 100644 --- a/competition_configurations/5-15-2.yml +++ b/competition_configurations/5-15-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/5-15-3.yml b/competition_configurations/5-15-3.yml index 55cff56716212a2a5a0199aea286421c9467a511..97b52d9f6726619acca9b9711998e6f2407278d4 100644 --- a/competition_configurations/5-15-3.yml +++ b/competition_configurations/5-15-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/5-16-1.yml b/competition_configurations/5-16-1.yml index e3daab75d2311ea2e50da41e2dc84ae8e4fc750f..2333d809e0a7be12bbe50a00f12da1cb7543fa5e 100644 --- a/competition_configurations/5-16-1.yml +++ b/competition_configurations/5-16-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-16-2.yml b/competition_configurations/5-16-2.yml index 1a4e2ecad027efc3fb54b3807bc5f1241b4c8e55..59b70c52aaf6604ddfab2d8ffdd2a7508c20a68b 100644 --- a/competition_configurations/5-16-2.yml +++ b/competition_configurations/5-16-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-16-3.yml b/competition_configurations/5-16-3.yml index 1a2f2b9e05cabd7c96701c81dd41f5190245f860..970649d8866ff74ce7455d44cae9ab0df7c5c17a 100644 --- a/competition_configurations/5-16-3.yml +++ b/competition_configurations/5-16-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-17-1.yml b/competition_configurations/5-17-1.yml index 6cf9a264872b407be7aae46645417ff008ba063d..10534a78a806537f75ddc3286f8dc3716e6789c4 100644 --- a/competition_configurations/5-17-1.yml +++ b/competition_configurations/5-17-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-17-2.yml b/competition_configurations/5-17-2.yml index 83487cc98ce4475dd4226a9328e91a13aa3ae9ae..529e4b4d3332ebf22862bbf972b79270776171cb 100644 --- a/competition_configurations/5-17-2.yml +++ b/competition_configurations/5-17-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-17-3.yml b/competition_configurations/5-17-3.yml index 6651cf5ec11a759bc96456ef61c16cb10eea88bf..e4bf3d62aa8bf5fbbb6b6cb341dd04521a5bd142 100644 --- a/competition_configurations/5-17-3.yml +++ b/competition_configurations/5-17-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-18-1.yml b/competition_configurations/5-18-1.yml index dc199f2ee805447102ac92efc36cdcdb2117531b..4ffd12fce813c52c0a50a82e9b958d2cdedd11aa 100644 --- a/competition_configurations/5-18-1.yml +++ b/competition_configurations/5-18-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-18-2.yml b/competition_configurations/5-18-2.yml index 608936820369cf342db98c1051f237968e0259e6..63871e074737bd79e88af24d08683686e221c93b 100644 --- a/competition_configurations/5-18-2.yml +++ b/competition_configurations/5-18-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-18-3.yml b/competition_configurations/5-18-3.yml index e619fc73d8fa26499e933b766805d506d1d259a6..1839e0e536b472bd5481b6fc0e5559130ce1f28e 100644 --- a/competition_configurations/5-18-3.yml +++ b/competition_configurations/5-18-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-19-1.yml b/competition_configurations/5-19-1.yml index ea3729f2e33d07f8f89dba21f05435ec2b27bd68..31ef831a52c76466924ff9f30fea11157968478a 100644 --- a/competition_configurations/5-19-1.yml +++ b/competition_configurations/5-19-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-19-2.yml b/competition_configurations/5-19-2.yml index fbdaa32c4c06e41bfac4f18e4b313e4b5be3d5f3..fedbadd150aecae98f937bc6def6a137302b7b3c 100644 --- a/competition_configurations/5-19-2.yml +++ b/competition_configurations/5-19-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-19-3.yml b/competition_configurations/5-19-3.yml index 2827343e48d878391d51d398c912f0e7f4ea1439..8ba59058e58b01a3ec65aad0e06f0a54766ed7ec 100644 --- a/competition_configurations/5-19-3.yml +++ b/competition_configurations/5-19-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-2-1.yml b/competition_configurations/5-2-1.yml index 0db609fc00ab7ac7155bc19894597161f35fa2cd..d4a3cb1469d38483e035ded502caf0fa334fb7bb 100644 --- a/competition_configurations/5-2-1.yml +++ b/competition_configurations/5-2-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-2-2.yml b/competition_configurations/5-2-2.yml index 0db609fc00ab7ac7155bc19894597161f35fa2cd..d4a3cb1469d38483e035ded502caf0fa334fb7bb 100644 --- a/competition_configurations/5-2-2.yml +++ b/competition_configurations/5-2-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-2-3.yml b/competition_configurations/5-2-3.yml index 0db609fc00ab7ac7155bc19894597161f35fa2cd..d4a3cb1469d38483e035ded502caf0fa334fb7bb 100644 --- a/competition_configurations/5-2-3.yml +++ b/competition_configurations/5-2-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-20-1.yml b/competition_configurations/5-20-1.yml index 4a039c67da322f99444205a32ed8f660d7611dde..dd78895e50daa70225578217e3e9bc7dc9b57499 100644 --- a/competition_configurations/5-20-1.yml +++ b/competition_configurations/5-20-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-20-2.yml b/competition_configurations/5-20-2.yml index 23dcb96b0c55a64d41afccc57f6cc297e304e30f..49dcc4cded552f1dcb2fc617d8fdb4ac50106d8c 100644 --- a/competition_configurations/5-20-2.yml +++ b/competition_configurations/5-20-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-20-3.yml b/competition_configurations/5-20-3.yml index ca728278f2d7b0b2d1cc9e57e20bb80e684b5076..150d53cc130214faec93549185fdd5441dbb9ffc 100644 --- a/competition_configurations/5-20-3.yml +++ b/competition_configurations/5-20-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-21-1.yml b/competition_configurations/5-21-1.yml index 545ef182eefafa37285f7db90886eee787c43930..19132804d46680f1df4ee3bb3b95018d91611267 100644 --- a/competition_configurations/5-21-1.yml +++ b/competition_configurations/5-21-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-21-2.yml b/competition_configurations/5-21-2.yml index 08db47b3b6512a5d971f71a5ecfb861faab2f9c9..92a5dc452b00c2bc1bebeb8515f1a385c8de18e9 100644 --- a/competition_configurations/5-21-2.yml +++ b/competition_configurations/5-21-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-21-3.yml b/competition_configurations/5-21-3.yml index ade2bb3a201ca1242f581c26fd0705c53ded859f..9979ec30b5b284e8af8293ab55664af165d9c974 100644 --- a/competition_configurations/5-21-3.yml +++ b/competition_configurations/5-21-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-22-1.yml b/competition_configurations/5-22-1.yml index fa1eead0bc736430bc6e61233dc7a9b32efafd96..3ea6ae01a93988bd9fa82b303967bfabbecc9586 100644 --- a/competition_configurations/5-22-1.yml +++ b/competition_configurations/5-22-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/5-22-2.yml b/competition_configurations/5-22-2.yml index fa1eead0bc736430bc6e61233dc7a9b32efafd96..3ea6ae01a93988bd9fa82b303967bfabbecc9586 100644 --- a/competition_configurations/5-22-2.yml +++ b/competition_configurations/5-22-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/5-22-3.yml b/competition_configurations/5-22-3.yml index fa1eead0bc736430bc6e61233dc7a9b32efafd96..3ea6ae01a93988bd9fa82b303967bfabbecc9586 100644 --- a/competition_configurations/5-22-3.yml +++ b/competition_configurations/5-22-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/5-23-1.yml b/competition_configurations/5-23-1.yml index ed69c2eb99d5df3d000d901294103f853087b82e..6e11d06fb900188513657b35dcc9ac2d9216586a 100644 --- a/competition_configurations/5-23-1.yml +++ b/competition_configurations/5-23-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/5-23-2.yml b/competition_configurations/5-23-2.yml index ed69c2eb99d5df3d000d901294103f853087b82e..6e11d06fb900188513657b35dcc9ac2d9216586a 100644 --- a/competition_configurations/5-23-2.yml +++ b/competition_configurations/5-23-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/5-23-3.yml b/competition_configurations/5-23-3.yml index ed69c2eb99d5df3d000d901294103f853087b82e..6e11d06fb900188513657b35dcc9ac2d9216586a 100644 --- a/competition_configurations/5-23-3.yml +++ b/competition_configurations/5-23-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/5-24-1.yml b/competition_configurations/5-24-1.yml index fa82a4c5acf5006b4f5ce71ce1d06a5a3c8a1a07..341dd380d2a382cd85470f2cf5a342af93e8ae46 100644 --- a/competition_configurations/5-24-1.yml +++ b/competition_configurations/5-24-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 500 items: - !Item diff --git a/competition_configurations/5-24-2.yml b/competition_configurations/5-24-2.yml index fa82a4c5acf5006b4f5ce71ce1d06a5a3c8a1a07..341dd380d2a382cd85470f2cf5a342af93e8ae46 100644 --- a/competition_configurations/5-24-2.yml +++ b/competition_configurations/5-24-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 500 items: - !Item diff --git a/competition_configurations/5-24-3.yml b/competition_configurations/5-24-3.yml index fa82a4c5acf5006b4f5ce71ce1d06a5a3c8a1a07..341dd380d2a382cd85470f2cf5a342af93e8ae46 100644 --- a/competition_configurations/5-24-3.yml +++ b/competition_configurations/5-24-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 500 items: - !Item diff --git a/competition_configurations/5-25-1.yml b/competition_configurations/5-25-1.yml index ed905600884f6ddf1cff51a8ac92e0a5f81489c7..0947e91548379bc0d257c60a89d635d684c78701 100644 --- a/competition_configurations/5-25-1.yml +++ b/competition_configurations/5-25-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 500 items: - !Item diff --git a/competition_configurations/5-25-2.yml b/competition_configurations/5-25-2.yml index ed905600884f6ddf1cff51a8ac92e0a5f81489c7..0947e91548379bc0d257c60a89d635d684c78701 100644 --- a/competition_configurations/5-25-2.yml +++ b/competition_configurations/5-25-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 500 items: - !Item diff --git a/competition_configurations/5-25-3.yml b/competition_configurations/5-25-3.yml index ed905600884f6ddf1cff51a8ac92e0a5f81489c7..0947e91548379bc0d257c60a89d635d684c78701 100644 --- a/competition_configurations/5-25-3.yml +++ b/competition_configurations/5-25-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 500 items: - !Item diff --git a/competition_configurations/5-26-1.yml b/competition_configurations/5-26-1.yml index f294adb68d4c8ea44f6d06bced4f18746065a587..4682df552543857724c25b2ce46e6d4c638d7296 100644 --- a/competition_configurations/5-26-1.yml +++ b/competition_configurations/5-26-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 5 t: 1000 items: - !Item diff --git a/competition_configurations/5-26-2.yml b/competition_configurations/5-26-2.yml index f294adb68d4c8ea44f6d06bced4f18746065a587..4682df552543857724c25b2ce46e6d4c638d7296 100644 --- a/competition_configurations/5-26-2.yml +++ b/competition_configurations/5-26-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 5 t: 1000 items: - !Item diff --git a/competition_configurations/5-26-3.yml b/competition_configurations/5-26-3.yml index f294adb68d4c8ea44f6d06bced4f18746065a587..4682df552543857724c25b2ce46e6d4c638d7296 100644 --- a/competition_configurations/5-26-3.yml +++ b/competition_configurations/5-26-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 5 t: 1000 items: - !Item diff --git a/competition_configurations/5-27-1.yml b/competition_configurations/5-27-1.yml index 4b0553e3c333d5d5eb95825cb7b21d8e7a72d3df..2407271b13ae090a29896103e04e7be269598438 100644 --- a/competition_configurations/5-27-1.yml +++ b/competition_configurations/5-27-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 5 t: 1000 items: - !Item diff --git a/competition_configurations/5-27-2.yml b/competition_configurations/5-27-2.yml index 4b0553e3c333d5d5eb95825cb7b21d8e7a72d3df..2407271b13ae090a29896103e04e7be269598438 100644 --- a/competition_configurations/5-27-2.yml +++ b/competition_configurations/5-27-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 5 t: 1000 items: - !Item diff --git a/competition_configurations/5-27-3.yml b/competition_configurations/5-27-3.yml index 4b0553e3c333d5d5eb95825cb7b21d8e7a72d3df..2407271b13ae090a29896103e04e7be269598438 100644 --- a/competition_configurations/5-27-3.yml +++ b/competition_configurations/5-27-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 5 t: 1000 items: - !Item diff --git a/competition_configurations/5-28-1.yml b/competition_configurations/5-28-1.yml index 60201ebc82589f804c5d34918d14e3da2a826c82..daa4aa718b5ff8109fec8888dc5d265f4ffe5db2 100644 --- a/competition_configurations/5-28-1.yml +++ b/competition_configurations/5-28-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 7 t: 1000 items: - !Item diff --git a/competition_configurations/5-28-2.yml b/competition_configurations/5-28-2.yml index 60201ebc82589f804c5d34918d14e3da2a826c82..daa4aa718b5ff8109fec8888dc5d265f4ffe5db2 100644 --- a/competition_configurations/5-28-2.yml +++ b/competition_configurations/5-28-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 7 t: 1000 items: - !Item diff --git a/competition_configurations/5-28-3.yml b/competition_configurations/5-28-3.yml index 60201ebc82589f804c5d34918d14e3da2a826c82..daa4aa718b5ff8109fec8888dc5d265f4ffe5db2 100644 --- a/competition_configurations/5-28-3.yml +++ b/competition_configurations/5-28-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 7 t: 1000 items: - !Item diff --git a/competition_configurations/5-29-1.yml b/competition_configurations/5-29-1.yml index f2187d785626b4827bcc90c929bc92538e51ccb9..fa1b04611222d4dc60d7d32200324479b1891c7b 100644 --- a/competition_configurations/5-29-1.yml +++ b/competition_configurations/5-29-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 7 t: 1000 items: - !Item diff --git a/competition_configurations/5-29-2.yml b/competition_configurations/5-29-2.yml index f2187d785626b4827bcc90c929bc92538e51ccb9..fa1b04611222d4dc60d7d32200324479b1891c7b 100644 --- a/competition_configurations/5-29-2.yml +++ b/competition_configurations/5-29-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 7 t: 1000 items: - !Item diff --git a/competition_configurations/5-29-3.yml b/competition_configurations/5-29-3.yml index f2187d785626b4827bcc90c929bc92538e51ccb9..fa1b04611222d4dc60d7d32200324479b1891c7b 100644 --- a/competition_configurations/5-29-3.yml +++ b/competition_configurations/5-29-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 7 t: 1000 items: - !Item diff --git a/competition_configurations/5-3-1.yml b/competition_configurations/5-3-1.yml index 7dcdc9e0dadcbc4a91db489f17b080ed42eb405e..eea534a1228d9943bb461c3895d0eaf4412fe7b9 100644 --- a/competition_configurations/5-3-1.yml +++ b/competition_configurations/5-3-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/5-3-2.yml b/competition_configurations/5-3-2.yml index 7dcdc9e0dadcbc4a91db489f17b080ed42eb405e..eea534a1228d9943bb461c3895d0eaf4412fe7b9 100644 --- a/competition_configurations/5-3-2.yml +++ b/competition_configurations/5-3-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/5-3-3.yml b/competition_configurations/5-3-3.yml index 7dcdc9e0dadcbc4a91db489f17b080ed42eb405e..eea534a1228d9943bb461c3895d0eaf4412fe7b9 100644 --- a/competition_configurations/5-3-3.yml +++ b/competition_configurations/5-3-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/5-30-1.yml b/competition_configurations/5-30-1.yml index e0ba1c419505fe8d3d203d30ae3c770b6cd3d61d..f2e6daac9759661c059f97239de3d55d721f151e 100644 --- a/competition_configurations/5-30-1.yml +++ b/competition_configurations/5-30-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 7 t: 1000 items: - !Item diff --git a/competition_configurations/5-30-2.yml b/competition_configurations/5-30-2.yml index e0ba1c419505fe8d3d203d30ae3c770b6cd3d61d..f2e6daac9759661c059f97239de3d55d721f151e 100644 --- a/competition_configurations/5-30-2.yml +++ b/competition_configurations/5-30-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 7 t: 1000 items: - !Item diff --git a/competition_configurations/5-30-3.yml b/competition_configurations/5-30-3.yml index e0ba1c419505fe8d3d203d30ae3c770b6cd3d61d..f2e6daac9759661c059f97239de3d55d721f151e 100644 --- a/competition_configurations/5-30-3.yml +++ b/competition_configurations/5-30-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 7 t: 1000 items: - !Item diff --git a/competition_configurations/5-4-1.yml b/competition_configurations/5-4-1.yml index 9213f9bb4e6a60d3ff587aa96d89ed6141681611..d22ea199294abf1c86536f99e5dfeb2f95a14496 100644 --- a/competition_configurations/5-4-1.yml +++ b/competition_configurations/5-4-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-4-2.yml b/competition_configurations/5-4-2.yml index 997286f04dc6c6f95197445209688bbdac82c99a..44bb32f69a988a6579baa54c2c1ed824943a48f1 100644 --- a/competition_configurations/5-4-2.yml +++ b/competition_configurations/5-4-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-4-3.yml b/competition_configurations/5-4-3.yml index f8395d7c19dc89567032e772936b714972ebf4fc..532b0a0c6a0e078e4928339e09ec55d9294978bf 100644 --- a/competition_configurations/5-4-3.yml +++ b/competition_configurations/5-4-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-5-1.yml b/competition_configurations/5-5-1.yml index 84d7f769f43ab57a9b7086c7c4e44c9470b43f4b..89f0193f4bb484939327202b0ccef6189c0f793b 100644 --- a/competition_configurations/5-5-1.yml +++ b/competition_configurations/5-5-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-5-2.yml b/competition_configurations/5-5-2.yml index 313419a99cb6bef3b95bf82387994cb924cb9005..6d8ea39ebc0912813df93283f4d9defbd7c18083 100644 --- a/competition_configurations/5-5-2.yml +++ b/competition_configurations/5-5-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-5-3.yml b/competition_configurations/5-5-3.yml index e3c2876dbc61ac98e3eb46c39c2fc38f3ba7e33b..8c3978d0dceb78baa23f75389c20333955a95540 100644 --- a/competition_configurations/5-5-3.yml +++ b/competition_configurations/5-5-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-6-1.yml b/competition_configurations/5-6-1.yml index 3f9b538102bac1245d56efd7665da5811e7139b5..5d92dbcca6b47e010b30b68c62b5436c2934e73e 100644 --- a/competition_configurations/5-6-1.yml +++ b/competition_configurations/5-6-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-6-2.yml b/competition_configurations/5-6-2.yml index 8b3bd37477a636e36db4e8bc98a8884b506d531e..1a7f37c300d381bc0a5c5a867e232d81bd591a8d 100644 --- a/competition_configurations/5-6-2.yml +++ b/competition_configurations/5-6-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-6-3.yml b/competition_configurations/5-6-3.yml index 0df360688d19694107702e0beb4c77c38776e014..01bd18ed05a1b6bde62ae8928ae7c8f70ff44624 100644 --- a/competition_configurations/5-6-3.yml +++ b/competition_configurations/5-6-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 items: - !Item diff --git a/competition_configurations/5-7-1.yml b/competition_configurations/5-7-1.yml index 56fda17aed603dac7ae86bc0e743101094fd964e..15b59eb2b995e1d3cf11d2247f0aa228d99ebddd 100644 --- a/competition_configurations/5-7-1.yml +++ b/competition_configurations/5-7-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-7-2.yml b/competition_configurations/5-7-2.yml index 966f7800f53c026be3ba315f1f626fd0477a1e7d..3dba30bcb4d6162b0ccf817bfa02166e32cee5c9 100644 --- a/competition_configurations/5-7-2.yml +++ b/competition_configurations/5-7-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-7-3.yml b/competition_configurations/5-7-3.yml index c7c2542aa539e5bcc47fe279d473de9bbfb1b61b..e69bfb421955037acd83786969f120fbcd90011d 100644 --- a/competition_configurations/5-7-3.yml +++ b/competition_configurations/5-7-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-8-1.yml b/competition_configurations/5-8-1.yml index 662bbef4d41f84f8cb28d36f772b0d168983d110..7e063c2c9794e8f474f40a80e7b7ebc201aadfb1 100644 --- a/competition_configurations/5-8-1.yml +++ b/competition_configurations/5-8-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-8-2.yml b/competition_configurations/5-8-2.yml index 1ed2f00becbd6d86787d2a3f79310ff8382d853d..41c6a64cda01f20d5c956154fac6213f668f9394 100644 --- a/competition_configurations/5-8-2.yml +++ b/competition_configurations/5-8-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-8-3.yml b/competition_configurations/5-8-3.yml index 124978fc664f159ae0cea7e6988bae723e3e9d60..91c91454554e2ba267fed96400733e071f0fbd7a 100644 --- a/competition_configurations/5-8-3.yml +++ b/competition_configurations/5-8-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-9-1.yml b/competition_configurations/5-9-1.yml index 4bb164017b7c4865a6f26bdf28684825956dbaba..ed248e1107e0b71c6c96860ec0032b8ebf32fd4c 100644 --- a/competition_configurations/5-9-1.yml +++ b/competition_configurations/5-9-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-9-2.yml b/competition_configurations/5-9-2.yml index ca83cfbb8e281cea54e09bd33c50e1ae914fe717..175bf005b35104fd1c10ebcf0e5dea31be42e8c3 100644 --- a/competition_configurations/5-9-2.yml +++ b/competition_configurations/5-9-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/5-9-3.yml b/competition_configurations/5-9-3.yml index 6f61fa8a0b2eaceb2a0fae5809580ded5b5d8099..dbc6cdcb7b412434754ebdad7eb3bc7a58fb4f02 100644 --- a/competition_configurations/5-9-3.yml +++ b/competition_configurations/5-9-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-1-1.yml b/competition_configurations/6-1-1.yml index d5c86b048b4c2e663e55cbac534a073ec6dc8108..ec08eb9a70d78ace39027c925faa6c27b7d91030 100644 --- a/competition_configurations/6-1-1.yml +++ b/competition_configurations/6-1-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-1-2.yml b/competition_configurations/6-1-2.yml index d5c86b048b4c2e663e55cbac534a073ec6dc8108..ec08eb9a70d78ace39027c925faa6c27b7d91030 100644 --- a/competition_configurations/6-1-2.yml +++ b/competition_configurations/6-1-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-1-3.yml b/competition_configurations/6-1-3.yml index d5c86b048b4c2e663e55cbac534a073ec6dc8108..ec08eb9a70d78ace39027c925faa6c27b7d91030 100644 --- a/competition_configurations/6-1-3.yml +++ b/competition_configurations/6-1-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-10-1.yml b/competition_configurations/6-10-1.yml index 182ba194b8cbe557fe5c447c8d82f2dfdf77d6f8..b6f5d2a3edeb547c008373dc071e011d85c2f400 100644 --- a/competition_configurations/6-10-1.yml +++ b/competition_configurations/6-10-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-10-2.yml b/competition_configurations/6-10-2.yml index ed8910c532ad8f1ace85fa62682523edbc3317b3..91d9b807791841b818cc10e339440dd7a87d36ec 100644 --- a/competition_configurations/6-10-2.yml +++ b/competition_configurations/6-10-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-10-3.yml b/competition_configurations/6-10-3.yml index 61b9afd0eff49ce4c508d20e4f49b278db602442..f1d836fa053d960a1402431b4780efa2c6eeeb0d 100644 --- a/competition_configurations/6-10-3.yml +++ b/competition_configurations/6-10-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-11-1.yml b/competition_configurations/6-11-1.yml index bc9230b7e719e470dfe0b6f0ce3b510fae1b1a60..a3b84f81b85dda95e072332afd45afa9630ae355 100644 --- a/competition_configurations/6-11-1.yml +++ b/competition_configurations/6-11-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-11-2.yml b/competition_configurations/6-11-2.yml index 7fabb93358d0c61b749399b6cbb87fa01a7a6c38..30bc4c1050cc18c7183ae08f0df9b4ec70678fa3 100644 --- a/competition_configurations/6-11-2.yml +++ b/competition_configurations/6-11-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-11-3.yml b/competition_configurations/6-11-3.yml index 6d00f8d458eab8429317ceaf201fe2c1140a967a..56022f01c77fea754599c0bfe316cc4d6ed60869 100644 --- a/competition_configurations/6-11-3.yml +++ b/competition_configurations/6-11-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-12-1.yml b/competition_configurations/6-12-1.yml index aec07a7bd392d7f25e8b3462ee3edea38b5dd8f8..bb5160cc2567586ea553cbb0c81b0fa2b5aaa868 100644 --- a/competition_configurations/6-12-1.yml +++ b/competition_configurations/6-12-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-12-2.yml b/competition_configurations/6-12-2.yml index 358d0f07001c9e80cba09a9e5dea33718fe3058e..db5f69f344584a90cac099df1a45287a12711f3a 100644 --- a/competition_configurations/6-12-2.yml +++ b/competition_configurations/6-12-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-12-3.yml b/competition_configurations/6-12-3.yml index 2be7a9b18e48bdc0facca33af262a593103f99fd..3df9642c529ef8202e42d0afad793ee38c5a587a 100644 --- a/competition_configurations/6-12-3.yml +++ b/competition_configurations/6-12-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-13-1.yml b/competition_configurations/6-13-1.yml index 7fcaa63591e978f2935d1a917c691cbd3acd99d2..5a3e930da2dde3f764cf53d4e0245b4a61cfc362 100644 --- a/competition_configurations/6-13-1.yml +++ b/competition_configurations/6-13-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-13-2.yml b/competition_configurations/6-13-2.yml index 7fcaa63591e978f2935d1a917c691cbd3acd99d2..5a3e930da2dde3f764cf53d4e0245b4a61cfc362 100644 --- a/competition_configurations/6-13-2.yml +++ b/competition_configurations/6-13-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-13-3.yml b/competition_configurations/6-13-3.yml index 7fcaa63591e978f2935d1a917c691cbd3acd99d2..5a3e930da2dde3f764cf53d4e0245b4a61cfc362 100644 --- a/competition_configurations/6-13-3.yml +++ b/competition_configurations/6-13-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-14-1.yml b/competition_configurations/6-14-1.yml index 0be0514d6e1388fa2efbd9163b262aa596188a58..67833290166431e227d56ee8f3d89c2090f5ac06 100644 --- a/competition_configurations/6-14-1.yml +++ b/competition_configurations/6-14-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 items: - !Item diff --git a/competition_configurations/6-14-2.yml b/competition_configurations/6-14-2.yml index 0be0514d6e1388fa2efbd9163b262aa596188a58..67833290166431e227d56ee8f3d89c2090f5ac06 100644 --- a/competition_configurations/6-14-2.yml +++ b/competition_configurations/6-14-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 items: - !Item diff --git a/competition_configurations/6-14-3.yml b/competition_configurations/6-14-3.yml index 0be0514d6e1388fa2efbd9163b262aa596188a58..67833290166431e227d56ee8f3d89c2090f5ac06 100644 --- a/competition_configurations/6-14-3.yml +++ b/competition_configurations/6-14-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 items: - !Item diff --git a/competition_configurations/6-15-1.yml b/competition_configurations/6-15-1.yml index 7554e1b8d4acdc399c31860ce52e7894feabb1a8..48bd6c68d8cb9c5fc345916295c5c72791b1342c 100644 --- a/competition_configurations/6-15-1.yml +++ b/competition_configurations/6-15-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 9 t: 1000 items: - !Item diff --git a/competition_configurations/6-15-2.yml b/competition_configurations/6-15-2.yml index 7554e1b8d4acdc399c31860ce52e7894feabb1a8..48bd6c68d8cb9c5fc345916295c5c72791b1342c 100644 --- a/competition_configurations/6-15-2.yml +++ b/competition_configurations/6-15-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 9 t: 1000 items: - !Item diff --git a/competition_configurations/6-15-3.yml b/competition_configurations/6-15-3.yml index 7554e1b8d4acdc399c31860ce52e7894feabb1a8..48bd6c68d8cb9c5fc345916295c5c72791b1342c 100644 --- a/competition_configurations/6-15-3.yml +++ b/competition_configurations/6-15-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 9 t: 1000 items: - !Item diff --git a/competition_configurations/6-16-1.yml b/competition_configurations/6-16-1.yml index e85d31b709377c83d317c0f2e68ca7f1fbba797a..effbdde2f3129bd29e2fa64bbc47bbf931e2fcef 100644 --- a/competition_configurations/6-16-1.yml +++ b/competition_configurations/6-16-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/6-16-2.yml b/competition_configurations/6-16-2.yml index e85d31b709377c83d317c0f2e68ca7f1fbba797a..effbdde2f3129bd29e2fa64bbc47bbf931e2fcef 100644 --- a/competition_configurations/6-16-2.yml +++ b/competition_configurations/6-16-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/6-16-3.yml b/competition_configurations/6-16-3.yml index e85d31b709377c83d317c0f2e68ca7f1fbba797a..effbdde2f3129bd29e2fa64bbc47bbf931e2fcef 100644 --- a/competition_configurations/6-16-3.yml +++ b/competition_configurations/6-16-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/6-17-1.yml b/competition_configurations/6-17-1.yml index a9c6bd9f6e98f32dd0010065332c563f25235e1c..db2818c8ef1d3405c2af6e76e938e0cc3679331c 100644 --- a/competition_configurations/6-17-1.yml +++ b/competition_configurations/6-17-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/6-17-2.yml b/competition_configurations/6-17-2.yml index a9c6bd9f6e98f32dd0010065332c563f25235e1c..db2818c8ef1d3405c2af6e76e938e0cc3679331c 100644 --- a/competition_configurations/6-17-2.yml +++ b/competition_configurations/6-17-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/6-17-3.yml b/competition_configurations/6-17-3.yml index a9c6bd9f6e98f32dd0010065332c563f25235e1c..db2818c8ef1d3405c2af6e76e938e0cc3679331c 100644 --- a/competition_configurations/6-17-3.yml +++ b/competition_configurations/6-17-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/6-18-1.yml b/competition_configurations/6-18-1.yml index 1f54e0f30845b663470a286ecca5764675691d5f..691ca79674a50e49561de95f61cbaa12777acc50 100644 --- a/competition_configurations/6-18-1.yml +++ b/competition_configurations/6-18-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/6-18-2.yml b/competition_configurations/6-18-2.yml index 1f54e0f30845b663470a286ecca5764675691d5f..691ca79674a50e49561de95f61cbaa12777acc50 100644 --- a/competition_configurations/6-18-2.yml +++ b/competition_configurations/6-18-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/6-18-3.yml b/competition_configurations/6-18-3.yml index 1f54e0f30845b663470a286ecca5764675691d5f..691ca79674a50e49561de95f61cbaa12777acc50 100644 --- a/competition_configurations/6-18-3.yml +++ b/competition_configurations/6-18-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/6-19-1.yml b/competition_configurations/6-19-1.yml index fd6f02ff6687105248734e0c5a69468b5a676b54..8ce74c39a99a69adb570023aff841108216b0740 100644 --- a/competition_configurations/6-19-1.yml +++ b/competition_configurations/6-19-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 500 items: - !Item diff --git a/competition_configurations/6-19-2.yml b/competition_configurations/6-19-2.yml index fd6f02ff6687105248734e0c5a69468b5a676b54..8ce74c39a99a69adb570023aff841108216b0740 100644 --- a/competition_configurations/6-19-2.yml +++ b/competition_configurations/6-19-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 500 items: - !Item diff --git a/competition_configurations/6-19-3.yml b/competition_configurations/6-19-3.yml index fd6f02ff6687105248734e0c5a69468b5a676b54..8ce74c39a99a69adb570023aff841108216b0740 100644 --- a/competition_configurations/6-19-3.yml +++ b/competition_configurations/6-19-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 500 items: - !Item diff --git a/competition_configurations/6-2-1.yml b/competition_configurations/6-2-1.yml index be8d87f73d603d646ea0c7fe2e5f00b338e1b947..65797efe6bdd9b12100decbe629b7f7db341d572 100644 --- a/competition_configurations/6-2-1.yml +++ b/competition_configurations/6-2-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-2-2.yml b/competition_configurations/6-2-2.yml index be8d87f73d603d646ea0c7fe2e5f00b338e1b947..65797efe6bdd9b12100decbe629b7f7db341d572 100644 --- a/competition_configurations/6-2-2.yml +++ b/competition_configurations/6-2-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-2-3.yml b/competition_configurations/6-2-3.yml index be8d87f73d603d646ea0c7fe2e5f00b338e1b947..65797efe6bdd9b12100decbe629b7f7db341d572 100644 --- a/competition_configurations/6-2-3.yml +++ b/competition_configurations/6-2-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-20-1.yml b/competition_configurations/6-20-1.yml index c53d4c6591472cf925f7dc1dd235a43d776eb046..3c9529852cfd16cb314291c21a4a0bf7e561e027 100644 --- a/competition_configurations/6-20-1.yml +++ b/competition_configurations/6-20-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 500 items: - !Item diff --git a/competition_configurations/6-20-2.yml b/competition_configurations/6-20-2.yml index c53d4c6591472cf925f7dc1dd235a43d776eb046..3c9529852cfd16cb314291c21a4a0bf7e561e027 100644 --- a/competition_configurations/6-20-2.yml +++ b/competition_configurations/6-20-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 500 items: - !Item diff --git a/competition_configurations/6-20-3.yml b/competition_configurations/6-20-3.yml index c53d4c6591472cf925f7dc1dd235a43d776eb046..3c9529852cfd16cb314291c21a4a0bf7e561e027 100644 --- a/competition_configurations/6-20-3.yml +++ b/competition_configurations/6-20-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 500 items: - !Item diff --git a/competition_configurations/6-21-1.yml b/competition_configurations/6-21-1.yml index 55f9a2b4e116da7c9625750a112716098b7deeb2..d8cb838dd53b9171dccf1c812e25b6c07fde9845 100644 --- a/competition_configurations/6-21-1.yml +++ b/competition_configurations/6-21-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 5 t: 1000 items: - !Item diff --git a/competition_configurations/6-21-2.yml b/competition_configurations/6-21-2.yml index 55f9a2b4e116da7c9625750a112716098b7deeb2..d8cb838dd53b9171dccf1c812e25b6c07fde9845 100644 --- a/competition_configurations/6-21-2.yml +++ b/competition_configurations/6-21-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 5 t: 1000 items: - !Item diff --git a/competition_configurations/6-21-3.yml b/competition_configurations/6-21-3.yml index 55f9a2b4e116da7c9625750a112716098b7deeb2..d8cb838dd53b9171dccf1c812e25b6c07fde9845 100644 --- a/competition_configurations/6-21-3.yml +++ b/competition_configurations/6-21-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 5 t: 1000 items: - !Item diff --git a/competition_configurations/6-22-1.yml b/competition_configurations/6-22-1.yml index 6329bbb04567edbeb527ff8e79d0d9311915ebe9..7d2ad941c12cb2b6bc8080c2eecb3112c60f73d9 100644 --- a/competition_configurations/6-22-1.yml +++ b/competition_configurations/6-22-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 5 t: 1000 items: - !Item diff --git a/competition_configurations/6-22-2.yml b/competition_configurations/6-22-2.yml index 6329bbb04567edbeb527ff8e79d0d9311915ebe9..7d2ad941c12cb2b6bc8080c2eecb3112c60f73d9 100644 --- a/competition_configurations/6-22-2.yml +++ b/competition_configurations/6-22-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 5 t: 1000 items: - !Item diff --git a/competition_configurations/6-22-3.yml b/competition_configurations/6-22-3.yml index 6329bbb04567edbeb527ff8e79d0d9311915ebe9..7d2ad941c12cb2b6bc8080c2eecb3112c60f73d9 100644 --- a/competition_configurations/6-22-3.yml +++ b/competition_configurations/6-22-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 5 t: 1000 items: - !Item diff --git a/competition_configurations/6-23-1.yml b/competition_configurations/6-23-1.yml index 8982cf5814018b371f3381d8e74f49c27ba526cf..3a2d0a8f20548142d7f25653843f0741718000cc 100644 --- a/competition_configurations/6-23-1.yml +++ b/competition_configurations/6-23-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 7 t: 1000 items: - !Item diff --git a/competition_configurations/6-23-2.yml b/competition_configurations/6-23-2.yml index 8982cf5814018b371f3381d8e74f49c27ba526cf..3a2d0a8f20548142d7f25653843f0741718000cc 100644 --- a/competition_configurations/6-23-2.yml +++ b/competition_configurations/6-23-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 7 t: 1000 items: - !Item diff --git a/competition_configurations/6-23-3.yml b/competition_configurations/6-23-3.yml index 8982cf5814018b371f3381d8e74f49c27ba526cf..3a2d0a8f20548142d7f25653843f0741718000cc 100644 --- a/competition_configurations/6-23-3.yml +++ b/competition_configurations/6-23-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 7 t: 1000 items: - !Item diff --git a/competition_configurations/6-24-1.yml b/competition_configurations/6-24-1.yml index b32117cd4c9bf8144d7524f3101c62f3c464fd1d..e57e8ccf06278c89e0a7ff5fe8e15800f1cf29f6 100644 --- a/competition_configurations/6-24-1.yml +++ b/competition_configurations/6-24-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 7 t: 1000 items: - !Item diff --git a/competition_configurations/6-24-2.yml b/competition_configurations/6-24-2.yml index b32117cd4c9bf8144d7524f3101c62f3c464fd1d..e57e8ccf06278c89e0a7ff5fe8e15800f1cf29f6 100644 --- a/competition_configurations/6-24-2.yml +++ b/competition_configurations/6-24-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 7 t: 1000 items: - !Item diff --git a/competition_configurations/6-24-3.yml b/competition_configurations/6-24-3.yml index b32117cd4c9bf8144d7524f3101c62f3c464fd1d..e57e8ccf06278c89e0a7ff5fe8e15800f1cf29f6 100644 --- a/competition_configurations/6-24-3.yml +++ b/competition_configurations/6-24-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 7 t: 1000 items: - !Item diff --git a/competition_configurations/6-25-1.yml b/competition_configurations/6-25-1.yml index 6d7a7a98de743a94b92a3ee4e80a52b7dcc6054e..e188115f7da04b9d97db15471742803beffb18eb 100644 --- a/competition_configurations/6-25-1.yml +++ b/competition_configurations/6-25-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/6-25-2.yml b/competition_configurations/6-25-2.yml index 6d7a7a98de743a94b92a3ee4e80a52b7dcc6054e..e188115f7da04b9d97db15471742803beffb18eb 100644 --- a/competition_configurations/6-25-2.yml +++ b/competition_configurations/6-25-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/6-25-3.yml b/competition_configurations/6-25-3.yml index 6d7a7a98de743a94b92a3ee4e80a52b7dcc6054e..e188115f7da04b9d97db15471742803beffb18eb 100644 --- a/competition_configurations/6-25-3.yml +++ b/competition_configurations/6-25-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/6-26-1.yml b/competition_configurations/6-26-1.yml index 370fb03cdceae06c5c66520b0ecba3d5e97b1471..f3a22f1fe45bc0060dc9ad3c7f4b831b65f8b939 100644 --- a/competition_configurations/6-26-1.yml +++ b/competition_configurations/6-26-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-26-2.yml b/competition_configurations/6-26-2.yml index 370fb03cdceae06c5c66520b0ecba3d5e97b1471..f3a22f1fe45bc0060dc9ad3c7f4b831b65f8b939 100644 --- a/competition_configurations/6-26-2.yml +++ b/competition_configurations/6-26-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-26-3.yml b/competition_configurations/6-26-3.yml index 370fb03cdceae06c5c66520b0ecba3d5e97b1471..f3a22f1fe45bc0060dc9ad3c7f4b831b65f8b939 100644 --- a/competition_configurations/6-26-3.yml +++ b/competition_configurations/6-26-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-27-1.yml b/competition_configurations/6-27-1.yml index 287032f05c48ae9be18a977035cfb146ea295204..29fd535e1942ae742388cec2c7817f29a75aeeb4 100644 --- a/competition_configurations/6-27-1.yml +++ b/competition_configurations/6-27-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-27-2.yml b/competition_configurations/6-27-2.yml index 287032f05c48ae9be18a977035cfb146ea295204..29fd535e1942ae742388cec2c7817f29a75aeeb4 100644 --- a/competition_configurations/6-27-2.yml +++ b/competition_configurations/6-27-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-27-3.yml b/competition_configurations/6-27-3.yml index 287032f05c48ae9be18a977035cfb146ea295204..29fd535e1942ae742388cec2c7817f29a75aeeb4 100644 --- a/competition_configurations/6-27-3.yml +++ b/competition_configurations/6-27-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-28-1.yml b/competition_configurations/6-28-1.yml index 88939ee6d3f65734b504223efc46a46f26848928..c0b8eee435800e51c96f1ad70ac6b38d759ace51 100644 --- a/competition_configurations/6-28-1.yml +++ b/competition_configurations/6-28-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-28-2.yml b/competition_configurations/6-28-2.yml index 88939ee6d3f65734b504223efc46a46f26848928..c0b8eee435800e51c96f1ad70ac6b38d759ace51 100644 --- a/competition_configurations/6-28-2.yml +++ b/competition_configurations/6-28-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-28-3.yml b/competition_configurations/6-28-3.yml index 88939ee6d3f65734b504223efc46a46f26848928..c0b8eee435800e51c96f1ad70ac6b38d759ace51 100644 --- a/competition_configurations/6-28-3.yml +++ b/competition_configurations/6-28-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-29-1.yml b/competition_configurations/6-29-1.yml index 77666c21b535b0cc508768653ae69da651c11ff4..2da8ca37115761c79be216298f59817b8ccc1331 100644 --- a/competition_configurations/6-29-1.yml +++ b/competition_configurations/6-29-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-29-2.yml b/competition_configurations/6-29-2.yml index 77666c21b535b0cc508768653ae69da651c11ff4..2da8ca37115761c79be216298f59817b8ccc1331 100644 --- a/competition_configurations/6-29-2.yml +++ b/competition_configurations/6-29-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-29-3.yml b/competition_configurations/6-29-3.yml index 77666c21b535b0cc508768653ae69da651c11ff4..2da8ca37115761c79be216298f59817b8ccc1331 100644 --- a/competition_configurations/6-29-3.yml +++ b/competition_configurations/6-29-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-3-1.yml b/competition_configurations/6-3-1.yml index eb2a2b0000dc06ae20ab901bbf9b486860fcabd9..a9c2eb9175bddae042d393589e14df5466737d01 100644 --- a/competition_configurations/6-3-1.yml +++ b/competition_configurations/6-3-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-3-2.yml b/competition_configurations/6-3-2.yml index eb2a2b0000dc06ae20ab901bbf9b486860fcabd9..a9c2eb9175bddae042d393589e14df5466737d01 100644 --- a/competition_configurations/6-3-2.yml +++ b/competition_configurations/6-3-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-3-3.yml b/competition_configurations/6-3-3.yml index eb2a2b0000dc06ae20ab901bbf9b486860fcabd9..a9c2eb9175bddae042d393589e14df5466737d01 100644 --- a/competition_configurations/6-3-3.yml +++ b/competition_configurations/6-3-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-30-1.yml b/competition_configurations/6-30-1.yml index 80711591296c9ef1cedaeb3bf49d51be1a107a0c..dcf5bc73c0bc2ce40b77e5b8e7431d2adaf889e7 100644 --- a/competition_configurations/6-30-1.yml +++ b/competition_configurations/6-30-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-30-2.yml b/competition_configurations/6-30-2.yml index 80711591296c9ef1cedaeb3bf49d51be1a107a0c..dcf5bc73c0bc2ce40b77e5b8e7431d2adaf889e7 100644 --- a/competition_configurations/6-30-2.yml +++ b/competition_configurations/6-30-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-30-3.yml b/competition_configurations/6-30-3.yml index 80711591296c9ef1cedaeb3bf49d51be1a107a0c..dcf5bc73c0bc2ce40b77e5b8e7431d2adaf889e7 100644 --- a/competition_configurations/6-30-3.yml +++ b/competition_configurations/6-30-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-4-1.yml b/competition_configurations/6-4-1.yml index b9c9fecf7e4031212522d7f01100b56d0ae86cfc..05962d4f370aab628584c858816c37af059e171f 100644 --- a/competition_configurations/6-4-1.yml +++ b/competition_configurations/6-4-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-4-2.yml b/competition_configurations/6-4-2.yml index b9c9fecf7e4031212522d7f01100b56d0ae86cfc..05962d4f370aab628584c858816c37af059e171f 100644 --- a/competition_configurations/6-4-2.yml +++ b/competition_configurations/6-4-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-4-3.yml b/competition_configurations/6-4-3.yml index b9c9fecf7e4031212522d7f01100b56d0ae86cfc..05962d4f370aab628584c858816c37af059e171f 100644 --- a/competition_configurations/6-4-3.yml +++ b/competition_configurations/6-4-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-5-1.yml b/competition_configurations/6-5-1.yml index 0b852ce04a273fa5277363265409aa958b1c66ef..e1e81cca432ea2db85a25bceb2d4f8f55c8de4a9 100644 --- a/competition_configurations/6-5-1.yml +++ b/competition_configurations/6-5-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-5-2.yml b/competition_configurations/6-5-2.yml index 0b852ce04a273fa5277363265409aa958b1c66ef..e1e81cca432ea2db85a25bceb2d4f8f55c8de4a9 100644 --- a/competition_configurations/6-5-2.yml +++ b/competition_configurations/6-5-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-5-3.yml b/competition_configurations/6-5-3.yml index 0b852ce04a273fa5277363265409aa958b1c66ef..e1e81cca432ea2db85a25bceb2d4f8f55c8de4a9 100644 --- a/competition_configurations/6-5-3.yml +++ b/competition_configurations/6-5-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-6-1.yml b/competition_configurations/6-6-1.yml index 87eac738674f7159db5c01351ab0244941f3878c..7a6fb044e38c8d56e86d8aa0bef376fdc38688bb 100644 --- a/competition_configurations/6-6-1.yml +++ b/competition_configurations/6-6-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-6-2.yml b/competition_configurations/6-6-2.yml index 87eac738674f7159db5c01351ab0244941f3878c..7a6fb044e38c8d56e86d8aa0bef376fdc38688bb 100644 --- a/competition_configurations/6-6-2.yml +++ b/competition_configurations/6-6-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-6-3.yml b/competition_configurations/6-6-3.yml index 87eac738674f7159db5c01351ab0244941f3878c..7a6fb044e38c8d56e86d8aa0bef376fdc38688bb 100644 --- a/competition_configurations/6-6-3.yml +++ b/competition_configurations/6-6-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-7-1.yml b/competition_configurations/6-7-1.yml index 8d6c396e0a3a230870ea118bd2588c480bde670c..bffe7ec2dab5fbe9e9a2d41632c1704f12458365 100644 --- a/competition_configurations/6-7-1.yml +++ b/competition_configurations/6-7-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-7-2.yml b/competition_configurations/6-7-2.yml index 8d6c396e0a3a230870ea118bd2588c480bde670c..bffe7ec2dab5fbe9e9a2d41632c1704f12458365 100644 --- a/competition_configurations/6-7-2.yml +++ b/competition_configurations/6-7-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-7-3.yml b/competition_configurations/6-7-3.yml index 8d6c396e0a3a230870ea118bd2588c480bde670c..bffe7ec2dab5fbe9e9a2d41632c1704f12458365 100644 --- a/competition_configurations/6-7-3.yml +++ b/competition_configurations/6-7-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-8-1.yml b/competition_configurations/6-8-1.yml index 31b530246e24902cf7b4520f2a10c576685d3e98..c773d232d6cf291314b831125a53b5494f533f72 100644 --- a/competition_configurations/6-8-1.yml +++ b/competition_configurations/6-8-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-8-2.yml b/competition_configurations/6-8-2.yml index 31b530246e24902cf7b4520f2a10c576685d3e98..c773d232d6cf291314b831125a53b5494f533f72 100644 --- a/competition_configurations/6-8-2.yml +++ b/competition_configurations/6-8-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-8-3.yml b/competition_configurations/6-8-3.yml index 31b530246e24902cf7b4520f2a10c576685d3e98..c773d232d6cf291314b831125a53b5494f533f72 100644 --- a/competition_configurations/6-8-3.yml +++ b/competition_configurations/6-8-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-9-1.yml b/competition_configurations/6-9-1.yml index b48fb5526f2b85cdbb7bab3c60ed2a7b4f7a58ca..7718d22d4ac038f20676957d157f8146db91a590 100644 --- a/competition_configurations/6-9-1.yml +++ b/competition_configurations/6-9-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-9-2.yml b/competition_configurations/6-9-2.yml index b48fb5526f2b85cdbb7bab3c60ed2a7b4f7a58ca..7718d22d4ac038f20676957d157f8146db91a590 100644 --- a/competition_configurations/6-9-2.yml +++ b/competition_configurations/6-9-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/6-9-3.yml b/competition_configurations/6-9-3.yml index b48fb5526f2b85cdbb7bab3c60ed2a7b4f7a58ca..7718d22d4ac038f20676957d157f8146db91a590 100644 --- a/competition_configurations/6-9-3.yml +++ b/competition_configurations/6-9-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/7-1-1.yml b/competition_configurations/7-1-1.yml index e5acd503cf4aae8623e86b1a40ec496fd2eaece9..43204b591397658a00bd20264ad465992a5f4b6e 100644 --- a/competition_configurations/7-1-1.yml +++ b/competition_configurations/7-1-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [-20] items: diff --git a/competition_configurations/7-1-2.yml b/competition_configurations/7-1-2.yml index 3791622e65b258f76df78eaa75948ad90ab368ef..74a7e6e561907c8a410d2d18e8dde70850934582 100644 --- a/competition_configurations/7-1-2.yml +++ b/competition_configurations/7-1-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [-20] items: diff --git a/competition_configurations/7-1-3.yml b/competition_configurations/7-1-3.yml index db48eb635ce7ae6a4c2cf7a7d9dae7e093c5ea3d..aff2e616593df8d9ecb4537705efde7d73e94c33 100644 --- a/competition_configurations/7-1-3.yml +++ b/competition_configurations/7-1-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [-20] items: diff --git a/competition_configurations/7-10-1.yml b/competition_configurations/7-10-1.yml index c86b3d48a5184cbf58f936e0e895b70949f6169f..a51a58f1890400d1f5100c6461a4c0bbf5c8f302 100644 --- a/competition_configurations/7-10-1.yml +++ b/competition_configurations/7-10-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 blackouts: [5, 10, 15, 20, 25] items: diff --git a/competition_configurations/7-10-2.yml b/competition_configurations/7-10-2.yml index 38da2e9260c295e721cc41071ddfa92c960432ac..541a4162185a0c03db3455f54090f7053d991911 100644 --- a/competition_configurations/7-10-2.yml +++ b/competition_configurations/7-10-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 blackouts: [5, 10, 15, 20, 25] items: diff --git a/competition_configurations/7-10-3.yml b/competition_configurations/7-10-3.yml index b213cd4991a04f65d50decffbfb7c00e28422c7a..7980180b4f1260a529889061728534f967c5b587 100644 --- a/competition_configurations/7-10-3.yml +++ b/competition_configurations/7-10-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 blackouts: [5, 10, 15, 20, 25] items: diff --git a/competition_configurations/7-11-1.yml b/competition_configurations/7-11-1.yml index 7aa233e3dae2d8fcce2567846444937d4643aa08..605d075ab1652ec03579c09853ddbb7dfa9c0f89 100644 --- a/competition_configurations/7-11-1.yml +++ b/competition_configurations/7-11-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 blackouts: [5, 10, 15, 20, 25] items: diff --git a/competition_configurations/7-11-2.yml b/competition_configurations/7-11-2.yml index 58aa86b6db06c21685488b01e362ef61f75a2ce3..1d43e1b503ef9886886cc6d41b169cac264fcae8 100644 --- a/competition_configurations/7-11-2.yml +++ b/competition_configurations/7-11-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 blackouts: [5, 10, 15, 20, 25] items: diff --git a/competition_configurations/7-11-3.yml b/competition_configurations/7-11-3.yml index 057ea7872a7cd43a720f783d349514561e71928f..800a9e92f241864220566b4705da87b9241086bd 100644 --- a/competition_configurations/7-11-3.yml +++ b/competition_configurations/7-11-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 blackouts: [5, 10, 15, 20, 25] items: diff --git a/competition_configurations/7-12-1.yml b/competition_configurations/7-12-1.yml index 7ddd9dced2d59665630b0a9755960d9fac69afe7..8046dcc8e63cee403d8bfc1167f6baca9e741cdb 100644 --- a/competition_configurations/7-12-1.yml +++ b/competition_configurations/7-12-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 blackouts: [5, 10, 15, 20, 25] items: diff --git a/competition_configurations/7-12-2.yml b/competition_configurations/7-12-2.yml index c75417db6b248a39e51fa647abc0674923087d75..ca202873b365861ef640ca24bdf7cfa7db6bb60d 100644 --- a/competition_configurations/7-12-2.yml +++ b/competition_configurations/7-12-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 blackouts: [5, 10, 15, 20, 25] items: diff --git a/competition_configurations/7-12-3.yml b/competition_configurations/7-12-3.yml index 338db55520875cb0c88988602f2fe7231397a9d7..5888dd38913ed17c69e7daaee51fa29d91ed518b 100644 --- a/competition_configurations/7-12-3.yml +++ b/competition_configurations/7-12-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 blackouts: [5, 10, 15, 20, 25] items: diff --git a/competition_configurations/7-13-1.yml b/competition_configurations/7-13-1.yml index c4964fa346f5892c4470025747b61f794b4c8c7e..0a81c8f18e7f64f0b28f56f7371692afefa54ab2 100644 --- a/competition_configurations/7-13-1.yml +++ b/competition_configurations/7-13-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 250 blackouts: [5, 10, 15, 20, 25] items: diff --git a/competition_configurations/7-13-2.yml b/competition_configurations/7-13-2.yml index 79db1d60f21c46d7139f1f8868c38a88ba53327d..81e726a572a59c459207581381445e0e69b1ed79 100644 --- a/competition_configurations/7-13-2.yml +++ b/competition_configurations/7-13-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 250 blackouts: [5, 10, 15, 20, 25] items: diff --git a/competition_configurations/7-13-3.yml b/competition_configurations/7-13-3.yml index be1e6d0a723fbb45c3b31ea1b6c97a7d207c96e6..61190a2c9950e0a08577b5750be6f0fe8e71ba03 100644 --- a/competition_configurations/7-13-3.yml +++ b/competition_configurations/7-13-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 250 blackouts: [5, 10, 15, 20, 25] items: diff --git a/competition_configurations/7-14-1.yml b/competition_configurations/7-14-1.yml index 517a047ed830d0cf16a4adfcf249857743e969ee..f9b4a3a6ce7c717af27c47969107e37c76ecf9a2 100644 --- a/competition_configurations/7-14-1.yml +++ b/competition_configurations/7-14-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 500 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125] items: diff --git a/competition_configurations/7-14-2.yml b/competition_configurations/7-14-2.yml index 0b8b07ec10925b1ab7429b5112231db4043d1410..c783c155937a8ec8c8ebbcaf1218565f1a6fe0a8 100644 --- a/competition_configurations/7-14-2.yml +++ b/competition_configurations/7-14-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 500 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125] items: diff --git a/competition_configurations/7-14-3.yml b/competition_configurations/7-14-3.yml index a387ae8c8a9581dd75296d473389be48dfdb6585..3050f9d62afb68a1cdeb7378ed89d3eeccaf3eda 100644 --- a/competition_configurations/7-14-3.yml +++ b/competition_configurations/7-14-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 500 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125] items: diff --git a/competition_configurations/7-15-1.yml b/competition_configurations/7-15-1.yml index af79aa352a1ad4e5376e8d0215d9914a8a757fd5..c5f30ba06216dbdb6e43b887602e37a1d16e5326 100644 --- a/competition_configurations/7-15-1.yml +++ b/competition_configurations/7-15-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 500 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125] items: diff --git a/competition_configurations/7-15-2.yml b/competition_configurations/7-15-2.yml index 52aaeeadff509eedbcf0e71b7e2f8b89f50ea222..5d53f34fb10661c4cf07adfcc03308747839eaa7 100644 --- a/competition_configurations/7-15-2.yml +++ b/competition_configurations/7-15-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 500 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125] items: diff --git a/competition_configurations/7-15-3.yml b/competition_configurations/7-15-3.yml index 54f3545727a0202bde13263818b40b3ecde527c2..50ce23d0352b1777145e29e179d5318d438edb92 100644 --- a/competition_configurations/7-15-3.yml +++ b/competition_configurations/7-15-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4 t: 500 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125] items: diff --git a/competition_configurations/7-16-1.yml b/competition_configurations/7-16-1.yml index afd73495bccd2c0c07d2f1f5e0c002dcc030ee0f..627e9277710a291f1b57fd778174e49719e97d4b 100644 --- a/competition_configurations/7-16-1.yml +++ b/competition_configurations/7-16-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [-20] items: diff --git a/competition_configurations/7-16-2.yml b/competition_configurations/7-16-2.yml index 6ea8d61bea27c24f28076fd859b0a80ecbbe2a2a..0c9dba4a0077bedd527d096464d00dc96bd44d90 100644 --- a/competition_configurations/7-16-2.yml +++ b/competition_configurations/7-16-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [-40] items: diff --git a/competition_configurations/7-16-3.yml b/competition_configurations/7-16-3.yml index 4564b1963c8dd53170639964c55119ed3d3f497e..945cb1cfc3aee35ab93940e39ff2e59b65ba1dd0 100644 --- a/competition_configurations/7-16-3.yml +++ b/competition_configurations/7-16-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [-60] items: diff --git a/competition_configurations/7-17-1.yml b/competition_configurations/7-17-1.yml index 0d4de8105e08374f44f65ca87112e7b86deaf2c1..f62b67fb451cdb12e135d0b3fee2991ad088789f 100644 --- a/competition_configurations/7-17-1.yml +++ b/competition_configurations/7-17-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 blackouts: [-20] items: diff --git a/competition_configurations/7-17-2.yml b/competition_configurations/7-17-2.yml index f0f331d0e7f0564a386a1740d4a42fa213a2b677..3d6a1d024955d13584490791d4d71de438c44658 100644 --- a/competition_configurations/7-17-2.yml +++ b/competition_configurations/7-17-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 blackouts: [-40] items: diff --git a/competition_configurations/7-17-3.yml b/competition_configurations/7-17-3.yml index 149ce8fb36a891b5ac669866102f57606613b48a..ff05533c9924b5978ef3474977f6c396d1da509c 100644 --- a/competition_configurations/7-17-3.yml +++ b/competition_configurations/7-17-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 blackouts: [-60] items: diff --git a/competition_configurations/7-18-1.yml b/competition_configurations/7-18-1.yml index 49be6b565d1f98925f0699c2eec4f4df8b9bc5cb..e391009911c6b58dd72203f57dff52af093c64e2 100644 --- a/competition_configurations/7-18-1.yml +++ b/competition_configurations/7-18-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 blackouts: [-20] items: diff --git a/competition_configurations/7-18-2.yml b/competition_configurations/7-18-2.yml index 427cc0c55ff864a5c064f4d3a7d13f106cd0d081..ef49e09ef45642dfb7bfa8f6e18c12ad704cd46c 100644 --- a/competition_configurations/7-18-2.yml +++ b/competition_configurations/7-18-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 blackouts: [-40] items: diff --git a/competition_configurations/7-18-3.yml b/competition_configurations/7-18-3.yml index f521b51f24d17bcff35d70a70798122f5054c8cf..2580534a2604da3bb64793d0953b9dc4e161cc62 100644 --- a/competition_configurations/7-18-3.yml +++ b/competition_configurations/7-18-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 blackouts: [-60] items: diff --git a/competition_configurations/7-19-1.yml b/competition_configurations/7-19-1.yml index 817c5f024ea822d6cb4c0d1a5e12aac0f1ecba45..f276da01e9754a1457458b00d0de96130235e48e 100644 --- a/competition_configurations/7-19-1.yml +++ b/competition_configurations/7-19-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125] items: diff --git a/competition_configurations/7-19-2.yml b/competition_configurations/7-19-2.yml index 5b7c2ac359745978177b7dd29fd774a31df1347f..a357b883702120dda87f798ee107fc54f7e25ead 100644 --- a/competition_configurations/7-19-2.yml +++ b/competition_configurations/7-19-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125] items: diff --git a/competition_configurations/7-19-3.yml b/competition_configurations/7-19-3.yml index c50085b8450b44026dc2e960255d19e994859192..d9fdd7b7304a91d493d6b6a84f9baa90646a7ff1 100644 --- a/competition_configurations/7-19-3.yml +++ b/competition_configurations/7-19-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125] items: diff --git a/competition_configurations/7-2-1.yml b/competition_configurations/7-2-1.yml index 33a62d64fb90e99ef5fe0799c00dd07116fa22c6..d3505365328ccabbfe4a509a3fffdae20f2e462c 100644 --- a/competition_configurations/7-2-1.yml +++ b/competition_configurations/7-2-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [-40] items: diff --git a/competition_configurations/7-2-2.yml b/competition_configurations/7-2-2.yml index 217c1ae663c3045c4ff16bd26c0eef94b5cdb765..29ee2a2caf52fba80a8a588c2ae8e68f29b6343b 100644 --- a/competition_configurations/7-2-2.yml +++ b/competition_configurations/7-2-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [-40] items: diff --git a/competition_configurations/7-2-3.yml b/competition_configurations/7-2-3.yml index 26872e0c0370a3503101b0a42e82111b4a21c441..4b683b3b8c832d1c108f5dde435ccb35cc0c1fc7 100644 --- a/competition_configurations/7-2-3.yml +++ b/competition_configurations/7-2-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [-40] items: diff --git a/competition_configurations/7-20-1.yml b/competition_configurations/7-20-1.yml index fd21a6b9000be621fac3777df8e96a587b1bb068..4a4be5c7c8826fdb78495e47ecc45a2c3a102d9b 100644 --- a/competition_configurations/7-20-1.yml +++ b/competition_configurations/7-20-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125] items: diff --git a/competition_configurations/7-20-2.yml b/competition_configurations/7-20-2.yml index ba74ba91668f4ea36a6a94868a94bdd74e9c5cdf..1f10fc85efb2e84aad5e33a496c123874de9cb54 100644 --- a/competition_configurations/7-20-2.yml +++ b/competition_configurations/7-20-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125] items: diff --git a/competition_configurations/7-20-3.yml b/competition_configurations/7-20-3.yml index 16b835d7d35409484054115a0f0cc492b10edec6..2ba15718ce3603c1974aaec0563ef174b8f6fda7 100644 --- a/competition_configurations/7-20-3.yml +++ b/competition_configurations/7-20-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125] items: diff --git a/competition_configurations/7-21-1.yml b/competition_configurations/7-21-1.yml index e362d61556e8121362d192ffb9fd727fd32bca64..346193c8e3b970c682ca4ea9098b5d65442ee64c 100644 --- a/competition_configurations/7-21-1.yml +++ b/competition_configurations/7-21-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125] items: diff --git a/competition_configurations/7-21-2.yml b/competition_configurations/7-21-2.yml index 054c9c5e2bb76d8c13765a5b5c2407a27e0fbcec..66af033635e4eb3b240358f845705b4665a14157 100644 --- a/competition_configurations/7-21-2.yml +++ b/competition_configurations/7-21-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125] items: diff --git a/competition_configurations/7-21-3.yml b/competition_configurations/7-21-3.yml index 5a997e71f470a8fd0bd0a1902466b22af617d6ca..ef83116cb745baaf0dab8c6a45b69d29fb63ad3c 100644 --- a/competition_configurations/7-21-3.yml +++ b/competition_configurations/7-21-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125] items: diff --git a/competition_configurations/7-22-1.yml b/competition_configurations/7-22-1.yml index 36f7e11fa8837f259c5589744bde2536c2491bd0..5af1d44f023dcfc3dd9e55aac9f34b4a81f28c4c 100644 --- a/competition_configurations/7-22-1.yml +++ b/competition_configurations/7-22-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125, 130, 135] items: diff --git a/competition_configurations/7-22-2.yml b/competition_configurations/7-22-2.yml index cacfc0b7ae1e6ffd988177d29d2bc5533b795d6d..7ae9dfdc27aa94bfde1c8ac47706337bbcf0382a 100644 --- a/competition_configurations/7-22-2.yml +++ b/competition_configurations/7-22-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125, 130, 135] items: diff --git a/competition_configurations/7-22-3.yml b/competition_configurations/7-22-3.yml index 91c77ce9e6c22f9a606155c31f1205d4f887abbf..33c57184d13d47a68ccf9a6929aa3a00c7124559 100644 --- a/competition_configurations/7-22-3.yml +++ b/competition_configurations/7-22-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125, 130, 135] items: diff --git a/competition_configurations/7-23-1.yml b/competition_configurations/7-23-1.yml index be8d9dd4643a83f1ec91cd8a7fa0b6adf22542fe..427c78a9e3abafa1bd8edd7bea2535a8d623a260 100644 --- a/competition_configurations/7-23-1.yml +++ b/competition_configurations/7-23-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125, 130, 135] items: diff --git a/competition_configurations/7-23-2.yml b/competition_configurations/7-23-2.yml index c7c20646572da168f929286fad356a0118edb193..7ea29effc7f234350ebd2428e1ba04aec4cfc683 100644 --- a/competition_configurations/7-23-2.yml +++ b/competition_configurations/7-23-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125, 130, 135] items: diff --git a/competition_configurations/7-23-3.yml b/competition_configurations/7-23-3.yml index 5bd0b7bcd34f4076ef16d6579e55d4d3ff65db7f..8464b34bebe8ee0ca0d46a1810c2a3d095386617 100644 --- a/competition_configurations/7-23-3.yml +++ b/competition_configurations/7-23-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125, 130, 135] items: diff --git a/competition_configurations/7-24-1.yml b/competition_configurations/7-24-1.yml index 72c562a7042de98fc86f76bd005dbae5ebdce7cd..2b276d49e76d9908bfeed69958095040b63e1fcd 100644 --- a/competition_configurations/7-24-1.yml +++ b/competition_configurations/7-24-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125, 130, 135] items: diff --git a/competition_configurations/7-24-2.yml b/competition_configurations/7-24-2.yml index d35cde99ca08c8e405a3ecbb8e6839db516b588a..ff181dca80224ce893433de0268d9b7c1acb21b2 100644 --- a/competition_configurations/7-24-2.yml +++ b/competition_configurations/7-24-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125, 130, 135] items: diff --git a/competition_configurations/7-24-3.yml b/competition_configurations/7-24-3.yml index f63a7aa69694f193c38263b1d7e27e1aa0b9f094..31934b2275fdf7dfa996ab2271245d54e25003fb 100644 --- a/competition_configurations/7-24-3.yml +++ b/competition_configurations/7-24-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 500 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125, 130, 135] items: diff --git a/competition_configurations/7-25-1.yml b/competition_configurations/7-25-1.yml index 19d27340b592e174799a93d0195646ebb30d841f..1491ada96b78b2c24d0de1fbf5047533a4edbde0 100644 --- a/competition_configurations/7-25-1.yml +++ b/competition_configurations/7-25-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125, 130, 135] items: diff --git a/competition_configurations/7-25-2.yml b/competition_configurations/7-25-2.yml index 19d27340b592e174799a93d0195646ebb30d841f..1491ada96b78b2c24d0de1fbf5047533a4edbde0 100644 --- a/competition_configurations/7-25-2.yml +++ b/competition_configurations/7-25-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125, 130, 135] items: diff --git a/competition_configurations/7-25-3.yml b/competition_configurations/7-25-3.yml index 19d27340b592e174799a93d0195646ebb30d841f..1491ada96b78b2c24d0de1fbf5047533a4edbde0 100644 --- a/competition_configurations/7-25-3.yml +++ b/competition_configurations/7-25-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 500 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125, 130, 135] items: diff --git a/competition_configurations/7-26-1.yml b/competition_configurations/7-26-1.yml index 841742a743448a8a64461b95241aaa78c416a101..02785de6e13433dc6ee36c37bf9f6cfa360d1c7d 100644 --- a/competition_configurations/7-26-1.yml +++ b/competition_configurations/7-26-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125, 130, 135] items: diff --git a/competition_configurations/7-26-2.yml b/competition_configurations/7-26-2.yml index 3c7b8c703677fda2202d47a9b970e4dd3092b86d..db4e6d181e7bc1df4cd00a66dca94c0f3f0ce4b7 100644 --- a/competition_configurations/7-26-2.yml +++ b/competition_configurations/7-26-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125, 130, 135] items: diff --git a/competition_configurations/7-26-3.yml b/competition_configurations/7-26-3.yml index a3ce384b1b61fdeb59453ef970af6b73bcc9f9d6..054330847971832c9b58118a269ce1691a7fb5d8 100644 --- a/competition_configurations/7-26-3.yml +++ b/competition_configurations/7-26-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125, 130, 135] items: diff --git a/competition_configurations/7-27-1.yml b/competition_configurations/7-27-1.yml index 1d4e0497ee81fffa28a3abd83cfb58017d9bbbc5..9bd65b36ff130555e3b6fea4574246bc61524da9 100644 --- a/competition_configurations/7-27-1.yml +++ b/competition_configurations/7-27-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125, 130, 135] items: diff --git a/competition_configurations/7-27-2.yml b/competition_configurations/7-27-2.yml index 812b458c52452bb4e40b1930394984f69cd2f602..579924e4d633270d7304ca689c176701df1121ba 100644 --- a/competition_configurations/7-27-2.yml +++ b/competition_configurations/7-27-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125, 130, 135] items: diff --git a/competition_configurations/7-27-3.yml b/competition_configurations/7-27-3.yml index ff461603aac08e38efc6ec6df966c929be6ca1c7..d16b4a7f2d719a8e6cf3710effdb6b0e2b1652a7 100644 --- a/competition_configurations/7-27-3.yml +++ b/competition_configurations/7-27-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125, 130, 135] items: diff --git a/competition_configurations/7-28-1.yml b/competition_configurations/7-28-1.yml index d942433457c7a18f213042a615528ed5ad49226a..739e27bb87901115352642816e1fc4f4ae2c2ddd 100644 --- a/competition_configurations/7-28-1.yml +++ b/competition_configurations/7-28-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 500 blackouts: [-20] items: diff --git a/competition_configurations/7-28-2.yml b/competition_configurations/7-28-2.yml index d942433457c7a18f213042a615528ed5ad49226a..739e27bb87901115352642816e1fc4f4ae2c2ddd 100644 --- a/competition_configurations/7-28-2.yml +++ b/competition_configurations/7-28-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 500 blackouts: [-20] items: diff --git a/competition_configurations/7-28-3.yml b/competition_configurations/7-28-3.yml index d942433457c7a18f213042a615528ed5ad49226a..739e27bb87901115352642816e1fc4f4ae2c2ddd 100644 --- a/competition_configurations/7-28-3.yml +++ b/competition_configurations/7-28-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 500 blackouts: [-20] items: diff --git a/competition_configurations/7-29-1.yml b/competition_configurations/7-29-1.yml index d993b3e50e2f9d23b18e224209e08e7bbaed5464..6980daab14470ef5f072741b1c0bdbb8c59838e5 100644 --- a/competition_configurations/7-29-1.yml +++ b/competition_configurations/7-29-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 500 blackouts: [-20] items: diff --git a/competition_configurations/7-29-2.yml b/competition_configurations/7-29-2.yml index d993b3e50e2f9d23b18e224209e08e7bbaed5464..6980daab14470ef5f072741b1c0bdbb8c59838e5 100644 --- a/competition_configurations/7-29-2.yml +++ b/competition_configurations/7-29-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 500 blackouts: [-20] items: diff --git a/competition_configurations/7-29-3.yml b/competition_configurations/7-29-3.yml index d993b3e50e2f9d23b18e224209e08e7bbaed5464..6980daab14470ef5f072741b1c0bdbb8c59838e5 100644 --- a/competition_configurations/7-29-3.yml +++ b/competition_configurations/7-29-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 500 blackouts: [-20] items: diff --git a/competition_configurations/7-3-1.yml b/competition_configurations/7-3-1.yml index 9c2e4e5051802689df1159a90fb258a4c19d3e0e..de669f5a3a745821752902d47064e9efbf45cb28 100644 --- a/competition_configurations/7-3-1.yml +++ b/competition_configurations/7-3-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [-60] items: diff --git a/competition_configurations/7-3-2.yml b/competition_configurations/7-3-2.yml index 77d9bc3b6973768529f4eac104adfe49abad5285..4b49ff1b73cc9060b7a8a2b52803d2593601d963 100644 --- a/competition_configurations/7-3-2.yml +++ b/competition_configurations/7-3-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [-60] items: diff --git a/competition_configurations/7-3-3.yml b/competition_configurations/7-3-3.yml index ef564f279b8145dc66d9bb4d35ddc696a1298659..46c0820d4f18dbf3bb08cc5cc4d653b254a44d61 100644 --- a/competition_configurations/7-3-3.yml +++ b/competition_configurations/7-3-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [-60] items: diff --git a/competition_configurations/7-30-1.yml b/competition_configurations/7-30-1.yml index 0a5af7452323fa7fbf6b4d38b7ec72c8d4280d9d..30fd6bc288174ab2461a325942db998b198274db 100644 --- a/competition_configurations/7-30-1.yml +++ b/competition_configurations/7-30-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 7 t: 1000 blackouts: [-20] items: diff --git a/competition_configurations/7-30-2.yml b/competition_configurations/7-30-2.yml index 0a5af7452323fa7fbf6b4d38b7ec72c8d4280d9d..30fd6bc288174ab2461a325942db998b198274db 100644 --- a/competition_configurations/7-30-2.yml +++ b/competition_configurations/7-30-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 7 t: 1000 blackouts: [-20] items: diff --git a/competition_configurations/7-30-3.yml b/competition_configurations/7-30-3.yml index 0a5af7452323fa7fbf6b4d38b7ec72c8d4280d9d..30fd6bc288174ab2461a325942db998b198274db 100644 --- a/competition_configurations/7-30-3.yml +++ b/competition_configurations/7-30-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 7 t: 1000 blackouts: [-20] items: diff --git a/competition_configurations/7-4-1.yml b/competition_configurations/7-4-1.yml index fbcf8c9aad425ca74d09f87d7eecc24c7a9008c2..79f68e30ede3908c0bf9c679100a788b1611ca71 100644 --- a/competition_configurations/7-4-1.yml +++ b/competition_configurations/7-4-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [0, 50] items: diff --git a/competition_configurations/7-4-2.yml b/competition_configurations/7-4-2.yml index 9daac229f3cee6048c7abea74de40766524315ef..523d7e15f2c2016e6fbb9a052b2b3dff432532ad 100644 --- a/competition_configurations/7-4-2.yml +++ b/competition_configurations/7-4-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [0, 100] items: diff --git a/competition_configurations/7-4-3.yml b/competition_configurations/7-4-3.yml index 481c8e93b0cdc92b25002f9b5e82e58e2bdea361..43de983bf4103c97997f0822777f5eb57750d8a3 100644 --- a/competition_configurations/7-4-3.yml +++ b/competition_configurations/7-4-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [0, 150] items: diff --git a/competition_configurations/7-5-1.yml b/competition_configurations/7-5-1.yml index b9119c8b38cb1ebde89d302df0b802f33560bcb0..50afbfc39d5114e78cf5a60eabd9a385f925e216 100644 --- a/competition_configurations/7-5-1.yml +++ b/competition_configurations/7-5-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [0, 50] items: diff --git a/competition_configurations/7-5-2.yml b/competition_configurations/7-5-2.yml index d0e8930bb0c0fe90abe948f1ed832daee81c0363..ec273a31994810b691a35e82210e59a410b7344f 100644 --- a/competition_configurations/7-5-2.yml +++ b/competition_configurations/7-5-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [0, 100] items: diff --git a/competition_configurations/7-5-3.yml b/competition_configurations/7-5-3.yml index 4d7389d4d6c47ddbb013bd4992ee734f865628a3..d21584b4d3ae12250548fe4ae6361c8eb5b4fe1f 100644 --- a/competition_configurations/7-5-3.yml +++ b/competition_configurations/7-5-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [0, 150] items: diff --git a/competition_configurations/7-6-1.yml b/competition_configurations/7-6-1.yml index badcbc00d3d485bd2cb7924a3f9e33c826350710..74428d4b977ed215a9f0013b3a50cd3380e24bde 100644 --- a/competition_configurations/7-6-1.yml +++ b/competition_configurations/7-6-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [0, 50] items: diff --git a/competition_configurations/7-6-2.yml b/competition_configurations/7-6-2.yml index 6d6c1b4c2df13668c46f78b8e8aef614ec60c263..b0e882b3457b8f746118dfbbcb79c37bed5fabfd 100644 --- a/competition_configurations/7-6-2.yml +++ b/competition_configurations/7-6-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [0, 100] items: diff --git a/competition_configurations/7-6-3.yml b/competition_configurations/7-6-3.yml index d06237654999e9e98eb0afe3259132487b50eae3..05b0872264520d8321bc7cb254756085ea227413 100644 --- a/competition_configurations/7-6-3.yml +++ b/competition_configurations/7-6-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [0, 150] items: diff --git a/competition_configurations/7-7-1.yml b/competition_configurations/7-7-1.yml index 496e5c6f5b4dae59d739b80e9d922864b058794e..11818c3bd57e478c22d58677833dc4c59fa80fc5 100644 --- a/competition_configurations/7-7-1.yml +++ b/competition_configurations/7-7-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [20, 25, 35, 40, 50, 55, 60] items: diff --git a/competition_configurations/7-7-2.yml b/competition_configurations/7-7-2.yml index 7f088b03e1d9a716f9df4bf14b72e56c145a1cc9..87b7ba8f8cebc1982ac46f166df7c208be099e88 100644 --- a/competition_configurations/7-7-2.yml +++ b/competition_configurations/7-7-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [20, 25, 35, 40, 50, 55, 60] items: diff --git a/competition_configurations/7-7-3.yml b/competition_configurations/7-7-3.yml index d2495d2ac3623745bcb9a453bee2c738aaa9d166..cfc54b0a295e1c07e74becf053ca64566e4de596 100644 --- a/competition_configurations/7-7-3.yml +++ b/competition_configurations/7-7-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [20, 25, 35, 40, 50, 55, 60] items: diff --git a/competition_configurations/7-8-1.yml b/competition_configurations/7-8-1.yml index fa5747905c14675bfb0e27f22d3bdc84ca6b798b..383293f9716fbc89ed2b1da3f28f73cfe2c491c4 100644 --- a/competition_configurations/7-8-1.yml +++ b/competition_configurations/7-8-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [20, 25, 35, 40, 50, 55, 60] items: diff --git a/competition_configurations/7-8-2.yml b/competition_configurations/7-8-2.yml index ac15d6bbc634a6e96da25b533cfcebb529d938ae..c5d46e78c5bf948892a089c8fb8198e2b1bd7081 100644 --- a/competition_configurations/7-8-2.yml +++ b/competition_configurations/7-8-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [20, 25, 35, 40, 50, 55, 60] items: diff --git a/competition_configurations/7-8-3.yml b/competition_configurations/7-8-3.yml index f9a360ec9420ad60fafcdf93d85441d45f6d3661..880b6018db14881c88e018909b5d9feb56eee552 100644 --- a/competition_configurations/7-8-3.yml +++ b/competition_configurations/7-8-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [20, 25, 35, 40, 50, 55, 60] items: diff --git a/competition_configurations/7-9-1.yml b/competition_configurations/7-9-1.yml index 679df6953490ee72853a9d0bab8971609ca804c4..583601121e382b577ae85990cfe3f9fb055088d5 100644 --- a/competition_configurations/7-9-1.yml +++ b/competition_configurations/7-9-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [20, 25, 35, 40, 50, 55, 60] items: diff --git a/competition_configurations/7-9-2.yml b/competition_configurations/7-9-2.yml index f9e94312a0351323d2b1620c78220993ade6d184..69c8b33ef85a413bbf6eaa845546386a0dd60437 100644 --- a/competition_configurations/7-9-2.yml +++ b/competition_configurations/7-9-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [20, 25, 35, 40, 50, 55, 60] items: diff --git a/competition_configurations/7-9-3.yml b/competition_configurations/7-9-3.yml index bdce1cc722ee395adaff91174f21327fb4399817..ea0726022439ba518f5f6b3f0c7f2a6f8a29c942 100644 --- a/competition_configurations/7-9-3.yml +++ b/competition_configurations/7-9-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 blackouts: [20, 25, 35, 40, 50, 55, 60] items: diff --git a/competition_configurations/8-1-1.yml b/competition_configurations/8-1-1.yml index 4a0e58b312e3a939e0160b6982173ad85dc29b95..653a5228da8d392b53e82729415604e66db081e3 100644 --- a/competition_configurations/8-1-1.yml +++ b/competition_configurations/8-1-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 250 items: - !Item diff --git a/competition_configurations/8-1-2.yml b/competition_configurations/8-1-2.yml index b3b52a32e238976f91c64fd8624c843a9106275b..c24939df7ffd8d96629b692422e27d365409d087 100644 --- a/competition_configurations/8-1-2.yml +++ b/competition_configurations/8-1-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 250 items: - !Item diff --git a/competition_configurations/8-1-3.yml b/competition_configurations/8-1-3.yml index c81646055a3476f6b9112e63a7cd0ec864217403..89fbf4cb8d301fe5375a645a0412b4271c57e92a 100644 --- a/competition_configurations/8-1-3.yml +++ b/competition_configurations/8-1-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 250 items: - !Item diff --git a/competition_configurations/8-10-1.yml b/competition_configurations/8-10-1.yml index 79ea08bd687c6b0f21844320920946f77b83b5d3..260de3f9d118cbebc74ad45de14fcdca18b0781f 100644 --- a/competition_configurations/8-10-1.yml +++ b/competition_configurations/8-10-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/8-10-2.yml b/competition_configurations/8-10-2.yml index 25a38afa726a33af15eaa028c76755452c8c664a..879f9de23ada5c41022a40e6b52df96f165401ed 100644 --- a/competition_configurations/8-10-2.yml +++ b/competition_configurations/8-10-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/8-10-3.yml b/competition_configurations/8-10-3.yml index 3d3ee70dcaa06e54bd61fd9de15ce6a658fb6aee..33bd410bd937460107bc78c2268462cd775dbcef 100644 --- a/competition_configurations/8-10-3.yml +++ b/competition_configurations/8-10-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/8-11-1.yml b/competition_configurations/8-11-1.yml index 442ea714709adcef95f5cf21ba80c82c7fca8d89..f32b962c8db589622fa27521821fe89279ec9a9b 100644 --- a/competition_configurations/8-11-1.yml +++ b/competition_configurations/8-11-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/8-11-2.yml b/competition_configurations/8-11-2.yml index 7fa9799f8fc464ada7dc480de1799205d8f8225f..b66d8ab2544bb06292c12ddd42c1de65fead251f 100644 --- a/competition_configurations/8-11-2.yml +++ b/competition_configurations/8-11-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/8-11-3.yml b/competition_configurations/8-11-3.yml index a5b6217fa90e3f1e1089916414ce8b92df2760d9..1fdebebfc2fa37abeb2d41bcae79ebdde637dfdb 100644 --- a/competition_configurations/8-11-3.yml +++ b/competition_configurations/8-11-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/8-12-1.yml b/competition_configurations/8-12-1.yml index 5d83334f1862f2e82ac860b293a5b6c49eb38114..dc752025d30187155201bbc09a2ed419fff0ade7 100644 --- a/competition_configurations/8-12-1.yml +++ b/competition_configurations/8-12-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/8-12-2.yml b/competition_configurations/8-12-2.yml index 488d94ab4a8495ab38132821d5aafda25ed1c2fd..788d62389d8eb1f120dd600b1dabea2ff52d97b6 100644 --- a/competition_configurations/8-12-2.yml +++ b/competition_configurations/8-12-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/8-12-3.yml b/competition_configurations/8-12-3.yml index 5ac42e686b74fd4ec5b238a28defbb81583a0487..f8ad9777b431c918c4e4c3e5932e7e7f87a27fc2 100644 --- a/competition_configurations/8-12-3.yml +++ b/competition_configurations/8-12-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/8-13-1.yml b/competition_configurations/8-13-1.yml index 19b3eeb4f2c6ef2bdc5b2f90ad2cef97f853145a..87015e51c9840bc9c399ea8c55db2863a9974d97 100644 --- a/competition_configurations/8-13-1.yml +++ b/competition_configurations/8-13-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/8-13-2.yml b/competition_configurations/8-13-2.yml index 401c1a58b8161497f2db58b1fcee3aa62545174c..eb06fdb05da7902cf8d6a2abadbf6449f721c099 100644 --- a/competition_configurations/8-13-2.yml +++ b/competition_configurations/8-13-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/8-13-3.yml b/competition_configurations/8-13-3.yml index 3faa3130d0f1fcfa7930e4a4723eea2f55350673..b920d6b0edbf2eab3d3222f8e35045b77258699f 100644 --- a/competition_configurations/8-13-3.yml +++ b/competition_configurations/8-13-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/8-14-1.yml b/competition_configurations/8-14-1.yml index 0f643776f6a0a6c8920e48aeb7d105b4e984237e..f3d31270d7421ce4e3e64cd12f5a3626f2991af5 100644 --- a/competition_configurations/8-14-1.yml +++ b/competition_configurations/8-14-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/8-14-2.yml b/competition_configurations/8-14-2.yml index 9dd72c92ba87e5a66aa943058caabc294b35c73d..33623a5c0c58a3d0f860b68292bb9d39dcd181d5 100644 --- a/competition_configurations/8-14-2.yml +++ b/competition_configurations/8-14-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/8-14-3.yml b/competition_configurations/8-14-3.yml index eefe12210bda5e9abb14e9113868ba70876a56f4..0812b5302380e3c88c6c891f443397b00499f082 100644 --- a/competition_configurations/8-14-3.yml +++ b/competition_configurations/8-14-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/8-15-1.yml b/competition_configurations/8-15-1.yml index 0fef3ccf866eb10a921436fe55a8cca6dbb34a04..a34e7aab505c9e0c896f96423a5b567ab6daa39b 100644 --- a/competition_configurations/8-15-1.yml +++ b/competition_configurations/8-15-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/8-15-2.yml b/competition_configurations/8-15-2.yml index 24ba81e5abd04e57be33daddc323dc97a7798c63..1138accf4583e1d2852d24145a8bb0466d8a4afe 100644 --- a/competition_configurations/8-15-2.yml +++ b/competition_configurations/8-15-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/8-15-3.yml b/competition_configurations/8-15-3.yml index 6c6a07d0973d4b26b14f3e41f1f53035439808e2..54446f4430c28df32e42ae7091b3fbdb05a0e3b6 100644 --- a/competition_configurations/8-15-3.yml +++ b/competition_configurations/8-15-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/8-16-1.yml b/competition_configurations/8-16-1.yml index 00b48434cba839a0d3fcb749ae4f25da034f720d..b4a944b185345792a812077754a7159fad4c5834 100644 --- a/competition_configurations/8-16-1.yml +++ b/competition_configurations/8-16-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/8-16-2.yml b/competition_configurations/8-16-2.yml index c61558b7cba9eee8db4600d8fe8a0a1f0f34c1ee..8a1e693b3a205b0037fc720713b75d652ebefb1f 100644 --- a/competition_configurations/8-16-2.yml +++ b/competition_configurations/8-16-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/8-16-3.yml b/competition_configurations/8-16-3.yml index 77af3a7ee8e9591f783b8d800619f52974bb4ea4..fef8b441172115dbe4b5536ed170b57908697ff0 100644 --- a/competition_configurations/8-16-3.yml +++ b/competition_configurations/8-16-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0 t: 250 items: - !Item diff --git a/competition_configurations/8-17-1.yml b/competition_configurations/8-17-1.yml index 577bfe6a2f4995e7fa8ea42dd590b2ffb7847e5c..f611fe9f891becbb8f41f7d02cc03078d3cba2ae 100644 --- a/competition_configurations/8-17-1.yml +++ b/competition_configurations/8-17-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/8-17-2.yml b/competition_configurations/8-17-2.yml index 010970188320f16acad023e95e54c97560843ccd..f4a58dfa052c00cbb36081c2f0abbe32a132b8d5 100644 --- a/competition_configurations/8-17-2.yml +++ b/competition_configurations/8-17-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/8-17-3.yml b/competition_configurations/8-17-3.yml index 4e66cc49f34566cba45a584e7b1597838d50ebaa..9721aa826b99d38e362843afa1a0fafdaba3ee13 100644 --- a/competition_configurations/8-17-3.yml +++ b/competition_configurations/8-17-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/8-18-1.yml b/competition_configurations/8-18-1.yml index 3f5028f430bf168b1c986902b1e33d5bc9535f10..7f333ca11dd07fff09cf3f4151aa4d9f9b3e8f65 100644 --- a/competition_configurations/8-18-1.yml +++ b/competition_configurations/8-18-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/8-18-2.yml b/competition_configurations/8-18-2.yml index 125b5703bfa41f51be76dbd87f57d7394abfee0a..2acb481c9ce7d874461ffdcc35527c176a42f66d 100644 --- a/competition_configurations/8-18-2.yml +++ b/competition_configurations/8-18-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/8-18-3.yml b/competition_configurations/8-18-3.yml index 3806f1bf63d74beaa6d7ddf4373dd0bb7495d3be..25b196eb9064cdb689c7e65e61c73b2aac61d858 100644 --- a/competition_configurations/8-18-3.yml +++ b/competition_configurations/8-18-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/8-19-1.yml b/competition_configurations/8-19-1.yml index c972a74e025dd26157ff3dff4e15e4252af60c4c..060b060e5f96aef533007eafc11840373e7102d3 100644 --- a/competition_configurations/8-19-1.yml +++ b/competition_configurations/8-19-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-19-2.yml b/competition_configurations/8-19-2.yml index 1c9944b7cf585b3a9be4a2820c913470892b64f6..a91fd4d9fbd417452c57e12b100a0d3fdf6827ef 100644 --- a/competition_configurations/8-19-2.yml +++ b/competition_configurations/8-19-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-19-3.yml b/competition_configurations/8-19-3.yml index 848f83024d2e0216ce5456299a23012bb0f8429a..3be5a8efdfdd1231934d1fe23040c503cbb1ff32 100644 --- a/competition_configurations/8-19-3.yml +++ b/competition_configurations/8-19-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-2-1.yml b/competition_configurations/8-2-1.yml index 2e992b2d63b3d09615a085bfca1a7e8a709271d5..0f60773e2d3e2ff4f03228b1ebb8acd0f3825943 100644 --- a/competition_configurations/8-2-1.yml +++ b/competition_configurations/8-2-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 250 items: - !Item diff --git a/competition_configurations/8-2-2.yml b/competition_configurations/8-2-2.yml index 957a358d05309342758a2075e22855a8d7a9b7bb..94e7eb3bc0da2162a1463c9d1e8b503f237de8d7 100644 --- a/competition_configurations/8-2-2.yml +++ b/competition_configurations/8-2-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 250 items: - !Item diff --git a/competition_configurations/8-2-3.yml b/competition_configurations/8-2-3.yml index 1c0377122a6330de6e721a83c381f3fbc8b6ff2a..dfc280b40daaffa3ca3e0c46662e20bf3f19c6c6 100644 --- a/competition_configurations/8-2-3.yml +++ b/competition_configurations/8-2-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 250 items: - !Item diff --git a/competition_configurations/8-20-1.yml b/competition_configurations/8-20-1.yml index c1b5c4f1a1c1387b4b1be633a0e2a701a4f1b5c7..66b02b7a1609e3e75d79e33c4c176cbb9a0b231e 100644 --- a/competition_configurations/8-20-1.yml +++ b/competition_configurations/8-20-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-20-2.yml b/competition_configurations/8-20-2.yml index cf517d87a4a450db138412450df54f0569992ebc..cbb1e07f64ad7d22819b33d90aab6b460bd05fd7 100644 --- a/competition_configurations/8-20-2.yml +++ b/competition_configurations/8-20-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-20-3.yml b/competition_configurations/8-20-3.yml index 904f0e756e63651bb8607327e6ff6fd7da8ee72f..ca6171967ab65433016d400425d33e6738ee1e31 100644 --- a/competition_configurations/8-20-3.yml +++ b/competition_configurations/8-20-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-21-1.yml b/competition_configurations/8-21-1.yml index 9b40d809decffa5a95f95e9ee59ed9dd1358267d..1f0040b1cc06dcdb8ff30d21cf9f37d66b383d63 100644 --- a/competition_configurations/8-21-1.yml +++ b/competition_configurations/8-21-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-21-2.yml b/competition_configurations/8-21-2.yml index 2a12e4d0d1d06a30e3cdc61c231b332b4d7b2c0a..a7ab05a5bbc00fc1aad033f007cea0bf5b46db32 100644 --- a/competition_configurations/8-21-2.yml +++ b/competition_configurations/8-21-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-21-3.yml b/competition_configurations/8-21-3.yml index 95990fb5910d89e97773e37c56f95b9438d65e0f..bc2a20af49db5e8ec94f7a2d4d56cdf460052aee 100644 --- a/competition_configurations/8-21-3.yml +++ b/competition_configurations/8-21-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-22-1.yml b/competition_configurations/8-22-1.yml index 2a044f738bed4dcfc01ae9455d5ea990f6ce08c6..46ab0f293e5f87bb6c14344302b70deb74cedf6c 100644 --- a/competition_configurations/8-22-1.yml +++ b/competition_configurations/8-22-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-22-2.yml b/competition_configurations/8-22-2.yml index 093e3933df691cfbf992465d8b9ae47e57a72be5..3422c064392109c8bb194d0dff726a5382bbd62b 100644 --- a/competition_configurations/8-22-2.yml +++ b/competition_configurations/8-22-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-22-3.yml b/competition_configurations/8-22-3.yml index 143fa1697062258ced633eed54c0f2d3b0f5381e..33541ea58fd36344188b0dd1b50dbad405fe784e 100644 --- a/competition_configurations/8-22-3.yml +++ b/competition_configurations/8-22-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-23-1.yml b/competition_configurations/8-23-1.yml index 6664c4d7ca8341b4cf66c3edd9b01094f9e06056..4852a7342abd5931f474ace1aa1dcd8b460453e3 100644 --- a/competition_configurations/8-23-1.yml +++ b/competition_configurations/8-23-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-23-2.yml b/competition_configurations/8-23-2.yml index d1b9ce0045625401d0be035ce68ebd55ec27b34a..24b68bd82b4fb4c42b8c7978a0b916053b26aceb 100644 --- a/competition_configurations/8-23-2.yml +++ b/competition_configurations/8-23-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-23-3.yml b/competition_configurations/8-23-3.yml index 17a80f10f1f9dca31f9177b71b29fe8e4b70fdbb..486dca0e8b74c59335094eae2db1b01472b8d450 100644 --- a/competition_configurations/8-23-3.yml +++ b/competition_configurations/8-23-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-24-1.yml b/competition_configurations/8-24-1.yml index b01d46dfe23326eeed2e9bcaada9ad07de333458..ee56b9c8102df3ca1a0d8e9b7c7b31cd0841b095 100644 --- a/competition_configurations/8-24-1.yml +++ b/competition_configurations/8-24-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-24-2.yml b/competition_configurations/8-24-2.yml index 2786ffdcc6d3ddbc0d25586f8e04b4f86f5359d2..5133c9852ff30db04dd0e5a659a32838be7cb279 100644 --- a/competition_configurations/8-24-2.yml +++ b/competition_configurations/8-24-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-24-3.yml b/competition_configurations/8-24-3.yml index a06bfe03f613a01b58ea1f5913048ce402431762..78d082a322eaebd62888b09c73872a44e33a61e1 100644 --- a/competition_configurations/8-24-3.yml +++ b/competition_configurations/8-24-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-25-1.yml b/competition_configurations/8-25-1.yml index 3a2e6eedd4d9de7e580af9d3e5b67b1019bcb54d..253d116974a29a5dbe74daceb5593214f7a0d68a 100644 --- a/competition_configurations/8-25-1.yml +++ b/competition_configurations/8-25-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-25-2.yml b/competition_configurations/8-25-2.yml index 62d848c61202e6cbdd90ac173e64d843c5471780..7d239c48d841077f28f2fa6acdf23f9388b098ff 100644 --- a/competition_configurations/8-25-2.yml +++ b/competition_configurations/8-25-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-25-3.yml b/competition_configurations/8-25-3.yml index 68e7f1034cda937d66dd250aca1c65d4cbeaf9ab..d32989b2368a6715d055f84d78a01a7c6845bf5e 100644 --- a/competition_configurations/8-25-3.yml +++ b/competition_configurations/8-25-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-26-1.yml b/competition_configurations/8-26-1.yml index 90ed48d1c87ba494227a08104878d94cbfb1dbbb..7767df534af457d692b444671e9bb9ee67050b26 100644 --- a/competition_configurations/8-26-1.yml +++ b/competition_configurations/8-26-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-26-2.yml b/competition_configurations/8-26-2.yml index 5071fee67a06bde62073e5add7d6cccb2fcd50fb..678dddf5c2db013f6075cf171db248cee383f30b 100644 --- a/competition_configurations/8-26-2.yml +++ b/competition_configurations/8-26-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-26-3.yml b/competition_configurations/8-26-3.yml index a2e21eede6454562041c72f1320027829aeef6cf..9e1a9b8b98428832f1883f6f3ac7bba864698f5b 100644 --- a/competition_configurations/8-26-3.yml +++ b/competition_configurations/8-26-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-27-1.yml b/competition_configurations/8-27-1.yml index 9bb4c780bfa26f446ecfb61a7ff3e39bfa22b212..d57f25e471436b91cf8d83646796040460134a0e 100644 --- a/competition_configurations/8-27-1.yml +++ b/competition_configurations/8-27-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-27-2.yml b/competition_configurations/8-27-2.yml index 7c34558fd145410dd5e09b2a72bef11cd5289df7..3470904802057fc2075b956da45c047d6df8c333 100644 --- a/competition_configurations/8-27-2.yml +++ b/competition_configurations/8-27-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-27-3.yml b/competition_configurations/8-27-3.yml index c81a62abda0a270685341c052121fe1070e6a401..37629abdb3152687a084c9a2aed91f1026eab369 100644 --- a/competition_configurations/8-27-3.yml +++ b/competition_configurations/8-27-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-28-1.yml b/competition_configurations/8-28-1.yml index 555db86beae5b4a0fd11c6d96cd824e27af88209..4790691e71b6bac413c808082625c8534832dd98 100644 --- a/competition_configurations/8-28-1.yml +++ b/competition_configurations/8-28-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-28-2.yml b/competition_configurations/8-28-2.yml index c8cfeb698f13f97978ef585df785834ff4b2587a..5ad02de35d6aa06f7d731abf70ae9ed064d02185 100644 --- a/competition_configurations/8-28-2.yml +++ b/competition_configurations/8-28-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-28-3.yml b/competition_configurations/8-28-3.yml index d8dd2e5454048cea76c76ca484c00e7671a8e8ec..cd908c78593d7b6233041ed9ee43dfa6d182918d 100644 --- a/competition_configurations/8-28-3.yml +++ b/competition_configurations/8-28-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-29-1.yml b/competition_configurations/8-29-1.yml index 0a2286351e52bcc1d0baec09601c360409ad6151..58518ce5a21c9d7c78790c446ae53960688ba2d8 100644 --- a/competition_configurations/8-29-1.yml +++ b/competition_configurations/8-29-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-29-2.yml b/competition_configurations/8-29-2.yml index 7eb69e8384269e13ed0802ba8f6742fb686e27ac..2df0638309861bffbdf4c89236b3eb4543601229 100644 --- a/competition_configurations/8-29-2.yml +++ b/competition_configurations/8-29-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-29-3.yml b/competition_configurations/8-29-3.yml index 6db66500499f26b3f04256522d7cd0dfa5aeb7b1..f10be2e44a1e12bdd958372af84241efc0d33f84 100644 --- a/competition_configurations/8-29-3.yml +++ b/competition_configurations/8-29-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-3-1.yml b/competition_configurations/8-3-1.yml index 2b542c6f60aa29538fdb1d8c6e8be7c5a2b02b63..fede4e7cfdb48d49042652b507c7b48d89fda858 100644 --- a/competition_configurations/8-3-1.yml +++ b/competition_configurations/8-3-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 250 items: - !Item diff --git a/competition_configurations/8-3-2.yml b/competition_configurations/8-3-2.yml index 4a2a421f8ab957aa427da3d1afc7fda75415ffaa..c24501d3ec571691b72279b4a90ada7df6746924 100644 --- a/competition_configurations/8-3-2.yml +++ b/competition_configurations/8-3-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 250 items: - !Item diff --git a/competition_configurations/8-3-3.yml b/competition_configurations/8-3-3.yml index dc6b6d8493586b08859722e65ae3c20236829f69..73fde3044deaae7c2a539252825b9a420c03bd4d 100644 --- a/competition_configurations/8-3-3.yml +++ b/competition_configurations/8-3-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3 t: 250 items: - !Item diff --git a/competition_configurations/8-30-1.yml b/competition_configurations/8-30-1.yml index 2a8ab46814ac7603b14faee81aef712d00829aed..64cb0d85ddbac9bf0f40fd3706446e7b867799cb 100644 --- a/competition_configurations/8-30-1.yml +++ b/competition_configurations/8-30-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-30-2.yml b/competition_configurations/8-30-2.yml index 66eae162dc9e1658f81f63b704ef9faed7cd87d5..30355d6900eef19f4ddddbf0a33d7cb492be9fea 100644 --- a/competition_configurations/8-30-2.yml +++ b/competition_configurations/8-30-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-30-3.yml b/competition_configurations/8-30-3.yml index cc540ee6f29b95a0ad23f562dcce7fe3b59c629d..bef5c8f5ae988e3374e95c6b50097d6374268d7e 100644 --- a/competition_configurations/8-30-3.yml +++ b/competition_configurations/8-30-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 blackouts: [15, 60] items: diff --git a/competition_configurations/8-4-1.yml b/competition_configurations/8-4-1.yml index 272448cfb3fcf0c3a8d1353871f7753e1ee98fbd..42d20ae37dffb4e5f1c17d64590296176b482b6d 100644 --- a/competition_configurations/8-4-1.yml +++ b/competition_configurations/8-4-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/8-4-2.yml b/competition_configurations/8-4-2.yml index 616c6c4b8638341b14053c5ce01c69aafa3897bd..1a4cac2213c0c016c4166b85b260d9a7b8d92000 100644 --- a/competition_configurations/8-4-2.yml +++ b/competition_configurations/8-4-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/8-4-3.yml b/competition_configurations/8-4-3.yml index 2bcbeba9fc2cd8fb698fbf1511b69114df738772..6c7ad4c29741aaa32748e246bba93a22637aefb6 100644 --- a/competition_configurations/8-4-3.yml +++ b/competition_configurations/8-4-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 500 items: - !Item diff --git a/competition_configurations/8-5-1.yml b/competition_configurations/8-5-1.yml index ae39522ccc53eb177c128833f363e1a63b6c07ee..96890b2dd78ba0e7fdbb427874e9281797b70378 100644 --- a/competition_configurations/8-5-1.yml +++ b/competition_configurations/8-5-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/8-5-2.yml b/competition_configurations/8-5-2.yml index 58016c6a08b2a5e264c8e44c41fdf85e87d89215..2fa09caaa4a6aefaec8e89b124af2fd275891f98 100644 --- a/competition_configurations/8-5-2.yml +++ b/competition_configurations/8-5-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/8-5-3.yml b/competition_configurations/8-5-3.yml index fc17fbfc928c95273d9a25c9fd996e6b2572b4c8..6177784fbc13f21da0c9bac847003c15a7de54e1 100644 --- a/competition_configurations/8-5-3.yml +++ b/competition_configurations/8-5-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/8-6-1.yml b/competition_configurations/8-6-1.yml index cc6bb7407766f1d24ca6b567f67d83ea57b76f4f..8fdcc00921db71f9778cf7a0e66ddec9e7f68af7 100644 --- a/competition_configurations/8-6-1.yml +++ b/competition_configurations/8-6-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/8-6-2.yml b/competition_configurations/8-6-2.yml index 43da7504cc3528308fe6f2ec8ec8465bd1e743f0..2da0df6a6be7c5847b9f0695f2953bdaae33ddf1 100644 --- a/competition_configurations/8-6-2.yml +++ b/competition_configurations/8-6-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/8-6-3.yml b/competition_configurations/8-6-3.yml index beb4519fcc24372668c64042c5aa0b0f27c1153f..8b5792fad7db0348ec4e0ebf271ea62cd4a1a0a0 100644 --- a/competition_configurations/8-6-3.yml +++ b/competition_configurations/8-6-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 1 t: 250 items: - !Item diff --git a/competition_configurations/8-7-1.yml b/competition_configurations/8-7-1.yml index 3d6eb0e330684c004f66a26150f29a0d64c22b82..8016bde94fafdb90825afb56c5debfc09ff93c30 100644 --- a/competition_configurations/8-7-1.yml +++ b/competition_configurations/8-7-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 250 items: - !Item diff --git a/competition_configurations/8-7-2.yml b/competition_configurations/8-7-2.yml index 2e41934a1bbae472433ec1a920e318e8142ca5b2..042bea9083ffc851188a0a50818ef21411313725 100644 --- a/competition_configurations/8-7-2.yml +++ b/competition_configurations/8-7-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 250 items: - !Item diff --git a/competition_configurations/8-7-3.yml b/competition_configurations/8-7-3.yml index cf4929bd6dc9b0f353f2de53fc035caab81d8f8c..c08b1ea7f71b63bf816d832adb82231befb1378e 100644 --- a/competition_configurations/8-7-3.yml +++ b/competition_configurations/8-7-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 250 items: - !Item diff --git a/competition_configurations/8-8-1.yml b/competition_configurations/8-8-1.yml index e488175b752dde62cf85e5b24120d13a21955b8c..84e5c27aab62f28b192248c4ff39c1fefde5179b 100644 --- a/competition_configurations/8-8-1.yml +++ b/competition_configurations/8-8-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 250 items: - !Item diff --git a/competition_configurations/8-8-2.yml b/competition_configurations/8-8-2.yml index e0cffb9fccf1eb9ccaf79f92cb19a4e89684b896..cbd208cb7a5043b7e4f8f71806524a5f28ced204 100644 --- a/competition_configurations/8-8-2.yml +++ b/competition_configurations/8-8-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 250 items: - !Item diff --git a/competition_configurations/8-8-3.yml b/competition_configurations/8-8-3.yml index e7cab6199a3faa31ae2b59de79d712306602d61d..9b3b8c0ccf185f2e50bd36c669c15b3ed746e33f 100644 --- a/competition_configurations/8-8-3.yml +++ b/competition_configurations/8-8-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 250 items: - !Item diff --git a/competition_configurations/8-9-1.yml b/competition_configurations/8-9-1.yml index 97b7157fb3afcf3b5c5c1cef1f42ad45ad5edc49..8dbdc34a54aa180dae785a03cd207a21c3debca9 100644 --- a/competition_configurations/8-9-1.yml +++ b/competition_configurations/8-9-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 250 items: - !Item diff --git a/competition_configurations/8-9-2.yml b/competition_configurations/8-9-2.yml index ed1059376c613784f4b148f7cc0574cbd74d023d..3a8f771c513afd02b3b79e2c20aec0263d6948d0 100644 --- a/competition_configurations/8-9-2.yml +++ b/competition_configurations/8-9-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 250 items: - !Item diff --git a/competition_configurations/8-9-3.yml b/competition_configurations/8-9-3.yml index 31a3276cfdb30cae9cc95fbb16b9daca6b96bc73..5554109118e4c6e9370560678ec1a5b828971bd6 100644 --- a/competition_configurations/8-9-3.yml +++ b/competition_configurations/8-9-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 250 items: - !Item diff --git a/competition_configurations/9-1-1.yml b/competition_configurations/9-1-1.yml index 8ac158420b88d0ea0121a4fba3cba1d90508cf7a..a0ae18f997eade525c023de269b756e9e6011c20 100644 --- a/competition_configurations/9-1-1.yml +++ b/competition_configurations/9-1-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0.9 t: 250 items: - !Item diff --git a/competition_configurations/9-1-2.yml b/competition_configurations/9-1-2.yml index 204e40098d0102d9dc37747094f5105efbf96df6..9bfc8cd98476e6e1258d40b8b02c1e4ac6cd16b3 100644 --- a/competition_configurations/9-1-2.yml +++ b/competition_configurations/9-1-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0.9 t: 250 items: - !Item diff --git a/competition_configurations/9-1-3.yml b/competition_configurations/9-1-3.yml index 5d9ae3d6ed4864c48d0b7f634cffb6dadab2e3d3..35bec1e2ee12a7d325784032febf3129e98d5dfe 100644 --- a/competition_configurations/9-1-3.yml +++ b/competition_configurations/9-1-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 0.9 t: 250 items: - !Item diff --git a/competition_configurations/9-10-1.yml b/competition_configurations/9-10-1.yml index e91f0270528fc90a9031a58ad296a765a1094fd9..a608d2d930968f84699fef3728a6674e31fa2e15 100644 --- a/competition_configurations/9-10-1.yml +++ b/competition_configurations/9-10-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 6.9 t: 250 items: - !Item diff --git a/competition_configurations/9-10-2.yml b/competition_configurations/9-10-2.yml index e91f0270528fc90a9031a58ad296a765a1094fd9..a608d2d930968f84699fef3728a6674e31fa2e15 100644 --- a/competition_configurations/9-10-2.yml +++ b/competition_configurations/9-10-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 6.9 t: 250 items: - !Item diff --git a/competition_configurations/9-10-3.yml b/competition_configurations/9-10-3.yml index e91f0270528fc90a9031a58ad296a765a1094fd9..a608d2d930968f84699fef3728a6674e31fa2e15 100644 --- a/competition_configurations/9-10-3.yml +++ b/competition_configurations/9-10-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 6.9 t: 250 items: - !Item diff --git a/competition_configurations/9-11-1.yml b/competition_configurations/9-11-1.yml index 652412cd53828386dde1c3657637cccb8ca3ef6b..7fdd0007202b7aba6ce6e5a9537d3f0942ed996f 100644 --- a/competition_configurations/9-11-1.yml +++ b/competition_configurations/9-11-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 8.9 t: 250 items: - !Item diff --git a/competition_configurations/9-11-2.yml b/competition_configurations/9-11-2.yml index 652412cd53828386dde1c3657637cccb8ca3ef6b..7fdd0007202b7aba6ce6e5a9537d3f0942ed996f 100644 --- a/competition_configurations/9-11-2.yml +++ b/competition_configurations/9-11-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 8.9 t: 250 items: - !Item diff --git a/competition_configurations/9-11-3.yml b/competition_configurations/9-11-3.yml index 652412cd53828386dde1c3657637cccb8ca3ef6b..7fdd0007202b7aba6ce6e5a9537d3f0942ed996f 100644 --- a/competition_configurations/9-11-3.yml +++ b/competition_configurations/9-11-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 8.9 t: 250 items: - !Item diff --git a/competition_configurations/9-12-1.yml b/competition_configurations/9-12-1.yml index 4ffe850424145b72057bd098b9a205dc1cd4a61b..d89c14ecf422a2b8ed70f0191141c94066547e09 100644 --- a/competition_configurations/9-12-1.yml +++ b/competition_configurations/9-12-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 8.9 t: 250 items: - !Item diff --git a/competition_configurations/9-12-2.yml b/competition_configurations/9-12-2.yml index 4ffe850424145b72057bd098b9a205dc1cd4a61b..d89c14ecf422a2b8ed70f0191141c94066547e09 100644 --- a/competition_configurations/9-12-2.yml +++ b/competition_configurations/9-12-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 8.9 t: 250 items: - !Item diff --git a/competition_configurations/9-12-3.yml b/competition_configurations/9-12-3.yml index 4ffe850424145b72057bd098b9a205dc1cd4a61b..d89c14ecf422a2b8ed70f0191141c94066547e09 100644 --- a/competition_configurations/9-12-3.yml +++ b/competition_configurations/9-12-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 8.9 t: 250 items: - !Item diff --git a/competition_configurations/9-13-1.yml b/competition_configurations/9-13-1.yml index 33700e5489188447ff8d6f231cf4166028816219..e068e5f661ada09f6299e61075c117f8e9dc1577 100644 --- a/competition_configurations/9-13-1.yml +++ b/competition_configurations/9-13-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-13-2.yml b/competition_configurations/9-13-2.yml index baed816dc58d458e529cc50bc5cfa9d154b0acb9..583284055de6fa16667f82cf808461f2dacf9ff9 100644 --- a/competition_configurations/9-13-2.yml +++ b/competition_configurations/9-13-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-13-3.yml b/competition_configurations/9-13-3.yml index c1bf45b15aead113cd7b1ec4e0b5a873d9b8b8cd..9d8f74eda90886878387366c654eb9c2f09ec142 100644 --- a/competition_configurations/9-13-3.yml +++ b/competition_configurations/9-13-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-14-1.yml b/competition_configurations/9-14-1.yml index cf68b426d8ddcc17379fe4907242c62d474a5156..d109b5c9f1b6990e6394d20daeca4f1138a7b711 100644 --- a/competition_configurations/9-14-1.yml +++ b/competition_configurations/9-14-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-14-2.yml b/competition_configurations/9-14-2.yml index 71ab814ff6697dfac324ff797ea2a5807decb7d3..38e55007c0078eb9970499b1a7715132e9895621 100644 --- a/competition_configurations/9-14-2.yml +++ b/competition_configurations/9-14-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-14-3.yml b/competition_configurations/9-14-3.yml index 38f03534796b5ecff511ad686a6aa156ec9d81b8..3362437ed578284cb2c12becd73fc35f14b5fbca 100644 --- a/competition_configurations/9-14-3.yml +++ b/competition_configurations/9-14-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-15-1.yml b/competition_configurations/9-15-1.yml index 34e51c0a44755da6dd9161a4cb102dbae80a9230..18106710ef8833de65060e4b8d22c4145e261f26 100644 --- a/competition_configurations/9-15-1.yml +++ b/competition_configurations/9-15-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-15-2.yml b/competition_configurations/9-15-2.yml index ad7618172faa9da4a78cfc824a08d8551e356cbd..d87052d500b7a34bc76f683ebbbc3823dce3521f 100644 --- a/competition_configurations/9-15-2.yml +++ b/competition_configurations/9-15-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-15-3.yml b/competition_configurations/9-15-3.yml index ea643a25c834a8f3bf17567ac4b907c8aa8b91cf..1edc620f665e5ff53d15fc10eb3c492a4436660b 100644 --- a/competition_configurations/9-15-3.yml +++ b/competition_configurations/9-15-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-16-1.yml b/competition_configurations/9-16-1.yml index 7aab3d59f69963b741ad86da8c85616597aec6a4..4d91e3effd6c59eede4e18177465cdd837cf5aec 100644 --- a/competition_configurations/9-16-1.yml +++ b/competition_configurations/9-16-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-16-2.yml b/competition_configurations/9-16-2.yml index 5aae92e231c35fff3c07260d89bc935bba9783b2..518516cc04b75b170810deca1f3c5a6b8fc4379d 100644 --- a/competition_configurations/9-16-2.yml +++ b/competition_configurations/9-16-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-16-3.yml b/competition_configurations/9-16-3.yml index 65e637fbebeb34812ce8e7267fe2baf535bca2d0..c05d7b806e62ebf5bd8d9c26d4c54b1a81917f16 100644 --- a/competition_configurations/9-16-3.yml +++ b/competition_configurations/9-16-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-17-1.yml b/competition_configurations/9-17-1.yml index 4876f1481a22acf00d521b543c5f3f8cad865830..1597b0976bbbb5476fa2979f4a64ac11215e0d34 100644 --- a/competition_configurations/9-17-1.yml +++ b/competition_configurations/9-17-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-17-2.yml b/competition_configurations/9-17-2.yml index 3e05f076f1b3f29d64e7824165552a458f541cf4..0a952add1757c5e016054acc59dc9cb4a916f56a 100644 --- a/competition_configurations/9-17-2.yml +++ b/competition_configurations/9-17-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-17-3.yml b/competition_configurations/9-17-3.yml index 2559a245394f7bfb1429e7f01c8f81b42a42d48a..f5cb92a35f50b07df0cd22e1e7110ba1dcffadbd 100644 --- a/competition_configurations/9-17-3.yml +++ b/competition_configurations/9-17-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-18-1.yml b/competition_configurations/9-18-1.yml index 3dc32aa4eef7293b7d236da043b47631bdcfcfb4..f383435931c72380448ad6e2a793cf2b0305e104 100644 --- a/competition_configurations/9-18-1.yml +++ b/competition_configurations/9-18-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-18-2.yml b/competition_configurations/9-18-2.yml index ffedef33373603117745c54459989d18dff6992a..782cb613f5eb2a608f9c96a4ea4305de45aaa106 100644 --- a/competition_configurations/9-18-2.yml +++ b/competition_configurations/9-18-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-18-3.yml b/competition_configurations/9-18-3.yml index cb5be84ff38006a9a5c986602bc7d83d2d6445f6..e3a2d9fe86967b912c49876a71fe39c8fd86a088 100644 --- a/competition_configurations/9-18-3.yml +++ b/competition_configurations/9-18-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-19-1.yml b/competition_configurations/9-19-1.yml index 17d1ef81082583e8b1af2b8d4ade13a1f4c84585..d8540df51297d71ca94536aa4482385e7bec47c4 100644 --- a/competition_configurations/9-19-1.yml +++ b/competition_configurations/9-19-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-19-2.yml b/competition_configurations/9-19-2.yml index 5f63a24fea27827dc0d41cab8a558192254fcd94..3573b4e6431251e3b972c7eb90258415a3786c3f 100644 --- a/competition_configurations/9-19-2.yml +++ b/competition_configurations/9-19-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-19-3.yml b/competition_configurations/9-19-3.yml index 48b7532ef72100c592e933840402fd725d7e4dea..34ced5d641219870aec9c61b997db79137b1f2e2 100644 --- a/competition_configurations/9-19-3.yml +++ b/competition_configurations/9-19-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-2-1.yml b/competition_configurations/9-2-1.yml index 36289d4764f83afd75c1447f1149f8b29db5a6d4..a3bba41656f106a3ac8dfe84ea0691afaa1b2682 100644 --- a/competition_configurations/9-2-1.yml +++ b/competition_configurations/9-2-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 8.9 t: 250 items: - !Item diff --git a/competition_configurations/9-2-2.yml b/competition_configurations/9-2-2.yml index 36289d4764f83afd75c1447f1149f8b29db5a6d4..a3bba41656f106a3ac8dfe84ea0691afaa1b2682 100644 --- a/competition_configurations/9-2-2.yml +++ b/competition_configurations/9-2-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 8.9 t: 250 items: - !Item diff --git a/competition_configurations/9-2-3.yml b/competition_configurations/9-2-3.yml index 36289d4764f83afd75c1447f1149f8b29db5a6d4..a3bba41656f106a3ac8dfe84ea0691afaa1b2682 100644 --- a/competition_configurations/9-2-3.yml +++ b/competition_configurations/9-2-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 8.9 t: 250 items: - !Item diff --git a/competition_configurations/9-20-1.yml b/competition_configurations/9-20-1.yml index 8f3e37e8f7a28dba90851576c34804efbf12dada..d89d800334b33c82b95f685bbac9abd916d60b9a 100644 --- a/competition_configurations/9-20-1.yml +++ b/competition_configurations/9-20-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-20-2.yml b/competition_configurations/9-20-2.yml index 1247ab82ba40ff96c1cd6d606a22ff911a14c8a9..1ff6bf1afc75b285a8dc0cbb99dddaca0ec6b95d 100644 --- a/competition_configurations/9-20-2.yml +++ b/competition_configurations/9-20-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-20-3.yml b/competition_configurations/9-20-3.yml index 82508b6a99041de4b25b43427b0927016469974b..6907486fd30c2f1be56dad5d5aee8873486e0835 100644 --- a/competition_configurations/9-20-3.yml +++ b/competition_configurations/9-20-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-21-1.yml b/competition_configurations/9-21-1.yml index 8856026d04e675da7911d8b64e485cac26b3fb6e..7194e3dd746dd3b42bf0244221bbdd432007dfa4 100644 --- a/competition_configurations/9-21-1.yml +++ b/competition_configurations/9-21-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-21-2.yml b/competition_configurations/9-21-2.yml index e30149533951a9e5ccafc91135a6a95a43d1afd5..8847bd187708e67f30dd7dc516e498b8780f74d0 100644 --- a/competition_configurations/9-21-2.yml +++ b/competition_configurations/9-21-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-21-3.yml b/competition_configurations/9-21-3.yml index 67ad8078451cdaad6b6b8706e79231f0f876921b..d9b8707a6e3cacc250e8a00d9b3fea9b3039624f 100644 --- a/competition_configurations/9-21-3.yml +++ b/competition_configurations/9-21-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-22-1.yml b/competition_configurations/9-22-1.yml index 22afdbc12cf324a77b43a878af2cded1df5d7f16..876cbd73bac7331c59ebe0d62a25ef368305addf 100644 --- a/competition_configurations/9-22-1.yml +++ b/competition_configurations/9-22-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-22-2.yml b/competition_configurations/9-22-2.yml index adb7d670a75d3e136b85a2f02cae9b07059c6d3b..341a4470a5a33096081740e92624eae43af21505 100644 --- a/competition_configurations/9-22-2.yml +++ b/competition_configurations/9-22-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-22-3.yml b/competition_configurations/9-22-3.yml index c4b6c532f75dcd86cde085e44d0b643ca23900d7..4ab65a1042fd2aa9148608ef374ff8669c623a91 100644 --- a/competition_configurations/9-22-3.yml +++ b/competition_configurations/9-22-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-23-1.yml b/competition_configurations/9-23-1.yml index bcec23808dca9058d5c7e9b887812d312d59ede8..247672e10725a413ee30cc7d9a079a022942a731 100644 --- a/competition_configurations/9-23-1.yml +++ b/competition_configurations/9-23-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-23-2.yml b/competition_configurations/9-23-2.yml index 6822b968486c2f5738dd748581d963fa454638f3..acffcbbbb9fea33bd436b5d65d4b4c34c96e5e60 100644 --- a/competition_configurations/9-23-2.yml +++ b/competition_configurations/9-23-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-23-3.yml b/competition_configurations/9-23-3.yml index f371f49f25e98325c8ca58b3c059edaf3f2549f1..0de7c0e4aaac8fc4f0d53b8150ca9c3b109e5f9f 100644 --- a/competition_configurations/9-23-3.yml +++ b/competition_configurations/9-23-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-24-1.yml b/competition_configurations/9-24-1.yml index f3560b0ef6b5cc9f96c95029499a85a290983cee..e9dd0d7ade340d6bd1522215d1ed5ef7b0a56ddf 100644 --- a/competition_configurations/9-24-1.yml +++ b/competition_configurations/9-24-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-24-2.yml b/competition_configurations/9-24-2.yml index 5629383c5bee04b9e692ae4905fe74c3bee07a2d..c353bb99a7f87b04797920779d3dc1731c329b8c 100644 --- a/competition_configurations/9-24-2.yml +++ b/competition_configurations/9-24-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-24-3.yml b/competition_configurations/9-24-3.yml index b658bd1a270687edcccbb37e04b1b933216e9faa..a0cd311c51a805d3bc6fc274752d35cc35927ee5 100644 --- a/competition_configurations/9-24-3.yml +++ b/competition_configurations/9-24-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-25-1.yml b/competition_configurations/9-25-1.yml index 2135b82e98a8f13683cc5a1794bdb85f8162af94..aa648600a1f5ec7e16a9e8816ac607f4c37bfaaf 100644 --- a/competition_configurations/9-25-1.yml +++ b/competition_configurations/9-25-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 6.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-25-2.yml b/competition_configurations/9-25-2.yml index b200989c77b0822d1e91b26bbfbcda6649c78146..d981172c5e5c7d68cb4edd9f42fbdc36e5b19817 100644 --- a/competition_configurations/9-25-2.yml +++ b/competition_configurations/9-25-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 6.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-25-3.yml b/competition_configurations/9-25-3.yml index 41b44779757b8a2724f7913319403677ef04439e..88b9576f4dbe140229cd66b98fa3cfce8e00acae 100644 --- a/competition_configurations/9-25-3.yml +++ b/competition_configurations/9-25-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 6.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-26-1.yml b/competition_configurations/9-26-1.yml index 0e570346472d534aaea3de4673e75b5d55e5bd06..263b30c177ade87373e9eca486d31480b4b9ff75 100644 --- a/competition_configurations/9-26-1.yml +++ b/competition_configurations/9-26-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 6.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-26-2.yml b/competition_configurations/9-26-2.yml index 12d6a175e93849cd1b641666916f2fc84202a5fc..c01e1bbf81b583877921668044a37656eb9c724b 100644 --- a/competition_configurations/9-26-2.yml +++ b/competition_configurations/9-26-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 6.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-26-3.yml b/competition_configurations/9-26-3.yml index 92708d0f93e3dc20e043a3ada116d8532e252af1..c652a2d87308aa8fca906347df078d72c73e10f1 100644 --- a/competition_configurations/9-26-3.yml +++ b/competition_configurations/9-26-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 6.9 t: 250 items: - !Item #FLOOR diff --git a/competition_configurations/9-27-1.yml b/competition_configurations/9-27-1.yml index 8bd8f50834ad50aa2e863cc1b12c84e61532c81e..cda313cea28f1606cc55f5a7f398667a1a4796a7 100644 --- a/competition_configurations/9-27-1.yml +++ b/competition_configurations/9-27-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2 t: 250 items: - !Item diff --git a/competition_configurations/9-27-2.yml b/competition_configurations/9-27-2.yml index 19b117ee72ea4a14e19016093d1d6f883c884c1f..8ac70280bba6632cb2542decb2b354260e5aa361 100644 --- a/competition_configurations/9-27-2.yml +++ b/competition_configurations/9-27-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3.9 t: 250 items: - !Item diff --git a/competition_configurations/9-27-3.yml b/competition_configurations/9-27-3.yml index 48206fb8d232f9da9b77c9ade7de0c30fdf5f562..49deb22822974d51f4ca2cd09d5d0d085835df84 100644 --- a/competition_configurations/9-27-3.yml +++ b/competition_configurations/9-27-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 8 t: 250 items: - !Item diff --git a/competition_configurations/9-28-1.yml b/competition_configurations/9-28-1.yml index 355e74a83b259a97c08bfe7dc3ce095aa5976af8..46ef3044e6eb0d78e148e928893a64c27efb0e54 100644 --- a/competition_configurations/9-28-1.yml +++ b/competition_configurations/9-28-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3.9 t: 500 items: - !Item diff --git a/competition_configurations/9-28-2.yml b/competition_configurations/9-28-2.yml index eec74c4c86723eb066b47d1a43d2e9217038bd73..64f03245855700c73340c748e2036b0ed6ccf572 100644 --- a/competition_configurations/9-28-2.yml +++ b/competition_configurations/9-28-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3.9 t: 500 items: - !Item diff --git a/competition_configurations/9-28-3.yml b/competition_configurations/9-28-3.yml index 1c4260ff51624e7e748cda30a08b0956f4cfdbd2..f25dea4f3aaaf88a4cbb3392bbd0646e892136c1 100644 --- a/competition_configurations/9-28-3.yml +++ b/competition_configurations/9-28-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3.9 t: 500 items: - !Item diff --git a/competition_configurations/9-29-1.yml b/competition_configurations/9-29-1.yml index b416303b0805fccb9c77fd99eab0f1cdda5727fc..7593bee008db98ab471f63c5d360edfab3368767 100644 --- a/competition_configurations/9-29-1.yml +++ b/competition_configurations/9-29-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3.9 t: 500 items: - !Item diff --git a/competition_configurations/9-29-2.yml b/competition_configurations/9-29-2.yml index 87170acaede2c230e418d767f5010238b7c1fb45..7553e4b3d8d639cc574e8e93ad948cede65e3db6 100644 --- a/competition_configurations/9-29-2.yml +++ b/competition_configurations/9-29-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3.9 t: 500 items: - !Item diff --git a/competition_configurations/9-29-3.yml b/competition_configurations/9-29-3.yml index a5e0f2ce79de75d04fa997cc49baf7cdb5e835d3..8f1286cbfa2f1a1cba81241fd725437f62a29455 100644 --- a/competition_configurations/9-29-3.yml +++ b/competition_configurations/9-29-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 3.9 t: 500 items: - !Item diff --git a/competition_configurations/9-3-1.yml b/competition_configurations/9-3-1.yml index 3c54bdf3baf409121c9e4b32a5d553ae623c1525..dfcc5bf7e4c8fdd05c837818b0b9f9fdac578bcc 100644 --- a/competition_configurations/9-3-1.yml +++ b/competition_configurations/9-3-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 10.9 t: 250 items: - !Item diff --git a/competition_configurations/9-3-2.yml b/competition_configurations/9-3-2.yml index 3c54bdf3baf409121c9e4b32a5d553ae623c1525..dfcc5bf7e4c8fdd05c837818b0b9f9fdac578bcc 100644 --- a/competition_configurations/9-3-2.yml +++ b/competition_configurations/9-3-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 10.9 t: 250 items: - !Item diff --git a/competition_configurations/9-3-3.yml b/competition_configurations/9-3-3.yml index 3c54bdf3baf409121c9e4b32a5d553ae623c1525..dfcc5bf7e4c8fdd05c837818b0b9f9fdac578bcc 100644 --- a/competition_configurations/9-3-3.yml +++ b/competition_configurations/9-3-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 10.9 t: 250 items: - !Item diff --git a/competition_configurations/9-30-1.yml b/competition_configurations/9-30-1.yml index ac5671165c502bcddbafd5f7718b4bd5d2713872..8cb21e646a87246671ceab474e108674cd22d06f 100644 --- a/competition_configurations/9-30-1.yml +++ b/competition_configurations/9-30-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 5.9 t: 500 items: - !Item diff --git a/competition_configurations/9-30-2.yml b/competition_configurations/9-30-2.yml index 9bb0b1a0cdb1bc3c1c24cac21002fde19b984be0..d7f1dc18a57b5d7ed76db279b30aca0ad7b389ac 100644 --- a/competition_configurations/9-30-2.yml +++ b/competition_configurations/9-30-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 5.9 t: 500 items: - !Item diff --git a/competition_configurations/9-30-3.yml b/competition_configurations/9-30-3.yml index 8e56dc7d509bd74728309e4ccc09c224cd07076e..d86564a8422c8ebe69c0b1667dfd12b36cba4909 100644 --- a/competition_configurations/9-30-3.yml +++ b/competition_configurations/9-30-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 5.9 t: 500 items: - !Item diff --git a/competition_configurations/9-4-1.yml b/competition_configurations/9-4-1.yml index 8f399a8fbdd549bb5f46f351edbb549ad497f54e..f1971cae34a9fab80248667f0e4bf016c70da2b7 100644 --- a/competition_configurations/9-4-1.yml +++ b/competition_configurations/9-4-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 10.9 t: 250 items: - !Item diff --git a/competition_configurations/9-4-2.yml b/competition_configurations/9-4-2.yml index 8f399a8fbdd549bb5f46f351edbb549ad497f54e..f1971cae34a9fab80248667f0e4bf016c70da2b7 100644 --- a/competition_configurations/9-4-2.yml +++ b/competition_configurations/9-4-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 10.9 t: 250 items: - !Item diff --git a/competition_configurations/9-4-3.yml b/competition_configurations/9-4-3.yml index 8f399a8fbdd549bb5f46f351edbb549ad497f54e..f1971cae34a9fab80248667f0e4bf016c70da2b7 100644 --- a/competition_configurations/9-4-3.yml +++ b/competition_configurations/9-4-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 10.9 t: 250 items: - !Item diff --git a/competition_configurations/9-5-1.yml b/competition_configurations/9-5-1.yml index 6834b73592d49e463a6ab29517699b529d801e00..714bab1872a49f984ad1e8cf288a4e8276983cec 100644 --- a/competition_configurations/9-5-1.yml +++ b/competition_configurations/9-5-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 10.9 t: 250 items: - !Item diff --git a/competition_configurations/9-5-2.yml b/competition_configurations/9-5-2.yml index 6834b73592d49e463a6ab29517699b529d801e00..714bab1872a49f984ad1e8cf288a4e8276983cec 100644 --- a/competition_configurations/9-5-2.yml +++ b/competition_configurations/9-5-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 10.9 t: 250 items: - !Item diff --git a/competition_configurations/9-5-3.yml b/competition_configurations/9-5-3.yml index 6834b73592d49e463a6ab29517699b529d801e00..714bab1872a49f984ad1e8cf288a4e8276983cec 100644 --- a/competition_configurations/9-5-3.yml +++ b/competition_configurations/9-5-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 10.9 t: 250 items: - !Item diff --git a/competition_configurations/9-6-1.yml b/competition_configurations/9-6-1.yml index d2b0f10c7a6078476b3641ffca40988dcbb56494..459c87fe80c020a473030e31aa7180dbd3ffdc3e 100644 --- a/competition_configurations/9-6-1.yml +++ b/competition_configurations/9-6-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 6.9 t: 250 items: - !Item diff --git a/competition_configurations/9-6-2.yml b/competition_configurations/9-6-2.yml index d2b0f10c7a6078476b3641ffca40988dcbb56494..459c87fe80c020a473030e31aa7180dbd3ffdc3e 100644 --- a/competition_configurations/9-6-2.yml +++ b/competition_configurations/9-6-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 6.9 t: 250 items: - !Item diff --git a/competition_configurations/9-6-3.yml b/competition_configurations/9-6-3.yml index d2b0f10c7a6078476b3641ffca40988dcbb56494..459c87fe80c020a473030e31aa7180dbd3ffdc3e 100644 --- a/competition_configurations/9-6-3.yml +++ b/competition_configurations/9-6-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 6.9 t: 250 items: - !Item diff --git a/competition_configurations/9-7-1.yml b/competition_configurations/9-7-1.yml index 2f47bd1ca285f9f81a142e2995b7f709d6dcbf9f..09c4538aba1bf1170dc589f4e917e3f13706419c 100644 --- a/competition_configurations/9-7-1.yml +++ b/competition_configurations/9-7-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item diff --git a/competition_configurations/9-7-2.yml b/competition_configurations/9-7-2.yml index 2f47bd1ca285f9f81a142e2995b7f709d6dcbf9f..09c4538aba1bf1170dc589f4e917e3f13706419c 100644 --- a/competition_configurations/9-7-2.yml +++ b/competition_configurations/9-7-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item diff --git a/competition_configurations/9-7-3.yml b/competition_configurations/9-7-3.yml index 2f47bd1ca285f9f81a142e2995b7f709d6dcbf9f..09c4538aba1bf1170dc589f4e917e3f13706419c 100644 --- a/competition_configurations/9-7-3.yml +++ b/competition_configurations/9-7-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 4.9 t: 250 items: - !Item diff --git a/competition_configurations/9-8-1.yml b/competition_configurations/9-8-1.yml index 5ff290b76705e6af931e0689b25ef18976132646..b7546f794dd510886dba424e194b3ad3c5a99a0d 100644 --- a/competition_configurations/9-8-1.yml +++ b/competition_configurations/9-8-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2.9 t: 250 items: - !Item diff --git a/competition_configurations/9-8-2.yml b/competition_configurations/9-8-2.yml index 5ff290b76705e6af931e0689b25ef18976132646..b7546f794dd510886dba424e194b3ad3c5a99a0d 100644 --- a/competition_configurations/9-8-2.yml +++ b/competition_configurations/9-8-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2.9 t: 250 items: - !Item diff --git a/competition_configurations/9-8-3.yml b/competition_configurations/9-8-3.yml index 5ff290b76705e6af931e0689b25ef18976132646..b7546f794dd510886dba424e194b3ad3c5a99a0d 100644 --- a/competition_configurations/9-8-3.yml +++ b/competition_configurations/9-8-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 2.9 t: 250 items: - !Item diff --git a/competition_configurations/9-9-1.yml b/competition_configurations/9-9-1.yml index d0debbd9f00964ec8c58017456a9de54b79d5bfd..9f575eb51529f0078b2f965cd57e06d84585a955 100644 --- a/competition_configurations/9-9-1.yml +++ b/competition_configurations/9-9-1.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 6.9 t: 250 items: - !Item diff --git a/competition_configurations/9-9-2.yml b/competition_configurations/9-9-2.yml index d0debbd9f00964ec8c58017456a9de54b79d5bfd..9f575eb51529f0078b2f965cd57e06d84585a955 100644 --- a/competition_configurations/9-9-2.yml +++ b/competition_configurations/9-9-2.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 6.9 t: 250 items: - !Item diff --git a/competition_configurations/9-9-3.yml b/competition_configurations/9-9-3.yml index d0debbd9f00964ec8c58017456a9de54b79d5bfd..9f575eb51529f0078b2f965cd57e06d84585a955 100644 --- a/competition_configurations/9-9-3.yml +++ b/competition_configurations/9-9-3.yml @@ -1,6 +1,7 @@ !ArenaConfig arenas: 0: !Arena + pass_mark: 6.9 t: 250 items: - !Item diff --git a/competition_configurations/pass b/competition_configurations/pass new file mode 100644 index 0000000000000000000000000000000000000000..db1dec1184098eda65dd18c0e109472e732e4f35 --- /dev/null +++ b/competition_configurations/pass @@ -0,0 +1,900 @@ +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +2 +4 +4 +4 +-0.5 +-0.5 +-0.5 +0 +0 +0 +4 +4 +4 +-0.5 +-0.5 +-0.5 +4 +4 +4 +0 +0 +0 +-0.5 +-0.5 +-0.5 +0 +0 +0 +-0.5 +-0.5 +-0.5 +-0.5 +-0.5 +-0.5 +0 +0 +0 +0 +0 +0 +4 +4 +4 +9 +9 +9 +39 +39 +39 +9 +9 +9 +-1.05 +-1.05 +-1.05 +0 +0 +0 +0 +0 +0 +1 +1 +1 +2 +2 +2 +2 +2 +2 +4 +7 +10 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +4 +2 +3 +4 +2 +2 +2 +2 +2 +2 +3 +3 +3 +8 +6 +10 +2 +2 +2 +4 +4 +4 +0 +0 +0 +6 +6 +6 +2 +4 +6 +3 +3 +5 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +2 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +-0.99 +-0.99 +-0.99 +0 +0 +0 +-0.99 +-0.99 +-0.99 +0.15 +0.15 +0.15 +0.15 +0.15 +0.15 +0.2 +0.2 +0.2 +0.05 +0.05 +0.05 +0.05 +0.05 +0.05 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0.5 +0.5 +0.5 +0.5 +0.5 +0.5 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +-1.1 +-1.1 +-1.1 +5 +5 +5 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +-0.5 +-0.5 +-0.5 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +3 +3 +3 +3 +3 +3 +5 +5 +5 +5 +5 +5 +7 +7 +7 +7 +7 +7 +7 +7 +7 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +2 +9 +9 +9 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +3 +3 +3 +3 +3 +5 +5 +5 +5 +5 +5 +7 +7 +7 +7 +7 +7 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +4 +4 +4 +4 +4 +4 +4 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +2 +0 +0 +0 +2 +2 +2 +0 +0 +0 +0 +0 +0 +3 +3 +3 +3 +3 +3 +7 +7 +7 +3 +3 +3 +3 +3 +3 +3 +3 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +2 +2 +2 +2 +2 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0.9 +0.9 +0.9 +8.9 +8.9 +8.9 +10.9 +10.9 +10.9 +10.9 +10.9 +10.9 +10.9 +10.9 +10.9 +6.9 +6.9 +6.9 +4.9 +4.9 +4.9 +2.9 +2.9 +2.9 +6.9 +6.9 +6.9 +6.9 +6.9 +6.9 +8.9 +8.9 +8.9 +8.9 +8.9 +8.9 +4.9 +4.9 +4.9 +4.9 +4.9 +4.9 +2.9 +2.9 +2.9 +2.9 +2.9 +2.9 +4.9 +4.9 +4.9 +4.9 +4.9 +4.9 +2.9 +2.9 +2.9 +2.9 +2.9 +2.9 +4.9 +4.9 +4.9 +4.9 +4.9 +4.9 +4.9 +4.9 +4.9 +4.9 +4.9 +4.9 +6.9 +6.9 +6.9 +6.9 +6.9 +6.9 +2 +3.9 +8 +3.9 +3.9 +3.9 +3.9 +3.9 +3.9 +5.9 +5.9 +5.9 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +-0.1 +-0.1 +-0.1 +-0.1 +-0.1 +-0.1 +-0.1 +-0.1 +-0.1 diff --git a/documentation/AWS/EC2.png b/documentation/AWS/EC2.png deleted file mode 100644 index c022caa36389d36793055e740e494662ec9a8c7c..0000000000000000000000000000000000000000 Binary files a/documentation/AWS/EC2.png and /dev/null differ diff --git a/documentation/AWS/launch.png b/documentation/AWS/launch.png deleted file mode 100644 index 8ad73b459d2378584bfa76b06b42a2aaa3b6231e..0000000000000000000000000000000000000000 Binary files a/documentation/AWS/launch.png and /dev/null differ diff --git a/documentation/AWS/limits.png b/documentation/AWS/limits.png deleted file mode 100644 index 83b19a9a8dc93fda0c92254acb27760452977f6f..0000000000000000000000000000000000000000 Binary files a/documentation/AWS/limits.png and /dev/null differ diff --git a/documentation/AWS/marketplace.png b/documentation/AWS/marketplace.png deleted file mode 100644 index de74aa22d78d0a82a5da04c3c934376b7180ea48..0000000000000000000000000000000000000000 Binary files a/documentation/AWS/marketplace.png and /dev/null differ diff --git a/documentation/AWS/p2.png b/documentation/AWS/p2.png deleted file mode 100644 index f481ce1917021993516da558d846a75827a0deae..0000000000000000000000000000000000000000 Binary files a/documentation/AWS/p2.png and /dev/null differ diff --git a/documentation/PrefabsPictures/Rewards/GoodGoalMulti.png b/documentation/PrefabsPictures/Rewards/GoodGoalMulti.png index 5bdc37140935e7f9b08c88d0b5bac5dcd08348ac..d5c3a24453380577db8121d5d7af679a4f15e409 100644 Binary files a/documentation/PrefabsPictures/Rewards/GoodGoalMulti.png and b/documentation/PrefabsPictures/Rewards/GoodGoalMulti.png differ diff --git a/documentation/README.md b/documentation/README.md index 1ca50647ebc4bfe2f45f3a384e4691f2926573f9..ae1eb548a36da579b5ee86a76b835dc3ffb3d064 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -5,10 +5,5 @@ You can find here the following documentation: - [The quickstart guide](quickstart.md) - [How to design configuration files](configFile.md) - [How training works](training.md) -- [Add a curriculum to your training using animalai-train](curriculum.md) +- [Add a curriculum to your training using animalai_train](curriculum.md) - [All the objects you can include in the arenas as well as their specifications](definitionsOfObjects.md) -- [How to submit your agent](submission.md) -- [A guide to train on AWS](cloudTraining.md) - - -More will come before the competition launches. diff --git a/documentation/cloudTraining.md b/documentation/cloudTraining.md deleted file mode 100644 index 65096224128283398ad23a63d25a4072f707f3f1..0000000000000000000000000000000000000000 --- a/documentation/cloudTraining.md +++ /dev/null @@ -1,98 +0,0 @@ -# Training on AWS - -Training an agent requires rendering the environment on a screen, which means that you may have to follow a few steps (detailed below) before you can use standard cloud compute instances. We detail two possibilities. Both methods were tested on [AWS p2.xlarge](https://aws.amazon.com/ec2/instance-types/p2/) using a standard [Deep Learning Base AMI](https://aws.amazon.com/marketplace/pp/B077GCZ4GR). - -We leave participants the task of adapting the information found here to different cloud providers and/or instance types or for their specific use-case. We do not have the resources to fully support this capability. We are providing the following purely in the hopes it serves as a useful guide for some. - -**WARNING: using cloud services will incur costs, carefully read your provider terms of service** - -## Pre-requisite: setup an AWS p2.xlarge instance - -Start by creating an account on [AWS](https://aws.amazon.com/), and then open the [console](https://console.aws.amazon.com/console/home?). -Compute engines on AWS are called `EC2` and offer a vast range of configurations in terms of number and type of CPUs, GPUs, -memory and storage. You can find more details about the different types and prices [here](https://aws.amazon.com/ec2/pricing/on-demand/). -In our case, we will use a `p2.xlarge` instance, in the console select `EC2`: - -![EC2](AWS/EC2.png) - -by default you will have a limit restriction on the number of instances you can create. Check your limits by selecting `Limits` on the top -left menu: - -![EC2](AWS/limits.png) - -Request an increase for `p2.xlarge` if needed. Once you have at least a limit of 1, go back to the EC2 console and select launch instance: - -![EC2](AWS/launch.png) - -You can then select various images, type in `Deep learning` to see what is on offer, for now we recommend to select `AWS Marketplace` on the left panel: - -![EC2](AWS/marketplace.png) - -and select either `Deep Learning Base AMI (Ubuntu)` if you want a basic Ubuntu install with CUDA capabilities. On the next page select `p2.xlarge` (this will not be selected by default): - -![EC2](AWS/p2.png) - -Click `Next` twice (first Next: Configure Instance Deatils, then Next: Add Storage) and add at least 15 Gb of storage to the current size (so at least 65 total with a default of 50). Click `review and launch`, and then `launch`. You will then be asked to create or select existing key pairs which will be used to ssh to your instance. - -Once your instance is started, it will appear on the EC2 console. To ssh into your instance, right click the line, select connect and follow the instructions. -We can now configure our instance for training. **Don't forget to shutdown your instance once you're done using it as you get charged as long as it runs**. - -## Simulating a screen - -As cloud engines do not have screens attached, rendering the environment window is impossible. We use a virtual screen instead, in the form of [xvfb](https://en.wikipedia.org/wiki/Xvfb). -You can follow either one of the following methods to use this. In both, **remember** to select `docker_training=True` in your environment configuration. - - -## Method 1: train using docker - -Basic Deep Learning Ubuntu images provide [NVIDIA docker](https://devblogs.nvidia.com/nvidia-docker-gpu-server-application-deployment-made-easy/) -pre-installed, which allows the use of CUDA within a container. SSH into your AWS instance, clone this repo and follow the instructions below. - -In the [submission guide](submission.md) we describe how to build a docker container for submission. The same process -can be used to create a docker for training an agent. The [dockerfile provided](../examples/submission/Dockerfile) can -be adapted to include all the libraries and code needed for training. - -For example, should you wish to train a standard Dopamine agent provided in `animalai-train` out of the box, using GPU compute, add the following -lines to your docker in the `YOUR COMMANDS GO HERE` part, below the line installing `animalai-train`: - -``` -RUN git clone https://github.com/beyretb/AnimalAI-Olympics.git -RUN pip uninstall --yes tensorflow -RUN pip install tensorflow-gpu==1.14 -RUN apt-get install unzip wget -RUN wget https://www.doc.ic.ac.uk/~bb1010/animalAI/env_linux_v1.0.0.zip -RUN mv env_linux_v1.0.0.zip AnimalAI-Olympics/env/ -RUN unzip AnimalAI-Olympics/env/env_linux_v1.0.0.zip -d AnimalAI-Olympics/env/ -WORKDIR /aaio/AnimalAI-Olympics/examples -RUN sed -i 's/docker_training=False/docker_training=True/g' trainDopamine.py -``` - -Build your docker, from the `examples/submission` folder run: - -``` -docker build --tag=test-training . -``` - -Once built, you can start training straight away by running: - -``` -docker run --runtime=nvidia test-training python trainDopamine.py -``` - -Notice the use of `--runtime=nvidia` which activates CUDA capabilities. You should see the following tensorflow line in the output -which confirms you are training using the GPU: - -``` -I tensorflow/core/common_runtime/gpu/gpu_device.cc:1432] Found device 0 with properties: -name: Tesla K80 major: 3 minor: 7 memoryClockRate(GHz): 0.823 -``` - -You're now ready to start training on AWS using docker! - -## Method 2: install xvfb on the instance - -An alternative to docker is to install `xvfb` directly on your AWS instance and use it in the same way you would when training on your home computer. For this you will want to install an Ubuntu image with some deep learning libraries installed. From the AWS Marketplace page you can for example install `Deep Learning AMI (Ubuntu)` which contains tensorflow and pytorch. - -To do so, you can follow the original ML Agents description for `p2.xlarge` found [here](https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Training-on-Amazon-Web-Service.md#setting-up-x-server-optional). From our -experience, these steps do not work as well on other types of instances. - diff --git a/documentation/configFile.md b/documentation/configFile.md index d7620c060dc278bff9f4ffe54651c6688380080b..96e5b316d3448f2d16ad40213aff14e48e147896 100644 --- a/documentation/configFile.md +++ b/documentation/configFile.md @@ -2,24 +2,20 @@ ## TL;DR -Run `python visualizeArena.py configs/configExample.yaml` to get an understanding of how the `YAML` files configure the +From the `examples` folder, run `python load_config_and_play.py configs/configExample.yaml` to get an understanding of how the `YAML` files configure the arenas for training. You will find a list of all objects you can add to an arena as well as the values for their parameters in [the definitions](definitionsOfObjects.md). You will find below all the technical details to create more complex training configurations. ## Intro To configure training arenas you can use a simple **YAML file** and/or the **ArenaConfig structure** provided in -`animalai/envs/ArenaConfig`. This makes training quite flexible and allows for the following: +`animalai.envs.arena_config`. This makes training quite flexible and allows for the following: - load and save configurations for reusability - 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 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`. - +We describe below the structure of the configuration files for an instance of the training environment, as well as all the +parameters and the values they can take. ## The Arenas

@@ -30,6 +26,8 @@ A single arena is as shown above, it comes with a single agent (blue sphere, bla 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. +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). + 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. @@ -37,9 +35,7 @@ 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 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). - +- `pass_mark` the score the agent needs to reach to pass the level ## Objects diff --git a/documentation/curriculum.md b/documentation/curriculum.md index 39a4716f5993a5668aef8bbc4ac1c689a892efc5..abe917179fde1927d7e0148a719b89594fe44e02 100644 --- a/documentation/curriculum.md +++ b/documentation/curriculum.md @@ -20,7 +20,7 @@ a meta-curriculum. ## Example -An example is provided in [the example folder](../examples/configs/curriculum). The idea of this curriculum is to train +An example is provided in [the example folder](../examples/configurations/curriculum). The idea of this curriculum is to train an agent to navigate a maze by creating maze like structures of perpendicular walls, starting with a single wall and food, adding one more wall at each level. Below are samples from the 6 different levels. @@ -74,7 +74,7 @@ except for the `configuration_files`. From the ml-agents documentation: cumulative reward of the last `100` episodes exceeds the current threshold. The mean reward logged to the console is dictated by the `summary_freq` parameter in the - [trainer configuration file](../examples/configs/trainer_config.yaml). + [trainer configuration file](../examples/configurations/training_configurations/trainer_ml_agents_config.yaml). * `signal_smoothing` (true/false) - Whether to weight the current progress measure by previous values. * If `true`, weighting will be 0.75 (new) 0.25 (old). @@ -88,7 +88,7 @@ except for the `configuration_files`. From the ml-agents documentation: Once the folder created, training is done in the same way as before but now we pass a `MetaCurriculum` object to the `meta_curriculum` argument of a `TrainerController`. - We provide an example using the above curriculum in [examples/trainCurriculum.py](../examples/trainCurriculum.py). + We provide an example using the above curriculum in [examples/train_curriculum.py](../examples/train_curriculum.py). Training this agent, you can see the lessons switch using tensorboard: ![](Curriculum/learning.png) diff --git a/documentation/final_submission.md b/documentation/final_submission.md deleted file mode 100644 index b165b58fa7dcc49f7a546b6169febdb93dba2976..0000000000000000000000000000000000000000 --- a/documentation/final_submission.md +++ /dev/null @@ -1,21 +0,0 @@ -# Final Submission Guidelines - -As the end of the competition approaches we would like to provide guidance on the final submission process and evaluation. You will be able to submit two agents for the final testing. The first will be your best agent from the current track (this will be submitted automatically and there is nothing for you to do), and the second is an agent of your choice that you can submit to the track ‘Submission 2 (optional)’. We will run both your submissions on the final test set and your final result will be the best overall score out of these agents. - -If you want to be considered for the WBA prize then you should submit a short write-up explaining how your entry is biologically inspired following the submission guidelines. Full details [here](https://www.easychair.org/cfp/AAI2019WBA). - -The deadline for submissions (to either track) and to the **WBA prize** is 23:59:59 1st November (Anywhere on Earth time). Please note that there may be heavier than usual traffic close to the deadline so we encourage you to submit early if possible. - -In order to submit to the second phase please refer to [the submission page on evalAI](https://evalai.cloudcv.org/web/challenges/challenge-page/396/submission). Note that **there is no evaluation on this track**, you only upload a docker image that we will automatically retrieve at the time of final evaluation. **The status on the EvalAI website will show as “Running”, you can ignore this.** You can make up to 20 submissions but only the latest one will be used. - -As was previously announced, the final evaluation test set is very similar to the one used throughout the competition, but contains extra tests, all minor variations of those in the current test set. This is to prevent overfitting to the exact tests on the current leaderboard. - -To reiterate, the final evaluation process is the following: -- We will take your best submission (total score) from the “Competition phase” track. If several agents returned the same score equal to your best one, we only consider the last one submitted chronologically. -- We will also take your latest submission on the “Submission 2 (optional)” track, if you have submitted there, and evaluate it along with the former. -We will then take the best of the two in terms of “total” score, and use this as your final submission for both global and categories ranking. - -Results and prizes will be announced once we have been able to run the final tests. - -Good Luck! - diff --git a/documentation/quickstart.md b/documentation/quickstart.md index 6c26587fabe5d22130f2591213130cad92654372..cff7e6fd970a2d1993a386d55fcbb5c4d5d3c9cb 100644 --- a/documentation/quickstart.md +++ b/documentation/quickstart.md @@ -1,23 +1,20 @@ # Quick Start Guide -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. +You can find below some pointers to get started with the Animal-AI. ## Running the standalone arena 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 +You can toggle the camera between first person, third 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 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 -`python visualizeArena.py configs/exampleConfig.yaml`. This loads the `configs/exampleConfig.yaml` configuration for the -arena and lets you play as the agent. +`python load_config_and_play.py`. This loads a random configuration from the competition for the arena and lets you play as the agent. -Have a look at the [configuration file](../examples/configs/exampleConfig.yaml) which specifies the objects to place. You can select +Have a look at the [configuration files](../competition_configurations) 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 @@ -29,16 +26,8 @@ objects, their size, location, rotation and color, randomizing any of these para Once you're happy with your arena configurations you can start training your agent. The `animalai` package includes several features to help with this: - 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 **choose the 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 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). +[examples folder](../examples) which contains various training examples and a readme file to explain how these work. \ No newline at end of file diff --git a/documentation/submission.md b/documentation/submission.md deleted file mode 100644 index 260101b4710b788488db6fa8342ee8a4b260b507..0000000000000000000000000000000000000000 --- a/documentation/submission.md +++ /dev/null @@ -1,96 +0,0 @@ -# Submission - -In order to participate in the competition you will need to upload a [docker image](https://docs.docker.com/get-started/) -containing your trained agent that interfaces with the `animalai` library. We detail the steps for participating -below. - -## Python agent and associated data - -Submissions need to implement the [agent script provided](https://github.com/beyretb/AnimalAI-Olympics/blob/master/agent.py). -This script must implement the methods present in the base script and keep the same class name. The methods are: -- `__init__`: this will only be called once when the agent is loaded first. It can contain loading of the model and other -related parameters. -- `reset(t)`: will be called each time the arena resets. At test time the length of episodes will vary across the 300 -experiments we will run, therefore we provide the agent with the length of the episode to come. Test lengths are either 250, 500, or 1000. -- `step(obs, reward, done, info)`: the method that is called each time the agent has to take a step. The arguments -are the ones returned by the Gym environment `AnimalAIEnv` from `animalai.envs.environment`. If you wish to directly -work on the ML Agents `BrainInfo` you can access them via `info['brain_info']` - -~~**NEW (v1.0.4)**: you can now select the resolution of the observation your agent takes as input, this argument will be passed to the environment directly (must be between 4 and 256)~~ (this option was removed, for evaluation inputs are 84x84, [see discussion](https://github.com/beyretb/AnimalAI-Olympics/issues/61#issuecomment-521933419)) - -Make sure any data loaded in the docker image is referred to using **absolute paths** in the container or the form `/aaio/data/...` (see below). An example that you can modify is provided [here](https://github.com/beyretb/AnimalAI-Olympics/blob/master/examples/submission/agent.py) - -## Create an EvalAI account and add submission details - -The competition is kindly hosted by EvalAI. Head over to [their website](https://evalai.cloudcv.org/), create an account, and enroll your team in the AnimalAI challenge. To be able to submit and be eligible for prizes you will also need to register your personal details using [this form](https://docs.google.com/forms/d/e/1FAIpQLScqcIDaCwp1Wezj-klNfahcph1V8UQ-AZqmQui7vmcqVenPKw/viewform?usp=sf_link). - -**Any question related solely to the submission process on EvalAI should be posted to the** [EvalAI forum](https://evalai-forum.cloudcv.org/c/animal-ai-olympics-2019) - -## Docker - -Docker offers a containerized platform for running applications in a closed environment. You can install all the libraries your agent will require and we will use this to run the tests as they would run on your local machine. The hardware we're using to run the tests is an AWS [p2.xlarge instance](https://aws.amazon.com/ec2/instance-types/p2/). - -Take the time to read the [Docker documentation](https://docs.docker.com/get-started/) and follow the install process. - -### Adding CUDA capabilities to Docker (optional) - -As part of the evaluation we offer GPU compute on an AWS -[p2.xlarge instance](https://aws.amazon.com/ec2/instance-types/p2/). These compute instances will run an Amazon -[Deep Learning Base AMI](https://aws.amazon.com/marketplace/pp/B077GCZ4GR) with several CUDA libraries installed. - -The native docker engine does not provide a pass-through to these libraries, rendering any use of GPU capable libraries (such as `tensorflow-gpu`) impossible. To overcome this issue, NVIDIA provides a specific version of docker. We can recommend [this tutorial](https://marmelab.com/blog/2018/03/21/using-nvidia-gpu-within-docker-container.html#installing-nvidia-docker) for installing this version. Note we cannot provide help with installing these. - -## Creating the docker image for submission - -Once you have docker up and running, you can start building your submission. Head over to `examples/sumission` and have a look at the `Dockerfile`. This script installs all the requirements for the environment, we do not recommend editing anything outside of the commented block saying `YOUR COMMANDS GO HERE`. - -If your submission only requires the `animalai-train` library to run, you can use `Dockerfile` without any modification. While in `examples/submission` run: - -``` -docker build --tag=submission . -``` - -You can give your docker image the name you want, it does not have to be `submission`. Note that the Dockerfile creates two -folders `/aaio` and `/aaio/data` at the root of the image, and copies the `agent.py` file and `data` folder from your local machine into the image. Your submission must keep this architecture. References to these folders in -your code **should use absolute paths** (see the example agent provided in `examples/submission`). - -## Test your docker image - -As uploading and evaluating images takes a while, and you are only allowed a maximum of one submission per day, it is recommended to ensure your docker runs properly before submitting. If there is a failure during testing **you will only have access to abridged outputs** which may not be enough to debug on your own. If you cannot find a solution using the provided submission testing volume you will need to raise a question on [the forum](https://evalai-forum.cloudcv.org/c/animal-ai-olympics-2019) and we will investigate for you (which might take time). - -Bottom line: be sure to test your submission prior to uploading! - -First, copy the AnimalAI **linux** environment (and AnimalAI_Data folder) to `examples/submission/test_submission/env`. - -Next, you need to run the image by mounting the `test_submission` folder and its content as a volume, and execute the `testDocker.py` script. To do so, from the `submission` folder, run: - -``` -docker run -v "$PWD"/test_submission:/aaio/test submission python /aaio/test/testDocker.py -``` - -If your image and agent are set properly, you should not get any error, and the script should output the rewards for 5 simple tests and conclude with `SUCCESS` - -## Submit your docker image - -You can now submit your image to EvalAI for evaluation as explained on the [EvalAI submission page](https://evalai.cloudcv.org/web/challenges/challenge-page/396/submission). - -**Note**: the phase name to use when pushing is: `animalai-main-396`. To push your image use `evalai push : --phase animalai-main-396` (details are at the bottom of the EvalAI page linked above). - -## Docker image evaluation and results - -On the EvalAI page you will see that the number of valid submissions is limited to one a day. A submission is valid if it fulfils the following requirements: - -- it does not crash at any point before the first two experiments are complete (this includes loading the agent, resetting it, and completing the two experiments) -- loading the agent takes less than 5 minutes -- running the first two experiments takes less than 10 minutes - -If your submission meets these requirements it will be flagged as valid and you will not be able to submit again until the following day. - -Completing the experiments cannot take longer than 80 minutes in total. If your submission goes over the time limit it will stop and you will score for any experiments that were completed. - -Example scenarios: - -- FAIL: agent loads in 2 minutes, crashes during test number 2 -- FAIL: agent loads in 1 minute, takes more than 10 minutes to complete tests 1 and 2 -- SUCCESS: your agent loads in 3 minutes, takes 30 seconds for test 1, takes 1 minute for test two, it therefore has 78.5 minutes to complete the remaining 298 experiments -- SUCCESS: agent loads in 4 minutes, completes test 1 and 2 in 1 minute, uses all the 79 minutes remaining to complete only 100 tests, you will get results based on the 102 experiments ran diff --git a/documentation/training.md b/documentation/training.md index 2c3b35b66b1926ce79eac1e4ca3b0d3f38d86d1c..b637e7c1c6c77f2ab9168a7c2f4b69d10ae8cae6 100644 --- a/documentation/training.md +++ b/documentation/training.md @@ -1,130 +1,3 @@ # Training -## 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. 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 -[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. The -actions are discrete and of dimension `2`, each component can take values `0`,`1` or `2` (`(0: nothing, 1: forward, 2: -backward)` and `(0: nothing, 1: right, 2: left)`). -- **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). 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)). - -## 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 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) - seed=0, # The random seed - docker_training=False, # Whether or not you are training inside a docker - no_graphics=False, # Always set to False - n_arenas=4, # Number of arenas in your environment - play=False, # Set to False for training - inference=False, # Set to true to watch your agent in action - resolution=None # Int: resolution of the agent's square camera (in [4,512], default 84) - ) -``` - -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 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: - -``` -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 - ) -``` - - -**Note**: as mentioned above, the environment will change the configuration of an arena if it receives a new `ArenaConfig` -from a `env.reset()` call. Therefore, should you have created several arenas and want to only change one (or more) arena -configuration(s), you can do so by only providing an `ArenaConfig` that contains configuration(s) for the associated arena(s). -For example, if you only want to modify arena number 3, you could create an `ArenaConfig` from the following `YAML`: - -``` -arenas: - 3: !Arena - t: 0 - items: - - !Item - (...) -``` - -### 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 including the observations. For example: - -``` -info = env.step(vector_action=take_action_vector) -``` - -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). - -### Close - -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). - -``` -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: - -- Instantiating an environment will open a window showing the environment from above. The size of this window will -influence the speed of training: the smaller the window, the faster the simulation and therefore the training. You can -resize the window during training but we advise to keep it small as much as possible. +Coming soon as a jupyter notebook \ No newline at end of file diff --git a/examples/README.md b/examples/README.md index 43a5642630df03c6c7ff7faebce05427e9c0c558..e517f1ed4e6845ba7bd1f69ad1dc64751cbf6013 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,37 +1,6 @@ -# Visualization and Training +TODO -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. - -## Visualizing configurations - -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: - -``` -python visualizeArena.py configs/exampleConfig.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. +Detail the various files in this folder +- load_and_play: +- train_ml_agents +- ... \ No newline at end of file diff --git a/examples/__init__.py b/examples/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/examples/animalai_train/LICENSE b/examples/animalai_train/LICENSE deleted file mode 100644 index 7ff5035efc3d2ab21234973537c35aa10e623655..0000000000000000000000000000000000000000 --- a/examples/animalai_train/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - 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/examples/animalai_train/README.md b/examples/animalai_train/README.md deleted file mode 100644 index 85bbd236da43978781f92bf1f953760bfe88b382..0000000000000000000000000000000000000000 --- a/examples/animalai_train/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# AnimalAI Python API - -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). - -For more details and documentation have a look at the [AnimalAI documentation](../documentation) \ No newline at end of file diff --git a/examples/animalai_train/animalai_train/__init__.py b/examples/animalai_train/animalai_train/__init__.py deleted file mode 100644 index fed0150033bd445f3d89dfdc4226b353ed855080..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/__init__.py +++ /dev/null @@ -1 +0,0 @@ -name = "animalai_train" \ No newline at end of file diff --git a/examples/animalai_train/animalai_train/dopamine/animalai_lib.py b/examples/animalai_train/animalai_train/dopamine/animalai_lib.py deleted file mode 100644 index fe501c65aee9e5b84d033c23789fb8ade815ef28..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/dopamine/animalai_lib.py +++ /dev/null @@ -1,157 +0,0 @@ -# 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. -""" -Code adapted from the Obstacle Tower competition -""" - -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -import math - -import numpy as np -import tensorflow as tf - -import gin.tf - -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 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) diff --git a/examples/animalai_train/animalai_train/trainers/__init__.py b/examples/animalai_train/animalai_train/trainers/__init__.py deleted file mode 100644 index 4859f5580807ab18f70e4844f526089a17c0ed93..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/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/examples/animalai_train/animalai_train/trainers/barracuda.py b/examples/animalai_train/animalai_train/trainers/barracuda.py deleted file mode 100644 index 813d54dbfbae0a01ce3749d461500a357df84a8b..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/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/examples/animalai_train/animalai_train/trainers/bc/__init__.py b/examples/animalai_train/animalai_train/trainers/bc/__init__.py deleted file mode 100644 index 80cd0aa01477c02d1231aab4c0adb2a0bebe85da..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/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/examples/animalai_train/animalai_train/trainers/bc/models.py b/examples/animalai_train/animalai_train/trainers/bc/models.py deleted file mode 100644 index e1ef94d5c4e291c13e1322c832c506d7b6a2628d..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/trainers/bc/models.py +++ /dev/null @@ -1,55 +0,0 @@ -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/examples/animalai_train/animalai_train/trainers/bc/offline_trainer.py b/examples/animalai_train/animalai_train/trainers/bc/offline_trainer.py deleted file mode 100644 index ebdbc443c4392fb031a312a3184208d95e0125f6..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/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_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/examples/animalai_train/animalai_train/trainers/bc/online_trainer.py b/examples/animalai_train/animalai_train/trainers/bc/online_trainer.py deleted file mode 100644 index 91ba340c1fad86dc0a80daa093105d27e1f0c093..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/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_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/examples/animalai_train/animalai_train/trainers/bc/policy.py b/examples/animalai_train/animalai_train/trainers/bc/policy.py deleted file mode 100644 index f2d990b347e93b7ea3de2d3780b9a7afb36707cd..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/trainers/bc/policy.py +++ /dev/null @@ -1,93 +0,0 @@ -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/examples/animalai_train/animalai_train/trainers/bc/trainer.py b/examples/animalai_train/animalai_train/trainers/bc/trainer.py deleted file mode 100644 index dbd4d9c4bccad4aca07e1e44b1efb048eaaf4183..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/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_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/examples/animalai_train/animalai_train/trainers/buffer.py b/examples/animalai_train/animalai_train/trainers/buffer.py deleted file mode 100644 index ff2f0b88a057985443638d287220ad1bbee14b82..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/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/examples/animalai_train/animalai_train/trainers/curriculum.py b/examples/animalai_train/animalai_train/trainers/curriculum.py deleted file mode 100644 index e45383100f54031aa2c0e7d254c1bde19d319ec7..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/trainers/curriculum.py +++ /dev/null @@ -1,118 +0,0 @@ -import os -import json -import math - -from .exception import CurriculumError -from animalai.envs.arena_config import ArenaConfig - -import logging - -logger = logging.getLogger('mlagents.trainers') - - -class Curriculum(object): - def __init__(self, location, yaml_files): - """ - Initializes a Curriculum object. - :param location: Path to JSON defining curriculum. - :param yaml_files: A list of configuration files for each lesson - """ - 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 ['configuration_files', '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']) - - configuration_files = self.data['configuration_files'] - # for key in configuration_files: - # 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(configuration_files) != 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(configuration_files))) - folder = os.path.dirname(location) - folder_yaml_files = os.listdir(folder) - if not all([file in folder_yaml_files for file in configuration_files]): - raise Curriculum( - 'One or more configuration file(s) in curriculum {0} could not be found'.format(location) - ) - self.configurations = [ArenaConfig(os.path.join(folder, file)) for file in configuration_files] - - @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, - self.data['configuration_files'][self.lesson_num])) - 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 = self.configurations[lesson] - # parameters = self.data['parameters'] - # for key in parameters: - # config[key] = parameters[key][lesson] - return config diff --git a/examples/animalai_train/animalai_train/trainers/demo_loader.py b/examples/animalai_train/animalai_train/trainers/demo_loader.py deleted file mode 100644 index 173615e401bdec2dab4ac8b540556a415c404575..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/trainers/demo_loader.py +++ /dev/null @@ -1,94 +0,0 @@ -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/examples/animalai_train/animalai_train/trainers/exception.py b/examples/animalai_train/animalai_train/trainers/exception.py deleted file mode 100644 index b2f0a0dbd117963094816668c1b2c6ebb257a460..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/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/examples/animalai_train/animalai_train/trainers/learn.py b/examples/animalai_train/animalai_train/trainers/learn.py deleted file mode 100644 index dd4b7cb78990e90625f9036e0be248bab6605e76..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/trainers/learn.py +++ /dev/null @@ -1,248 +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_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) - 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 - ) - - -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/examples/animalai_train/animalai_train/trainers/meta_curriculum.py b/examples/animalai_train/animalai_train/trainers/meta_curriculum.py deleted file mode 100644 index 4eaccc68783e5f50ab8f3a20315f4014ac51e7ea..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/trainers/meta_curriculum.py +++ /dev/null @@ -1,149 +0,0 @@ -"""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): - """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 one JSON file which name is the - same as the brains in the academy (e.g Learner) and contains - the parameters for the curriculum as well as all the YAML - files for each curriculum lesson - """ - # used_reset_parameters = set() - self._brains_to_curriculums = {} - self._configuration_files = [] - - try: - json_files = [file for file in os.listdir(curriculum_folder) if '.json' in file.lower()] - yaml_files = [file for file in os.listdir(curriculum_folder) if - ('.yaml' in file.lower() or '.yml' in file.lower())] - for curriculum_filename in json_files: - brain_name = curriculum_filename.split('.')[0] - curriculum_filepath = \ - os.path.join(curriculum_folder, curriculum_filename) - curriculum = Curriculum(curriculum_filepath, yaml_files) - - # ===== TO REMOVE ??? =========== - # 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()) - # ===== end of to remove ========= - 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 curr_config diff --git a/examples/animalai_train/animalai_train/trainers/models.py b/examples/animalai_train/animalai_train/trainers/models.py deleted file mode 100644 index 66c6cd7190552f44fe10107e70b80eb7c0232679..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/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/examples/animalai_train/animalai_train/trainers/policy.py b/examples/animalai_train/animalai_train/trainers/policy.py deleted file mode 100644 index dd23940a90d8470eb968e7fc2d5d895fae883f16..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/trainers/policy.py +++ /dev/null @@ -1,212 +0,0 @@ -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/examples/animalai_train/animalai_train/trainers/ppo/__init__.py b/examples/animalai_train/animalai_train/trainers/ppo/__init__.py deleted file mode 100644 index d48a8ccfe1b8a329f887f4e10dcf001d35888623..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/trainers/ppo/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .models import * -from .trainer import * -from .policy import * diff --git a/examples/animalai_train/animalai_train/trainers/ppo/models.py b/examples/animalai_train/animalai_train/trainers/ppo/models.py deleted file mode 100644 index 519dfb50bd5e36ba5e4bfc8361b610a220339609..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/trainers/ppo/models.py +++ /dev/null @@ -1,195 +0,0 @@ -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/examples/animalai_train/animalai_train/trainers/ppo/policy.py b/examples/animalai_train/animalai_train/trainers/ppo/policy.py deleted file mode 100644 index 33bbba62bb1ffbdddb481631e1d9ff6608172486..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/trainers/ppo/policy.py +++ /dev/null @@ -1,214 +0,0 @@ -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/examples/animalai_train/animalai_train/trainers/ppo/trainer.py b/examples/animalai_train/animalai_train/trainers/ppo/trainer.py deleted file mode 100644 index 817cd6698a427b485d2270de4050cfb18f9657ff..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/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_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/examples/animalai_train/animalai_train/trainers/tensorflow_to_barracuda.py b/examples/animalai_train/animalai_train/trainers/tensorflow_to_barracuda.py deleted file mode 100644 index a7942909d3848be7f5b34bec47bd9bb66c0eaf87..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/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_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/examples/animalai_train/animalai_train/trainers/trainer.py b/examples/animalai_train/animalai_train/trainers/trainer.py deleted file mode 100644 index 6abd8ca8e77ed425dcb32a249e596fe5a38ce566..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/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/examples/animalai_train/animalai_train/trainers/trainer_controller.py b/examples/animalai_train/animalai_train/trainers/trainer_controller.py deleted file mode 100644 index f792a9fd77b5e7a8bab1eb23d1f9701a05586c3b..0000000000000000000000000000000000000000 --- a/examples/animalai_train/animalai_train/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_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(arenas_configurations=self.meta_curriculum.get_config()) - else: - if self.update_config: - self.update_config = False - return env.reset(arenas_configurations=self.config) - 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/examples/animalai_train/setup.py b/examples/animalai_train/setup.py deleted file mode 100644 index 9d9bd209c4fe91004890d3c4f870fe52dcf8a34b..0000000000000000000000000000000000000000 --- a/examples/animalai_train/setup.py +++ /dev/null @@ -1,37 +0,0 @@ -from setuptools import setup - -setup( - name='animalai_train', - version='1.1.1', - 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', - 'animalai_train.dopamine'], # Required - zip_safe=False, - - install_requires=[ - 'animalai>=1.0.5', - 'dopamine-rl', - 'tensorflow==1.14', - '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', - 'docopt', - 'pypiwin32==223;platform_system=="Windows"'], - python_requires=">=3.5,<3.8", -) diff --git a/examples/configs/1-Food.yaml b/examples/configs/1-Food.yaml deleted file mode 100644 index c5992f16a199f844a8655b0a607ab7d2dbd21f12..0000000000000000000000000000000000000000 --- a/examples/configs/1-Food.yaml +++ /dev/null @@ -1,22 +0,0 @@ -!ArenaConfig -arenas: - 0: !Arena - t: 250 - items: - - !Item - name: GoodGoal - 1: !Arena - t: 250 - items: - - !Item - name: GoodGoal - 2: !Arena - t: 250 - items: - - !Item - name: GoodGoal - 3: !Arena - t: 250 - items: - - !Item - name: GoodGoal diff --git a/examples/configs/2-Preferences.yaml b/examples/configs/2-Preferences.yaml deleted file mode 100644 index 2ea5a4cc84d0d02bd5974f06ebda33fab544cc3b..0000000000000000000000000000000000000000 --- a/examples/configs/2-Preferences.yaml +++ /dev/null @@ -1,11 +0,0 @@ -!ArenaConfig -arenas: - 0: !Arena - t: 250 - items: - - !Item - name: GoodGoal - - !Item - name: GoodGoalMulti - - !Item - name: BadGoal diff --git a/examples/configs/3-Obstacles.yaml b/examples/configs/3-Obstacles.yaml deleted file mode 100644 index 845e977c00767c327e2ab351742eba99df16b4f4..0000000000000000000000000000000000000000 --- a/examples/configs/3-Obstacles.yaml +++ /dev/null @@ -1,17 +0,0 @@ -!ArenaConfig -arenas: - 0: !Arena - t: 0 - items: - - !Item - name: GoodGoal - sizes: - - !Vector3 {x: 1, y: 1, z: 1} - - !Item - name: Wall - colors: - - !RGB {r: 153, g: 153, b: 153} - - !Item - name: Wall - colors: - - !RGB {r: 153, g: 153, b: 153} diff --git a/examples/configs/4-Avoidance.yaml b/examples/configs/4-Avoidance.yaml deleted file mode 100644 index f0c64551424b2dbdd69833695a462ab5628d7642..0000000000000000000000000000000000000000 --- a/examples/configs/4-Avoidance.yaml +++ /dev/null @@ -1,11 +0,0 @@ -!ArenaConfig -arenas: - 0: !Arena - t: 0 - items: - - !Item - name: GoodGoal - sizes: - - !Vector3 {x: 1, y: 1, z: 1} - - !Item - name: DeathZone diff --git a/examples/configs/5-SpatialReasoning.yaml b/examples/configs/5-SpatialReasoning.yaml deleted file mode 100644 index d0e7c9ead2c8b6bf9bbfd1555c217dddd46aaea8..0000000000000000000000000000000000000000 --- a/examples/configs/5-SpatialReasoning.yaml +++ /dev/null @@ -1,22 +0,0 @@ -!ArenaConfig -arenas: - 0: !Arena - t: 0 - items: - - !Item - name: GoodGoalMulti - sizes: - - !Vector3 {x: 1, y: 1, z: 1} - - !Vector3 {x: 1, y: 1, z: 1} - - !Item - name: Ramp - colors: - - !RGB {r: 255, g: 0, b: 255} - - !RGB {r: 255, g: 0, b: 255} - - !RGB {r: 255, g: 0, b: 255} - - !Item - name: Wall - colors: - - !RGB {r: 153, g: 153, b: 153} - - !RGB {r: 153, g: 153, b: 153} - - !RGB {r: 153, g: 153, b: 153} diff --git a/examples/configs/6-Generalization.yaml b/examples/configs/6-Generalization.yaml deleted file mode 100644 index 942058a0d6f2090a0d8ceee6729715bebf06e1f7..0000000000000000000000000000000000000000 --- a/examples/configs/6-Generalization.yaml +++ /dev/null @@ -1,22 +0,0 @@ -!ArenaConfig -arenas: - 0: !Arena - t: 0 - items: - - !Item - name: GoodGoalMulti - sizes: - - !Vector3 {x: 1, y: 1, z: 1} - - !Vector3 {x: 1, y: 1, z: 1} - - !Item - name: Ramp - - !Item - name: Ramp - - !Item - name: Ramp - - !Item - name: Wall - - !Item - name: Wall - - !Item - name: Wall \ No newline at end of file diff --git a/examples/configs/7-InternalMemory.yaml b/examples/configs/7-InternalMemory.yaml deleted file mode 100644 index 35007091eba7f1b2e2290b9042e7c39c7f802749..0000000000000000000000000000000000000000 --- a/examples/configs/7-InternalMemory.yaml +++ /dev/null @@ -1,32 +0,0 @@ -!ArenaConfig -arenas: - 0: !Arena - t: 0 - blackouts: [-20] - items: - - !Item - name: GoodGoal - 1: !Arena - t: 100 - blackouts: [-40] - items: - - !Item - name: Wall - - !Item - name: GoodGoal - 2: !Arena - t: 100 - blackouts: [50, 55, 75, 80, 100, 105, 125] - items: - - !Item - name: WallTranparent - - !Item - name: GoodGoal - 3: !Arena - t: 100 - blackouts: [25, 30, 50, 55, 75] - items: - - !Item - name: CylinderTunnel - - !Item - name: GoodGoal diff --git a/examples/configs/allObjectsRandom.yaml b/examples/configs/allObjectsRandom.yaml deleted file mode 100644 index aaedf9c1fbce976dd1c264ccdc893cc2f1ea3c93..0000000000000000000000000000000000000000 --- a/examples/configs/allObjectsRandom.yaml +++ /dev/null @@ -1,150 +0,0 @@ -!ArenaConfig -arenas: - 0: !Arena - t: 0 - items: - - !Item - name: CylinderTunnel - - !Item - name: Ramp - - !Item - name: Wall - - !Item - name: WallTransparent - - !Item - name: Cardbox1 - - !Item - name: Cardbox2 - - !Item - name: Cylinder - - !Item - name: UObject - - !Item - name: LObject - - !Item - name: GoodGoal - - !Item - name: GoodGoalBounce - - !Item - name: BadGoal - - !Item - name: BadGoalBounce - - !Item - name: GoodGoalMulti - - !Item - name: GoodGoalMultiBounce - - !Item - name: DeathZone - - !Item - name: HotZone - 1: !Arena - t: 0 - items: - - !Item - name: CylinderTunnel - - !Item - name: Ramp - - !Item - name: Wall - - !Item - name: WallTransparent - - !Item - name: Cardbox1 - - !Item - name: Cardbox2 - - !Item - name: Cylinder - - !Item - name: UObject - - !Item - name: LObject - - !Item - name: GoodGoal - - !Item - name: GoodGoalBounce - - !Item - name: BadGoal - - !Item - name: BadGoalBounce - - !Item - name: GoodGoalMulti - - !Item - name: GoodGoalMultiBounce - - !Item - name: DeathZone - - !Item - name: HotZone - 2: !Arena - t: 0 - items: - - !Item - name: CylinderTunnel - - !Item - name: Ramp - - !Item - name: Wall - - !Item - name: WallTransparent - - !Item - name: Cardbox1 - - !Item - name: Cardbox2 - - !Item - name: Cylinder - - !Item - name: UObject - - !Item - name: LObject - - !Item - name: GoodGoal - - !Item - name: GoodGoalBounce - - !Item - name: BadGoal - - !Item - name: BadGoalBounce - - !Item - name: GoodGoalMulti - - !Item - name: GoodGoalMultiBounce - - !Item - name: DeathZone - - !Item - name: HotZone - 3: !Arena - t: 0 - items: - - !Item - name: CylinderTunnel - - !Item - name: Ramp - - !Item - name: Wall - - !Item - name: WallTransparent - - !Item - name: Cardbox1 - - !Item - name: Cardbox2 - - !Item - name: Cylinder - - !Item - name: UObject - - !Item - name: LObject - - !Item - name: GoodGoal - - !Item - name: GoodGoalBounce - - !Item - name: BadGoal - - !Item - name: BadGoalBounce - - !Item - name: GoodGoalMulti - - !Item - name: GoodGoalMultiBounce - - !Item - name: DeathZone - - !Item - name: HotZone diff --git a/examples/configs/exampleConfig.yaml b/examples/configs/exampleConfig.yaml deleted file mode 100644 index 852330ff6faf73a9cc0928707a4f894764179e95..0000000000000000000000000000000000000000 --- a/examples/configs/exampleConfig.yaml +++ /dev/null @@ -1,23 +0,0 @@ -!ArenaConfig -arenas: - 0: !Arena - t: 0 - items: - - !Item - name: Wall - positions: - - !Vector3 {x: 10, y: 0, z: 10} - - !Vector3 {x: -1, y: 0, z: 30} - colors: - - !RGB {r: 204, g: 0, b: 204 } - rotations: [45] - sizes: - - !Vector3 {x: -1, y: 5, z: -1} - - !Item - name: CylinderTunnel - colors: - - !RGB {r: 204, g: 0, b: 204 } - - !RGB {r: 204, g: 0, b: 204 } - - !RGB {r: 204, g: 0, b: 204 } - - !Item - name: GoodGoal \ No newline at end of file diff --git a/examples/configs/exampleTraining.yaml b/examples/configs/exampleTraining.yaml deleted file mode 100644 index 97f961c1d89f6ece426c42ebb6e72972a620e881..0000000000000000000000000000000000000000 --- a/examples/configs/exampleTraining.yaml +++ /dev/null @@ -1,34 +0,0 @@ -!ArenaConfig -arenas: - 0: !Arena - t: 1000 - items: - - !Item - name: Wall - - !Item - name: CylinderTunnel - - !Item - name: GoodGoal - 1: !Arena - t: 1000 - items: - - !Item - name: WallTransparent - - !Item - name: GoodGoal - 2: !Arena - t: 1000 - items: - - !Item - name: Cardbox1 - - !Item - name: BadGoal - - !Item - name: GoodGoal - 3: !Arena - t: 1000 - items: - - !Item - name: DeathZone - - !Item - name: GoodGoal \ No newline at end of file diff --git a/examples/configs/forcedChoice.yaml b/examples/configs/forcedChoice.yaml deleted file mode 100644 index 245a235e9cb7deed198885b5c86434d9114f2bec..0000000000000000000000000000000000000000 --- a/examples/configs/forcedChoice.yaml +++ /dev/null @@ -1,43 +0,0 @@ -!ArenaConfig -arenas: - 0: !Arena - t: 0 - items: - - !Item - name: Wall - positions: - - !Vector3 {x: 20, y: 0, z: 20} - - !Vector3 {x: 20, y: 0, z: 8.75} - - !Vector3 {x: 20, y: 0, z: 31.25} - - !Vector3 {x: 8.75, y: 0, z: 20} - - !Vector3 {x: 31.25, y: 0, z: 20} - rotations: [0,0,0,0,0] - sizes: - - !Vector3 {x: 5, y: 0.5, z: 5} - - !Vector3 {x: .1, y: 5, z: 17.5} - - !Vector3 {x: .1, y: 5, z: 17.5} - - !Vector3 {x: 17.5, y: 5, z: .1} - - !Vector3 {x: 17.5, y: 5, z: .1} - colors: - - !RGB {r: 0, g: 0, b: 255} - - !RGB {r: 200, g: 200, b: 200} - - !RGB {r: 200, g: 200, b: 200} - - !RGB {r: 200, g: 200, b: 200} - - !RGB {r: 200, g: 200, b: 200} - - !Item - name: Agent - positions: - - !Vector3 {x: 20, y: .5, z: 20} - rotations: [0] - - !Item - name: GoodGoal - positions: - - !Vector3 {x: 30, y: 0, z: 30} - sizes: - - !Vector3 {x: 1, y: 1, z: 1} - - !Item - name: BadGoal - positions: - - !Vector3 {x: 10, y: 0, z: 30} - sizes: - - !Vector3 {x: 1, y: 1, z: 1} \ No newline at end of file diff --git a/examples/configs/movingFood.yaml b/examples/configs/movingFood.yaml deleted file mode 100644 index 6ebccd81b68f93f0534ef75d18bbbf78c2eb67f6..0000000000000000000000000000000000000000 --- a/examples/configs/movingFood.yaml +++ /dev/null @@ -1,9 +0,0 @@ -!ArenaConfig -arenas: - 0: !Arena - t: 0 - items: - - !Item - name: GoodGoalBounce - - !Item - name: BadGoalBounce \ No newline at end of file diff --git a/examples/configs/objectManipulation.yaml b/examples/configs/objectManipulation.yaml deleted file mode 100644 index 8b957bd4e5725dfdccce5d474bf4235571dda786..0000000000000000000000000000000000000000 --- a/examples/configs/objectManipulation.yaml +++ /dev/null @@ -1,17 +0,0 @@ -!ArenaConfig -arenas: - 0: !Arena - t: 0 - items: - - !Item - name: GoodGoal - sizes: - - !Vector3 {x: 1, y: 1, z: 1} - - !Item - name: Cardbox1 - - !Item - name: Cardbox2 - - !Item - name: UObject - - !Item - name: LObject diff --git a/examples/configs/rainbow.gin b/examples/configs/rainbow.gin deleted file mode 100644 index 1cc5e9795ef53df7152780936d8f7c9cf8df66c7..0000000000000000000000000000000000000000 --- a/examples/configs/rainbow.gin +++ /dev/null @@ -1,34 +0,0 @@ -# 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/configs/trainer_config.yaml b/examples/configs/trainer_config.yaml deleted file mode 100644 index 314ca567641c6272cb729d2afaff540c8f990e34..0000000000000000000000000000000000000000 --- a/examples/configs/trainer_config.yaml +++ /dev/null @@ -1,26 +0,0 @@ -default: - trainer: ppo - -Learner: - trainer: ppo - epsilon: 0.2 - gamma: 0.99 - lambd: 0.95 - learning_rate: 3.0e-4 - memory_size: 256 - normalize: false - sequence_length: 64 - summary_freq: 1000 - use_recurrent: false - use_curiosity: true - curiosity_strength: 0.01 - curiosity_enc_size: 256 - time_horizon: 128 - batch_size: 64 - buffer_size: 2024 - hidden_units: 256 - num_layers: 1 - beta: 1.0e-2 - max_steps: 5.0e6 - num_epoch: 3 - diff --git a/examples/configurations/arena_configurations/easy/1-1-1.yml b/examples/configurations/arena_configurations/easy/1-1-1.yml new file mode 100644 index 0000000000000000000000000000000000000000..0592c66a7a6a733778f08945cb1db150280a68cc --- /dev/null +++ b/examples/configurations/arena_configurations/easy/1-1-1.yml @@ -0,0 +1,17 @@ +!ArenaConfig +arenas: + 0: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + positions: + - !Vector3 {x: 20, y: 0, z: 20} + rotations: [0] + - !Item + name: GoodGoal + positions: + - !Vector3 {x: 20, y: 0, z: 22} + sizes: + - !Vector3 {x: 1, y: 1, z: 1} \ No newline at end of file diff --git a/examples/configurations/arena_configurations/easy/1-10-1.yml b/examples/configurations/arena_configurations/easy/1-10-1.yml new file mode 100644 index 0000000000000000000000000000000000000000..0fed265931605b818509b05e52895e510267a7ab --- /dev/null +++ b/examples/configurations/arena_configurations/easy/1-10-1.yml @@ -0,0 +1,17 @@ +!ArenaConfig +arenas: + 0: !Arena + pass_mark: 4 + t: 250 + items: + - !Item + name: Agent + positions: + - !Vector3 {x: 20, y: 0, z: 5} + rotations: [0] + - !Item + name: GoodGoalMulti + positions: + - !Vector3 {x: 20, y: 0, z: 26} + sizes: + - !Vector3 {x: 5, y: 5, z: 5} \ No newline at end of file diff --git a/examples/configurations/arena_configurations/easy/1-13-1.yml b/examples/configurations/arena_configurations/easy/1-13-1.yml new file mode 100644 index 0000000000000000000000000000000000000000..0f560954d5de06fc62babdb701ab169000d23163 --- /dev/null +++ b/examples/configurations/arena_configurations/easy/1-13-1.yml @@ -0,0 +1,17 @@ +!ArenaConfig +arenas: + 0: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + positions: + - !Vector3 {x: 7, y: 0, z: 7} + rotations: [225] + - !Item + name: GoodGoal + positions: + - !Vector3 {x: 32, y: 0, z: 32} + sizes: + - !Vector3 {x: 1, y: 1, z: 1} \ No newline at end of file diff --git a/examples/configurations/arena_configurations/easy/1-17-1.yml b/examples/configurations/arena_configurations/easy/1-17-1.yml new file mode 100644 index 0000000000000000000000000000000000000000..7db4a6e27a0d27ecfa4be1cfe418c35b7535159e --- /dev/null +++ b/examples/configurations/arena_configurations/easy/1-17-1.yml @@ -0,0 +1,17 @@ +!ArenaConfig +arenas: + 0: !Arena + pass_mark: -0.5 + t: 250 + items: + - !Item + name: Agent + positions: + - !Vector3 {x: 1, y: 0, z: 1} + rotations: [225] + - !Item + name: GoodGoalMulti + positions: + - !Vector3 {x: 39, y: 0, z: 39} + sizes: + - !Vector3 {x: .5, y: .5, z: .5} \ No newline at end of file diff --git a/examples/configurations/arena_configurations/easy/1-20-1.yml b/examples/configurations/arena_configurations/easy/1-20-1.yml new file mode 100644 index 0000000000000000000000000000000000000000..60c33f935f53e0816a8c206b1d2dc7b9a23bdad1 --- /dev/null +++ b/examples/configurations/arena_configurations/easy/1-20-1.yml @@ -0,0 +1,15 @@ +!ArenaConfig +arenas: + 0: !Arena + pass_mark: 4 + t: 250 + items: + - !Item + name: GoodGoalMulti + positions: + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + - !Vector3 {x: 1, y: 1, z: 1} + - !Vector3 {x: 1, y: 1, z: 1} + - !Vector3 {x: 1, y: 1, z: 1} + - !Vector3 {x: 1, y: 1, z: 1} \ No newline at end of file diff --git a/examples/configurations/arena_configurations/easy/2-7-1.yml b/examples/configurations/arena_configurations/easy/2-7-1.yml new file mode 100644 index 0000000000000000000000000000000000000000..0c2e6a725211a54fcbad1725ef60609834036487 --- /dev/null +++ b/examples/configurations/arena_configurations/easy/2-7-1.yml @@ -0,0 +1,41 @@ +!ArenaConfig +arenas: + 0: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + positions: + - !Vector3 {x: 20, y: 0, z: 5} + rotations: [0] + - !Item + name: Wall + positions: + - !Vector3 {x: 10, y: 0, z: 10.25} + - !Vector3 {x: 30, y: 0, z: 10.25} + - !Vector3 {x: 17.78, y: 0, z: 30} + - !Vector3 {x: 22.22, y: 0, z: 30} + rotations: [45, 135, 258.7, 101.3] + colors: + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + sizes: + - !Vector3 {x: 27.75, y: 5, z: .5} + - !Vector3 {x: 27.75, y: 5, z: .5} + - !Vector3 {x: 20, y: 5, z: .5} + - !Vector3 {x: 20, y: 5, z: .5} + - !Item + name: GoodGoal + positions: + - !Vector3 {x: 10, y: 0, z: 30} + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + - !Item + name: BadGoal + positions: + - !Vector3 {x: 30, y: 0, z: 30} + sizes: + - !Vector3 {x: 1, y: 1, z: 1} \ No newline at end of file diff --git a/examples/configurations/arena_configurations/easy/3-1-1.yml b/examples/configurations/arena_configurations/easy/3-1-1.yml new file mode 100644 index 0000000000000000000000000000000000000000..e554db30af1de50b8d619baec56f09fe0936d5e4 --- /dev/null +++ b/examples/configurations/arena_configurations/easy/3-1-1.yml @@ -0,0 +1,26 @@ +!ArenaConfig +arenas: + 0: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Wall + positions: + - !Vector3 {x: 20, y: 0, z: 20} + rotations: [10] + sizes: + - !Vector3 {x: 15, y: 10, z: 1} + colors: + - !RGB {r: 153, g: 153, b: 153} + - !Item + name: GoodGoal + positions: + - !Vector3 {x: 20, y: 0, z: 24} + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + - !Item + name: Agent + positions: + - !Vector3 {x: 20, y: 0, z: 1} + rotations: [0] \ No newline at end of file diff --git a/examples/configurations/arena_configurations/easy/4-1-2.yml b/examples/configurations/arena_configurations/easy/4-1-2.yml new file mode 100644 index 0000000000000000000000000000000000000000..ffbffba8b6f03b8c73da9fc3c6ca6e16e18a2b59 --- /dev/null +++ b/examples/configurations/arena_configurations/easy/4-1-2.yml @@ -0,0 +1,24 @@ +!ArenaConfig +arenas: + 0: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: DeathZone + positions: + - !Vector3 {x: 20, y: 0, z: 20} + rotations: [45] + sizes: + - !Vector3 {x: 10, y: 0, z: 10} + - !Item + name: GoodGoal + positions: + - !Vector3 {x: 20, y: 0, z: 30} + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + - !Item + name: Agent + positions: + - !Vector3 {x: 20, y: 0, z: 10} + rotations: [0] \ No newline at end of file diff --git a/examples/configurations/arena_configurations/easy/5-1-1.yml b/examples/configurations/arena_configurations/easy/5-1-1.yml new file mode 100644 index 0000000000000000000000000000000000000000..78e3fd9eb74b019c81973a4318cc66074caa7d47 --- /dev/null +++ b/examples/configurations/arena_configurations/easy/5-1-1.yml @@ -0,0 +1,28 @@ +!ArenaConfig +arenas: + 0: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Wall + positions: + - !Vector3 {x: 9.5, y: 0, z: 19} + - !Vector3 {x: 30.5, y: 0, z: 19} + rotations: [0,0] + sizes: + - !Vector3 {x: 19, y: 3, z: 38} + - !Vector3 {x: 19, y: 3, z: 38} + colors: + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !Item + name: GoodGoal + positions: + - !Vector3 {x: 1, y: 0, z: 39} + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + - !Item + name: Agent + positions: + - !Vector3 {x: 20, y: 0, z: 1} \ No newline at end of file diff --git a/examples/configurations/arena_configurations/easy/5-22-1.yml b/examples/configurations/arena_configurations/easy/5-22-1.yml new file mode 100644 index 0000000000000000000000000000000000000000..3ea6ae01a93988bd9fa82b303967bfabbecc9586 --- /dev/null +++ b/examples/configurations/arena_configurations/easy/5-22-1.yml @@ -0,0 +1,138 @@ +!ArenaConfig +arenas: + 0: !Arena + pass_mark: 1 + t: 500 + items: + - !Item + name: Wall #Non-diag arms + positions: + - !Vector3 {x: 18, y: 0, z: 7.5} + - !Vector3 {x: 22, y: 0, z: 7.5} + - !Vector3 {x: 18, y: 0, z: 32.5} + - !Vector3 {x: 22, y: 0, z: 32.5} + - !Vector3 {x: 7.5, y: 0, z: 18} + - !Vector3 {x: 7.5, y: 0, z: 22} + - !Vector3 {x: 32.5, y: 0, z: 18} + - !Vector3 {x: 32.5, y: 0, z: 22} + rotations: [0,0,0,0,0,0,0,0] + sizes: + - !Vector3 {x: 0.1, y: 3, z: 15} + - !Vector3 {x: 0.1, y: 3, z: 15} + - !Vector3 {x: 0.1, y: 3, z: 15} + - !Vector3 {x: 0.1, y: 3, z: 15} + - !Vector3 {x: 15, y: 3, z: 0.1} + - !Vector3 {x: 15, y: 3, z: 0.1} + - !Vector3 {x: 15, y: 3, z: 0.1} + - !Vector3 {x: 15, y: 3, z: 0.1} + colors: + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !Item + name: Wall #Non-diag backplates + positions: + - !Vector3 {x: 20, y: 0, z: 25.5} + - !Vector3 {x: 20, y: 0, z: 14.5} + - !Vector3 {x: 0.5, y: 0, z: 20} + - !Vector3 {x: 20, y: 0, z: 0.5} + - !Vector3 {x: 20, y: 0, z: 39.5} + - !Vector3 {x: 39.5, y: 0, z: 20} + rotations: [0,0,90,0,0,90] + sizes: + - !Vector3 {x: 3.9, y: 3, z: 1} + - !Vector3 {x: 3.9, y: 3, z: 1} + - !Vector3 {x: 3.9, y: 3, z: 1} + - !Vector3 {x: 3.9, y: 3, z: 1} + - !Vector3 {x: 3.9, y: 3, z: 1} + - !Vector3 {x: 3.9, y: 3, z: 1} + colors: + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !Item + name: Wall #Diag arms + positions: + - !Vector3 {x: 12.61, y: 0, z: 30.4} + - !Vector3 {x: 9.7, y: 0, z: 27.39} + - !Vector3 {x: 30.3, y: 0, z: 12.61} + - !Vector3 {x: 27.39, y: 0, z: 9.6} + - !Vector3 {x: 12.61, y: 0, z: 9.6} + - !Vector3 {x: 9.7, y: 0, z: 12.61} + - !Vector3 {x: 27.39, y: 0, z: 30.4} + - !Vector3 {x: 30.3, y: 0, z: 27.39} + rotations: [135,135,135,135,45,45,45,45] + sizes: + - !Vector3 {x: 0.1, y: 3, z: 15} + - !Vector3 {x: 0.1, y: 3, z: 15} + - !Vector3 {x: 0.1, y: 3, z: 15} + - !Vector3 {x: 0.1, y: 3, z: 15} + - !Vector3 {x: 0.1, y: 3, z: 15} + - !Vector3 {x: 0.1, y: 3, z: 15} + - !Vector3 {x: 0.1, y: 3, z: 15} + - !Vector3 {x: 0.1, y: 3, z: 15} + colors: + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !Item + name: Wall #Diag Blocks + positions: + - !Vector3 {x: 16.045, y: 0, z: 24.005} + - !Vector3 {x: 23.955, y: 0, z: 15.995} + - !Vector3 {x: 16.045, y: 0, z: 15.995} + - !Vector3 {x: 23.955, y: 0, z: 24.005} + rotations: [135,315,45,225] + sizes: + - !Vector3 {x: 4, y: 3, z: 1} + - !Vector3 {x: 4, y: 3, z: 1} + - !Vector3 {x: 4, y: 3, z: 1} + - !Vector3 {x: 4, y: 3, z: 1} + colors: + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !Item + name: Wall #Diag backplates + positions: + - !Vector3 {x: 6, y: 0, z: 6} + - !Vector3 {x: 34, y: 0, z: 6} + - !Vector3 {x: 6, y: 0, z: 34} + - !Vector3 {x: 34, y: 0, z: 34} + rotations: [45,135,134,45] + sizes: + - !Vector3 {x: 4, y: 3, z: 1} + - !Vector3 {x: 4, y: 3, z: 1} + - !Vector3 {x: 4, y: 3, z: 1} + - !Vector3 {x: 4, y: 3, z: 1} + colors: + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !Item + name: GoodGoalMulti + positions: + - !Vector3 {x: 2, y: 0, z: 20} + - !Vector3 {x: 38, y: 0, z: 20} + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + - !Vector3 {x: 1, y: 1, z: 1} + - !Item + name: Agent + positions: + - !Vector3 {x: 20, y: 0, z: 20} \ No newline at end of file diff --git a/examples/configurations/arena_configurations/hard/2-22-1.yml b/examples/configurations/arena_configurations/hard/2-22-1.yml new file mode 100644 index 0000000000000000000000000000000000000000..0f1daec0e694a49df71704d610543f02808f7ef7 --- /dev/null +++ b/examples/configurations/arena_configurations/hard/2-22-1.yml @@ -0,0 +1,41 @@ +!ArenaConfig +arenas: + 0: !Arena + pass_mark: 2 + t: 500 + items: + - !Item + name: Wall + positions: + - !Vector3 {x: 20, y: 0, z: 22.5} + rotations: [0] + sizes: + - !Vector3 {x: 40, y: .6, z: 35} + colors: + - !RGB {r: 0, g: 0, b: 255} + - !Item + name: Ramp + positions: + - !Vector3 {x: 20, y: .6, z: 22.5} + rotations: [180] + sizes: + - !Vector3 {x: 40, y: 2, z: 35} + colors: + - !RGB {r: 255, g: 0, b: 255} + - !Item + name: Agent + positions: + - !Vector3 {x: 5, y: 0, z: 2.5} + rotations: [60] + - !Item + name: GoodGoal + positions: + - !Vector3 {x: 19, y: 3, z: 9} + sizes: + - !Vector3 {x: 3, y: 3, z: 3} + - !Item + name: GoodGoal + positions: + - !Vector3 {x: 38, y: 0, z: 2.5} + sizes: + - !Vector3 {x: 1, y: 1, z: 1} diff --git a/examples/configurations/arena_configurations/hard/3-15-1.yml b/examples/configurations/arena_configurations/hard/3-15-1.yml new file mode 100644 index 0000000000000000000000000000000000000000..7f5e11612c0dad4550a23420df9fca350690f404 --- /dev/null +++ b/examples/configurations/arena_configurations/hard/3-15-1.yml @@ -0,0 +1,28 @@ +!ArenaConfig +arenas: + 0: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: CylinderTunnelTransparent + positions: + - !Vector3 {x: 20, y: 0, z: 20} + - !Vector3 {x: 30, y: 0, z: 20} + - !Vector3 {x: 10, y: 0, z: 20} + rotations: [90,90,90] + sizes: + - !Vector3 {x: 10, y: 10, z: 10} + - !Vector3 {x: 10, y: 10, z: 10} + - !Vector3 {x: 10, y: 10, z: 10} + - !Item + name: GoodGoal + positions: + - !Vector3 {x: 20, y: 0, z: 20} + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + - !Item + name: Agent + positions: + - !Vector3 {x: 20, y: 0, z: 1} + rotations: [0] \ No newline at end of file diff --git a/examples/configurations/arena_configurations/hard/3-16-1.yml b/examples/configurations/arena_configurations/hard/3-16-1.yml new file mode 100644 index 0000000000000000000000000000000000000000..7026b012ff7c49fcbc8d91f07633aa99b603f5a3 --- /dev/null +++ b/examples/configurations/arena_configurations/hard/3-16-1.yml @@ -0,0 +1,35 @@ +!ArenaConfig +arenas: + 0: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Wall + positions: + - !Vector3 {x: 20, y: 0, z: 30} + rotations: [0] + sizes: + - !Vector3 {x: 40, y: 0.5, z: 20} + colors: + - !RGB {r: 0, g: 0, b: 255} + - !Item + name: Ramp + positions: + - !Vector3 {x: 35, y: 0, z: 18} + sizes: + - !Vector3 {x: 4, y: 0.5, z: 4} + rotations: [180] + colors: + - !RGB {r: 255, g: 0, b: 255} + - !Item + name: GoodGoal + positions: + - !Vector3 {x: 20, y: 0.5, z: 35} + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + - !Item + name: Agent + positions: + - !Vector3 {x: 5, y: 0, z: 5} + rotations: [45] \ No newline at end of file diff --git a/examples/configurations/arena_configurations/hard/3-2-1.yml b/examples/configurations/arena_configurations/hard/3-2-1.yml new file mode 100644 index 0000000000000000000000000000000000000000..0ff833656842becdb29aa065e3873488885d28b0 --- /dev/null +++ b/examples/configurations/arena_configurations/hard/3-2-1.yml @@ -0,0 +1,26 @@ +!ArenaConfig +arenas: + 0: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Wall + positions: + - !Vector3 {x: 30, y: 0, z: 12.5} + rotations: [0] + sizes: + - !Vector3 {x: 1, y: 5, z: 25} + colors: + - !RGB {r: 153, g: 153, b: 153} + - !Item + name: GoodGoal + positions: + - !Vector3 {x: 38, y: 0, z: 5} + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + - !Item + name: Agent + positions: + - !Vector3 {x: 1, y: 0, z: 1} + rotations: [12] \ No newline at end of file diff --git a/examples/configurations/arena_configurations/hard/3-22-1.yml b/examples/configurations/arena_configurations/hard/3-22-1.yml new file mode 100644 index 0000000000000000000000000000000000000000..09b0f558b04e0067e1a2f8255abc6547cba7400e --- /dev/null +++ b/examples/configurations/arena_configurations/hard/3-22-1.yml @@ -0,0 +1,38 @@ +!ArenaConfig +arenas: + 0: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Cardbox1 + positions: + - !Vector3 {x: 20, y: 0, z: 2.5} + - !Vector3 {x: 20, y: 0, z: 7.5} + - !Vector3 {x: 20, y: 0, z: 12.5} + - !Vector3 {x: 20, y: 0, z: 17.5} + - !Vector3 {x: 20, y: 0, z: 22.5} + - !Vector3 {x: 20, y: 0, z: 27.5} + - !Vector3 {x: 20, y: 0, z: 32.5} + - !Vector3 {x: 20, y: 0, z: 37.5} + rotations: [0,0,0,0,0,0,0,0] + sizes: + - !Vector3 {x: 1, y: 1, z: 5} + - !Vector3 {x: 1, y: 1, z: 5} + - !Vector3 {x: 1, y: 1, z: 5} + - !Vector3 {x: 1, y: 1, z: 5} + - !Vector3 {x: 1, y: 1, z: 5} + - !Vector3 {x: 1, y: 1, z: 5} + - !Vector3 {x: 1, y: 1, z: 5} + - !Vector3 {x: 1, y: 1, z: 5} + - !Item + name: GoodGoal + positions: + - !Vector3 {x: 35, y: 0, z: 5} + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + - !Item + name: Agent + positions: + - !Vector3 {x: 5, y: 0, z: 20} + rotations: [90] \ No newline at end of file diff --git a/examples/configurations/arena_configurations/hard/3-28-1.yml b/examples/configurations/arena_configurations/hard/3-28-1.yml new file mode 100644 index 0000000000000000000000000000000000000000..5aa1e25f2c975747286a40eb9f6b6a8081a462be --- /dev/null +++ b/examples/configurations/arena_configurations/hard/3-28-1.yml @@ -0,0 +1,41 @@ +!ArenaConfig +arenas: + 0: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Wall + positions: + - !Vector3 {x: 20, y: 0, z: 20} + - !Vector3 {x: 22, y: 0, z: 24.5} + - !Vector3 {x: 24, y: 0, z: 19} + - !Vector3 {x: 21, y: 0, z: 12.5} + - !Vector3 {x: 17, y: 0, z: 19.5} + - !Vector3 {x: 19, y: 0, z: 28.75} + rotations: [0,0,0,0,0,60] + sizes: + - !Vector3 {x: 1, y: 3, z: 10} + - !Vector3 {x: 3, y: 3, z: 1} + - !Vector3 {x: 1, y: 3, z: 12} + - !Vector3 {x: 7, y: 3, z: 1} + - !Vector3 {x: 1, y: 3, z: 15} + - !Vector3 {x: 1, y: 3, z: 5} + colors: + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !Item + name: GoodGoal + positions: + - !Vector3 {x: 23, y: 0, z: 30} + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + - !Item + name: Agent + positions: + - !Vector3 {x: 22, y: 0, z: 22} + rotations: [0] \ No newline at end of file diff --git a/examples/configurations/arena_configurations/hard/3-30-1.yml b/examples/configurations/arena_configurations/hard/3-30-1.yml new file mode 100644 index 0000000000000000000000000000000000000000..c801aff800d8b00d9fb9846dbb07b34d0b8fc1ba --- /dev/null +++ b/examples/configurations/arena_configurations/hard/3-30-1.yml @@ -0,0 +1,43 @@ +!ArenaConfig +arenas: + 0: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Wall + positions: + - !Vector3 {x: 15, y: 0, z: 20} + - !Vector3 {x: 20, y: 0, z: 15.5} + - !Vector3 {x: 25, y: 0, z: 20} + - !Vector3 {x: 20, y: 0, z: 24.5} + rotations: [0,0,0,0] + sizes: + - !Vector3 {x: 1, y: 3, z: 10} + - !Vector3 {x: 9, y: 3, z: 1} + - !Vector3 {x: 1, y: 3, z: 10} + - !Vector3 {x: 9, y: 3, z: 1} + colors: + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !Item + name: Ramp + positions: + - !Vector3 {x: 23, y: 0, z: 20} + rotations: [270] + sizes: + - !Vector3 {x: 8, y: 3, z: 2.99} + colors: + - !RGB {r: 255, g: 0, b: 255} + - !Item + name: GoodGoal + positions: + - !Vector3 {x: 35, y: 0, z: 30} + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + - !Item + name: Agent + positions: + - !Vector3 {x: 16, y: 0, z: 20} \ No newline at end of file diff --git a/examples/configurations/arena_configurations/hard/4-22-1.yml b/examples/configurations/arena_configurations/hard/4-22-1.yml new file mode 100644 index 0000000000000000000000000000000000000000..cdbcec9af1f3b7dc563977b38d9340ca12dadf9e --- /dev/null +++ b/examples/configurations/arena_configurations/hard/4-22-1.yml @@ -0,0 +1,32 @@ +!ArenaConfig +arenas: + 0: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: DeathZone + positions: + - !Vector3 {x: 20, y: 0, z: 20} + rotations: [0] + sizes: + - !Vector3 {x: 40, y: 0, z: 20} + - !Item + name: Wall + positions: + - !Vector3 {x: 20, y: 0, z: 20} + rotations: [0] + sizes: + - !Vector3 {x: 10, y: 0.1, z: 22} + colors: + - !RGB {r: 153, g: 153, b: 153} + - !Item + name: GoodGoal + positions: + - !Vector3 {x: 20, y: 0, z: 35} + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + - !Item + name: Agent + positions: + - !Vector3 {x: 10, y: 0, z: 5} \ No newline at end of file diff --git a/examples/configurations/arena_configurations/hard/5-16-1.yml b/examples/configurations/arena_configurations/hard/5-16-1.yml new file mode 100644 index 0000000000000000000000000000000000000000..2333d809e0a7be12bbe50a00f12da1cb7543fa5e --- /dev/null +++ b/examples/configurations/arena_configurations/hard/5-16-1.yml @@ -0,0 +1,49 @@ +!ArenaConfig +arenas: + 0: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + positions: + - !Vector3 {x: 20, y: 0.5, z: 1} + rotations: [0] + - !Item + name: Wall + rotations: [0,0,0] + positions: + - !Vector3 {x: 20, y: 0, z: 5} + - !Vector3 {x: 13.33, y: 0, z: 25} + - !Vector3 {x: 26.66, y: 0, z: 25} + sizes: + - !Vector3 {x: 20, y: .5, z: 10} + - !Vector3 {x: 1, y: 1, z: 30} + - !Vector3 {x: 1, y: 1, z: 30} + colors: + - !RGB {r: 0, g: 0, b: 255} + - !RGB {r: 153, g: 153, b: 153} + - !RGB {r: 153, g: 153, b: 153} + - !Item + name: WallTransparent + rotations: [0,0,0,0,0,0] + positions: + - !Vector3 {x: 10, y: 0, z: 39} + - !Vector3 {x: 30, y: 0, z: 39} + - !Vector3 {x: 10, y: 0, z: 37} + - !Vector3 {x: 30, y: 0, z: 37} + - !Vector3 {x: 20, y: 5, z: 39} + - !Vector3 {x: 20, y: 5, z: 37} + sizes: + - !Vector3 {x: 2, y: 5, z: 2} + - !Vector3 {x: 2, y: 1, z: 2} + - !Vector3 {x: 2, y: 5, z: 2} + - !Vector3 {x: 2, y: 1, z: 2} + - !Vector3 {x: 35, y: 0.1, z: 2} + - !Vector3 {x: 35, y: 1, z: 2} + - !Item + name: GoodGoal + positions: + - !Vector3 {x: 5, y: 15, z: 39} + sizes: + - !Vector3 {x: 1, y: 1, z: 1} \ No newline at end of file diff --git a/examples/configurations/arena_configurations/hard/5-7-1.yml b/examples/configurations/arena_configurations/hard/5-7-1.yml new file mode 100644 index 0000000000000000000000000000000000000000..15b59eb2b995e1d3cf11d2247f0aa228d99ebddd --- /dev/null +++ b/examples/configurations/arena_configurations/hard/5-7-1.yml @@ -0,0 +1,46 @@ +!ArenaConfig +arenas: + 0: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Wall + positions: + - !Vector3 {x: 20, y: 0, z: 2.5} + - !Vector3 {x: 20, y: 0, z: 22.5} + rotations: [0,0] + sizes: + - !Vector3 {x: 5, y: .5, z: 5} + - !Vector3 {x: 1, y: 5, z: 35} + colors: + - !RGB {r: 0, g: 0, b: 255} + - !RGB {r: 153, g: 153, b: 153} + - !Item + name: Agent + positions: + - !Vector3 {x: 20, y: .5, z: 1} + rotations: [0] + - !Item + name: CylinderTunnel + positions: + - !Vector3 {x: 10, y: 0, z: 20} + rotations: [83] + sizes: + - !Vector3 {x: 10, y: 10, z: 10} + colors: + - !RGB {r: 153, g: 153, b: 153} + - !Item + name: GoodGoal + positions: + - !Vector3 {x: 10, y: 0, z: 20} + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + - !Item + name: Wall + positions: + - !Vector3 {x: 30, y: 0, z: 20} + sizes: + - !Vector3 {x: 8, y: 0.1, z: 7} + colors: + - !RGB {r: 153, g: 153, b: 153} diff --git a/examples/configurations/arena_configurations/test_speed.yml b/examples/configurations/arena_configurations/test_speed.yml new file mode 100644 index 0000000000000000000000000000000000000000..3533c5b114acd07814b315dc1bfd40bb99f73565 --- /dev/null +++ b/examples/configurations/arena_configurations/test_speed.yml @@ -0,0 +1,322 @@ +!ArenaConfig +arenas: + 0: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 1: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 2: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 3: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 4: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 5: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 6: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 7: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 8: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 9: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 10: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 11: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 12: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 13: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 14: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 15: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 16: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 17: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 18: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 19: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 20: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 21: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 22: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 23: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 24: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 25: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 26: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 27: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 28: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 29: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 30: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 31: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} diff --git a/examples/configurations/arena_configurations/train_ml_agents_arenas.yml b/examples/configurations/arena_configurations/train_ml_agents_arenas.yml new file mode 100644 index 0000000000000000000000000000000000000000..1bf35493e70095bd1e308714ea7a88ec36580d14 --- /dev/null +++ b/examples/configurations/arena_configurations/train_ml_agents_arenas.yml @@ -0,0 +1,82 @@ +!ArenaConfig +arenas: + 0: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 1: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 2: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 3: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 4: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 5: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 6: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} + 7: !Arena + pass_mark: 0 + t: 250 + items: + - !Item + name: Agent + - !Item + name: GoodGoal + sizes: + - !Vector3 {x: 1, y: 1, z: 1} diff --git a/examples/configs/curriculum/0.yaml b/examples/configurations/curriculum/0.yaml similarity index 100% rename from examples/configs/curriculum/0.yaml rename to examples/configurations/curriculum/0.yaml diff --git a/examples/configs/curriculum/1.yaml b/examples/configurations/curriculum/1.yaml similarity index 100% rename from examples/configs/curriculum/1.yaml rename to examples/configurations/curriculum/1.yaml diff --git a/examples/configs/curriculum/2.yaml b/examples/configurations/curriculum/2.yaml similarity index 100% rename from examples/configs/curriculum/2.yaml rename to examples/configurations/curriculum/2.yaml diff --git a/examples/configs/curriculum/3.yaml b/examples/configurations/curriculum/3.yaml similarity index 100% rename from examples/configs/curriculum/3.yaml rename to examples/configurations/curriculum/3.yaml diff --git a/examples/configs/curriculum/4.yaml b/examples/configurations/curriculum/4.yaml similarity index 100% rename from examples/configs/curriculum/4.yaml rename to examples/configurations/curriculum/4.yaml diff --git a/examples/configs/curriculum/5.yaml b/examples/configurations/curriculum/5.yaml similarity index 100% rename from examples/configs/curriculum/5.yaml rename to examples/configurations/curriculum/5.yaml diff --git a/examples/configs/curriculum/Learner.json b/examples/configurations/curriculum/AnimalAI.json similarity index 100% rename from examples/configs/curriculum/Learner.json rename to examples/configurations/curriculum/AnimalAI.json diff --git a/examples/configurations/training_configurations/train_ml_agents_config.yaml b/examples/configurations/training_configurations/train_ml_agents_config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..85093c005dae3be1fde89d29a695fa6efbed3eb5 --- /dev/null +++ b/examples/configurations/training_configurations/train_ml_agents_config.yaml @@ -0,0 +1,28 @@ +AnimalAI: + trainer: ppo + epsilon: 0.2 + lambd: 0.95 + learning_rate: 3.0e-4 + learning_rate_schedule: linear + memory_size: 128 + normalize: false + sequence_length: 64 + summary_freq: 10000 + use_recurrent: false + vis_encode_type: simple + time_horizon: 128 + batch_size: 64 + buffer_size: 2024 + hidden_units: 256 + num_layers: 1 + beta: 1.0e-2 + max_steps: 1.0e7 + num_epoch: 3 + reward_signals: + extrinsic: + strength: 1.0 + gamma: 0.99 + curiosity: + strength: 0.01 + gamma: 0.99 + encoding_size: 256 \ No newline at end of file diff --git a/env/README.md b/examples/env/README.md similarity index 100% rename from env/README.md rename to examples/env/README.md diff --git a/examples/load_config_and_play.py b/examples/load_config_and_play.py new file mode 100644 index 0000000000000000000000000000000000000000..ae3cfce39e768b9c096d6533e5e03ebf4198fab7 --- /dev/null +++ b/examples/load_config_and_play.py @@ -0,0 +1,50 @@ +import sys +import random +import os +from animalai.envs.arena_config import ArenaConfig +from animalai.envs.environment import AnimalAIEnvironment + +""" + +""" + + +def load_config_and_play(configuration_file: str) -> None: + """ + Loads a configuration file for a single arena and lets you play manually + :param configuration_file: str path to the yaml configuration + :return: None + """ + env_path = "env/AnimalAI" + port = 5005 + random.randint( + 0, 100 + ) # use a random port to allow relaunching the script rapidly + configuration = ArenaConfig(configuration_file) + + environment = AnimalAIEnvironment( + file_name=env_path, + base_port=port, + arenas_configurations=configuration, + play=True, + ) + + try: + while environment.proc1: + continue + except KeyboardInterrupt: + pass + finally: + environment.close() + + +if __name__ == "__main__": + if len(sys.argv) > 1: + configuration_file = sys.argv[1] + else: + competition_folder = "../competition_configurations/" + configuration_files = os.listdir(competition_folder) + configuration_random = random.randint(0, len(configuration_files)) + configuration_file = ( + competition_folder + configuration_files[configuration_random] + ) + load_config_and_play(configuration_file=configuration_file) diff --git a/examples/requirements.txt b/examples/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/examples/submission/Dockerfile b/examples/submission/Dockerfile deleted file mode 100644 index 06e0f4b93086164ab702af2d8cc4998c5e4c9de3..0000000000000000000000000000000000000000 --- a/examples/submission/Dockerfile +++ /dev/null @@ -1,46 +0,0 @@ -FROM nvidia/cuda:9.0-cudnn7-runtime-ubuntu16.04 - -RUN apt-get clean && apt-get update && apt-get install -y locales -RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && \ - locale-gen -ENV LC_ALL en_US.UTF-8 -ENV LANG en_US.UTF-8 -ENV LANGUAGE en_US.UTF-8 -ENV SHELL /bin/bash - -RUN apt-get update && \ - apt-get install -y curl bzip2 xvfb ffmpeg git libxrender1 - -WORKDIR /aaio - -RUN curl -o ~/miniconda.sh -O https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh && \ - chmod +x ~/miniconda.sh && \ - ~/miniconda.sh -b -p /opt/conda && \ - rm ~/miniconda.sh && \ - /opt/conda/bin/conda clean -ya && \ - /opt/conda/bin/conda create -n python36 python=3.6 numpy - -ENV PATH /opt/conda/envs/python36/bin:/opt/conda/envs/bin:$PATH - -RUN pip install animalai - -COPY agent.py /aaio/agent.py -COPY data /aaio/data - -ENV HTTP_PROXY "" -ENV HTTPS_PROXY "" -ENV http_proxy "" -ENV https_proxy "" - -######################################################################################################################## -# YOUR COMMANDS GO HERE - -# For example, if your agent requires the animalai-train library -# you can add the following (remove if not needed): -RUN pip install animalai-train - - -######################################################################################################################## - -CMD ["/bin/bash"] - diff --git a/examples/submission/README.md b/examples/submission/README.md deleted file mode 100644 index 7c03bcb11417648aa3397688d5e3d4e48542d601..0000000000000000000000000000000000000000 --- a/examples/submission/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Submission example - -We provide here the code for creating a submission container, as well as a very basic agent trained on `1-Food` using `trainMLAgents.py`. The `agent.py` implements the -script you will need to submit, it loads a trained model located in `data`. - -Read the [submission documentation](../../documentation/submission.md) \ No newline at end of file diff --git a/examples/submission/agent.py b/examples/submission/agent.py deleted file mode 100644 index 61287ded2fe1ccf5e361f07b4a9b242d927995f8..0000000000000000000000000000000000000000 --- a/examples/submission/agent.py +++ /dev/null @@ -1,55 +0,0 @@ -import yaml -from animalai_train.trainers.ppo.policy import PPOPolicy -from animalai.envs.brain import BrainParameters - - -class Agent(object): - - def __init__(self): - """ - Load your agent here and initialize anything needed - """ - - # Load the configuration and model using ABSOLUTE PATHS - self.configuration_file = '/aaio/data/trainer_config.yaml' - self.model_path = '/aaio/data/1-Food/Learner' - - self.brain = BrainParameters(brain_name='Learner', - camera_resolutions=[{'height': 84, 'width': 84, 'blackAndWhite': False}], - num_stacked_vector_observations=1, - vector_action_descriptions=['', ''], - vector_action_space_size=[3, 3], - vector_action_space_type=0, # corresponds to discrete - vector_observation_space_size=3 - ) - self.trainer_params = yaml.load(open(self.configuration_file))['Learner'] - self.trainer_params['keep_checkpoints'] = 0 - self.trainer_params['model_path'] = self.model_path - self.trainer_params['use_recurrent'] = False - - self.policy = PPOPolicy(brain=self.brain, - seed=0, - trainer_params=self.trainer_params, - is_training=False, - load=True) - - def reset(self, t=250): - """ - Reset is called before each episode begins - Leave blank if nothing needs to happen there - :param t the number of timesteps in the episode - """ - - def step(self, obs, reward, done, info): - """ - :param obs: agent's observation of the current environment - :param reward: amount of reward returned after previous action - :param done: whether the episode has ended. - :param info: contains auxiliary diagnostic information, including BrainInfo. - :return: the action to take, a list or size 2 - """ - - brain_info = info['brain_info'] - action = self.policy.evaluate(brain_info=brain_info)['action'] - - return action diff --git a/examples/submission/data/1-Food/Learner.nn b/examples/submission/data/1-Food/Learner.nn deleted file mode 100644 index 725953f9ddd2a7547da28fbc226d50c61a25d381..0000000000000000000000000000000000000000 Binary files a/examples/submission/data/1-Food/Learner.nn and /dev/null differ diff --git a/examples/submission/data/1-Food/Learner/checkpoint b/examples/submission/data/1-Food/Learner/checkpoint deleted file mode 100644 index ae7dcf8bf9d133a6cc20018ac7e777f715c0261b..0000000000000000000000000000000000000000 --- a/examples/submission/data/1-Food/Learner/checkpoint +++ /dev/null @@ -1,13 +0,0 @@ -model_checkpoint_path: "model-58856.cptk" -all_model_checkpoint_paths: "model-5000.cptk" -all_model_checkpoint_paths: "model-10000.cptk" -all_model_checkpoint_paths: "model-15000.cptk" -all_model_checkpoint_paths: "model-20000.cptk" -all_model_checkpoint_paths: "model-25000.cptk" -all_model_checkpoint_paths: "model-30000.cptk" -all_model_checkpoint_paths: "model-35000.cptk" -all_model_checkpoint_paths: "model-40000.cptk" -all_model_checkpoint_paths: "model-45000.cptk" -all_model_checkpoint_paths: "model-50000.cptk" -all_model_checkpoint_paths: "model-55000.cptk" -all_model_checkpoint_paths: "model-58856.cptk" diff --git a/examples/submission/data/1-Food/Learner/frozen_graph_def.pb b/examples/submission/data/1-Food/Learner/frozen_graph_def.pb deleted file mode 100644 index 3b2e7ad272e63ff8350f07d453a7ff7055df31fc..0000000000000000000000000000000000000000 Binary files a/examples/submission/data/1-Food/Learner/frozen_graph_def.pb and /dev/null differ diff --git a/examples/submission/data/1-Food/Learner/model-58856.cptk.data-00000-of-00001 b/examples/submission/data/1-Food/Learner/model-58856.cptk.data-00000-of-00001 deleted file mode 100644 index c5755cebddc4eea60a16f4308c130a851e59ba96..0000000000000000000000000000000000000000 Binary files a/examples/submission/data/1-Food/Learner/model-58856.cptk.data-00000-of-00001 and /dev/null differ diff --git a/examples/submission/data/1-Food/Learner/model-58856.cptk.index b/examples/submission/data/1-Food/Learner/model-58856.cptk.index deleted file mode 100644 index 44a3df2e5ecf2eda91373a4b6147d8314803b743..0000000000000000000000000000000000000000 Binary files a/examples/submission/data/1-Food/Learner/model-58856.cptk.index and /dev/null differ diff --git a/examples/submission/data/1-Food/Learner/model-58856.cptk.meta b/examples/submission/data/1-Food/Learner/model-58856.cptk.meta deleted file mode 100644 index 4571e8208aa0e2e03b387c8edcd60690054d478d..0000000000000000000000000000000000000000 Binary files a/examples/submission/data/1-Food/Learner/model-58856.cptk.meta and /dev/null differ diff --git a/examples/submission/data/1-Food/Learner/raw_graph_def.pb b/examples/submission/data/1-Food/Learner/raw_graph_def.pb deleted file mode 100644 index 664c068e6cf30353a520eb8e2fa6eaee6d423f98..0000000000000000000000000000000000000000 Binary files a/examples/submission/data/1-Food/Learner/raw_graph_def.pb and /dev/null differ diff --git a/examples/submission/data/trainer_config.yaml b/examples/submission/data/trainer_config.yaml deleted file mode 100644 index 70db74069286f6dfabb115f0eb6e54638ec7896c..0000000000000000000000000000000000000000 --- a/examples/submission/data/trainer_config.yaml +++ /dev/null @@ -1,23 +0,0 @@ -Learner: - trainer: ppo - epsilon: 0.2 - gamma: 0.99 - lambd: 0.95 - learning_rate: 3.0e-4 - memory_size: 256 - normalize: false - sequence_length: 64 - summary_freq: 1000 - use_recurrent: false - use_curiosity: true - curiosity_strength: 0.01 - curiosity_enc_size: 256 - time_horizon: 128 - batch_size: 64 - buffer_size: 2024 - hidden_units: 256 - num_layers: 1 - beta: 1.0e-2 - max_steps: 5.0e6 - num_epoch: 3 - diff --git a/examples/submission/test_submission/1-Food.yaml b/examples/submission/test_submission/1-Food.yaml deleted file mode 100644 index 2025a62ab0dc339923d9a4b7615b43e2b8bdabac..0000000000000000000000000000000000000000 --- a/examples/submission/test_submission/1-Food.yaml +++ /dev/null @@ -1,7 +0,0 @@ -!ArenaConfig -arenas: - 0: !Arena - t: 250 - items: - - !Item - name: GoodGoal diff --git a/examples/submission/test_submission/env/README.md b/examples/submission/test_submission/env/README.md deleted file mode 100644 index 78b91a6749b36395f4f2a6b5c6cc717f74c436b9..0000000000000000000000000000000000000000 --- a/examples/submission/test_submission/env/README.md +++ /dev/null @@ -1 +0,0 @@ -Place the **Linux** environment here to test your docker \ No newline at end of file diff --git a/examples/submission/test_submission/testDocker.py b/examples/submission/test_submission/testDocker.py deleted file mode 100644 index 547c9298d5b9c7287d90132ea6a558941bcbebab..0000000000000000000000000000000000000000 --- a/examples/submission/test_submission/testDocker.py +++ /dev/null @@ -1,79 +0,0 @@ -import importlib.util - -from animalai.envs.gym.environment import AnimalAIEnv -from animalai.envs.arena_config import ArenaConfig - - -def main(): - # Load the agent from the submission - print('Loading your agent') - try: - spec = importlib.util.spec_from_file_location('agent_module', '/aaio/agent.py') - agent_module = importlib.util.module_from_spec(spec) - spec.loader.exec_module(agent_module) - submitted_agent = agent_module.Agent() - except Exception as e: - print('Your agent could not be loaded, make sure all the paths are absolute, error thrown:') - raise e - print('Agent successfully loaded') - - arena_config_in = ArenaConfig('/aaio/test/1-Food.yaml') - - print('Resetting your agent') - try: - submitted_agent.reset(t=arena_config_in.arenas[0].t) - except Exception as e: - print('Your agent could not be reset:') - raise e - - try: - resolution = submitted_agent.resolution - assert resolution == 84 - except AttributeError: - resolution = 84 - except AssertionError: - print('Resolution must be 84 for testing') - return - - env = AnimalAIEnv( - environment_filename='/aaio/test/env/AnimalAI', - seed=0, - retro=False, - n_arenas=1, - worker_id=1, - docker_training=True, - resolution=resolution - ) - - print('Running 5 episodes') - - for k in range(5): - - env.reset(arenas_configurations=arena_config_in) - cumulated_reward = 0 - print('Episode {} starting'.format(k)) - - try: - submitted_agent.reset(t=arena_config_in.arenas[0].t) - except Exception as e: - print('Agent reset failed during episode {}'.format(k)) - raise e - try: - obs, reward, done, info = env.step([0, 0]) - for i in range(arena_config_in.arenas[0].t): - - action = submitted_agent.step(obs, reward, done, info) - obs, reward, done, info = env.step(action) - cumulated_reward += reward - if done: - break - except Exception as e: - print('Episode {} failed'.format(k)) - raise e - print('Episode {0} completed, reward {1}'.format(k, cumulated_reward)) - - print('SUCCESS') - - -if __name__ == '__main__': - main() diff --git a/examples/trainCurriculum.py b/examples/trainCurriculum.py deleted file mode 100644 index 7aec22879bc5da27cb4e4e18a5b852089df3a336..0000000000000000000000000000000000000000 --- a/examples/trainCurriculum.py +++ /dev/null @@ -1,43 +0,0 @@ -from animalai_train.trainers.trainer_controller import TrainerController -from animalai.envs import UnityEnvironment -from animalai_train.trainers.meta_curriculum import MetaCurriculum -import random -import yaml -import sys - -# ML-agents parameters for training -env_path = '../env/AnimalAI' -worker_id = random.randint(1, 100) -seed = 10 -base_port = 5005 -sub_id = 1 -run_id = 'train_example_curriculum' -save_freq = 5000 -curriculum_file = 'configs/curriculum/' -load_model = False -train_model = True -keep_checkpoints = 5000 -lesson = 0 -run_seed = 1 -trainer_config_path = 'configs/trainer_config.yaml' -model_path = './models/{run_id}'.format(run_id=run_id) -summaries_dir = './summaries' -maybe_meta_curriculum = MetaCurriculum(curriculum_file) - -trainer_config = yaml.load(open(trainer_config_path)) -env = UnityEnvironment( - n_arenas=1, # Change this to train on more arenas - file_name=env_path, - worker_id=worker_id, - seed=seed, - docker_training=False, - play=False -) - -external_brains = {brain: env.brains[brain] for brain in env.external_brain_names} - -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) -tc.start_learning(env, trainer_config) diff --git a/examples/trainDopamine.py b/examples/trainDopamine.py deleted file mode 100644 index 837c43a3e0434f82e8d8009781d2a9d527f19f9e..0000000000000000000000000000000000000000 --- a/examples/trainDopamine.py +++ /dev/null @@ -1,34 +0,0 @@ -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/1-Food.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, - docker_training=False, - 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/trainMLAgents.py b/examples/trainMLAgents.py deleted file mode 100644 index 3d92c3c55cad52a71e17c592a14f6f0974fb8d87..0000000000000000000000000000000000000000 --- a/examples/trainMLAgents.py +++ /dev/null @@ -1,84 +0,0 @@ -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 -import random -import yaml -import sys - - -# ML-agents parameters for training -env_path = '../env/AnimalAI' -worker_id = random.randint(1, 100) -seed = 10 -base_port = 5005 -sub_id = 1 -run_id = 'train_example' -save_freq = 5000 -curriculum_file = None -load_model = False -train_model = True -keep_checkpoints = 5000 -lesson = 0 -run_seed = 1 -docker_target_name = None -trainer_config_path = 'configs/trainer_config.yaml' -model_path = './models/{run_id}'.format(run_id=run_id) -summaries_dir = './summaries' -maybe_meta_curriculum = None - - -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, worker_id, 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 - - return UnityEnvironment( - n_arenas=4, # Change this to train on more arenas - file_name=env_path, - worker_id=worker_id, - seed=seed, - docker_training=docker_training, - play=False - ) - - -# If no configuration file is provided we default to all objects placed randomly -if len(sys.argv) > 1: - arena_config_in = ArenaConfig(sys.argv[1]) -else: - arena_config_in = ArenaConfig('configs/exampleTraining.yaml') - -trainer_config = load_config(trainer_config_path) -env = init_environment(env_path, docker_target_name, worker_id, run_seed) - -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, arena_config_in) -tc.start_learning(env, trainer_config) diff --git a/examples/train_baselines_dqn.py b/examples/train_baselines_dqn.py new file mode 100644 index 0000000000000000000000000000000000000000..368504da895c2e245e0eb42cf3ba414e2e9cf75d --- /dev/null +++ b/examples/train_baselines_dqn.py @@ -0,0 +1,43 @@ +from baselines import deepq +from baselines import logger + +from animalai.envs.gym.environment import AnimalAIGym +from animalai.envs.arena_config import ArenaConfig + + +def main(): + arenas_configurations = ArenaConfig( + "configurations/arena_configurations/train_ml_agents_arenas.yml" + ) + env = AnimalAIGym( + environment_filename="env/AnimalAI", + worker_id=0, + flatten_branched=True, + uint8_visual=True, + arenas_configurations=arenas_configurations, + ) + logger.configure("./logs") # Çhange to log in a different directory + act = deepq.learn( + env, + "cnn", # conv_only is also a good choice for GridWorld + lr=2.5e-4, + total_timesteps=1000000, + buffer_size=50000, + exploration_fraction=0.05, + exploration_final_eps=0.1, + print_freq=20, + train_freq=5, + learning_starts=20000, + target_network_update_freq=50, + gamma=0.99, + prioritized_replay=False, + checkpoint_freq=1000, + checkpoint_path="./logs", # Change to save model in a different directory + dueling=True, + ) + print("Saving model to unity_model.pkl") + act.save("unity_model.pkl") + + +if __name__ == "__main__": + main() diff --git a/examples/train_baselines_ppo2.py b/examples/train_baselines_ppo2.py new file mode 100644 index 0000000000000000000000000000000000000000..fec962d01d6f06397c3cd840ac94d558ae9aea76 --- /dev/null +++ b/examples/train_baselines_ppo2.py @@ -0,0 +1,53 @@ +from animalai.envs.gym.environment import AnimalAIGym +from animalai.envs.arena_config import ArenaConfig +from baselines.common.vec_env.subproc_vec_env import SubprocVecEnv +from baselines.bench import Monitor +from baselines import logger +import baselines.ppo2.ppo2 as ppo2 + +import os + +try: + from mpi4py import MPI +except ImportError: + MPI = None + + +def make_aai_env(env_directory, num_env, arenas_configurations, start_index=0): + """ + Create a wrapped, monitored Unity environment. + """ + + def make_env(rank, arena_configuration): # pylint: disable=C0111 + def _thunk(): + env = AnimalAIGym( + environment_filename=env_directory, + worker_id=rank, + flatten_branched=True, + arenas_configurations=arena_configuration, + uint8_visual=True, + ) + env = Monitor( + env, logger.get_dir() and os.path.join(logger.get_dir(), str(rank)) + ) + return env + + return _thunk + + return SubprocVecEnv( + [make_env(i + start_index, arenas_configurations) for i in range(num_env)] + ) + + +def main(): + arenas_configurations = ArenaConfig( + "configurations/arena_configurations/train_ml_agents_arenas.yml" + ) + env = make_aai_env("env/AnimalAI", 2, arenas_configurations) + ppo2.learn( + network="cnn", env=env, total_timesteps=100000, lr=1e-3, + ) + + +if __name__ == "__main__": + main() diff --git a/examples/train_curriculum.py b/examples/train_curriculum.py new file mode 100644 index 0000000000000000000000000000000000000000..b8620b85a4d7e8eca0da2b20b227a35e8f8cf9e1 --- /dev/null +++ b/examples/train_curriculum.py @@ -0,0 +1,26 @@ +from mlagents.trainers.trainer_util import load_config + +from animalai_train.run_options_aai import RunOptionsAAI +from animalai_train.run_training_aai import run_training_aai + +trainer_config_path = ( + "configurations/training_configurations/train_ml_agents_config.yaml" +) +environment_path = "env/AnimalAI" +curriculum_path = "configurations/curriculum" +run_id = "train_curriculum" +base_port = 5005 +number_of_environments = 8 +number_of_arenas_per_environment = 1 + +args = RunOptionsAAI( + trainer_config=load_config(trainer_config_path), + env_path=environment_path, + run_id=run_id, + base_port=base_port, + num_envs=number_of_environments, + curriculum_config=curriculum_path, + n_arenas_per_env=number_of_arenas_per_environment, +) + +run_training_aai(0, args) diff --git a/examples/train_demonstration.py b/examples/train_demonstration.py new file mode 100644 index 0000000000000000000000000000000000000000..0bd145befc47c68ff30ea98bdd06e2901f3e66f6 --- /dev/null +++ b/examples/train_demonstration.py @@ -0,0 +1,3 @@ +# TODO: for later release, will need to add a recorder within the compiled +# TODO: environment, (if that's feasible at all) +# TODO: https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Training-Imitation-Learning.md diff --git a/examples/train_ml_agents_ppo.py b/examples/train_ml_agents_ppo.py new file mode 100644 index 0000000000000000000000000000000000000000..b9d65558a2969e54e6fcd2647844512c75a7b670 --- /dev/null +++ b/examples/train_ml_agents_ppo.py @@ -0,0 +1,27 @@ +from mlagents.trainers.trainer_util import load_config +from animalai.envs.arena_config import ArenaConfig + +from animalai_train.run_options_aai import RunOptionsAAI +from animalai_train.run_training_aai import run_training_aai + +trainer_config_path = ( + "configurations/training_configurations/train_ml_agents_config.yaml" +) +environment_path = "env/AnimalAI" +arena_config_path = "configurations/arena_configurations/train_ml_agents_arenas.yml" +run_id = "train_ml_agents" +base_port = 5005 +number_of_environments = 4 +number_of_arenas_per_environment = 8 + +args = RunOptionsAAI( + trainer_config=load_config(trainer_config_path), + env_path=environment_path, + run_id=run_id, + base_port=base_port, + num_envs=number_of_environments, + arena_config=ArenaConfig(arena_config_path), + n_arenas_per_env=number_of_arenas_per_environment, +) + +run_training_aai(0, args) diff --git a/examples/train_ml_agents_sac.py b/examples/train_ml_agents_sac.py new file mode 100644 index 0000000000000000000000000000000000000000..df946f2ff62977d8be3784c54e5431fbd5e2b9ee --- /dev/null +++ b/examples/train_ml_agents_sac.py @@ -0,0 +1 @@ +# TODO: add SAC trainer or maybe add directly to train_ml_agents.py diff --git a/examples/visualizeArena.py b/examples/visualizeArena.py deleted file mode 100644 index 09711631ed93f027d17edc3f7bc1b33f9af8f55a..0000000000000000000000000000000000000000 --- a/examples/visualizeArena.py +++ /dev/null @@ -1,50 +0,0 @@ -from animalai.envs.environment import UnityEnvironment -from animalai.envs.arena_config import ArenaConfig -import sys -import random - -env_path = '../env/AnimalAI' -worker_id = random.randint(0, 200) -run_seed = 1 -docker_target_name = None -no_graphics = False - - -def init_environment(env_path, docker_target_name, no_graphics, worker_id, 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 - - return UnityEnvironment( - n_arenas=1, - file_name=env_path, - worker_id=worker_id, - seed=seed, - docker_training=docker_training, - play=True - ) - - -# If no configuration file is provided we default to all objects placed randomly -if len(sys.argv) > 1: - arena_config_in = ArenaConfig(sys.argv[1]) -else: - arena_config_in = ArenaConfig('configs/allObjectsRandom.yaml') - -env = init_environment(env_path, docker_target_name, no_graphics, worker_id, run_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 =arena_config_in) - -try: - while True: - continue -except KeyboardInterrupt: - env.close() diff --git a/examples/visualizeLightsOff.py b/examples/visualizeLightsOff.py deleted file mode 100644 index 43182437a2562b72c394213928257494b358f923..0000000000000000000000000000000000000000 --- a/examples/visualizeLightsOff.py +++ /dev/null @@ -1,67 +0,0 @@ -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' -worker_id = random.randint(1, 100) - -seed = 10 -base_port = 5005 -sub_id = 1 -run_id = 'train_example' -run_seed = 1 -docker_target_name = None -no_graphics = False -n_arenas = 4 -resolution = 128 - -if env_path is not None: - env_path = (env_path.strip() - .replace('.app', '') - .replace('.exe', '') - .replace('.x86_64', '') - .replace('.x86', '')) -docker_training = docker_target_name is not None - -env = UnityEnvironment( - n_arenas=n_arenas, - file_name=env_path, - worker_id=worker_id, - seed=seed, - docker_training=docker_training, - play=False, - resolution=resolution -) - -arena_config_in = ArenaConfig('configs/7-InternalMemory.yaml') -env.reset(arenas_configurations=arena_config_in) -fig, axes = plt.subplots(2, 2) -imshows = [] -for i in range(2): - for j in range(2): - axes[i, j].set_title('Arena ' + str(i * 2 + j)) - axes[i, j].axis('off') - imshows.append(axes[i, j].imshow(np.zeros((resolution, resolution, 3)))) - - -def initialize_animation(): - for i in range(4): - imshows[i].set_data(np.zeros((resolution, resolution, 3))) - - -def run_step_imshow(step): - res = env.step(np.random.randint(0, 3, size=2 * n_arenas)) - for i in range(4): - imshows[i].set_data(res['Learner'].visual_observations[0][i, :, :, :]) - fig.suptitle('Step = ' + str(step)) - return imshows - - -try: - anim = animation.FuncAnimation(fig, run_step_imshow, init_func=initialize_animation, frames=100, interval=50) - plt.show() -except KeyboardInterrupt: - env.close()