multi-agent-rlenv 3.3.1__tar.gz → 3.3.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/PKG-INFO +1 -1
  2. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/__init__.py +1 -1
  3. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/adapters/overcooked_adapter.py +15 -0
  4. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/tests/test_serialization.py +59 -5
  5. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/.github/workflows/ci.yaml +0 -0
  6. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/.github/workflows/docs.yaml +0 -0
  7. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/.gitignore +0 -0
  8. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/LICENSE +0 -0
  9. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/README.md +0 -0
  10. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/pyproject.toml +0 -0
  11. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/adapters/__init__.py +0 -0
  12. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/adapters/gym_adapter.py +0 -0
  13. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/adapters/pettingzoo_adapter.py +0 -0
  14. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/adapters/pymarl_adapter.py +0 -0
  15. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/adapters/smac_adapter.py +0 -0
  16. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/env_builder.py +0 -0
  17. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/env_pool.py +0 -0
  18. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/exceptions.py +0 -0
  19. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/mock_env.py +0 -0
  20. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/models/__init__.py +0 -0
  21. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/models/env.py +0 -0
  22. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/models/episode.py +0 -0
  23. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/models/observation.py +0 -0
  24. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/models/spaces.py +0 -0
  25. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/models/state.py +0 -0
  26. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/models/step.py +0 -0
  27. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/models/transition.py +0 -0
  28. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/py.typed +0 -0
  29. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/wrappers/__init__.py +0 -0
  30. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/wrappers/agent_id_wrapper.py +0 -0
  31. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/wrappers/available_actions_mask.py +0 -0
  32. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/wrappers/available_actions_wrapper.py +0 -0
  33. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/wrappers/blind_wrapper.py +0 -0
  34. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/wrappers/centralised.py +0 -0
  35. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/wrappers/delayed_rewards.py +0 -0
  36. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/wrappers/last_action_wrapper.py +0 -0
  37. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/wrappers/paddings.py +0 -0
  38. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/wrappers/penalty_wrapper.py +0 -0
  39. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/wrappers/rlenv_wrapper.py +0 -0
  40. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/wrappers/time_limit.py +0 -0
  41. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/src/marlenv/wrappers/video_recorder.py +0 -0
  42. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/tests/__init__.py +0 -0
  43. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/tests/test_adapters.py +0 -0
  44. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/tests/test_episode.py +0 -0
  45. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/tests/test_models.py +0 -0
  46. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/tests/test_pool.py +0 -0
  47. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/tests/test_spaces.py +0 -0
  48. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/tests/test_wrappers.py +0 -0
  49. {multi_agent_rlenv-3.3.1 → multi_agent_rlenv-3.3.3}/tests/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: multi-agent-rlenv
3
- Version: 3.3.1
3
+ Version: 3.3.3
4
4
  Summary: A strongly typed Multi-Agent Reinforcement Learning framework
5
5
  Project-URL: repository, https://github.com/yamoling/multi-agent-rlenv
6
6
  Author-email: Yannick Molinghen <yannick.molinghen@ulb.be>
@@ -62,7 +62,7 @@ print(env.extras_shape) # (1, )
62
62
  If you want to create a new environment, you can simply create a class that inherits from `MARLEnv`. If you want to create a wrapper around an existing `MARLEnv`, you probably want to subclass `RLEnvWrapper` which implements a default behaviour for every method.
63
63
  """
64
64
 
65
- __version__ = "3.3.1"
65
+ __version__ = "3.3.3"
66
66
 
67
67
  from . import models
68
68
  from . import wrappers
@@ -1,6 +1,7 @@
1
1
  import sys
2
2
  from dataclasses import dataclass
3
3
  from typing import Literal, Sequence
4
+ from copy import deepcopy
4
5
 
5
6
  import cv2
6
7
  import numpy as np
@@ -87,6 +88,20 @@ class Overcooked(MARLEnv[Sequence[int] | npt.NDArray, DiscreteActionSpace]):
87
88
  info=info,
88
89
  )
89
90
 
91
+ def __deepcopy__(self, memo: dict):
92
+ mdp = deepcopy(self._mdp)
93
+ return Overcooked(OvercookedEnv.from_mdp(mdp, horizon=self.horizon))
94
+
95
+ def __getstate__(self):
96
+ return {"horizon": self.horizon, "mdp": self._mdp}
97
+
98
+ def __setstate__(self, state: dict):
99
+ from overcooked_ai_py.mdp.overcooked_mdp import Recipe
100
+
101
+ mdp = state["mdp"]
102
+ Recipe.configure(mdp.recipe_config)
103
+ self.__init__(OvercookedEnv.from_mdp(state["mdp"], horizon=state["horizon"]))
104
+
90
105
  def get_image(self):
91
106
  rewards_dict = {} # dictionary of details you want rendered in the UI
92
107
  for key, value in self._oenv.game_stats.items():
@@ -1,15 +1,13 @@
1
1
  import pickle
2
- from importlib.util import find_spec
3
-
4
2
  import numpy as np
5
3
  import orjson
6
4
  import pytest
5
+ import os
6
+ from copy import deepcopy
7
7
 
8
8
  import marlenv
9
9
  from marlenv import DiscreteMockEnv
10
10
 
11
- skip_gym = find_spec("gymnasium") is None
12
-
13
11
 
14
12
  def test_registry():
15
13
  env = DiscreteMockEnv(4)
@@ -22,7 +20,7 @@ def test_registry():
22
20
  assert restored_env.n_actions == env.n_actions
23
21
 
24
22
 
25
- @pytest.mark.skipif(skip_gym, reason="Gymnasium is not installed")
23
+ @pytest.mark.skipif(not marlenv.adapters.HAS_GYM, reason="Gymnasium is not installed")
26
24
  def test_registry_gym():
27
25
  env = marlenv.make("CartPole-v1")
28
26
  restored_env = pickle.loads(pickle.dumps(env))
@@ -135,3 +133,59 @@ def test_serialize_episode():
135
133
  episode.add(transition)
136
134
 
137
135
  _ = orjson.dumps(episode, option=orjson.OPT_SERIALIZE_NUMPY)
136
+
137
+
138
+ @pytest.mark.skipif(not marlenv.adapters.HAS_OVERCOOKED, reason="Overcooked is not installed")
139
+ def test_deepcopy_overcooked():
140
+ env = marlenv.adapters.Overcooked.from_layout("scenario4")
141
+ env2 = deepcopy(env)
142
+ assert env == env2
143
+
144
+
145
+ @pytest.mark.skipif(not marlenv.adapters.HAS_OVERCOOKED, reason="Overcooked is not installed")
146
+ def test_pickle_overcooked():
147
+ env = marlenv.adapters.Overcooked.from_layout("scenario1_s", horizon=60)
148
+ serialized = pickle.dumps(env)
149
+ restored = pickle.loads(serialized)
150
+ assert env == restored
151
+
152
+ env.reset()
153
+ restored.reset()
154
+
155
+ for _ in range(50):
156
+ actions = env.sample_action()
157
+ step = env.step(actions)
158
+ step_restored = restored.step(actions)
159
+ assert step == step_restored
160
+
161
+
162
+ @pytest.mark.skipif(not marlenv.adapters.HAS_OVERCOOKED, reason="Overcooked is not installed")
163
+ def test_unpickling_from_blank_process():
164
+ from marlenv.adapters import Overcooked
165
+ import pickle
166
+ import subprocess
167
+ import tempfile
168
+
169
+ env = Overcooked.from_layout("large_room")
170
+ env_file = tempfile.NamedTemporaryFile("wb", delete=False)
171
+ pickle.dump(env, env_file)
172
+ env_file.close()
173
+
174
+ # Write the python file
175
+
176
+ f = tempfile.NamedTemporaryFile("w", delete=False)
177
+ f.write("""
178
+ import pickle
179
+ import sys
180
+
181
+ with open(sys.argv[1], "rb") as f:
182
+ env = pickle.load(f)
183
+
184
+ env.reset()""")
185
+ f.close()
186
+ try:
187
+ output = subprocess.run(f"python {f.name} {env_file.name}", shell=True, capture_output=True)
188
+ assert output.returncode == 0, output.stderr.decode("utf-8")
189
+ finally:
190
+ os.remove(f.name)
191
+ os.remove(env_file.name)