gen_mds.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. __author__ = "Feng Gu"
  2. __email__ = "contact@fenggu.me"
  3. """
  4. isort:skip_file
  5. """
  6. import os
  7. import re
  8. from gymnasium.envs.registration import registry
  9. from tqdm import tqdm
  10. from utils import trim
  11. from itertools import chain
  12. from utils import env_name_format
  13. readme_path = os.path.join(
  14. os.path.dirname(os.path.dirname(os.path.dirname(__file__))),
  15. "README.md",
  16. )
  17. LAYOUT = "env"
  18. pattern = re.compile(r"(?<!^)(?=[A-Z])")
  19. all_envs = list(registry.values())
  20. filtered_envs_by_type = {}
  21. env_names = []
  22. babyai_envs = {}
  23. # Obtain filtered list
  24. for env_spec in tqdm(all_envs):
  25. if isinstance(env_spec.entry_point, str):
  26. # minigrid.envs:Env
  27. split = env_spec.entry_point.split(".")
  28. # ignore gymnasium.envs.env_type:Env
  29. env_module = split[0]
  30. if len(split) > 2 and "babyai" in split[2]:
  31. curr_babyai_env = split[2]
  32. babyai_env_name = curr_babyai_env.split(":")[1]
  33. babyai_envs[babyai_env_name] = env_spec
  34. elif env_module == "minigrid":
  35. env_name = split[1]
  36. filtered_envs_by_type[env_name] = env_spec
  37. # if env_module != "minigrid":
  38. else:
  39. continue
  40. filtered_envs = {
  41. env[0]: env[1]
  42. for env in sorted(
  43. filtered_envs_by_type.items(),
  44. key=lambda item: item[1].entry_point.split(".")[1],
  45. )
  46. }
  47. filtered_babyai_envs = {
  48. env[0]: env[1]
  49. for env in sorted(
  50. babyai_envs.items(),
  51. key=lambda item: item[1].entry_point.split(".")[1],
  52. )
  53. }
  54. for env_name, env_spec in chain(filtered_envs.items(), filtered_babyai_envs.items()):
  55. made = env_spec.make()
  56. docstring = trim(made.unwrapped.__doc__)
  57. # minigrid.envs:Env or minigrid.envs.babyai:Env
  58. split = env_spec.entry_point.split(".")
  59. # ignore minigrid.envs.env_type:Env
  60. env_module = split[0]
  61. env_name = split[-1].split(":")[-1]
  62. env_type = env_module if len(split) == 2 else split[-1].split(":")[0]
  63. path_name = ""
  64. os.makedirs(
  65. os.path.join(
  66. os.path.dirname(os.path.dirname(__file__)), "environments", env_type
  67. ),
  68. exist_ok=True,
  69. )
  70. v_path = os.path.join(
  71. os.path.dirname(os.path.dirname(__file__)),
  72. "environments",
  73. env_type,
  74. f"{env_name}.md",
  75. )
  76. formatted_env_name = env_name_format(env_name)
  77. front_matter = f"""---
  78. autogenerated:
  79. title: {formatted_env_name}
  80. ---
  81. """
  82. title = f"# {formatted_env_name}"
  83. gif = (
  84. "```{figure} "
  85. + f"""/_static/videos/{env_type}/{env_name}.gif
  86. :alt: {formatted_env_name}
  87. :width: 200px
  88. ```
  89. """
  90. )
  91. if docstring is None:
  92. docstring = "No information provided"
  93. all_text = f"""{front_matter}
  94. {title}
  95. {gif}
  96. {docstring}
  97. """
  98. file = open(v_path, "w+", encoding="utf-8")
  99. file.write(all_text)
  100. file.close()