From 617e4908e20fd08e4e135421cd47d52018a3148c Mon Sep 17 00:00:00 2001
From: VioIchigo <89044579+VioIchigo@users.noreply.github.com>
Date: Wed, 10 Apr 2024 07:19:02 -0400
Subject: [PATCH 01/10] Update publications.md (#426)
---
docs/content/publications.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/docs/content/publications.md b/docs/content/publications.md
index 236328aa3..714260e32 100644
--- a/docs/content/publications.md
+++ b/docs/content/publications.md
@@ -8,6 +8,7 @@ firstpage:
List of publications & submissions using Minigrid or BabyAI (please open a pull request to add missing entries):
- [Learning from Active Human Involvement through Proxy Value Propagation](https://metadriverse.github.io/pvp/)(UCLA, NeurIPS Spotlight 2023)
+- [Go Beyond Imagination: Maximizing Episodic Reachability with World Models](https://arxiv.org/pdf/2308.13661.pdf) (UMich, ICML 2023)
- [Hierarchies of Reward Machines](https://arxiv.org/abs/2205.15752) (Imperial College London, ILASP, Universitat Pompeu Fabra, ICML 2023)
- [Minimal Value-Equivalent Partial Models for Scalable and Robust Planning in Lifelong Reinforcement Learning](https://arxiv.org/abs/2301.10119) (Mila, McGill University, CoLLAs 2023)
- [DEIR: Efficient and Robust Exploration through Discriminative-Model-Based Episodic Intrinsic Rewards](https://arxiv.org/abs/2304.10770) (U-Tokyo, Google Brain, IJCAI 2023)
From a7a6725aabd3d2a4e9edf6b11739208efe1d5520 Mon Sep 17 00:00:00 2001
From: rbankosegger
Date: Mon, 22 Apr 2024 16:45:44 +0200
Subject: [PATCH 02/10] Fix issue when generating non-square DoorKey
environments (#429)
Co-authored-by: Rafael Bankosegger
---
minigrid/envs/doorkey.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/minigrid/envs/doorkey.py b/minigrid/envs/doorkey.py
index 39724968f..43c07f840 100644
--- a/minigrid/envs/doorkey.py
+++ b/minigrid/envs/doorkey.py
@@ -91,7 +91,7 @@ def _gen_grid(self, width, height):
self.place_agent(size=(splitIdx, height))
# Place a door in the wall
- doorIdx = self._rand_int(1, width - 2)
+ doorIdx = self._rand_int(1, height - 2)
self.put_obj(Door("yellow", is_locked=True), splitIdx, doorIdx)
# Place a yellow key on the left side
From 37f28b20991f391f83ff8c7757b1fe73d92a20fa Mon Sep 17 00:00:00 2001
From: Timon Erhart <57718207+turbotimon@users.noreply.github.com>
Date: Tue, 23 Apr 2024 23:29:03 +0200
Subject: [PATCH 03/10] doc fix env-id param (#430)
---
docs/content/basic_usage.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/content/basic_usage.md b/docs/content/basic_usage.md
index 24a1530d7..0bbce46de 100644
--- a/docs/content/basic_usage.md
+++ b/docs/content/basic_usage.md
@@ -13,10 +13,10 @@ There is a UI application which allows you to manually control the agent with th
./minigrid/manual_control.py
```
-The environment being run can be selected with the `--env` option, eg:
+The environment being run can be selected with the `--env-id` option, eg:
```bash
-./minigrid/manual_control.py --env MiniGrid-Empty-8x8-v0
+./minigrid/manual_control.py --env-id MiniGrid-Empty-8x8-v0
```
## Installation
From dd42847e86c9425ba7cd0e0c6cacafd5154f2091 Mon Sep 17 00:00:00 2001
From: Simon Ouellette
Date: Mon, 3 Jun 2024 06:43:45 -0400
Subject: [PATCH 04/10] New publication (#432)
---
docs/content/publications.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/docs/content/publications.md b/docs/content/publications.md
index 714260e32..7be20f03e 100644
--- a/docs/content/publications.md
+++ b/docs/content/publications.md
@@ -7,6 +7,7 @@ firstpage:
List of publications & submissions using Minigrid or BabyAI (please open a pull request to add missing entries):
+- [Conviction-Based Planning for Sparse Reward Reinforcement Learning Problems](https://prl-theworkshop.github.io/prl2024-icaps/papers/8.pdf)(UQÀM, PRL @ ICAPS 2024)
- [Learning from Active Human Involvement through Proxy Value Propagation](https://metadriverse.github.io/pvp/)(UCLA, NeurIPS Spotlight 2023)
- [Go Beyond Imagination: Maximizing Episodic Reachability with World Models](https://arxiv.org/pdf/2308.13661.pdf) (UMich, ICML 2023)
- [Hierarchies of Reward Machines](https://arxiv.org/abs/2205.15752) (Imperial College London, ILASP, Universitat Pompeu Fabra, ICML 2023)
From 6b99e062c576755c6bd10ad44784b6bd394cadb7 Mon Sep 17 00:00:00 2001
From: Marc Speckmann <45273033+MarcSpeckmann@users.noreply.github.com>
Date: Thu, 6 Jun 2024 15:08:17 +0200
Subject: [PATCH 05/10] Correct registered configuration for UnlockPickupEnv
(#437)
---
minigrid/envs/unlockpickup.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/minigrid/envs/unlockpickup.py b/minigrid/envs/unlockpickup.py
index 93256285b..45a653f41 100644
--- a/minigrid/envs/unlockpickup.py
+++ b/minigrid/envs/unlockpickup.py
@@ -53,7 +53,7 @@ class UnlockPickupEnv(RoomGrid):
## Registered Configurations
- - `MiniGrid-Unlock-v0`
+ - `MiniGrid-UnlockPickup-v0`
"""
From 6762cb1f5c08b698ddbe91174fa686aabf1db27a Mon Sep 17 00:00:00 2001
From: Mark Towers
Date: Thu, 6 Jun 2024 15:04:12 +0100
Subject: [PATCH 06/10] Fix `FlatObsWrapper` obs dtype (#435)
---
minigrid/wrappers.py | 21 +++++++++------------
1 file changed, 9 insertions(+), 12 deletions(-)
diff --git a/minigrid/wrappers.py b/minigrid/wrappers.py
index 569fa11d0..814c6e5f5 100644
--- a/minigrid/wrappers.py
+++ b/minigrid/wrappers.py
@@ -569,19 +569,17 @@ class FlatObsWrapper(ObservationWrapper):
(2835,)
"""
- def __init__(self, env, maxStrLen=96):
+ def __init__(self, env, maxStrLen: int = 96):
super().__init__(env)
self.maxStrLen = maxStrLen
self.numCharCodes = 28
- imgSpace = env.observation_space.spaces["image"]
- imgSize = reduce(operator.mul, imgSpace.shape, 1)
-
+ img_size = np.prod(env.observation_space["image"].shape)
self.observation_space = spaces.Box(
low=0,
high=255,
- shape=(imgSize + self.numCharCodes * self.maxStrLen,),
+ shape=(img_size + self.numCharCodes * self.maxStrLen,),
dtype="uint8",
)
@@ -598,12 +596,11 @@ def observation(self, obs):
), f"mission string too long ({len(mission)} chars)"
mission = mission.lower()
- strArray = np.zeros(
- shape=(self.maxStrLen, self.numCharCodes), dtype="float32"
- )
+ str_array = np.zeros(shape=(self.maxStrLen, self.numCharCodes), dtype="uint8")
+ # as `numCharCodes` < 255 then we can use `uint8`
for idx, ch in enumerate(mission):
- if ch >= "a" and ch <= "z":
+ if "a" <= ch <= "z":
chNo = ord(ch) - ord("a")
elif ch == " ":
chNo = ord("z") - ord("a") + 1
@@ -613,11 +610,11 @@ def observation(self, obs):
raise ValueError(
f"Character {ch} is not available in mission string."
)
- assert chNo < self.numCharCodes, "%s : %d" % (ch, chNo)
- strArray[idx, chNo] = 1
+ assert chNo < self.numCharCodes, f"{ch} : {chNo:d}"
+ str_array[idx, chNo] = 1
self.cachedStr = mission
- self.cachedArray = strArray
+ self.cachedArray = str_array
obs = np.concatenate((image.flatten(), self.cachedArray.flatten()))
From 016fb0db11d693840a2d379ecd609452eb670ae4 Mon Sep 17 00:00:00 2001
From: Raghu Rajan <15613406+RaghuSpaceRajan@users.noreply.github.com>
Date: Tue, 18 Jun 2024 14:18:39 +0530
Subject: [PATCH 07/10] Update README.md to add missing link to Gymansium
(#439)
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index b2a2c25ea..677c1cf75 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@
-The Minigrid library contains a collection of discrete grid-world environments to conduct research on Reinforcement Learning. The environments follow the [Gymnasium]() standard API and they are designed to be lightweight, fast, and easily customizable.
+The Minigrid library contains a collection of discrete grid-world environments to conduct research on Reinforcement Learning. The environments follow the [Gymnasium](https://github.com/Farama-Foundation/Gymnasium) standard API and they are designed to be lightweight, fast, and easily customizable.
The documentation website is at [minigrid.farama.org](https://minigrid.farama.org/), and we have a public discord server (which we also use to coordinate development work) that you can join here: [https://discord.gg/bnJ6kubTg6](https://discord.gg/bnJ6kubTg6)
From 7e79669bd5b62b59b000b443b8c72efee2ec7890 Mon Sep 17 00:00:00 2001
From: James Doran
Date: Fri, 19 Jul 2024 11:33:01 +0100
Subject: [PATCH 08/10] Update WFCEnv documentation (#438)
Co-authored-by: Mark Towers
---
docs/_scripts/gen_env_docs.py | 12 +++++-
docs/_scripts/gen_envs_display.py | 33 ++++++++++++++-
docs/_scripts/gen_gifs.py | 6 +++
docs/_scripts/utils.py | 4 +-
.../minigrid/ObstructedMaze_Full_V1.gif | Bin 0 -> 23817 bytes
docs/_static/videos/wfc/Dungeon.gif | Bin 0 -> 36826 bytes
docs/_static/videos/wfc/DungeonLessRooms.gif | Bin 0 -> 38747 bytes
docs/_static/videos/wfc/DungeonMazeScaled.gif | Bin 0 -> 42415 bytes
docs/_static/videos/wfc/DungeonRooms.gif | Bin 0 -> 37339 bytes
docs/_static/videos/wfc/DungeonSpirals.gif | Bin 0 -> 38638 bytes
docs/_static/videos/wfc/Maze.gif | Bin 0 -> 46108 bytes
docs/_static/videos/wfc/MazeKnot.gif | Bin 0 -> 16201 bytes
docs/_static/videos/wfc/MazePaths.gif | Bin 0 -> 44742 bytes
docs/_static/videos/wfc/MazeSimple.gif | Bin 0 -> 51863 bytes
docs/_static/videos/wfc/MazeSpirals.gif | Bin 0 -> 39155 bytes
docs/_static/videos/wfc/MazeWall.gif | Bin 0 -> 55293 bytes
docs/_static/videos/wfc/Mazelike.gif | Bin 0 -> 32445 bytes
docs/_static/videos/wfc/ObstaclesAngular.gif | Bin 0 -> 26776 bytes
.../_static/videos/wfc/ObstaclesBlackdots.gif | Bin 0 -> 38840 bytes
docs/_static/videos/wfc/ObstaclesHogs2.gif | Bin 0 -> 44915 bytes
docs/_static/videos/wfc/ObstaclesHogs3.gif | Bin 0 -> 37277 bytes
docs/_static/videos/wfc/RoomsFabric.gif | Bin 0 -> 33641 bytes
docs/_static/videos/wfc/RoomsMagicOffice.gif | Bin 0 -> 41344 bytes
docs/_static/videos/wfc/RoomsOffice.gif | Bin 0 -> 43921 bytes
docs/_static/videos/wfc/Skew2.gif | Bin 0 -> 30116 bytes
docs/_static/videos/wfc/SkewCave.gif | Bin 0 -> 39144 bytes
docs/_static/videos/wfc/SkewLake.gif | Bin 0 -> 40339 bytes
docs/_static/videos/wfc/WFCEnv.gif | Bin 0 -> 33927 bytes
docs/content/publications.md | 1 +
docs/environments/wfc/index.md | 18 ++++++++
docs/index.md | 1 +
minigrid/__init__.py | 9 +---
minigrid/envs/wfc/config.py | 13 ++++++
minigrid/envs/wfc/patterns/Blackdots.png | Bin 2804 -> 9055 bytes
minigrid/envs/wfc/patterns/SimpleWall.png | Bin 138 -> 4239 bytes
minigrid/envs/wfc/wfcenv.py | 40 ++++++++++++++++--
minigrid/envs/wfc/wfclogic/control.py | 1 -
37 files changed, 122 insertions(+), 16 deletions(-)
create mode 100644 docs/_static/videos/minigrid/ObstructedMaze_Full_V1.gif
create mode 100644 docs/_static/videos/wfc/Dungeon.gif
create mode 100644 docs/_static/videos/wfc/DungeonLessRooms.gif
create mode 100644 docs/_static/videos/wfc/DungeonMazeScaled.gif
create mode 100644 docs/_static/videos/wfc/DungeonRooms.gif
create mode 100644 docs/_static/videos/wfc/DungeonSpirals.gif
create mode 100644 docs/_static/videos/wfc/Maze.gif
create mode 100644 docs/_static/videos/wfc/MazeKnot.gif
create mode 100644 docs/_static/videos/wfc/MazePaths.gif
create mode 100644 docs/_static/videos/wfc/MazeSimple.gif
create mode 100644 docs/_static/videos/wfc/MazeSpirals.gif
create mode 100644 docs/_static/videos/wfc/MazeWall.gif
create mode 100644 docs/_static/videos/wfc/Mazelike.gif
create mode 100644 docs/_static/videos/wfc/ObstaclesAngular.gif
create mode 100644 docs/_static/videos/wfc/ObstaclesBlackdots.gif
create mode 100644 docs/_static/videos/wfc/ObstaclesHogs2.gif
create mode 100644 docs/_static/videos/wfc/ObstaclesHogs3.gif
create mode 100644 docs/_static/videos/wfc/RoomsFabric.gif
create mode 100644 docs/_static/videos/wfc/RoomsMagicOffice.gif
create mode 100644 docs/_static/videos/wfc/RoomsOffice.gif
create mode 100644 docs/_static/videos/wfc/Skew2.gif
create mode 100644 docs/_static/videos/wfc/SkewCave.gif
create mode 100644 docs/_static/videos/wfc/SkewLake.gif
create mode 100644 docs/_static/videos/wfc/WFCEnv.gif
create mode 100644 docs/environments/wfc/index.md
diff --git a/docs/_scripts/gen_env_docs.py b/docs/_scripts/gen_env_docs.py
index d6b3f30bc..782f44428 100644
--- a/docs/_scripts/gen_env_docs.py
+++ b/docs/_scripts/gen_env_docs.py
@@ -19,6 +19,7 @@
filtered_envs_by_type = {}
env_names = []
babyai_envs = {}
+wfc_envs = {}
# Obtain filtered list
for env_spec in tqdm(all_envs):
@@ -32,6 +33,9 @@
curr_babyai_env = split[2]
babyai_env_name = curr_babyai_env.split(":")[1]
babyai_envs[babyai_env_name] = env_spec
+ elif len(split) > 2 and "wfc" in split[2]:
+ curr_wfc_env = env_spec.kwargs["wfc_config"]
+ wfc_envs[curr_wfc_env] = env_spec
elif env_module == "minigrid":
env_name = split[1]
filtered_envs_by_type[env_name] = env_spec
@@ -56,7 +60,13 @@
)
}
-for env_name, env_spec in chain(filtered_envs.items(), filtered_babyai_envs.items()):
+# Because they share a class, only the default (MazeSimple) environment should be kept
+canonical_wfc_env_name = "MazeSimple"
+filtered_wfc_envs = {canonical_wfc_env_name: wfc_envs[canonical_wfc_env_name]}
+
+for env_name, env_spec in chain(
+ filtered_envs.items(), filtered_babyai_envs.items(), filtered_wfc_envs.items()
+):
env = env_spec.make()
docstring = trim(env.unwrapped.__doc__)
diff --git a/docs/_scripts/gen_envs_display.py b/docs/_scripts/gen_envs_display.py
index 3deacea06..4221d0223 100644
--- a/docs/_scripts/gen_envs_display.py
+++ b/docs/_scripts/gen_envs_display.py
@@ -4,16 +4,41 @@
import gymnasium
+# Display bonus WFC presets
+from minigrid.envs.wfc import WFCEnv
+from minigrid.envs.wfc.config import (
+ WFC_PRESETS_INCONSISTENT,
+ WFC_PRESETS_SLOW,
+ register_wfc_presets,
+)
+from utils import env_name_format
+
+register_wfc_presets(WFC_PRESETS_INCONSISTENT, gymnasium.register)
+register_wfc_presets(WFC_PRESETS_SLOW, gymnasium.register)
+
+# Read name from the actual class so it is updated if the class name changes
+WFCENV_NAME = WFCEnv.__name__
+
+
+def title_from_id(env_id):
+ words = []
+ for chunk in env_id.split("_"):
+ words.extend(env_name_format(chunk).split(" "))
+
+ return " ".join(w.title() for w in words)
+
def create_grid_cell(type_id, env_id, base_path):
+ # All WFCEnv environments should link to WFCEnv page
+ href = f"{base_path}{env_id if type_id != 'wfc' else WFCENV_NAME}"
return f"""
-
+
- {' '.join(env_id.split('_')).title()}
+ {title_from_id(env_id)}
@@ -64,6 +89,10 @@ def generate_page(env, limit=-1, base_path=""):
env_name = split[-1].split(":")[-1]
env_type = env_module if len(split) == 2 else split[-1].split(":")[0]
+ if env_name == WFCENV_NAME:
+ env_name = env_spec.kwargs["wfc_config"]
+ assert isinstance(env_name, str)
+
if env_module == "minigrid":
if env_type not in type_dict.keys():
type_dict[env_type] = []
diff --git a/docs/_scripts/gen_gifs.py b/docs/_scripts/gen_gifs.py
index 3bdc92282..60f89aa0c 100644
--- a/docs/_scripts/gen_gifs.py
+++ b/docs/_scripts/gen_gifs.py
@@ -24,12 +24,18 @@
# iterate through all envspecs
for env_spec in tqdm(gymnasium.envs.registry.values()):
# minigrid.envs:Env or minigrid.envs.babyai:Env
+ if not isinstance(env_spec.entry_point, str):
+ continue
split = env_spec.entry_point.split(".")
# ignore minigrid.envs.env_type:Env
env_module = split[0]
env_name = split[-1].split(":")[-1]
env_type = env_module if len(split) == 2 else split[-1].split(":")[0]
+ # Override env_name for WFC to include the preset name
+ if env_name == "WFCEnv":
+ env_name = env_spec.kwargs["wfc_config"]
+
if env_module == "minigrid" and env_name not in envs_completed:
os.makedirs(os.path.join(output_dir, env_type), exist_ok=True)
path = os.path.join(output_dir, env_type, env_name + ".gif")
diff --git a/docs/_scripts/utils.py b/docs/_scripts/utils.py
index a182f3035..933393e29 100644
--- a/docs/_scripts/utils.py
+++ b/docs/_scripts/utils.py
@@ -32,7 +32,9 @@ def trim(docstring):
def env_name_format(str):
# KeyCorridorEnv
- split = re.findall(r"[A-Z](?:[a-z]+|[A-Z]*(?=[A-Z]|$))", str)
+ split = re.findall(r"[A-Z](?:[a-z]+[0-9]*|[A-Z]*[0-9]*(?=[A-Z]|$))", str)
+ if not split:
+ split.append(str)
# ['Key', 'Corridor', 'Env']
split = filter(lambda x: x.upper() != "ENV", split)
return " ".join(split)
diff --git a/docs/_static/videos/minigrid/ObstructedMaze_Full_V1.gif b/docs/_static/videos/minigrid/ObstructedMaze_Full_V1.gif
new file mode 100644
index 0000000000000000000000000000000000000000..289fc2d95bd546c4b89b1881381b141fd929cfb9
GIT binary patch
literal 23817
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
literal 0
HcmV?d00001
diff --git a/docs/_static/videos/wfc/Dungeon.gif b/docs/_static/videos/wfc/Dungeon.gif
new file mode 100644
index 0000000000000000000000000000000000000000..35c21a8a74b2cbbace77452e13ac86142e1d98b0
GIT binary patch
literal 36826
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 =CIp4Ag
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
literal 0
HcmV?d00001
diff --git a/docs/_static/videos/wfc/DungeonLessRooms.gif b/docs/_static/videos/wfc/DungeonLessRooms.gif
new file mode 100644
index 0000000000000000000000000000000000000000..f3b7a52d660e987d534dafdf35f0a59570197910
GIT binary patch
literal 38747
zcmeFYRcsuv_n@0L)Nq?L%nfrJW@wn1Ght@tOqi)*hK4x}!-SccX&RU?Gtc&S|GHZ3
z+zCn+t#&0|CcO9mSZ0|NtvNlZ*MH8q9G$(_i_Ez8OE%gNQs
z$z{pOh0Dpg$jKSV{ipp4{I5n1MNtq}Qxz3a5@%)p4*TKXDESi{4A;M&@jns&nHJ^~
z6bAkik<_33-r!GI^m-$Ie)orerjW^&nl%cD#$&VI7^y29jwfM=B9fjX8%d&7Enyt3
zFCI_(ZZeiF-B2=_#qDyu@uXBdohRsp4EWSorW_}lL=PBiET1n`DwOH;YCN7T=c~4U
zi)^Y~t~KnBB9>j+UuvKo9}*kqELv-E+#So2Z8;xk_T*T@&S-H6=nQ~GA(3nSF4yga
zrYp9gQMWt%i$a!Uy!Fa7DP>lFYoe{;U>cjv=AH4G@o>IOwK7c4o8fRtM{_(^9^|gI
zqG7PxWesY%0QcCO@1J?K&i)-qVlYrx;8xn43TDky==452)RQ*RwCV&sT%@(QK$n@{
zDIaeR=hvC?Qu%#aj(5lN;_n2c4(}7@z|-CSORvP+h=vmH*p`0-8PUoNoRE)0{|0}S
zNLLC*XO-F($22e74#qX6Gz=yTqy6SbYNg_<3aWA_AP>8h}OiJ30U?whI`)=
z5Xp&Nwi_>e|0)016TH=4Lc-$XPOKE?k*T4Kj^}ogng+gRa*mM|Bvo%|csEhdoo+u}
z!Ky7I!?dKlMB6|nawpSqhz=_=X_oFF$MdJDMWWsQk;P9mIQql<5FG2W{EtKxhXujZ
zV~2%dyvRpIfr;2Ku<7O%M*Nw0jf!NMG5W%qE@*{iRlS6a
zc6qBeGJU!(oUz5OENi1U=LCm%`9u>-jwv#tUMOkdX@c~!AEoTKupJ#3;~b=^q|mS8Q#2*n$shUO^Y7{a;lW{aXXq84(DgmQ8LkCw~+TqVQ-OD
zT;nK0ohNEEebex}GuQTLa%(maTH~xU7C^gO@!ePFfVD74< |