gen_env_docs.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. from __future__ import annotations
  2. import os
  3. import re
  4. from itertools import chain
  5. from gymnasium.envs.registration import registry
  6. from tqdm import tqdm
  7. from utils import env_name_format, trim
  8. readme_path = os.path.join(
  9. os.path.dirname(os.path.dirname(os.path.dirname(__file__))),
  10. "README.md",
  11. )
  12. all_envs = list(registry.values())
  13. filtered_envs_by_type = {}
  14. env_names = []
  15. babyai_envs = {}
  16. # Obtain filtered list
  17. for env_spec in tqdm(all_envs):
  18. if isinstance(env_spec.entry_point, str):
  19. # minigrid.envs:Env
  20. split = env_spec.entry_point.split(".")
  21. # ignore gymnasium.envs.env_type:Env
  22. env_module = split[0]
  23. if len(split) > 2 and "babyai" in split[2]:
  24. curr_babyai_env = split[2]
  25. babyai_env_name = curr_babyai_env.split(":")[1]
  26. babyai_envs[babyai_env_name] = env_spec
  27. elif env_module == "minigrid":
  28. env_name = split[1]
  29. filtered_envs_by_type[env_name] = env_spec
  30. # if env_module != "minigrid":
  31. else:
  32. continue
  33. filtered_envs = {
  34. env[0]: env[1]
  35. for env in sorted(
  36. filtered_envs_by_type.items(),
  37. key=lambda item: item[1].entry_point.split(".")[1],
  38. )
  39. }
  40. filtered_babyai_envs = {
  41. env[0]: env[1]
  42. for env in sorted(
  43. babyai_envs.items(),
  44. key=lambda item: item[1].entry_point.split(".")[1],
  45. )
  46. }
  47. for env_name, env_spec in chain(filtered_envs.items(), filtered_babyai_envs.items()):
  48. env = env_spec.make()
  49. docstring = trim(env.unwrapped.__doc__)
  50. # minigrid.envs:Env or minigrid.envs.babyai:Env
  51. split = env_spec.entry_point.split(".")
  52. # ignore minigrid.envs.env_type:Env
  53. env_module = split[0]
  54. env_name = split[-1].split(":")[-1]
  55. env_type = env_module if len(split) == 2 else split[-1].split(":")[0]
  56. path_name = ""
  57. os.makedirs(
  58. os.path.join(
  59. os.path.dirname(os.path.dirname(__file__)), "environments", env_type
  60. ),
  61. exist_ok=True,
  62. )
  63. v_path = os.path.join(
  64. os.path.dirname(os.path.dirname(__file__)),
  65. "environments",
  66. env_type,
  67. f"{env_name}.md",
  68. )
  69. formatted_env_name = env_name_format(env_name)
  70. # Front matter
  71. front_matter = f"""---
  72. autogenerated:
  73. title: {formatted_env_name}
  74. ---
  75. """
  76. # Title and gif
  77. title = f"# {formatted_env_name}"
  78. gif = (
  79. "```{figure} "
  80. + f"""/_static/videos/{env_type}/{env_name}.gif
  81. :alt: {formatted_env_name}
  82. :width: 200px
  83. ```
  84. """
  85. )
  86. # Environment attributes
  87. action_space_table = env.action_space.__repr__().replace("\n", "")
  88. observation_space_table = env.observation_space.__repr__().replace("\n", "")
  89. env_attributes = f"""
  90. | | |
  91. |---|---|
  92. | Action Space | `{re.sub(' +', ' ', action_space_table)}` |
  93. | Observation Space | `{re.sub(' +', ' ', observation_space_table)}` |
  94. | Reward Range | `{env.reward_range}` |
  95. | Creation | `gymnasium.make("{env_spec.id}")` |
  96. """
  97. # Create Markdown file content
  98. if docstring is None:
  99. docstring = "No information provided"
  100. all_text = f"""{front_matter}
  101. {title}
  102. {gif}
  103. {env_attributes}
  104. {docstring}
  105. """
  106. file = open(v_path, "w+", encoding="utf-8")
  107. file.write(all_text)
  108. file.close()