MiniCraft - FourRooms

Reproduces the minigrid FourRooms gridworld environment as a HierarchyCraft environment.

Minigrid representation:

HierarchyCraft requirements graph:

 1from typing import Dict, List, TypeVar
 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
 9
10MINICRAFT_NAME = "FourRooms"
11__doc__ = MiniCraftEnv.description(MINICRAFT_NAME, for_module_header=True)
12
13
14class MiniHCraftFourRooms(MiniCraftEnv):
15    MINICRAFT_NAME = MINICRAFT_NAME
16    __doc__ = MiniCraftEnv.description(MINICRAFT_NAME)
17
18    SOUTH_WEST_ROOM = Zone("South-West")
19    """South west room."""
20
21    SOUTH_EAST_ROOM = Zone("South-East")
22    """South east room."""
23
24    NORTH_WEST_ROOM = Zone("North-West")
25    """North west room."""
26
27    NORTH_EAST_ROOM = Zone("North-East")
28    """North east room."""
29
30    GOAL = Item("goal")
31    """Goal to reach."""
32
33    def __init__(self, **kwargs) -> None:
34        self.task = GetItemTask(self.GOAL)
35
36        self.ROOMS = [
37            self.SOUTH_WEST_ROOM,
38            self.SOUTH_EAST_ROOM,
39            self.NORTH_EAST_ROOM,
40            self.NORTH_WEST_ROOM,
41        ]
42
43        super().__init__(
44            self.MINICRAFT_NAME,
45            start_zone=self.SOUTH_WEST_ROOM,
46            purpose=self.task,
47            **kwargs,
48        )
49
50    def build_transformations(self) -> List[Transformation]:
51        find_goal = Transformation(
52            "find-goal",
53            inventory_changes=[Yield(CURRENT_ZONE, self.GOAL, max=0)],
54            zone=self.NORTH_EAST_ROOM,
55        )
56
57        reach_goal = Transformation(
58            "reach-goal",
59            inventory_changes=[
60                Use(CURRENT_ZONE, self.GOAL, consume=1),
61                Yield(PLAYER, self.GOAL),
62            ],
63        )
64
65        neighbors = _get_rooms_connections(self.ROOMS)
66
67        moves = []
68        for destination, neighbor_rooms in neighbors.items():
69            for neighbor_room in neighbor_rooms:
70                moves.append(
71                    Transformation(
72                        f"go-to-{destination.name}-from-{neighbor_room.name}",
73                        destination=destination,
74                        zone=neighbor_room,
75                    )
76                )
77
78        return [find_goal, reach_goal] + moves
79
80
81Room = TypeVar("Room")
82
83
84def _get_rooms_connections(rooms: List[Room]) -> Dict[Room, List[Room]]:
85    neighbors = {}
86    for room_id, destination in enumerate(rooms):
87        neighbors[destination] = [rooms[room_id - 1], rooms[(room_id + 1) % len(rooms)]]
88    return neighbors

API Documentation

MINICRAFT_NAME = 'FourRooms'
class MiniHCraftFourRooms(typing.Generic[~ObsType, ~ActType]):
15class MiniHCraftFourRooms(MiniCraftEnv):
16    MINICRAFT_NAME = MINICRAFT_NAME
17    __doc__ = MiniCraftEnv.description(MINICRAFT_NAME)
18
19    SOUTH_WEST_ROOM = Zone("South-West")
20    """South west room."""
21
22    SOUTH_EAST_ROOM = Zone("South-East")
23    """South east room."""
24
25    NORTH_WEST_ROOM = Zone("North-West")
26    """North west room."""
27
28    NORTH_EAST_ROOM = Zone("North-East")
29    """North east room."""
30
31    GOAL = Item("goal")
32    """Goal to reach."""
33
34    def __init__(self, **kwargs) -> None:
35        self.task = GetItemTask(self.GOAL)
36
37        self.ROOMS = [
38            self.SOUTH_WEST_ROOM,
39            self.SOUTH_EAST_ROOM,
40            self.NORTH_EAST_ROOM,
41            self.NORTH_WEST_ROOM,
42        ]
43
44        super().__init__(
45            self.MINICRAFT_NAME,
46            start_zone=self.SOUTH_WEST_ROOM,
47            purpose=self.task,
48            **kwargs,
49        )
50
51    def build_transformations(self) -> List[Transformation]:
52        find_goal = Transformation(
53            "find-goal",
54            inventory_changes=[Yield(CURRENT_ZONE, self.GOAL, max=0)],
55            zone=self.NORTH_EAST_ROOM,
56        )
57
58        reach_goal = Transformation(
59            "reach-goal",
60            inventory_changes=[
61                Use(CURRENT_ZONE, self.GOAL, consume=1),
62                Yield(PLAYER, self.GOAL),
63            ],
64        )
65
66        neighbors = _get_rooms_connections(self.ROOMS)
67
68        moves = []
69        for destination, neighbor_rooms in neighbors.items():
70            for neighbor_room in neighbor_rooms:
71                moves.append(
72                    Transformation(
73                        f"go-to-{destination.name}-from-{neighbor_room.name}",
74                        destination=destination,
75                        zone=neighbor_room,
76                    )
77                )
78
79        return [find_goal, reach_goal] + moves

Reproduces the minigrid FourRooms gridworld environment as a HierarchyCraft environment.

MiniHCraftFourRooms(**kwargs)
34    def __init__(self, **kwargs) -> None:
35        self.task = GetItemTask(self.GOAL)
36
37        self.ROOMS = [
38            self.SOUTH_WEST_ROOM,
39            self.SOUTH_EAST_ROOM,
40            self.NORTH_EAST_ROOM,
41            self.NORTH_WEST_ROOM,
42        ]
43
44        super().__init__(
45            self.MINICRAFT_NAME,
46            start_zone=self.SOUTH_WEST_ROOM,
47            purpose=self.task,
48            **kwargs,
49        )
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 = 'FourRooms'
SOUTH_WEST_ROOM = Zone(name='South-West')

South west room.

SOUTH_EAST_ROOM = Zone(name='South-East')

South east room.

NORTH_WEST_ROOM = Zone(name='North-West')

North west room.

NORTH_EAST_ROOM = Zone(name='North-East')

North east room.

GOAL = Item(name='goal')

Goal to reach.

task
ROOMS
def build_transformations(self) -> List[hcraft.Transformation]:
51    def build_transformations(self) -> List[Transformation]:
52        find_goal = Transformation(
53            "find-goal",
54            inventory_changes=[Yield(CURRENT_ZONE, self.GOAL, max=0)],
55            zone=self.NORTH_EAST_ROOM,
56        )
57
58        reach_goal = Transformation(
59            "reach-goal",
60            inventory_changes=[
61                Use(CURRENT_ZONE, self.GOAL, consume=1),
62                Yield(PLAYER, self.GOAL),
63            ],
64        )
65
66        neighbors = _get_rooms_connections(self.ROOMS)
67
68        moves = []
69        for destination, neighbor_rooms in neighbors.items():
70            for neighbor_room in neighbor_rooms:
71                moves.append(
72                    Transformation(
73                        f"go-to-{destination.name}-from-{neighbor_room.name}",
74                        destination=destination,
75                        zone=neighbor_room,
76                    )
77                )
78
79        return [find_goal, reach_goal] + moves

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