You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

132 lines
3.2 KiB

from __future__ import annotations
import os
import re
from itertools import chain
from gymnasium.envs.registration import registry
from tqdm import tqdm
from utils import env_name_format, trim
readme_path = os.path.join(
os.path.dirname(os.path.dirname(os.path.dirname(__file__))),
"README.md",
)
all_envs = list(registry.values())
filtered_envs_by_type = {}
env_names = []
babyai_envs = {}
# Obtain filtered list
for env_spec in tqdm(all_envs):
if isinstance(env_spec.entry_point, str):
# minigrid.envs:Env
split = env_spec.entry_point.split(".")
# ignore gymnasium.envs.env_type:Env
env_module = split[0]
if len(split) > 2 and "babyai" in split[2]:
curr_babyai_env = split[2]
babyai_env_name = curr_babyai_env.split(":")[1]
babyai_envs[babyai_env_name] = env_spec
elif env_module == "minigrid":
env_name = split[1]
filtered_envs_by_type[env_name] = env_spec
# if env_module != "minigrid":
else:
continue
filtered_envs = {
env[0]: env[1]
for env in sorted(
filtered_envs_by_type.items(),
key=lambda item: item[1].entry_point.split(".")[1],
)
}
filtered_babyai_envs = {
env[0]: env[1]
for env in sorted(
babyai_envs.items(),
key=lambda item: item[1].entry_point.split(".")[1],
)
}
for env_name, env_spec in chain(filtered_envs.items(), filtered_babyai_envs.items()):
env = env_spec.make()
docstring = trim(env.unwrapped.__doc__)
# minigrid.envs:Env or minigrid.envs.babyai:Env
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]
path_name = ""
os.makedirs(
os.path.join(
os.path.dirname(os.path.dirname(__file__)), "environments", env_type
),
exist_ok=True,
)
v_path = os.path.join(
os.path.dirname(os.path.dirname(__file__)),
"environments",
env_type,
f"{env_name}.md",
)
formatted_env_name = env_name_format(env_name)
# Front matter
front_matter = f"""---
autogenerated:
title: {formatted_env_name}
---
"""
# Title and gif
title = f"# {formatted_env_name}"
gif = (
"```{figure} "
+ f"""/_static/videos/{env_type}/{env_name}.gif
:alt: {formatted_env_name}
:width: 200px
```
"""
)
# Environment attributes
action_space_table = env.action_space.__repr__().replace("\n", "")
observation_space_table = env.observation_space.__repr__().replace("\n", "")
env_attributes = f"""
| | |
|---|---|
| Action Space | `{re.sub(' +', ' ', action_space_table)}` |
| Observation Space | `{re.sub(' +', ' ', observation_space_table)}` |
| Reward Range | `{env.reward_range}` |
| Creation | `gymnasium.make("{env_spec.id}")` |
"""
# Create Markdown file content
if docstring is None:
docstring = "No information provided"
all_text = f"""{front_matter}
{title}
{gif}
{env_attributes}
{docstring}
"""
file = open(v_path, "w+", encoding="utf-8")
file.write(all_text)
file.close()