From 59a783d21315fcc00212dc45a6a136708a853508 Mon Sep 17 00:00:00 2001 From: O-suke12 Date: Sat, 6 Apr 2024 17:27:24 +0900 Subject: [PATCH] initial --- Overcooked Tutorial.ipynb | 155 +++++++++++++++++++++++++------ README.md | 169 ---------------------------------- process.ipynb | 189 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 317 insertions(+), 196 deletions(-) delete mode 100644 README.md create mode 100644 process.ipynb diff --git a/Overcooked Tutorial.ipynb b/Overcooked Tutorial.ipynb index 8a65e6f..20e70cd 100644 --- a/Overcooked Tutorial.ipynb +++ b/Overcooked Tutorial.ipynb @@ -20,6 +20,129 @@ "You can also start an experiment in another python script like the following, which can sometimes be more convenient:" ] }, + { + "cell_type": "code", + "execution_count": 1, + "id": "a0a035be", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Computing MediumLevelActionManager\n", + "Computing MediumLevelActionManager\n" + ] + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "857c87f1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Computing MediumLevelActionManager\n" + ] + }, + { + "data": { + "text/plain": [ + "{'both_agent_obs': (array([ 1., 0., 0., 0., 0., 0., 0., 0., -1., -1., 0., 0., -1.,\n", + " 2., 0., 0., 0., 0., 2., -1., 0., 0., 1., 1., 0., 0.,\n", + " 0., 0., 0., 0., -2., 0., 1., 1., 0., 0., 0., 0., 0.,\n", + " 0., -2., 1., 1., 0., 0., 0., 1., 0., 0., 0., 0., 0.,\n", + " 0., 0., -1., -2., 0., 0., 2., 1., 0., 0., 0., 0., 2.,\n", + " -2., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., 3., 0.,\n", + " 1., 1., 0., 0., 0., 0., 0., 0., 3., -1., 0., 1., 0.,\n", + " 1., -5., 1., 6., 2.]),\n", + " array([ 1., 0., 0., 0., 0., 0., 0., 0., -1., -2., 0., 0., 2.,\n", + " 1., 0., 0., 0., 0., 2., -2., 0., 0., 1., 1., 0., 0.,\n", + " 0., 0., 0., 0., 3., 0., 1., 1., 0., 0., 0., 0., 0.,\n", + " 0., 3., -1., 0., 1., 0., 1., 1., 0., 0., 0., 0., 0.,\n", + " 0., 0., -1., -1., 0., 0., -1., 2., 0., 0., 0., 0., 2.,\n", + " -1., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., -2., 0.,\n", + " 1., 1., 0., 0., 0., 0., 0., 0., -2., 1., 1., 0., 0.,\n", + " 0., 5., -1., 1., 3.])),\n", + " 'overcooked_state': ,\n", + " 'other_agent_env_idx': 1}" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "288e199c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "({'both_agent_obs': (array([ 0., 1., 0., 0., 0., 0., 0., 0., -1., -1., 0., 0., 2.,\n", + " 2., 0., 0., 0., 0., 2., -1., 0., 0., 1., 1., 0., 0.,\n", + " 0., 0., 0., 0., 3., 0., 1., 1., 0., 0., 0., 0., 0.,\n", + " 0., 3., 1., 0., 0., 0., 1., 1., 0., 0., 0., 0., 0.,\n", + " 0., 0., -1., -1., 0., 0., -1., 2., 0., 0., 0., 0., 2.,\n", + " -1., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., -2., 0.,\n", + " 1., 1., 0., 0., 0., 0., 0., 0., -2., 1., 1., 0., 0.,\n", + " 0., 5., 0., 1., 2.]),\n", + " array([ 1., 0., 0., 0., 0., 0., 0., 0., -1., -1., 0., 0., -1.,\n", + " 2., 0., 0., 0., 0., 2., -1., 0., 0., 1., 1., 0., 0.,\n", + " 0., 0., 0., 0., -2., 0., 1., 1., 0., 0., 0., 0., 0.,\n", + " 0., -2., 1., 1., 0., 0., 0., 0., 1., 0., 0., 0., 0.,\n", + " 0., 0., -1., -1., 0., 0., 2., 2., 0., 0., 0., 0., 2.,\n", + " -1., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., 3., 0.,\n", + " 1., 1., 0., 0., 0., 0., 0., 0., 3., 1., 0., 0., 0.,\n", + " 1., -5., 0., 6., 2.])),\n", + " 'overcooked_state': ,\n", + " 'other_agent_env_idx': 0},\n", + " 0,\n", + " False,\n", + " {'agent_infos': [{}, {}],\n", + " 'sparse_r_by_agent': [0, 0],\n", + " 'shaped_r_by_agent': [0, 0],\n", + " 'phi_s': None,\n", + " 'phi_s_prime': None,\n", + " 'policy_agent_idx': 1})" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "d9bd5b49", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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LE+zli5disrKSvlfbm5ulx+TiIioM7XrsaBFixZh9erV2LhxI5KSGl/yHx8fD6fTiYqKioCr3MLCQsTHx8t5tm3bFrC/hruYG/KcSa/XQ6/Xt6eoRERE3UKbrnCFEFi0aBE+++wzrF+/HmlpaQHrx48fD61Wi3Xr1snLsrOzkZOTg/T0dABAeno69u7di6KiIjnP2rVrYTabMXz48I6cCxERUbfVpivchQsX4oMPPsAXX3yBiIgIeczVYrHAaDTCYrHg9ttvx5IlSxAdHQ2z2Yx7770X6enpmDJlCgDg0ksvxfDhw3HzzTfjhRdeQEFBAR599FEsXLiQV7FERNRjtSngvv766wCAiy66KGD5ypUrccsttwAAXnrpJahUKsydOxcOhwMZGRl47bXGF/qr1WqsXr0ad999N9LT0xEWFoYFCxZg2bJlHTsTIiKibozvUiYiIuoARZ7DJSIiotYJ6ckLRP0/IiKiYGltHArtgCv5/hEREQVLa+MQu5SJiIgUwIBLRESkAAZcIiIiBTDgEhERKYABl4iISAEMuERERApgwCUiIlIAAy4REZECGHCJiIgUwIBLRESkAAZcIiIiBTDgEhERKYABl4iISAEMuERERApgwCUiIlIAAy4REZECGHCJiIgUwIBLRESkAAZcIiIiBTDgEhERKYABl4iISAEMuERERApgwCUiIlIAAy4REZECGHCJiIgUwIBLRESkAAZcIiIiBTDgEhERKYABl4iISAEMuERERApgwCUiIlIAAy4REZECGHCJiIgUwIBLRESkAAZcIiIiBTDgEhERKYABl4iISAEMuERERApgwCUiIlIAAy4REZECGHCJiIgUwIBLRESkAAZcIiIiBTDgEhERKYABl4iISAEMuERERApgwCUiIlIAAy4REZECGHCJiIgUwIBLRESkAAZcIiIiBTDgEhERKYABl4iISAEMuERERApgwCUiIlKAJtgFCHVDr1mKsD6pAICf338QrhrbObcZPefNLi5V1yjL2YRTP/892MVol/hLXoPOkhbsYrRLzmeXBbsIIW/8nY1tLuuvdwWxJF0vafTNiE6ZHuxitEuFNiXYRWiX6upq4J3rzpmPV7hEREQKYMClXkEKdgGIqNfrlV3KklqDcOtAAIDHWYuakpOt2EYrpw2R8XJapdHJaWNUX2iMFnm/rppK3wqvB0J4O6Po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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [] + }, { "cell_type": "code", "execution_count": 1, @@ -815,32 +938,10 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "id": "464d0c84", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Avg rew: 214.00 (std: 58.69, se: 18.56); avg len: 400.00; : 100%|█| 10/10 [00:12\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "9995a39fbf464613812ba6b729c583a5", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(IntSlider(value=0, description='timestep', max=399), Output()), _dom_classes=('widget-in…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "from overcooked_ai_py.visualization.state_visualizer import StateVisualizer\n", "# here we use the self-play agentPair created earlier again\n", @@ -915,9 +1016,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python [conda env:harl]", + "display_name": "overcooked_ai", "language": "python", - "name": "conda-env-harl-py" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -929,7 +1030,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.15" + "version": "3.10.0" } }, "nbformat": 4, diff --git a/README.md b/README.md deleted file mode 100644 index 11bef39..0000000 --- a/README.md +++ /dev/null @@ -1,169 +0,0 @@ -![MDP python tests](https://github.com/HumanCompatibleAI/overcooked_ai/workflows/.github/workflows/pythontests.yml/badge.svg) ![overcooked-ai codecov](https://codecov.io/gh/HumanCompatibleAI/overcooked_ai/branch/master/graph/badge.svg) [![PyPI version](https://badge.fury.io/py/overcooked-ai.svg)](https://badge.fury.io/py/overcooked-ai) [!["Open Issues"](https://img.shields.io/github/issues-raw/HumanCompatibleAI/overcooked_ai.svg)](https://github.com/HumanCompatibleAI/minerl/overcooked_ai) [![GitHub issues by-label](https://img.shields.io/github/issues-raw/HumanCompatibleAI/overcooked_ai/bug.svg?color=red)](https://github.com/HumanCompatibleAI/overcooked_ai/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+label%3Abug) [![Downloads](https://pepy.tech/badge/overcooked-ai)](https://pepy.tech/project/overcooked-ai) -[![arXiv](https://img.shields.io/badge/arXiv-1910.05789-bbbbbb.svg)](https://arxiv.org/abs/1910.05789) - -# Overcooked-AI 🧑‍🍳🤖 - -

- - - 5 of the available layouts. New layouts are easy to hardcode or generate programmatically. -

- -## Introduction 🥘 - -Overcooked-AI is a benchmark environment for fully cooperative human-AI task performance, based on the wildly popular video game [Overcooked](http://www.ghosttowngames.com/overcooked/). - -The goal of the game is to deliver soups as fast as possible. Each soup requires placing up to 3 ingredients in a pot, waiting for the soup to cook, and then having an agent pick up the soup and delivering it. The agents should split up tasks on the fly and coordinate effectively in order to achieve high reward. - -You can **try out the game [here](https://humancompatibleai.github.io/overcooked-demo/)** (playing with some previously trained DRL agents). To play with your own trained agents using this interface, or to collect more human-AI or human-human data, you can use the code [here](https://github.com/HumanCompatibleAI/overcooked_ai/tree/master/src/overcooked_demo). You can find some human-human and human-AI gameplay data already collected [here](https://github.com/HumanCompatibleAI/overcooked_ai/tree/master/src/human_aware_rl/static/human_data). - -DRL implementations compatible with the environment are included in the repo as a submodule under src/human_aware_rl. - -The old [human_aware_rl](https://github.com/HumanCompatibleAI/human_aware_rl) is being deprecated and should only used to reproduce the results in the 2019 paper: *[On the Utility of Learning about Humans for Human-AI Coordination](https://arxiv.org/abs/1910.05789)* (also see our [blog post](https://bair.berkeley.edu/blog/2019/10/21/coordination/)). - -For simple usage of the environment, it's worthwhile considering using [this environment wrapper](https://github.com/Stanford-ILIAD/PantheonRL). - -## Research Papers using Overcooked-AI 📑 - - -- Carroll, Micah, Rohin Shah, Mark K. Ho, Thomas L. Griffiths, Sanjit A. Seshia, Pieter Abbeel, and Anca Dragan. ["On the utility of learning about humans for human-ai coordination."](https://arxiv.org/abs/1910.05789) NeurIPS 2019. -- Charakorn, Rujikorn, Poramate Manoonpong, and Nat Dilokthanakul. [“Investigating Partner Diversification Methods in Cooperative Multi-Agent Deep Reinforcement Learning.”](https://www.rujikorn.com/files/papers/diversity_ICONIP2020.pdf) Neural Information Processing. ICONIP 2020. -- Knott, Paul, Micah Carroll, Sam Devlin, Kamil Ciosek, Katja Hofmann, Anca D. Dragan, and Rohin Shah. ["Evaluating the Robustness of Collaborative Agents."](https://arxiv.org/abs/2101.05507) AAMAS 2021. -- Nalepka, Patrick, Jordan P. Gregory-Dunsmore, James Simpson, Gaurav Patil, and Michael J. Richardson. ["Interaction Flexibility in Artificial Agents Teaming with Humans."](https://www.researchgate.net/publication/351533529_Interaction_Flexibility_in_Artificial_Agents_Teaming_with_Humans) Cogsci 2021. -- Fontaine, Matthew C., Ya-Chuan Hsu, Yulun Zhang, Bryon Tjanaka, and Stefanos Nikolaidis. [“On the Importance of Environments in Human-Robot Coordination”](http://arxiv.org/abs/2106.10853) RSS 2021. -- Zhao, Rui, Jinming Song, Hu Haifeng, Yang Gao, Yi Wu, Zhongqian Sun, Yang Wei. ["Maximum Entropy Population Based Training for Zero-Shot Human-AI Coordination"](https://arxiv.org/abs/2112.11701). NeurIPS Cooperative AI Workshop, 2021. -- Sarkar, Bidipta, Aditi Talati, Andy Shih, and Dorsa Sadigh. [“PantheonRL: A MARL Library for Dynamic Training Interactions”](https://iliad.stanford.edu/pdfs/publications/sarkar2022pantheonrl.pdf). AAAI 2022. -- Ribeiro, João G., Cassandro Martinho, Alberto Sardinha, Francisco S. Melo. ["Assisting Unknown Teammates in Unknown Tasks: Ad Hoc Teamwork under Partial Observability"](https://arxiv.org/abs/2201.03538). - - -## Installation ☑️ - -### Installing from PyPI 🗜 - -You can install the pre-compiled wheel file using pip. -``` -pip install overcooked-ai -``` -Note that PyPI releases are stable but infrequent. For the most up-to-date development features, build from source with `pip install -e .`. - - -### Building from source 🔧 - -It is useful to setup a conda environment with Python 3.7 (virtualenv works too): - -``` -conda create -n overcooked_ai python=3.7 -conda activate overcooked_ai -``` - -Clone the repo -``` -git clone https://github.com/HumanCompatibleAI/overcooked_ai.git -``` -Finally, use python setup-tools to locally install - -If you just want to use the environment: - -``` -pip install -e overcooked_ai/ -``` - -If you also need the DRL implementations (you may have to input this in your terminal as `pip install -e 'overcooked_ai[harl]'`): - -``` -pip install -e overcooked_ai[harl] -``` - - -### Verifying Installation 📈 - -When building from source, you can verify the installation by running the Overcooked unit test suite. The following commands should all be run from the `overcooked_ai` project root directory: - -``` -python testing/overcooked_test.py -``` - -To check whether the humam_aware_rl is installed correctly, you can run the following script from the src/human_aware_rl directory - -``` -$ ./run_tests.sh -``` - -⚠️**Be sure to change your CWD to the human_aware_rl directory before running the script, as the test script uses the CWD to dynamically generate a path to save temporary training runs/checkpoints. The testing script will fail if not being run from the correct directory.** - -This will run all tests belonging to the human_aware_rl module. You can checkout the README in the submodule for instructions of running target-specific tests. This can be initiated from any directory. - -If you're thinking of using the planning code extensively, you should run the full testing suite that verifies all of the Overcooked accessory tools (this can take 5-10 mins): -``` -python -m unittest discover -s testing/ -p "*_test.py" -``` - - -## Code Structure Overview 🗺 - -`overcooked_ai_py` contains: - -`mdp/`: -- `overcooked_mdp.py`: main Overcooked game logic -- `overcooked_env.py`: environment classes built on top of the Overcooked mdp -- `layout_generator.py`: functions to generate random layouts programmatically - -`agents/`: -- `agent.py`: location of agent classes -- `benchmarking.py`: sample trajectories of agents (both trained and planners) and load various models - -`planning/`: -- `planners.py`: near-optimal agent planning logic -- `search.py`: A* search and shortest path logic - -`human_aware_rl` contains: - -`ppo/`: -- `ppo_rllib.py`: Primary module where code for training a PPO agent resides. This includes an rllib compatible wrapper on `OvercookedEnv`, utilities for converting rllib `Policy` classes to Overcooked `Agent`s, as well as utility functions and callbacks -- `ppo_rllib_client.py` Driver code for configuing and launching the training of an agent. More details about usage below -- `ppo_rllib_from_params_client.py`: train one agent with PPO in Overcooked with variable-MDPs -- `ppo_rllib_test.py` Reproducibility tests for local sanity checks -- `run_experiments.sh` Script for training agents on 5 classical layouts -- `trained_example/` Pretrained model for testing purposes - -`rllib/`: -- `rllib.py`: rllib agent and training utils that utilize Overcooked APIs -- `utils.py`: utils for the above -- `tests.py`: preliminary tests for the above - -`imitation/`: -- `behavior_cloning_tf2.py`: Module for training, saving, and loading a BC model -- `behavior_cloning_tf2_test.py`: Contains basic reproducibility tests as well as unit tests for the various components of the bc module. - -`human/`: -- `process_data.py` script to process human data in specific formats to be used by DRL algorithms -- `data_processing_utils.py` utils for the above - -`utils.py`: utils for the repo - -`overcooked_demo` contains: - -`server/`: -- `app.py`: The Flask app -- `game.py`: The main logic of the game. State transitions are handled by overcooked.Gridworld object embedded in the game environment -- `move_agents.py`: A script that simplifies copying checkpoints to [agents](src/overcooked_demo/server/static/assets/agents/) directory. Instruction of how to use can be found inside the file or by running `python move_agents.py -h` - -`up.sh`: Shell script to spin up the Docker server that hosts the game - - -## Python Visualizations 🌠 - -See [this Google Colab](https://colab.research.google.com/drive/1AAVP2P-QQhbx6WTOnIG54NXLXFbO7y6n#scrollTo=Z1RBlqADnTDw) for some sample code for visualizing trajectories in python. - -We have incorporated a [notebook](Overcooked%20Tutorial.ipynb) that guides users on the process of training, loading, and evaluating agents. Ideally, we would like to enable users to execute the notebook in Google Colab; however, due to Colab's default kernel being Python 3.10 and our repository being optimized for Python 3.7, some functions are presently incompatible with Colab. To provide a seamless experience, we have pre-executed all the cells in the notebook, allowing you to view the expected output when running it locally following the appropriate setup. - -Overcooked_demo can also start an interactive game in the browser for visualizations. Details can be found in its [README](src/overcooked_demo/README.md) - -## Raw Data :ledger: - -The raw data used in training is >100 MB, which makes it inconvenient to distribute via git. The code uses pickled dataframes for training and testing, but in case one needs to original data it can be found [here](https://drive.google.com/drive/folders/1aGV8eqWeOG5BMFdUcVoP2NHU_GFPqi57?usp=share_link) - -## Further Issues and questions ❓ - -If you have issues or questions, don't hesitate to contact [Micah Carroll](https://micahcarroll.github.io) at mdc@berkeley.edu. - diff --git a/process.ipynb b/process.ipynb new file mode 100644 index 0000000..61adde6 --- /dev/null +++ b/process.ipynb @@ -0,0 +1,189 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Computing MediumLevelActionManager\n", + "Computing MediumLevelActionManager\n", + "Computing MediumLevelActionManager\n" + ] + }, + { + "data": { + "text/plain": [ + "{'both_agent_obs': (array([ 1., 0., 0., 0., 0., 0., 0., 0., -1., -1., 0., 0., -1.,\n", + " 2., 0., 0., 0., 0., 2., -1., 0., 0., 1., 1., 0., 0.,\n", + " 0., 0., 0., 0., -2., 0., 1., 1., 0., 0., 0., 0., 0.,\n", + " 0., -2., 1., 1., 0., 0., 0., 1., 0., 0., 0., 0., 0.,\n", + " 0., 0., -1., -2., 0., 0., 2., 1., 0., 0., 0., 0., 2.,\n", + " -2., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., 3., 0.,\n", + " 1., 1., 0., 0., 0., 0., 0., 0., 3., -1., 0., 1., 0.,\n", + " 1., -5., 1., 6., 2.]),\n", + " array([ 1., 0., 0., 0., 0., 0., 0., 0., -1., -2., 0., 0., 2.,\n", + " 1., 0., 0., 0., 0., 2., -2., 0., 0., 1., 1., 0., 0.,\n", + " 0., 0., 0., 0., 3., 0., 1., 1., 0., 0., 0., 0., 0.,\n", + " 0., 3., -1., 0., 1., 0., 1., 1., 0., 0., 0., 0., 0.,\n", + " 0., 0., -1., -1., 0., 0., -1., 2., 0., 0., 0., 0., 2.,\n", + " -1., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., -2., 0.,\n", + " 1., 1., 0., 0., 0., 0., 0., 0., -2., 1., 1., 0., 0.,\n", + " 0., 5., -1., 1., 3.])),\n", + " 'overcooked_state': ,\n", + " 'other_agent_env_idx': 1}" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from overcooked_ai_py.mdp.overcooked_mdp import OvercookedGridworld\n", + "from overcooked_ai_py.mdp.overcooked_env import OvercookedEnv\n", + "from overcooked_ai_py.mdp.overcooked_env import Overcooked\n", + "from overcooked_ai_py.agents.agent import AgentPair\n", + "\n", + "import gym\n", + "\n", + "mdp = OvercookedGridworld.from_layout_name(\"asymmetric_advantages\")\n", + "base_env = OvercookedEnv.from_mdp(mdp, horizon=500)\n", + "env = gym.make(\"Overcooked-v0\",base_env = base_env, featurize_fn =base_env.featurize_state_mdp)\n", + "env.reset()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "({'both_agent_obs': (array([ 0., 1., 0., 0., 0., 0., 0., 0., -1., -2., 0., 0., 2.,\n", + " 1., 0., 0., 0., 0., 2., -2., 0., 0., 1., 1., 0., 0.,\n", + " 0., 0., 0., 0., 3., 0., 1., 1., 0., 0., 0., 0., 0.,\n", + " 0., 3., -1., 0., 1., 0., 1., 1., 0., 0., 0., 0., 0.,\n", + " 0., 0., -1., -1., 0., 0., -1., 2., 0., 0., 0., 0., 2.,\n", + " -1., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., -2., 0.,\n", + " 1., 1., 0., 0., 0., 0., 0., 0., -2., 1., 1., 0., 0.,\n", + " 0., 5., -1., 1., 3.]),\n", + " array([ 1., 0., 0., 0., 0., 0., 0., 0., -1., -1., 0., 0., -1.,\n", + " 2., 0., 0., 0., 0., 2., -1., 0., 0., 1., 1., 0., 0.,\n", + " 0., 0., 0., 0., -2., 0., 1., 1., 0., 0., 0., 0., 0.,\n", + " 0., -2., 1., 1., 0., 0., 0., 0., 1., 0., 0., 0., 0.,\n", + " 0., 0., -1., -2., 0., 0., 2., 1., 0., 0., 0., 0., 2.,\n", + " -2., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., 3., 0.,\n", + " 1., 1., 0., 0., 0., 0., 0., 0., 3., -1., 0., 1., 0.,\n", + " 1., -5., 1., 6., 2.])),\n", + " 'overcooked_state': ,\n", + " 'other_agent_env_idx': 0},\n", + " 0,\n", + " False,\n", + " {'agent_infos': [{}, {}],\n", + " 'sparse_r_by_agent': [0, 0],\n", + " 'shaped_r_by_agent': [0, 0],\n", + " 'phi_s': None,\n", + " 'phi_s_prime': None,\n", + " 'policy_agent_idx': 1})" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "env.step((1,0))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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Xrz//vtdWZ4WLV26FFVVVfJPfn5+0I9JRETUlTo0LGjRokVYvXo1NmzYgLS0ppf8Jycnw+l0orKyMuAut7i4GMnJyXKerVu3Buyv8Snmxjxn0uv10Ov1HSkqERFRWGjXHa4QAosWLcLHH3+MdevWITMzM2D9uHHjoNVqsXbtWnlZbm4u8vLykJWVBQDIysrCnj17UFJSIudZs2YNzGYzhg0b1plzISIiClvtusNduHAh3n33XXz66aeIiYmR+1wtFguMRiMsFgtuv/12LFmyBPHx8TCbzbjnnnuQlZWFyZMnAwAuvfRSDBs2DDfffDOee+45FBUV4ZFHHsHChQt5F0tERN1WuwLuq6++CgC46KKLApavXLkSt9xyCwDghRdegEqlwty5c+FwODBz5ky88sorcl61Wo3Vq1fj7rvvRlZWFqKiorBgwQIsW7asc2dCREQUxvguZSIiok5QZBwuERERtU1ET14gIE/9TkREFBJtjUORHXAl3w8REVGotDUOsUmZiIhIAQy4RERECmDAJSIiUgADLhERkQIYcImIiBTAgEtERKQABlwiIiIFMOASEREpgAGXiIhIAQy4RERECmDAJSIiUgADLhERkQIYcImIiBTAgEtERKQABlwiIiIFMOASEREpgAGXiIhIAQy4RERECmDAJSIiUgADLhERkQIYcImIiBTAgEtERKQABlwiIiIFMOASEREpgAGXiIhIAQy4RERECmDAJSIiUgADLhERkQIYcImIiBTAgEtERKQABlwiIiIFMOASEREpgAGXiIhIAQy4RERECmDAJSIiUgADLhERkQIYcImIiBTAgEtERKQABlwiIiIFMOASEREpgAGXiIhIAQy4RERECmDAJSIiUgADLhERkQIYcImIiBTAgEtERKQABlwiIiIFMOASEREpgAGXiIhIAQy4RERECmDAJSIiUgADLhERkQIYcImIiBTAgEtERKQABlwiIiIFaEJdgEg35JqliOrVFwDw4z8egKvWds5tRs15PcilCo7yvI04+ePfQ12MDkm+5BXoLJmhLkaH5H18WaiLEPHG3dl0zeW8cVcISxJ8aaNuRnzGtFAXo0MqtRmhLkKH1NTUAG9dd858vMMlIiJSAAMu9QhSqAtARD1ej2xSltQaRFsHAAA8zjrUlp5owzZaOW2ITZbTKo1OThvjekNjtMj7ddVW+VZ4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FdQWaDS+90i3NizoTE31LgL3RRTG2KRMPRobJIlIKQy41KNxIAgRKYVNytSj2UuP47jfzDyDLlwspxundBNCBEzv5t+MHBUVJacPbfiLnLaVHg1CabsP/zpPG3UtouJ80/X5T1/oX++SJAVMq9dY70J4cfj7TxUqNVHnMOBSj+aoKUXZyd3y741TtQFN86aeGXD9P/h1Op08w035yR/l5fXVpUErc3fgX+dpI2bL9V5fXy/XtdfrldMqlSqg3hvze73ugHonCmdsUqYejr24RKQMBlzq4diLG9H456MIwiZl6tFspcdgLzsh/65+5zY5PfaypQAASaVBYkofebn99E9y+odVD0I09Dke3fGvph2Lto0n7amO7fxITjtqK2EyJwMAhl5wFwxR8QAAjT4axkTftHrOuio4/Jrpv3/n1wAAITyB9U4UxhhwqWcTAkI09c96Pc4WszX2057J63FBeBservJ6WsxDzfnXlfC4muo9YAyukOv9zNpvzC+El/VOEYNNykRERAqIyDvcxjfR1Ld8M0LUYTV1Ta9ktNl9b4uSVBoIna3Z8sb8jXdYdfz/2CG19W54tb56t1dXwyl8TyBrHF64Jd/wH2etHfU1gfUO+O5wWe8UavVyA83ZHyqQRFvnwwojR48eRf/+/UNdDCIiIll+fj7S0tJaXR+Rd7jx8b6HKvLy8mCxWEJcmshjs9mQnp6O/Px8mM3mUBcn4rD+Oo511zmsv84JVv0JIWC325GamnrWfBEZcBtnCrFYLPxP1wlms5n11wmsv45j3XUO669zglF/bbn540NTRERECmDAJSIiUkBEBly9Xo/HH3884L231Hasv85h/XUc665zWH+dE+r6i8inlImIiCJNRN7hEhERRRoGXCIiIgUw4BIRESmAAZeIiEgBDLhEREQKiMiA+/LLL6Nv374wGAyYNGkStm7dGuoihdzy5csxYcIExMTEICkpCVdffTVyc3MD8tTX12PhwoVISEhAdHQ05s6di+Li4oA8eXl5mD17NkwmE5KSkvDAAw/A7XYreSoh98wzz0CSJCxevFhexro7u1OnTuGmm25CQkICjEYjRo4cie3bt8vrhRB47LHHkJKSAqPRiBkzZuDw4cMB+ygvL8f8+fNhNpsRGxuL22+/HdXV1WceqtvxeDx49NFHkZmZCaPRiP79++OJJ54IeBE+66/Jhg0bcMUVVyA1NRWSJOGTTz4JWN9VdfXjjz/i/PPPh8FgQHp6Op577rnOF15EmPfff1/odDrxt7/9Tezbt0/ccccdIjY2VhQXF4e6aCE1c+ZMsXLlSrF3716xa9cucfnll4uMjAxRXV0t5/nlL38p0tPTxdq1a8X27dvF5MmTxZQpU+T1brdbjBgxQsyYMUPs3LlTfPHFFyIxMVEsXbo0FKcUElu3bhV9+/YVo0aNEvfdd5+8nHXXuvLyctGnTx9xyy23iC1btoijR4+Kr7/+Whw5ckTO88wzzwiLxSI++eQTsXv3bnHllVeKzMxMUVdXJ+eZNWuWGD16tNi8ebP4/vvvxYABA8SNN94YilNS1FNPPSUSEhLE6tWrxbFjx8SHH34ooqOjxZ/+9Cc5D+uvyRdffCF++9vfio8++kgAEB9//HHA+q6oq6qqKmG1WsX8+fPF3r17xXvvvSeMRqN4/fXXO1X2iAu4EydOFAsXLpR/93g8IjU1VSxfvjyEpQo/JSUlAoBYv369EEKIyspKodVqxYcffijnOXDggAAgsrOzhRC+/8gqlUoUFRXJeV599VVhNpuFw+FQ9gRCwG63i4EDB4o1a9aICy+8UA64rLuze+ihh8S0adNaXe/1ekVycrL4/e9/Ly+rrKwUer1evPfee0IIIfbv3y8AiG3btsl5vvzySyFJkjh16lTwCh8GZs+eLW677baAZddee62YP3++EIL1dzZnBtyuqqtXXnlFxMXFBVy7Dz30kBg8eHCnyhtRTcpOpxM5OTmYMWOGvEylUmHGjBnIzs4OYcnCT1VVFYCmmZVycnLgcrkC6m7IkCHIyMiQ6y47OxsjR46E1WqV88ycORM2mw379u1TsPShsXDhQsyePTugjgDW3bl89tlnGD9+PK6//nokJSVh7NixePPNN+X1x44dQ1FRUUD9WSwWTJo0KaD+YmNjMX78eDnPjBkzoFKpsGXLFuVOJgSmTJmCtWvX4tChQwCA3bt3Y+PGjbjssssAsP7ao6vqKjs7GxdccAF0Op2cZ+bMmcjNzUVFRUWHyxdRswWVlpbC4/EEfKgBgNVqxcGDB0NUqvDj9XqxePFiTJ06FSNGjAAAFBUVQafTITY2NiCv1WpFUVGRnKelum1c1529//772LFjB7Zt29ZsHevu7I4ePYpXX30VS5YswW9+8xts27YN9957L3Q6HRYsWCCff0v1419/SUlJAes1Gg3i4+O7ff09/PDDsNlsGDJkCNRqNTweD5566inMnz8fAFh/7dBVdVVUVITMzMxm+2hcFxcX16HyRVTApbZZuHAh9u7di40bN4a6KBEhPz8f9913H9asWQODwRDq4kQcr9eL8ePH4+mnnwYAjB07Fnv37sVrr72GBQsWhLh04e+DDz7AqlWr8O6772L48OHYtWsXFi9ejNTUVNZfNxNRTcqJiYlQq9XNng4tLi5GcnJyiEoVXhYtWoTVq1fj22+/RVpamrw8OTkZTqcTlZWVAfn96y45ObnFum1c113l5OSgpKQE5513HjQaDTQaDdavX48VK1ZAo9HAarWy7s4iJSUFw4YNC1g2dOhQ5OXlAWg6/7Ndt8nJySgpKQlY73a7UV5e3u3r74EHHsDDDz+MefPmYeTIkbj55ptx//33Y/ny5QBYf+3RVXUVrOs5ogKuTqfDuHHjsHbtWnmZ1+vF2rVrkZWVFcKShZ4QAosWLcLHH3+MdevWNWsOGTduHLRabUDd5ebmIi8vT667rKws7NmzJ+A/45o1a2A2m5t9oHYn06dPx549e7Br1y75Z/z48Zg/f76cZt21burUqc2GoB06dAh9+vQBAGRmZiI5OTmg/mw2G7Zs2RJQf5WVlcjJyZHzrFu3Dl6vF5MmTVLgLEKntrYWKlXgR7FarYbX6wXA+muPrqqrrKwsbNiwAS6XS86zZs0aDB48uMPNyQAic1iQXq8Xb731lti/f7+48847RWxsbMDToT3R3XffLSwWi/juu+9EYWGh/FNbWyvn+eUvfykyMjLEunXrxPbt20VWVpbIysqS1zcObbn00kvFrl27xFdffSV69erVI4a2nMn/KWUhWHdns3XrVqHRaMRTTz0lDh8+LFatWiVMJpP4xz/+Ied55plnRGxsrPj000/Fjz/+KK666qoWh2qMHTtWbNmyRWzcuFEMHDiwWw5rOdOCBQtE79695WFBH330kUhMTBQPPvignIf118Rut4udO3eKnTt3CgDi+eefFzt37hQnTpwQQnRNXVVWVgqr1SpuvvlmsXfvXvH+++8Lk8nU84YFCSHESy+9JDIyMoROpxMTJ04UmzdvDnWRQg5Aiz8rV66U89TV1Ylf/epXIi4uTphMJnHNNdeIwsLCgP0cP35cXHbZZcJoNIrExETxv//7v8Llcil8NqF3ZsBl3Z3d559/LkaMGCH0er0YMmSIeOONNwLWe71e8eijjwqr1Sr0er2YPn26yM3NDchTVlYmbrzxRhEdHS3MZrO49dZbhd1uV/I0QsJms4n77rtPZGRkCIPBIPr16yd++9vfBgxJYf01+fbbb1v8rFuwYIEQouvqavfu3WLatGlCr9eL3r17i2eeeabTZed8uERERAqIqD5cIiKiSMWAS0REpAAGXCIiIgUw4BIRESmAAZeIiEgBDLhEREQKYMAlIiJSAAMuERGRAhhwiYiIFMCAS0REpAAGXCIiIgX8f1stRggXmk2FAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from matplotlib import pyplot as plt\n", + "plt.imshow(env.render(), interpolation='nearest')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "Traceback (most recent call last):\n File \"/home/osuke/miniconda3/envs/overcooked_ai/lib/python3.10/site-packages/ray/rllib/utils/pre_checks/env.py\", line 70, in check_env\n check_multiagent_environments(env)\n File \"/home/osuke/miniconda3/envs/overcooked_ai/lib/python3.10/site-packages/ray/rllib/utils/pre_checks/env.py\", line 295, in check_multiagent_environments\n _check_done({\"dummy_env_id\": done}, base_env=True, agent_ids=env.get_agent_ids())\n File \"/home/osuke/miniconda3/envs/overcooked_ai/lib/python3.10/site-packages/ray/rllib/utils/pre_checks/env.py\", line 422, in _check_done\n if not isinstance(done_, (bool, np.bool, np.bool_)):\n File \"/home/osuke/miniconda3/envs/overcooked_ai/lib/python3.10/site-packages/numpy/__init__.py\", line 324, in __getattr__\n raise AttributeError(__former_attrs__[attr])\nAttributeError: module 'numpy' has no attribute 'bool'.\n`np.bool` was a deprecated alias for the builtin `bool`. To avoid this error in existing code, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.\nThe aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at:\n https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations. Did you mean: 'bool_'?\n\nThe above error has been found in your environment! We've added a module for checking your custom environments. It may cause your experiment to fail if your environment is not set up correctly. You can disable this behavior by setting `disable_env_checking=True` in your environment config dictionary. You can run the environment checking module standalone by calling ray.rllib.utils.check_env([env]).", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m~/miniconda3/envs/overcooked_ai/lib/python3.10/site-packages/ray/rllib/utils/pre_checks/env.py:70\u001b[0m, in \u001b[0;36mcheck_env\u001b[0;34m(env)\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(env, MultiAgentEnv):\n\u001b[0;32m---> 70\u001b[0m \u001b[43mcheck_multiagent_environments\u001b[49m\u001b[43m(\u001b[49m\u001b[43menv\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 71\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(env, gym\u001b[38;5;241m.\u001b[39mEnv):\n", + "File \u001b[0;32m~/miniconda3/envs/overcooked_ai/lib/python3.10/site-packages/ray/rllib/utils/pre_checks/env.py:295\u001b[0m, in \u001b[0;36mcheck_multiagent_environments\u001b[0;34m(env)\u001b[0m\n\u001b[1;32m 292\u001b[0m _check_reward(\n\u001b[1;32m 293\u001b[0m {\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdummy_env_id\u001b[39m\u001b[38;5;124m\"\u001b[39m: reward}, base_env\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m, agent_ids\u001b[38;5;241m=\u001b[39menv\u001b[38;5;241m.\u001b[39mget_agent_ids()\n\u001b[1;32m 294\u001b[0m )\n\u001b[0;32m--> 295\u001b[0m \u001b[43m_check_done\u001b[49m\u001b[43m(\u001b[49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mdummy_env_id\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mdone\u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbase_env\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43magent_ids\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43menv\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_agent_ids\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 296\u001b[0m _check_info({\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdummy_env_id\u001b[39m\u001b[38;5;124m\"\u001b[39m: info}, base_env\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m, agent_ids\u001b[38;5;241m=\u001b[39menv\u001b[38;5;241m.\u001b[39mget_agent_ids())\n", + "File \u001b[0;32m~/miniconda3/envs/overcooked_ai/lib/python3.10/site-packages/ray/rllib/utils/pre_checks/env.py:422\u001b[0m, in \u001b[0;36m_check_done\u001b[0;34m(done, base_env, agent_ids)\u001b[0m\n\u001b[1;32m 421\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m agent_id, done_ \u001b[38;5;129;01min\u001b[39;00m multi_agent_dict\u001b[38;5;241m.\u001b[39mitems():\n\u001b[0;32m--> 422\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(done_, (\u001b[38;5;28mbool\u001b[39m, \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbool\u001b[49m, np\u001b[38;5;241m.\u001b[39mbool_)):\n\u001b[1;32m 423\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 424\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mYour step function must return dones that are boolean. But \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 425\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124minstead was a \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mtype\u001b[39m(done)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 426\u001b[0m )\n", + "File \u001b[0;32m~/miniconda3/envs/overcooked_ai/lib/python3.10/site-packages/numpy/__init__.py:324\u001b[0m, in \u001b[0;36m__getattr__\u001b[0;34m(attr)\u001b[0m\n\u001b[1;32m 323\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m attr \u001b[38;5;129;01min\u001b[39;00m __former_attrs__:\n\u001b[0;32m--> 324\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m(__former_attrs__[attr])\n\u001b[1;32m 326\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m attr \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtesting\u001b[39m\u001b[38;5;124m'\u001b[39m:\n", + "\u001b[0;31mAttributeError\u001b[0m: module 'numpy' has no attribute 'bool'.\n`np.bool` was a deprecated alias for the builtin `bool`. To avoid this error in existing code, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.\nThe aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at:\n https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[16], line 3\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mhuman_aware_rl\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mrllib\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mrllib\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m load_agent\n\u001b[1;32m 2\u001b[0m agent_path \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124movercooked_demo/server/static/assets/agents/RllibCrampedRoomSP/agent\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m----> 3\u001b[0m ppo_agent \u001b[38;5;241m=\u001b[39m \u001b[43mload_agent\u001b[49m\u001b[43m(\u001b[49m\u001b[43magent_path\u001b[49m\u001b[43m,\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mppo\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 4\u001b[0m ppo_agent\n", + "File \u001b[0;32m~/overcooked_ai/human_aware_rl/rllib/rllib.py:896\u001b[0m, in \u001b[0;36mload_agent\u001b[0;34m(save_path, policy_id, agent_index)\u001b[0m\n\u001b[1;32m 885\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mload_agent\u001b[39m(save_path, policy_id\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mppo\u001b[39m\u001b[38;5;124m\"\u001b[39m, agent_index\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m0\u001b[39m):\n\u001b[1;32m 886\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 887\u001b[0m \u001b[38;5;124;03m Returns an RllibAgent (compatible with the Overcooked Agent API) from the `save_path` to a previously\u001b[39;00m\n\u001b[1;32m 888\u001b[0m \u001b[38;5;124;03m serialized trainer object created with `save_trainer`\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 894\u001b[0m \u001b[38;5;124;03m as the featurization is not symmetric for both players\u001b[39;00m\n\u001b[1;32m 895\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 896\u001b[0m trainer \u001b[38;5;241m=\u001b[39m \u001b[43mload_trainer\u001b[49m\u001b[43m(\u001b[49m\u001b[43msave_path\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 897\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m get_agent_from_trainer(\n\u001b[1;32m 898\u001b[0m trainer, policy_id\u001b[38;5;241m=\u001b[39mpolicy_id, agent_index\u001b[38;5;241m=\u001b[39magent_index\n\u001b[1;32m 899\u001b[0m )\n", + "File \u001b[0;32m~/overcooked_ai/human_aware_rl/rllib/rllib.py:856\u001b[0m, in \u001b[0;36mload_trainer\u001b[0;34m(save_path, true_num_workers)\u001b[0m\n\u001b[1;32m 851\u001b[0m config[\n\u001b[1;32m 852\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mresults_dir\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 853\u001b[0m ] \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m/Users/runner/work/human_aware_rl/human_aware_rl/human_aware_rl/ppo/results_temp\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 855\u001b[0m \u001b[38;5;66;03m# Get un-trained trainer object with proper config\u001b[39;00m\n\u001b[0;32m--> 856\u001b[0m trainer \u001b[38;5;241m=\u001b[39m \u001b[43mgen_trainer_from_params\u001b[49m\u001b[43m(\u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 857\u001b[0m \u001b[38;5;66;03m# Load weights into dummy object\u001b[39;00m\n\u001b[1;32m 858\u001b[0m trainer\u001b[38;5;241m.\u001b[39mrestore(save_path)\n", + "File \u001b[0;32m~/overcooked_ai/human_aware_rl/rllib/rllib.py:783\u001b[0m, in \u001b[0;36mgen_trainer_from_params\u001b[0;34m(params)\u001b[0m\n\u001b[1;32m 779\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmdp_params\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01min\u001b[39;00m environment_params:\n\u001b[1;32m 780\u001b[0m environment_params[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124meval_mdp_params\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m environment_params[\n\u001b[1;32m 781\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmdp_params\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 782\u001b[0m ]\n\u001b[0;32m--> 783\u001b[0m trainer \u001b[38;5;241m=\u001b[39m \u001b[43mPPOTrainer\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 784\u001b[0m \u001b[43m \u001b[49m\u001b[43menv\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43movercooked_multi_agent\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 785\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m{\u001b[49m\n\u001b[1;32m 786\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmultiagent\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mmulti_agent_config\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 787\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcallbacks\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mTrainingCallbacks\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 788\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcustom_eval_function\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mget_rllib_eval_function\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 789\u001b[0m \u001b[43m \u001b[49m\u001b[43mevaluation_params\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 790\u001b[0m \u001b[43m \u001b[49m\u001b[43menvironment_params\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43meval_mdp_params\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 791\u001b[0m \u001b[43m \u001b[49m\u001b[43menvironment_params\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43menv_params\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 792\u001b[0m \u001b[43m \u001b[49m\u001b[43menvironment_params\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mouter_shape\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 793\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mppo\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 794\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mppo\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mself_play\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mbc\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 795\u001b[0m \u001b[43m \u001b[49m\u001b[43mverbose\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mparams\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mverbose\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 796\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 797\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43menv_config\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43menvironment_params\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 798\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43meager_tracing\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 799\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mtraining_params\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 800\u001b[0m \u001b[43m \u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 801\u001b[0m \u001b[43m \u001b[49m\u001b[43mlogger_creator\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcustom_logger_creator\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 802\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 803\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m trainer\n", + "File \u001b[0;32m~/miniconda3/envs/overcooked_ai/lib/python3.10/site-packages/ray/rllib/algorithms/algorithm.py:308\u001b[0m, in \u001b[0;36mAlgorithm.__init__\u001b[0;34m(self, config, env, logger_creator, **kwargs)\u001b[0m\n\u001b[1;32m 296\u001b[0m \u001b[38;5;66;03m# Initialize common evaluation_metrics to nan, before they become\u001b[39;00m\n\u001b[1;32m 297\u001b[0m \u001b[38;5;66;03m# available. We want to make sure the metrics are always present\u001b[39;00m\n\u001b[1;32m 298\u001b[0m \u001b[38;5;66;03m# (although their values may be nan), so that Tune does not complain\u001b[39;00m\n\u001b[1;32m 299\u001b[0m \u001b[38;5;66;03m# when we use these as stopping criteria.\u001b[39;00m\n\u001b[1;32m 300\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mevaluation_metrics \u001b[38;5;241m=\u001b[39m {\n\u001b[1;32m 301\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mevaluation\u001b[39m\u001b[38;5;124m\"\u001b[39m: {\n\u001b[1;32m 302\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mepisode_reward_max\u001b[39m\u001b[38;5;124m\"\u001b[39m: np\u001b[38;5;241m.\u001b[39mnan,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 305\u001b[0m }\n\u001b[1;32m 306\u001b[0m }\n\u001b[0;32m--> 308\u001b[0m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__init__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mconfig\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlogger_creator\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlogger_creator\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 310\u001b[0m \u001b[38;5;66;03m# Check, whether `training_iteration` is still a tune.Trainable property\u001b[39;00m\n\u001b[1;32m 311\u001b[0m \u001b[38;5;66;03m# and has not been overridden by the user in the attempt to implement the\u001b[39;00m\n\u001b[1;32m 312\u001b[0m \u001b[38;5;66;03m# algos logic (this should be done now inside `training_step`).\u001b[39;00m\n\u001b[1;32m 313\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n", + "File \u001b[0;32m~/miniconda3/envs/overcooked_ai/lib/python3.10/site-packages/ray/tune/trainable/trainable.py:157\u001b[0m, in \u001b[0;36mTrainable.__init__\u001b[0;34m(self, config, logger_creator, remote_checkpoint_dir, custom_syncer)\u001b[0m\n\u001b[1;32m 155\u001b[0m start_time \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[1;32m 156\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_local_ip \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_current_ip()\n\u001b[0;32m--> 157\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msetup\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdeepcopy\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 158\u001b[0m setup_time \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime() \u001b[38;5;241m-\u001b[39m start_time\n\u001b[1;32m 159\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m setup_time \u001b[38;5;241m>\u001b[39m SETUP_TIME_THRESHOLD:\n", + "File \u001b[0;32m~/miniconda3/envs/overcooked_ai/lib/python3.10/site-packages/ray/rllib/algorithms/algorithm.py:418\u001b[0m, in \u001b[0;36mAlgorithm.setup\u001b[0;34m(self, config)\u001b[0m\n\u001b[1;32m 411\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m _init \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m:\n\u001b[1;32m 412\u001b[0m \u001b[38;5;66;03m# - Create rollout workers here automatically.\u001b[39;00m\n\u001b[1;32m 413\u001b[0m \u001b[38;5;66;03m# - Run the execution plan to create the local iterator to `next()`\u001b[39;00m\n\u001b[1;32m 414\u001b[0m \u001b[38;5;66;03m# in each training iteration.\u001b[39;00m\n\u001b[1;32m 415\u001b[0m \u001b[38;5;66;03m# This matches the behavior of using `build_trainer()`, which\u001b[39;00m\n\u001b[1;32m 416\u001b[0m \u001b[38;5;66;03m# has been deprecated.\u001b[39;00m\n\u001b[1;32m 417\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 418\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mworkers \u001b[38;5;241m=\u001b[39m \u001b[43mWorkerSet\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 419\u001b[0m \u001b[43m \u001b[49m\u001b[43menv_creator\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43menv_creator\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 420\u001b[0m \u001b[43m \u001b[49m\u001b[43mvalidate_env\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalidate_env\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 421\u001b[0m \u001b[43m \u001b[49m\u001b[43mpolicy_class\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_default_policy_class\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 422\u001b[0m \u001b[43m \u001b[49m\u001b[43mtrainer_config\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 423\u001b[0m \u001b[43m \u001b[49m\u001b[43mnum_workers\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mnum_workers\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 424\u001b[0m \u001b[43m \u001b[49m\u001b[43mlocal_worker\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 425\u001b[0m \u001b[43m \u001b[49m\u001b[43mlogdir\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlogdir\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 426\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 427\u001b[0m \u001b[38;5;66;03m# WorkerSet creation possibly fails, if some (remote) workers cannot\u001b[39;00m\n\u001b[1;32m 428\u001b[0m \u001b[38;5;66;03m# be initialized properly (due to some errors in the RolloutWorker's\u001b[39;00m\n\u001b[1;32m 429\u001b[0m \u001b[38;5;66;03m# constructor).\u001b[39;00m\n\u001b[1;32m 430\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m RayActorError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 431\u001b[0m \u001b[38;5;66;03m# In case of an actor (remote worker) init failure, the remote worker\u001b[39;00m\n\u001b[1;32m 432\u001b[0m \u001b[38;5;66;03m# may still exist and will be accessible, however, e.g. calling\u001b[39;00m\n\u001b[1;32m 433\u001b[0m \u001b[38;5;66;03m# its `sample.remote()` would result in strange \"property not found\"\u001b[39;00m\n\u001b[1;32m 434\u001b[0m \u001b[38;5;66;03m# errors.\u001b[39;00m\n", + "File \u001b[0;32m~/miniconda3/envs/overcooked_ai/lib/python3.10/site-packages/ray/rllib/evaluation/worker_set.py:171\u001b[0m, in \u001b[0;36mWorkerSet.__init__\u001b[0;34m(self, env_creator, validate_env, policy_class, trainer_config, num_workers, local_worker, logdir, _setup)\u001b[0m\n\u001b[1;32m 168\u001b[0m spaces \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 170\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m local_worker:\n\u001b[0;32m--> 171\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_local_worker \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_worker\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 172\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mcls\u001b[39;49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mRolloutWorker\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 173\u001b[0m \u001b[43m \u001b[49m\u001b[43menv_creator\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43menv_creator\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 174\u001b[0m \u001b[43m \u001b[49m\u001b[43mvalidate_env\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mvalidate_env\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 175\u001b[0m \u001b[43m \u001b[49m\u001b[43mpolicy_cls\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_policy_class\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 176\u001b[0m \u001b[43m \u001b[49m\u001b[43mworker_index\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 177\u001b[0m \u001b[43m \u001b[49m\u001b[43mnum_workers\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnum_workers\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 178\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_local_config\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 179\u001b[0m \u001b[43m \u001b[49m\u001b[43mspaces\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mspaces\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 180\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/overcooked_ai/lib/python3.10/site-packages/ray/rllib/evaluation/worker_set.py:661\u001b[0m, in \u001b[0;36mWorkerSet._make_worker\u001b[0;34m(self, cls, env_creator, validate_env, policy_cls, worker_index, num_workers, recreated_worker, config, spaces)\u001b[0m\n\u001b[1;32m 658\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 659\u001b[0m extra_python_environs \u001b[38;5;241m=\u001b[39m config\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mextra_python_environs_for_worker\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[0;32m--> 661\u001b[0m worker \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m(\u001b[49m\n\u001b[1;32m 662\u001b[0m \u001b[43m \u001b[49m\u001b[43menv_creator\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43menv_creator\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 663\u001b[0m \u001b[43m \u001b[49m\u001b[43mvalidate_env\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mvalidate_env\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 664\u001b[0m \u001b[43m \u001b[49m\u001b[43mpolicy_spec\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpolicies\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 665\u001b[0m \u001b[43m \u001b[49m\u001b[43mpolicy_mapping_fn\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmultiagent\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mpolicy_mapping_fn\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 666\u001b[0m \u001b[43m \u001b[49m\u001b[43mpolicies_to_train\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmultiagent\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mpolicies_to_train\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 667\u001b[0m \u001b[43m \u001b[49m\u001b[43mtf_session_creator\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43msession_creator\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mtf_session_args\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 668\u001b[0m \u001b[43m \u001b[49m\u001b[43mrollout_fragment_length\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mrollout_fragment_length\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 669\u001b[0m \u001b[43m \u001b[49m\u001b[43mcount_steps_by\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmultiagent\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcount_steps_by\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 670\u001b[0m \u001b[43m \u001b[49m\u001b[43mbatch_mode\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mbatch_mode\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 671\u001b[0m \u001b[43m \u001b[49m\u001b[43mepisode_horizon\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mhorizon\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 672\u001b[0m \u001b[43m \u001b[49m\u001b[43mpreprocessor_pref\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mpreprocessor_pref\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 673\u001b[0m \u001b[43m \u001b[49m\u001b[43msample_async\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43msample_async\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 674\u001b[0m \u001b[43m \u001b[49m\u001b[43mcompress_observations\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcompress_observations\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 675\u001b[0m \u001b[43m \u001b[49m\u001b[43mnum_envs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mnum_envs_per_worker\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 676\u001b[0m \u001b[43m \u001b[49m\u001b[43mobservation_fn\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmultiagent\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mobservation_fn\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 677\u001b[0m \u001b[43m \u001b[49m\u001b[43mobservation_filter\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mobservation_filter\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 678\u001b[0m \u001b[43m \u001b[49m\u001b[43mclip_rewards\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mclip_rewards\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 679\u001b[0m \u001b[43m \u001b[49m\u001b[43mnormalize_actions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mnormalize_actions\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 680\u001b[0m \u001b[43m \u001b[49m\u001b[43mclip_actions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mclip_actions\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 681\u001b[0m \u001b[43m \u001b[49m\u001b[43menv_config\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43menv_config\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 682\u001b[0m \u001b[43m \u001b[49m\u001b[43mpolicy_config\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 683\u001b[0m \u001b[43m \u001b[49m\u001b[43mworker_index\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mworker_index\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 684\u001b[0m \u001b[43m \u001b[49m\u001b[43mnum_workers\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnum_workers\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 685\u001b[0m \u001b[43m \u001b[49m\u001b[43mrecreated_worker\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrecreated_worker\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 686\u001b[0m \u001b[43m \u001b[49m\u001b[43mlog_dir\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_logdir\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 687\u001b[0m \u001b[43m \u001b[49m\u001b[43mlog_level\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mlog_level\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 688\u001b[0m \u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcallbacks\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 689\u001b[0m \u001b[43m \u001b[49m\u001b[43minput_creator\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minput_creator\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 690\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_creator\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_creator\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 691\u001b[0m \u001b[43m \u001b[49m\u001b[43mremote_worker_envs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mremote_worker_envs\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 692\u001b[0m \u001b[43m \u001b[49m\u001b[43mremote_env_batch_wait_ms\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mremote_env_batch_wait_ms\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 693\u001b[0m \u001b[43m \u001b[49m\u001b[43msoft_horizon\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43msoft_horizon\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 694\u001b[0m \u001b[43m \u001b[49m\u001b[43mno_done_at_end\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mno_done_at_end\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 695\u001b[0m \u001b[43m \u001b[49m\u001b[43mseed\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mseed\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mworker_index\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 696\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mseed\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\n\u001b[1;32m 697\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 698\u001b[0m \u001b[43m \u001b[49m\u001b[43mfake_sampler\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mfake_sampler\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 699\u001b[0m \u001b[43m \u001b[49m\u001b[43mextra_python_environs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mextra_python_environs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 700\u001b[0m \u001b[43m \u001b[49m\u001b[43mspaces\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mspaces\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 701\u001b[0m \u001b[43m \u001b[49m\u001b[43mdisable_env_checking\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mdisable_env_checking\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 702\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 704\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m worker\n", + "File \u001b[0;32m~/miniconda3/envs/overcooked_ai/lib/python3.10/site-packages/ray/rllib/evaluation/rollout_worker.py:495\u001b[0m, in \u001b[0;36mRolloutWorker.__init__\u001b[0;34m(self, env_creator, validate_env, policy_spec, policy_mapping_fn, policies_to_train, tf_session_creator, rollout_fragment_length, count_steps_by, batch_mode, episode_horizon, preprocessor_pref, sample_async, compress_observations, num_envs, observation_fn, observation_filter, clip_rewards, normalize_actions, clip_actions, env_config, model_config, policy_config, worker_index, num_workers, recreated_worker, log_dir, log_level, callbacks, input_creator, output_creator, remote_worker_envs, remote_env_batch_wait_ms, soft_horizon, no_done_at_end, seed, extra_python_environs, fake_sampler, spaces, policy, disable_env_checking)\u001b[0m\n\u001b[1;32m 492\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39menv \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 493\u001b[0m \u001b[38;5;66;03m# Validate environment (general validation function).\u001b[39;00m\n\u001b[1;32m 494\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_disable_env_checking:\n\u001b[0;32m--> 495\u001b[0m \u001b[43mcheck_env\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43menv\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 496\u001b[0m \u001b[38;5;66;03m# Custom validation function given, typically a function attribute of the\u001b[39;00m\n\u001b[1;32m 497\u001b[0m \u001b[38;5;66;03m# algorithm trainer.\u001b[39;00m\n\u001b[1;32m 498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m validate_env \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "File \u001b[0;32m~/miniconda3/envs/overcooked_ai/lib/python3.10/site-packages/ray/rllib/utils/pre_checks/env.py:83\u001b[0m, in \u001b[0;36mcheck_env\u001b[0;34m(env)\u001b[0m\n\u001b[1;32m 81\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[1;32m 82\u001b[0m actual_error \u001b[38;5;241m=\u001b[39m traceback\u001b[38;5;241m.\u001b[39mformat_exc()\n\u001b[0;32m---> 83\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 84\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mactual_error\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 85\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mThe above error has been found in your environment! \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 86\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mWe\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mve added a module for checking your custom environments. It \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 87\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmay cause your experiment to fail if your environment is not set up \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 88\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcorrectly. You can disable this behavior by setting \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 89\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m`disable_env_checking=True` in your environment config \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 90\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdictionary. You can run the environment checking module \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 91\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstandalone by calling ray.rllib.utils.check_env([env]).\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 92\u001b[0m )\n", + "\u001b[0;31mValueError\u001b[0m: Traceback (most recent call last):\n File \"/home/osuke/miniconda3/envs/overcooked_ai/lib/python3.10/site-packages/ray/rllib/utils/pre_checks/env.py\", line 70, in check_env\n check_multiagent_environments(env)\n File \"/home/osuke/miniconda3/envs/overcooked_ai/lib/python3.10/site-packages/ray/rllib/utils/pre_checks/env.py\", line 295, in check_multiagent_environments\n _check_done({\"dummy_env_id\": done}, base_env=True, agent_ids=env.get_agent_ids())\n File \"/home/osuke/miniconda3/envs/overcooked_ai/lib/python3.10/site-packages/ray/rllib/utils/pre_checks/env.py\", line 422, in _check_done\n if not isinstance(done_, (bool, np.bool, np.bool_)):\n File \"/home/osuke/miniconda3/envs/overcooked_ai/lib/python3.10/site-packages/numpy/__init__.py\", line 324, in __getattr__\n raise AttributeError(__former_attrs__[attr])\nAttributeError: module 'numpy' has no attribute 'bool'.\n`np.bool` was a deprecated alias for the builtin `bool`. To avoid this error in existing code, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.\nThe aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at:\n https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations. Did you mean: 'bool_'?\n\nThe above error has been found in your environment! We've added a module for checking your custom environments. It may cause your experiment to fail if your environment is not set up correctly. You can disable this behavior by setting `disable_env_checking=True` in your environment config dictionary. You can run the environment checking module standalone by calling ray.rllib.utils.check_env([env])." + ] + } + ], + "source": [ + "from human_aware_rl.rllib.rllib import load_agent\n", + "agent_path = \"overcooked_demo/server/static/assets/agents/RllibCrampedRoomSP/agent\"\n", + "ppo_agent = load_agent(agent_path,\"ppo\",0)\n", + "ppo_agent" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "overcooked_ai", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}