MiniCraft - MultiRoom

Reproduces the minigrid MultiRoom gridworld environment as a HierarchyCraft environment.

Minigrid representation:

HierarchyCraft requirements graph:

 1from typing import List
 2
 3from hcraft.elements import Item, Zone
 4from hcraft.task import GetItemTask
 5from hcraft.transformation import Transformation, Use, Yield, PLAYER, CURRENT_ZONE
 6
 7from hcraft.examples.minicraft.minicraft import MiniCraftEnv
 8
 9MINICRAFT_NAME = "MultiRoom"
10__doc__ = MiniCraftEnv.description(MINICRAFT_NAME, for_module_header=True)
11
12
13class MiniHCraftMultiRoom(MiniCraftEnv):
14    MINICRAFT_NAME = MINICRAFT_NAME
15    __doc__ = MiniCraftEnv.description(MINICRAFT_NAME)
16
17    GOAL = Item("goal")
18    """Goal to reach."""
19
20    def __init__(self, n_rooms: int = 6, **kwargs) -> None:
21        self.rooms = [Zone(f"Room {i + 1}") for i in range(n_rooms)]
22        self.task = GetItemTask(self.GOAL)
23        super().__init__(
24            self.MINICRAFT_NAME,
25            purpose=self.task,
26            start_zone=self.rooms[0],
27            **kwargs,
28        )
29
30    def build_transformations(self) -> List[Transformation]:
31        transformations = []
32        find_goal = Transformation(
33            "Find goal",
34            inventory_changes=[Yield(CURRENT_ZONE, self.GOAL, max=0)],
35            zone=self.rooms[-1],
36        )
37        transformations.append(find_goal)
38
39        reach_goal = Transformation(
40            "Reach goal",
41            inventory_changes=[
42                Use(CURRENT_ZONE, self.GOAL, consume=1),
43                Yield(PLAYER, self.GOAL),
44            ],
45        )
46        transformations.append(reach_goal)
47
48        for i, room in enumerate(self.rooms):
49            connected_rooms: List[Zone] = []
50            if i > 0:
51                connected_rooms.append(self.rooms[i - 1])
52            if i < len(self.rooms) - 1:
53                connected_rooms.append(self.rooms[i + 1])
54            for connected_room in connected_rooms:
55                transformations.append(
56                    Transformation(
57                        f"Go to {room.name} from {connected_room.name}",
58                        destination=room,
59                        zone=connected_room,
60                    )
61                )
62
63        return transformations

API Documentation

MINICRAFT_NAME = 'MultiRoom'
class MiniHCraftMultiRoom(typing.Generic[~ObsType, ~ActType]):
14class MiniHCraftMultiRoom(MiniCraftEnv):
15    MINICRAFT_NAME = MINICRAFT_NAME
16    __doc__ = MiniCraftEnv.description(MINICRAFT_NAME)
17
18    GOAL = Item("goal")
19    """Goal to reach."""
20
21    def __init__(self, n_rooms: int = 6, **kwargs) -> None:
22        self.rooms = [Zone(f"Room {i + 1}") for i in range(n_rooms)]
23        self.task = GetItemTask(self.GOAL)
24        super().__init__(
25            self.MINICRAFT_NAME,
26            purpose=self.task,
27            start_zone=self.rooms[0],
28            **kwargs,
29        )
30
31    def build_transformations(self) -> List[Transformation]:
32        transformations = []
33        find_goal = Transformation(
34            "Find goal",
35            inventory_changes=[Yield(CURRENT_ZONE, self.GOAL, max=0)],
36            zone=self.rooms[-1],
37        )
38        transformations.append(find_goal)
39
40        reach_goal = Transformation(
41            "Reach goal",
42            inventory_changes=[
43                Use(CURRENT_ZONE, self.GOAL, consume=1),
44                Yield(PLAYER, self.GOAL),
45            ],
46        )
47        transformations.append(reach_goal)
48
49        for i, room in enumerate(self.rooms):
50            connected_rooms: List[Zone] = []
51            if i > 0:
52                connected_rooms.append(self.rooms[i - 1])
53            if i < len(self.rooms) - 1:
54                connected_rooms.append(self.rooms[i + 1])
55            for connected_room in connected_rooms:
56                transformations.append(
57                    Transformation(
58                        f"Go to {room.name} from {connected_room.name}",
59                        destination=room,
60                        zone=connected_room,
61                    )
62                )
63
64        return transformations

Reproduces the minigrid MultiRoom gridworld environment as a HierarchyCraft environment.

MiniHCraftMultiRoom(n_rooms: int = 6, **kwargs)
21    def __init__(self, n_rooms: int = 6, **kwargs) -> None:
22        self.rooms = [Zone(f"Room {i + 1}") for i in range(n_rooms)]
23        self.task = GetItemTask(self.GOAL)
24        super().__init__(
25            self.MINICRAFT_NAME,
26            purpose=self.task,
27            start_zone=self.rooms[0],
28            **kwargs,
29        )
Arguments:
  • invalid_reward: Reward given to the agent for invalid actions. Defaults to -1.0.
  • max_step: Maximum number of steps before episode truncation. If None, never truncates the episode. Defaults to None.
  • render_window: Window using to render the environment with pygame.
MINICRAFT_NAME = 'MultiRoom'
GOAL = Item(name='goal')

Goal to reach.

rooms
task
def build_transformations(self) -> List[hcraft.Transformation]:
31    def build_transformations(self) -> List[Transformation]:
32        transformations = []
33        find_goal = Transformation(
34            "Find goal",
35            inventory_changes=[Yield(CURRENT_ZONE, self.GOAL, max=0)],
36            zone=self.rooms[-1],
37        )
38        transformations.append(find_goal)
39
40        reach_goal = Transformation(
41            "Reach goal",
42            inventory_changes=[
43                Use(CURRENT_ZONE, self.GOAL, consume=1),
44                Yield(PLAYER, self.GOAL),
45            ],
46        )
47        transformations.append(reach_goal)
48
49        for i, room in enumerate(self.rooms):
50            connected_rooms: List[Zone] = []
51            if i > 0:
52                connected_rooms.append(self.rooms[i - 1])
53            if i < len(self.rooms) - 1:
54                connected_rooms.append(self.rooms[i + 1])
55            for connected_room in connected_rooms:
56                transformations.append(
57                    Transformation(
58                        f"Go to {room.name} from {connected_room.name}",
59                        destination=room,
60                        zone=connected_room,
61                    )
62                )
63
64        return transformations

Build transformations for this MiniCraft environment

Inherited Members
hcraft.examples.minicraft.minicraft.MiniCraftEnv
description
hcraft.env.HcraftEnv
world
invalid_reward
max_step
name
render_window
render_mode
state
current_step
current_score
cumulated_score
episodes
task_successes
terminal_successes
purpose
metadata
truncated
observation_space
action_space
action_masks
step
render
reset
close
all_behaviors
solving_behavior
planning_problem
infos
gymnasium.core.Env
spec
unwrapped
np_random_seed
np_random
has_wrapper_attr
get_wrapper_attr
set_wrapper_attr