Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
> **Note:** This is a temporary fork of [HumanCompatibleAI/overcooked_ai](https://github.com/HumanCompatibleAI/overcooked_ai), with full credit to [Micah Carroll](https://github.com/micahcarroll) and team for the original work. The purpose of this fork is to bring all Python dependencies up to date (Python 3.13, numpy 2.x, gymnasium, etc.) and modernize the test framework. We will close this fork if/when these changes can be merged into the original repository.

---

![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)

Expand Down
35 changes: 17 additions & 18 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,38 +1,37 @@
[build-system]
requires = ["setuptools>=77.0.3"]
requires = ["setuptools>=82.0.1"]
build-backend = "setuptools.build_meta"

[project]
name = "overcooked_ai"
version = "2.0.0"
description = "Cooperative multi-agent environment based on Overcooked"
readme = "README.md"
requires-python = ">=3.10,<3.11"
requires-python = ">=3.13"
license = { file = "LICENSE" }
authors = [{ name = "Micah Carroll", email = "mdc@berkeley.edu" }]
urls = { homepage = "https://github.com/HumanCompatibleAI/overcooked_ai" }
keywords = ["Overcooked", "AI", "Reinforcement Learning"]
dependencies = [
"dill",
"gymnasium",
"ipywidgets",
"numpy<2",
"opencv-python",
"pygame",
"scipy",
"setuptools>=77.0.3",
"tqdm",
"dill>=0.4.1",
"gymnasium>=1.2.2",
"ipywidgets>=8.1.8",
"numpy>=2.4.4",
"opencv-python>=4.13.0.92",
"pygame>=2.6.1",
"scipy>=1.17.1",
"setuptools>=82.0.1",
"tqdm>=4.67.3",
]

[project.optional-dependencies]
harl = [
"ipykernel",
"ray[rllib,tune]==2.2",
"dm-tree",
"lz4",
"tensorflow[and-cuda]==2.19.0",
"wandb",
"gym",
"ipykernel>=7.2.0",
"ray[rllib,tune]>=2.54.1",
"dm-tree>=0.1.10",
"lz4>=4.4.5",
"tensorflow[and-cuda]>=2.21.0",
"wandb>=0.25.1",
]

[project.scripts]
Expand Down
44 changes: 22 additions & 22 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,32 +38,32 @@
],
},
install_requires=[
"dill",
"numpy<2.0.0",
"scipy",
"tqdm",
"gymnasium",
"ipython",
"pygame",
"ipywidgets",
"opencv-python",
"flask",
"flask-socketio",
"dill>=0.4.1",
"numpy>=2.4.4",
"scipy>=1.17.1",
"tqdm>=4.67.3",
"gymnasium>=1.2.2",
"ipython>=9.12.0",
"pygame>=2.6.1",
"ipywidgets>=8.1.8",
"opencv-python>=4.13.0.92",
"flask>=3.1.3",
"flask-socketio>=5.6.1",
],
# removed overlapping dependencies
extras_require={
"harl": [
"wandb",
"GitPython",
"memory_profiler",
"sacred",
"pymongo",
"matplotlib",
"requests",
"seaborn==0.9.0",
"ray[rllib]>=2.5.0",
"protobuf",
"tensorflow>=2.14.0",
"wandb>=0.25.1",
"GitPython>=3.1.46",
"memory_profiler>=0.61.0",
"sacred>=0.8.7",
"pymongo>=4.16.0",
"matplotlib>=3.10.8",
"requests>=2.33.1",
"seaborn>=0.13.2",
"ray[rllib]>=2.54.1",
"protobuf>=7.34.1",
"tensorflow>=2.21.0",
]
},
entry_points={
Expand Down
64 changes: 20 additions & 44 deletions src/human_aware_rl/human/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,9 @@
import os
import pickle
import shutil
import sys
import unittest

import numpy as np
from numpy.testing._private.utils import assert_raises
import pytest

from human_aware_rl.human.process_dataframes import (
csv_to_df_pickle,
Expand All @@ -29,7 +27,7 @@
)


class TestProcessDataFrames(unittest.TestCase):
class TestProcessDataFrames:
temp_data_dir = "this_is_a_temp"
data_len_2019 = 3546
data_len_2020 = 1189
Expand All @@ -51,61 +49,53 @@ class TestProcessDataFrames(unittest.TestCase):
"layouts": ["cramped_room"],
}

def setUp(self):
print(
"\nIn Class {}, in Method {}".format(
self.__class__.__name__, self._testMethodName
)
)
@pytest.fixture(autouse=True)
def _setup(self):
if not os.path.exists(self.temp_data_dir):
os.makedirs(self.temp_data_dir)

def tearDown(self):
yield
shutil.rmtree(self.temp_data_dir)

def test_csv_to_df_pickle_2019(self):
params = copy.deepcopy(self.base_csv_to_df_params)
params["csv_path"] = DUMMY_2019_RAW_HUMAN_DATA_PATH
params["button_presses_threshold"] = 0.0
data = csv_to_df_pickle(**params)
self.assertEqual(len(data), self.data_len_2019)
assert len(data) == self.data_len_2019

params = copy.deepcopy(self.base_csv_to_df_params)
params["csv_path"] = DUMMY_2019_RAW_HUMAN_DATA_PATH
params["button_presses_threshold"] = 0.7
data = csv_to_df_pickle(**params)
self.assertLess(len(data), self.data_len_2019)
assert len(data) < self.data_len_2019

def test_csv_to_df_pickle_2020(self):
params = copy.deepcopy(self.base_csv_to_df_params)
params["button_presses_threshold"] = 0.0
data = csv_to_df_pickle(**params)
self.assertEqual(len(data), self.data_len_2020)
assert len(data) == self.data_len_2020

params = copy.deepcopy(self.base_csv_to_df_params)
params["button_presses_threshold"] = 0.7
data = csv_to_df_pickle(**params)
self.assertLess(len(data), self.data_len_2020)
assert len(data) < self.data_len_2020

def test_csv_to_df_pickle(self):
# Try various button thresholds (hand-picked to lie between different values for dummy data games)
button_thresholds = [0.2, 0.6, 0.7]
lengths = []
for threshold in button_thresholds:
# dummy dataset is too small to partion so we set train_test_split=False
params = copy.deepcopy(self.base_csv_to_df_params)
params["button_presses_threshold"] = threshold
data = csv_to_df_pickle(**params)
lengths.append(len(data))

# Filtered data size should be monotonically decreasing wrt button_threshold
for i in range(len(lengths) - 1):
self.assertGreaterEqual(lengths[i], lengths[i + 1])
assert lengths[i] >= lengths[i + 1]

# Picking a threshold that's suficiently high discards all data, should result in value error
params = copy.deepcopy(self.base_csv_to_df_params)
params["button_presses_threshold"] = 0.8
self.assertRaises(ValueError, csv_to_df_pickle, **params)
with pytest.raises(ValueError):
csv_to_df_pickle(**params)

def test_get_trajs_from_data_2019(self):
params = copy.deepcopy(self.base_get_trajs_from_data_params)
Expand All @@ -117,22 +107,19 @@ def test_get_trajs_from_data_2019_featurize(self):
trajectories, _ = get_trajs_from_data(**params)

def test_get_trajs_from_data_2020(self):
# Ensure we can properly deserialize states with updated objects (i.e tomatoes)
params = copy.deepcopy(self.base_get_trajs_from_data_params)
params["layouts"] = ["inverse_marshmallow_experiment"]
params["data_path"] = DUMMY_2020_CLEAN_HUMAN_DATA_PATH
trajectories, _ = get_trajs_from_data(**params)

def test_get_trajs_from_data_2020_featurize(self):
# Ensure we can properly featurize states with updated dynamics and updated objects (i.e tomatoes)
params = copy.deepcopy(self.base_get_trajs_from_data_params)
params["layouts"] = ["inverse_marshmallow_experiment"]
params["data_path"] = DUMMY_2020_CLEAN_HUMAN_DATA_PATH
params["featurize_states"] = True
trajectories, _ = get_trajs_from_data(**params)

def test_csv_to_df_to_trajs_integration(self):
# Ensure the output of 'csv_to_df_pickle' works as valid input to 'get_trajs_from_data'
params = copy.deepcopy(self.base_csv_to_df_params)
_ = csv_to_df_pickle(**params)

Expand All @@ -144,7 +131,7 @@ def test_csv_to_df_to_trajs_integration(self):
_ = get_trajs_from_data(**params)


class TestHumanDataConversion(unittest.TestCase):
class TestHumanDataConversion:
temp_dir = "this_is_also_a_temp"
infile = DUMMY_2019_CLEAN_HUMAN_DATA_PATH
horizon = 400
Expand All @@ -160,12 +147,8 @@ def _equal_pickle_and_env_state_dict(
["timestep", "all_orders", "bonus_orders"],
)

def setUp(self):
print(
"\nIn Class {}, in Method {}".format(
self.__class__.__name__, self._testMethodName
)
)
@pytest.fixture(autouse=True)
def _setup(self):
if not os.path.exists(self.temp_dir):
os.makedirs(self.temp_dir)

Expand All @@ -191,7 +174,7 @@ def setUp(self):
with open(outfile, "rb") as f:
self.human_data = pickle.load(f)[self.layout_name]

def tearDown(self):
yield
shutil.rmtree(self.temp_dir)

def test_state(self):
Expand All @@ -200,17 +183,10 @@ def test_state(self):
if state_dict.items() == self.starting_state_dict.items():
self.env.reset()
else:
self.assertTrue(
self._equal_pickle_and_env_state_dict(
state_dict, self.env.state.to_dict()
),
"Expected state:\t\n{}\n\nActual state:\t\n{}".format(
self.env.state.to_dict(), state_dict
),
assert self._equal_pickle_and_env_state_dict(
state_dict, self.env.state.to_dict()
), "Expected state:\t\n{}\n\nActual state:\t\n{}".format(
self.env.state.to_dict(), state_dict
)
self.env.step(joint_action=joint_action)
idx += 1


if __name__ == "__main__":
unittest.main()
Loading