HierarchyCraft (hcraft for short) is a Python library designed to create arbitrary hierarchical environments that are compatible with both the OpenAI Gym Reinforcement Learning Framework and AIPlan4EU Unified Planning Framework. This library enables users to easily create complex hierarchical structures that can be used to test and develop various reinforcement learning or planning algorithms.
In environments built with HierarchyCraft the agent (player) has an inventory and can navigate into abstract zones that themselves have inventories.
The action space of HierarchyCraft environments consists of sub-tasks, referred to as Transformations, as opposed to detailed movements and controls. But each Transformations has specific requirements to be valid (eg. have enought of an item, be in the right place), and these requirements may necessitate the execution of other Transformations first, inherently creating a hierarchical structure in HierarchyCraft environments.
This concept is visually represented by the Requirements graph depicting the hierarchical relationships within each HierarchyCraft environment. The Requirements graph is directly constructed from the list of Transformations composing the environement.
More details about requirements graph can be found in the documentation at hcraft.requirements
and example of requirements graph for some HierarchyCraft environements can be found in hcraft.examples
.
HierarchyCraft returns vectorized state information, which plainly and directly describes the player's inventory, current positions, and the inventory of the current zone. Compared to benchmarks that return grids, pixel arrays, text or sound, we directly return a low-dimensional latent representation that doesn't need to be learned. Therefore saving compute time and allowing researchers to focus only the the hierarchical reasoning part.
See hcraft.state
for more details.
You can use HierarchyCraft to create various custom hierarchical environments from a list of customized Transformations.
See hcraft.env
for a complete tutorial on creating custom environments.
Without optional dependencies:
pip install hcraft
All hcraft environments can use a common graphical user interface that can be used with gui requirements:
pip install hcraft[gui]
Gym environment can be obtained with gym requirements:
pip install hcraft[gym]
Planning problems can be obtained throught the upf interface with planning requirements:
pip install hcraft[planning]
Some complex graph can be represented in html interactive visualisation:
pip install hcraft[htmlvis]
Install the graphical user interface optional dependencies:
pip install hcraft[gui]
You can directly try to play yourself with the GUI available for any HierarchyCraft environments, for example:
hcraft minecraft
For more examples:
hcraft --help
from hcraft import get_human_action
from hcraft.examples import MineHcraftEnv
env = MineHcraftEnv()
# or env: MineHcraftEnv = gym.make("MineHcraft-NoReward-v1")
n_episodes = 2
for _ in range(n_episodes):
env.reset()
done = False
total_reward = 0
while not done:
env.render()
action = get_human_action(env)
print(f"Human pressed: {env.world.transformations[action]}")
_observation, reward, done, _info = env.step(action)
total_reward += reward
print(f"SCORE: {total_reward}")
Using the programmatic interface, any HierarchyCraft environment can easily be interfaced with classic reinforcement learning agents.
import numpy as np
from hcraft.examples import MineHcraftEnv
def random_legal_agent(observation, action_is_legal):
action = np.random.choice(np.nonzero(action_is_legal)[0])
return int(action)
env = MineHcraftEnv(max_step=10)
done = False
observation = env.reset()
while not done:
action_is_legal = env.action_masks()
action = random_legal_agent(observation, action_is_legal)
_observation, _reward, done, _info = env.step(action)
# Other examples of HierarchyCraft environments
from hcraft.examples import TowerHcraftEnv, RecursiveHcraftEnv, RandomHcraftEnv
tower_env = TowerHcraftEnv(height=3, width=2)
# or tower_env = gym.make("TowerHcraft-v1", height=3, width=2)
recursive_env = RecursiveHcraftEnv(n_items=6)
# or recursive_env = gym.make("RecursiveHcraft-v1", n_items=6)
random_env = RandomHcraftEnv(n_items_per_n_inputs={0:2, 1:5, 2:10}, seed=42)
# or random_env = gym.make("RandomHcraft-v1", n_items_per_n_inputs={0:2, 1:5, 2:10}, seed=42)
See hcraft.env
for a more complete description.
HierarchyCraft environments can be converted to planning problem in one line thanks to the Unified Planning Framework (UPF):
# Example env
env = TowerHcraftEnv(height=3, width=2)
# Make it into a unified planning problem
planning_problem = env.planning_problem()
print(planning_problem.upf_problem)
Then they can be solved with any compatible planner for UPF:
# Solve the planning problem and show the plan
planning_problem.solve()
print(planning_problem.plan)
The planning_problem can also give actions to do in the environment, triggering replaning if necessary:
# Automatically replan at the end of each plan until env termination
done = False
_observation = env.reset()
while not done:
action = planning_problem.action_from_plan(env.state)
if action is None:
# Plan is empty, nothing to do, thus terminates
done = True
continue
_observation, _reward, done, _ = env.step(action)
# Goal is achieved == purpose is terminated
if env.purpose.terminated:
print("Success ! The plan worked in the actual environment !")
else:
print("Failed ... Something went wrong with the plan.")
See hcraft.planning
for a more complete description.
Learn more in the DOCUMENTATION
You want to contribute to HierarchyCraft ? See our contributions guidelines and join us !