gen_envs_display.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. from __future__ import annotations
  2. import os
  3. import gymnasium
  4. # Display bonus WFC presets
  5. from minigrid.envs.wfc import WFCEnv
  6. from minigrid.envs.wfc.config import (
  7. WFC_PRESETS_INCONSISTENT,
  8. WFC_PRESETS_SLOW,
  9. register_wfc_presets,
  10. )
  11. from utils import env_name_format
  12. register_wfc_presets(WFC_PRESETS_INCONSISTENT, gymnasium.register)
  13. register_wfc_presets(WFC_PRESETS_SLOW, gymnasium.register)
  14. # Read name from the actual class so it is updated if the class name changes
  15. WFCENV_NAME = WFCEnv.__name__
  16. def title_from_id(env_id):
  17. words = []
  18. for chunk in env_id.split("_"):
  19. words.extend(env_name_format(chunk).split(" "))
  20. return " ".join(w.title() for w in words)
  21. def create_grid_cell(type_id, env_id, base_path):
  22. # All WFCEnv environments should link to WFCEnv page
  23. href = f"{base_path}{env_id if type_id != 'wfc' else WFCENV_NAME}"
  24. return f"""
  25. <a href="{href}">
  26. <div class="env-grid__cell">
  27. <div class="cell__image-container">
  28. <img src="/_static/videos/{type_id}/{env_id}.gif">
  29. </div>
  30. <div class="cell__title">
  31. <span>{title_from_id(env_id)}</span>
  32. </div>
  33. </div>
  34. </a>
  35. """
  36. def generate_page(env, limit=-1, base_path=""):
  37. env_type_id = env["id"]
  38. env_list = env["list"]
  39. cells = [create_grid_cell(env_type_id, env_id, base_path) for env_id in env_list]
  40. non_limited_page = limit == -1 or limit >= len(cells)
  41. if non_limited_page:
  42. cells = "\n".join(cells)
  43. else:
  44. cells = "\n".join(cells[:limit])
  45. more_btn = (
  46. """
  47. <a href="./complete_list">
  48. <button class="more-btn">
  49. See More Environments
  50. </button>
  51. </a>
  52. """
  53. if not non_limited_page
  54. else ""
  55. )
  56. return f"""
  57. <div class="env-grid">
  58. {cells}
  59. </div>
  60. {more_btn}
  61. """
  62. if __name__ == "__main__":
  63. """
  64. python gen_envs_display
  65. """
  66. type_dict = {}
  67. for env_spec in gymnasium.envs.registry.values():
  68. if isinstance(env_spec.entry_point, str):
  69. # minigrid.envs:Env or minigrid.envs.babyai:Env
  70. split = env_spec.entry_point.split(".")
  71. # ignore minigrid.envs.env_type:Env
  72. env_module = split[0]
  73. env_name = split[-1].split(":")[-1]
  74. env_type = env_module if len(split) == 2 else split[-1].split(":")[0]
  75. if env_name == WFCENV_NAME:
  76. env_name = env_spec.kwargs["wfc_config"]
  77. assert isinstance(env_name, str)
  78. if env_module == "minigrid":
  79. if env_type not in type_dict.keys():
  80. type_dict[env_type] = []
  81. if env_name not in type_dict[env_type]:
  82. type_dict[env_type].append(env_name)
  83. else:
  84. continue
  85. for key, value in type_dict.items():
  86. env_type = key
  87. page = generate_page({"id": key, "list": value})
  88. fp = open(
  89. os.path.join(
  90. os.path.dirname(__file__), "..", "environments", env_type, "list.html"
  91. ),
  92. "w",
  93. encoding="utf-8",
  94. )
  95. fp.write(page)
  96. fp.close()