kaggle-environments 1.16.11__tar.gz → 1.17.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of kaggle-environments might be problematic. Click here for more details.

Files changed (226) hide show
  1. {kaggle-environments-1.16.11/kaggle_environments.egg-info → kaggle_environments-1.17.3}/PKG-INFO +25 -2
  2. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/__init__.py +18 -8
  3. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/luxai_s3/env.py +14 -7
  4. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/luxai_s3/params.py +5 -4
  5. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/luxai_s3/state.py +33 -17
  6. kaggle_environments-1.17.3/kaggle_environments/envs/open_spiel/games/__init__.py +0 -0
  7. kaggle_environments-1.17.3/kaggle_environments/envs/open_spiel/games/connect_four/__init__.py +0 -0
  8. kaggle_environments-1.17.3/kaggle_environments/envs/open_spiel/games/connect_four/connect_four.js +296 -0
  9. kaggle_environments-1.17.3/kaggle_environments/envs/open_spiel/games/connect_four/connect_four_proxy.py +86 -0
  10. kaggle_environments-1.17.3/kaggle_environments/envs/open_spiel/games/connect_four/connect_four_proxy_test.py +57 -0
  11. kaggle_environments-1.17.3/kaggle_environments/envs/open_spiel/observation.py +133 -0
  12. kaggle_environments-1.17.3/kaggle_environments/envs/open_spiel/open_spiel.py +416 -0
  13. kaggle_environments-1.17.3/kaggle_environments/envs/open_spiel/proxy.py +139 -0
  14. kaggle_environments-1.17.3/kaggle_environments/envs/open_spiel/proxy_test.py +64 -0
  15. kaggle_environments-1.17.3/kaggle_environments/envs/open_spiel/test_open_spiel.py +18 -0
  16. kaggle_environments-1.17.3/kaggle_environments/envs/rps/__init__.py +0 -0
  17. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3/kaggle_environments.egg-info}/PKG-INFO +25 -2
  18. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments.egg-info/SOURCES.txt +11 -0
  19. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments.egg-info/requires.txt +7 -6
  20. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/setup.py +1 -0
  21. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/LICENSE +0 -0
  22. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/MANIFEST.in +0 -0
  23. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/README.md +0 -0
  24. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/agent.py +0 -0
  25. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/api.py +0 -0
  26. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/core.py +0 -0
  27. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/chess/chess.js +0 -0
  28. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/chess/chess.json +0 -0
  29. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/chess/chess.py +0 -0
  30. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/chess/test_chess.py +0 -0
  31. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/connectx/connectx.js +0 -0
  32. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/connectx/connectx.json +0 -0
  33. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/connectx/connectx.py +0 -0
  34. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/connectx/test_connectx.py +0 -0
  35. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/football/football.json +0 -0
  36. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/football/football.py +0 -0
  37. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/football/helpers.py +0 -0
  38. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/football/test_football.py +0 -0
  39. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/halite/__init__.py +0 -0
  40. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/halite/halite.js +0 -0
  41. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/halite/halite.json +0 -0
  42. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/halite/halite.py +0 -0
  43. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/halite/helpers.py +0 -0
  44. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/halite/test_halite.py +0 -0
  45. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/hungry_geese/__init__.py +0 -0
  46. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/hungry_geese/hungry_geese.js +0 -0
  47. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/hungry_geese/hungry_geese.json +0 -0
  48. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/hungry_geese/hungry_geese.py +0 -0
  49. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/hungry_geese/test_hungry_geese.py +0 -0
  50. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/identity/identity.json +0 -0
  51. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/identity/identity.py +0 -0
  52. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/__init__.py +0 -0
  53. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/helpers.py +0 -0
  54. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/kore_fleets.js +0 -0
  55. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/kore_fleets.json +0 -0
  56. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/kore_fleets.py +0 -0
  57. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/java/main.py +0 -0
  58. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/java/test/configuration.json +0 -0
  59. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/java/test/fullob.json +0 -0
  60. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/java/test/observation.json +0 -0
  61. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/python/__init__.py +0 -0
  62. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/python/main.py +0 -0
  63. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/Bot.ts +0 -0
  64. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/DoNothingBot.ts +0 -0
  65. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/MinerBot.ts +0 -0
  66. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/interpreter.ts +0 -0
  67. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Board.ts +0 -0
  68. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Cell.ts +0 -0
  69. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Configuration.ts +0 -0
  70. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Direction.ts +0 -0
  71. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Fleet.ts +0 -0
  72. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/KoreIO.ts +0 -0
  73. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Observation.ts +0 -0
  74. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Pair.ts +0 -0
  75. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Player.ts +0 -0
  76. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Point.ts +0 -0
  77. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Shipyard.ts +0 -0
  78. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/ShipyardAction.ts +0 -0
  79. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/main.py +0 -0
  80. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/miner.py +0 -0
  81. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/package.json +0 -0
  82. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/test/BoardTest.ts +0 -0
  83. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ConfigurationTest.ts +0 -0
  84. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ObservationTest.ts +0 -0
  85. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/test/PointTest.ts +0 -0
  86. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ShipyardTest.ts +0 -0
  87. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/test/configuration.json +0 -0
  88. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/test/fullob.json +0 -0
  89. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/test/observation.json +0 -0
  90. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/tsconfig.json +0 -0
  91. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/test_kore_fleets.py +0 -0
  92. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/llm_20_questions/keywords.py +0 -0
  93. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/llm_20_questions/llm_20_questions.js +0 -0
  94. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/llm_20_questions/llm_20_questions.json +0 -0
  95. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/llm_20_questions/llm_20_questions.py +0 -0
  96. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/llm_20_questions/test_llm_20_questions.py +0 -0
  97. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/__init__.py +0 -0
  98. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/agents.py +0 -0
  99. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/dimensions/754.js +0 -0
  100. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/dimensions/main.js +0 -0
  101. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/index.html +0 -0
  102. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/lux_ai_2021.json +0 -0
  103. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/lux_ai_2021.py +0 -0
  104. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/__init__.py +0 -0
  105. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_constants.js +0 -0
  106. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_constants.json +0 -0
  107. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_objects.js +0 -0
  108. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/io.js +0 -0
  109. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/kit.js +0 -0
  110. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/map.js +0 -0
  111. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/parser.js +0 -0
  112. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/main.js +0 -0
  113. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/main.py +0 -0
  114. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/__init__.py +0 -0
  115. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/annotate.py +0 -0
  116. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/constants.py +0 -0
  117. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game.py +0 -0
  118. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_constants.json +0 -0
  119. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_constants.py +0 -0
  120. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_map.py +0 -0
  121. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_objects.py +0 -0
  122. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/python/random_agent.py +0 -0
  123. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/python/simple_agent.py +0 -0
  124. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_lux.py +0 -0
  125. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/__init__.py +0 -0
  126. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/agents.py +0 -0
  127. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/index.html +0 -0
  128. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/lux_ai_s2.json +0 -0
  129. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/lux_ai_s2.py +0 -0
  130. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/__init__.py +0 -0
  131. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/actions.py +0 -0
  132. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/config.py +0 -0
  133. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/env.py +0 -0
  134. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/factory.py +0 -0
  135. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/globals.py +0 -0
  136. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/map/__init__.py +0 -0
  137. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/map/bfs_deltas_gen.py +0 -0
  138. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/map/board.py +0 -0
  139. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/map/position.py +0 -0
  140. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/map_generator/__init__.py +0 -0
  141. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/map_generator/generator.py +0 -0
  142. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/map_generator/symnoise.py +0 -0
  143. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/map_generator/timing.py +0 -0
  144. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/map_generator/visualize.py +0 -0
  145. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/map_generator/visualize_samples.py +0 -0
  146. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/pyvisual/__init__.py +0 -0
  147. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/pyvisual/visualizer.py +0 -0
  148. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/replay/__init__.py +0 -0
  149. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/replay/replay.py +0 -0
  150. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/spaces/__init__.py +0 -0
  151. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/spaces/act_space.py +0 -0
  152. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/spaces/obs_space.py +0 -0
  153. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/state/__init__.py +0 -0
  154. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/state/state.py +0 -0
  155. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/state/stats.py +0 -0
  156. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/state/typing.py +0 -0
  157. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/team.py +0 -0
  158. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/tools/__init__.py +0 -0
  159. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/tools/replay.py +0 -0
  160. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/unit.py +0 -0
  161. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/utils/__init__.py +0 -0
  162. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/utils/animate.py +0 -0
  163. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/utils/heuristics/__init__.py +0 -0
  164. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/utils/heuristics/bidding.py +0 -0
  165. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/utils/heuristics/factory.py +0 -0
  166. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/utils/heuristics/factory_placement.py +0 -0
  167. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/utils/utils.py +0 -0
  168. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/version.py +0 -0
  169. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/wrappers/__init__.py +0 -0
  170. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/wrappers/controllers.py +0 -0
  171. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/wrappers/sb3.py +0 -0
  172. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/test_agents/python/agent.py +0 -0
  173. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/test_agents/python/lux/cargo.py +0 -0
  174. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/test_agents/python/lux/config.py +0 -0
  175. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/test_agents/python/lux/factory.py +0 -0
  176. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/test_agents/python/lux/kit.py +0 -0
  177. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/test_agents/python/lux/team.py +0 -0
  178. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/test_agents/python/lux/unit.py +0 -0
  179. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/test_agents/python/lux/utils.py +0 -0
  180. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/test_agents/python/main.py +0 -0
  181. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/test_lux.py +0 -0
  182. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/agents.py +0 -0
  183. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/index.html +0 -0
  184. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/lux_ai_s3.json +0 -0
  185. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/lux_ai_s3.py +0 -0
  186. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/luxai_s3/__init__.py +0 -0
  187. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/luxai_s3/globals.py +0 -0
  188. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/luxai_s3/profiler.py +0 -0
  189. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/luxai_s3/pygame_render.py +0 -0
  190. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/luxai_s3/spaces.py +0 -0
  191. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/luxai_s3/utils.py +0 -0
  192. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/luxai_s3/wrappers.py +0 -0
  193. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/test_agents/python/agent.py +0 -0
  194. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/__init__.py +0 -0
  195. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/kit.py +0 -0
  196. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/utils.py +0 -0
  197. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/test_agents/python/main.py +0 -0
  198. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/test_lux.py +0 -0
  199. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/mab/__init__.py +0 -0
  200. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/mab/agents.py +0 -0
  201. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/mab/mab.js +0 -0
  202. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/mab/mab.json +0 -0
  203. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/mab/mab.py +0 -0
  204. {kaggle-environments-1.16.11/kaggle_environments/envs/rps → kaggle_environments-1.17.3/kaggle_environments/envs/open_spiel}/__init__.py +0 -0
  205. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/rps/agents.py +0 -0
  206. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/rps/helpers.py +0 -0
  207. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/rps/rps.js +0 -0
  208. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/rps/rps.json +0 -0
  209. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/rps/rps.py +0 -0
  210. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/rps/test_rps.py +0 -0
  211. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/rps/utils.py +0 -0
  212. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/tictactoe/test_tictactoe.py +0 -0
  213. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/tictactoe/tictactoe.js +0 -0
  214. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/tictactoe/tictactoe.json +0 -0
  215. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/envs/tictactoe/tictactoe.py +0 -0
  216. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/errors.py +0 -0
  217. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/helpers.py +0 -0
  218. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/main.py +0 -0
  219. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/schemas.json +0 -0
  220. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/static/player.html +0 -0
  221. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/status_codes.json +0 -0
  222. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments/utils.py +0 -0
  223. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments.egg-info/dependency_links.txt +0 -0
  224. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments.egg-info/entry_points.txt +0 -0
  225. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/kaggle_environments.egg-info/top_level.txt +0 -0
  226. {kaggle-environments-1.16.11 → kaggle_environments-1.17.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: kaggle-environments
3
- Version: 1.16.11
3
+ Version: 1.17.3
4
4
  Summary: Kaggle Environments
5
5
  Home-page: https://github.com/Kaggle/kaggle-environments
6
6
  Author: Kaggle
@@ -10,6 +10,29 @@ Keywords: Kaggle
10
10
  Requires-Python: >=3.8
11
11
  Description-Content-Type: text/markdown
12
12
  License-File: LICENSE
13
+ Requires-Dist: jsonschema>=3.0.1
14
+ Requires-Dist: Flask>=1.1.2
15
+ Requires-Dist: numpy>=1.19.5
16
+ Requires-Dist: requests>=2.25.1
17
+ Requires-Dist: pettingzoo==1.24.0
18
+ Requires-Dist: gymnasium==0.29.0
19
+ Requires-Dist: stable-baselines3==2.1.0
20
+ Requires-Dist: transformers>=4.33.1
21
+ Requires-Dist: scipy>=1.11.2
22
+ Requires-Dist: shimmy>=1.2.1
23
+ Requires-Dist: Chessnut>=0.4.1
24
+ Requires-Dist: open_spiel>=1.5.0
25
+ Dynamic: author
26
+ Dynamic: author-email
27
+ Dynamic: description
28
+ Dynamic: description-content-type
29
+ Dynamic: home-page
30
+ Dynamic: keywords
31
+ Dynamic: license
32
+ Dynamic: license-file
33
+ Dynamic: requires-dist
34
+ Dynamic: requires-python
35
+ Dynamic: summary
13
36
 
14
37
  # [<img src="https://kaggle.com/static/images/site-logo.png" height="50" style="margin-bottom:-15px" />](https://kaggle.com) Environments
15
38
 
@@ -20,7 +20,7 @@ from .core import *
20
20
  from .main import http_request
21
21
  from . import errors
22
22
 
23
- __version__ = "1.16.11"
23
+ __version__ = "1.17.3"
24
24
 
25
25
  __all__ = ["Agent", "environments", "errors", "evaluate", "http_request",
26
26
  "make", "register", "utils", "__version__",
@@ -31,13 +31,23 @@ __all__ = ["Agent", "environments", "errors", "evaluate", "http_request",
31
31
  for name in listdir(utils.envs_path):
32
32
  try:
33
33
  env = import_module(f".envs.{name}.{name}", __name__)
34
- register(name, {
35
- "agents": getattr(env, "agents", []),
36
- "html_renderer": getattr(env, "html_renderer", None),
37
- "interpreter": getattr(env, "interpreter"),
38
- "renderer": getattr(env, "renderer"),
39
- "specification": getattr(env, "specification"),
40
- })
34
+ if name == "open_spiel":
35
+ for env_name, env_dict in env.registered_open_spiel_envs.items():
36
+ register(env_name, {
37
+ "agents": env_dict.get("agents"),
38
+ "html_renderer": env_dict.get("html_renderer"),
39
+ "interpreter": env_dict.get("interpreter"),
40
+ "renderer": env_dict.get("renderer"),
41
+ "specification": env_dict.get("specification"),
42
+ })
43
+ else:
44
+ register(name, {
45
+ "agents": getattr(env, "agents", []),
46
+ "html_renderer": getattr(env, "html_renderer", None),
47
+ "interpreter": getattr(env, "interpreter"),
48
+ "renderer": getattr(env, "renderer"),
49
+ "specification": getattr(env, "specification"),
50
+ })
41
51
  except Exception as e:
42
52
  if "football" not in name:
43
53
  print("Loading environment %s failed: %s" % (name, e))
@@ -148,6 +148,11 @@ class LuxAIS3Env(environment.Environment):
148
148
  i : max_sensor_range * 2 + 1 - i,
149
149
  i : max_sensor_range * 2 + 1 - i,
150
150
  ].set(val)
151
+ # vision of position at center of update has an extra 10
152
+ update = update.at[
153
+ max_sensor_range,
154
+ max_sensor_range,
155
+ ].add(10)
151
156
  vision_power_map = jax.lax.dynamic_update_slice(
152
157
  vision_power_map,
153
158
  update=update + existing_vision_power,
@@ -227,6 +232,10 @@ class LuxAIS3Env(environment.Environment):
227
232
  state = state.replace(
228
233
  units_mask=(state.units.energy[..., 0] >= 0) & state.units_mask
229
234
  )
235
+
236
+ """spawn relic nodes based on schedule"""
237
+ relic_nodes_mask = (state.steps >= state.relic_spawn_schedule) & (state.relic_spawn_schedule != -1)
238
+ state = state.replace(relic_nodes_mask=relic_nodes_mask)
230
239
 
231
240
  """ process unit movement """
232
241
  # 0 is do nothing, 1 is move up, 2 is move right, 3 is move down, 4 is move left, 5 is sap
@@ -646,11 +655,10 @@ class LuxAIS3Env(environment.Environment):
646
655
  axis=(0, 1),
647
656
  )
648
657
  new_tile_types_map = jnp.where(
649
- state.steps * params.nebula_tile_drift_speed % 1 == 0,
658
+ (state.steps - 1) * abs(params.nebula_tile_drift_speed) % 1 > state.steps * abs(params.nebula_tile_drift_speed) % 1,
650
659
  new_tile_types_map,
651
660
  state.map_features.tile_type,
652
661
  )
653
- # new_energy_nodes = state.energy_nodes + jnp.array([1 * jnp.sign(params.energy_node_drift_speed), -1 * jnp.sign(params.energy_node_drift_speed)])
654
662
 
655
663
  energy_node_deltas = jnp.round(
656
664
  jax.random.uniform(
@@ -663,8 +671,6 @@ class LuxAIS3Env(environment.Environment):
663
671
  energy_node_deltas_symmetric = jnp.stack(
664
672
  [-energy_node_deltas[:, 1], -energy_node_deltas[:, 0]], axis=-1
665
673
  )
666
- # TODO symmetric movement
667
- # energy_node_deltas = jnp.round(jax.random.uniform(key=key, shape=(params.max_energy_nodes // 2, 2), minval=-params.energy_node_drift_magnitude, maxval=params.energy_node_drift_magnitude)).astype(jnp.int16)
668
674
  energy_node_deltas = jnp.concatenate(
669
675
  (energy_node_deltas, energy_node_deltas_symmetric)
670
676
  )
@@ -677,7 +683,7 @@ class LuxAIS3Env(environment.Environment):
677
683
  ),
678
684
  )
679
685
  new_energy_nodes = jnp.where(
680
- state.steps * params.energy_node_drift_speed % 1 == 0,
686
+ (state.steps - 1) * abs(params.energy_node_drift_speed) % 1 > state.steps * abs(params.energy_node_drift_speed) % 1,
681
687
  new_energy_nodes,
682
688
  state.energy_nodes,
683
689
  )
@@ -688,7 +694,9 @@ class LuxAIS3Env(environment.Environment):
688
694
 
689
695
  # Compute relic scores
690
696
  def team_relic_score(unit_counts_map):
691
- scores = (unit_counts_map > 0) & (state.relic_nodes_map_weights > 0)
697
+ # not all relic nodes are spawned in yet, but relic nodes map ids are precomputed for all to be spawned relic nodes
698
+ # for efficiency. So we check if the relic node (by id) is spawned in yet. relic nodes mask is always increasing so we can do a simple trick below
699
+ scores = (unit_counts_map > 0) & (state.relic_nodes_map_weights <= state.relic_nodes_mask.sum() // 2) & (state.relic_nodes_map_weights > 0)
692
700
  return jnp.sum(scores, dtype=jnp.int32)
693
701
 
694
702
  # note we need to recompue unit counts since units can get removed due to collisions
@@ -771,7 +779,6 @@ class LuxAIS3Env(environment.Environment):
771
779
  )
772
780
  state = self.compute_energy_features(state, params)
773
781
  state = self.compute_sensor_masks(state, params)
774
-
775
782
  return self.get_obs(state, params=params, key=key), state
776
783
 
777
784
  @functools.partial(jax.jit, static_argnums=(0,))
@@ -46,6 +46,7 @@ class EnvParams:
46
46
  min_energy_per_tile: int = -20
47
47
 
48
48
  max_relic_nodes: int = 6
49
+ """max relic nodes in the entire map. This number should be tuned carefully as relic node spawning code is hardcoded against this number 6"""
49
50
  relic_config_size: int = 5
50
51
  fog_of_war: bool = True
51
52
  """
@@ -87,15 +88,15 @@ class EnvParams:
87
88
  env_params_ranges = dict(
88
89
  # map_type=[1],
89
90
  unit_move_cost=list(range(1, 6)),
90
- unit_sensor_range=list(range(2, 5)),
91
- nebula_tile_vision_reduction=list(range(0, 4)),
92
- nebula_tile_energy_reduction=[0, 0, 10, 25],
91
+ unit_sensor_range=[1, 2, 3, 4],
92
+ nebula_tile_vision_reduction=list(range(0, 8)),
93
+ nebula_tile_energy_reduction=[0, 1, 2, 3, 5, 25],
93
94
  unit_sap_cost=list(range(30, 51)),
94
95
  unit_sap_range=list(range(3, 8)),
95
96
  unit_sap_dropoff_factor=[0.25, 0.5, 1],
96
97
  unit_energy_void_factor=[0.0625, 0.125, 0.25, 0.375],
97
98
  # map randomizations
98
- nebula_tile_drift_speed=[-0.05, -0.025, 0.025, 0.05],
99
+ nebula_tile_drift_speed=[-0.15, -0.1, -0.05, -0.025, 0.025, 0.05, 0.1, 0.15],
99
100
  energy_node_drift_speed=[0.01, 0.02, 0.03, 0.04, 0.05],
100
101
  energy_node_drift_magnitude=list(range(3, 6)),
101
102
  )
@@ -66,7 +66,10 @@ class EnvState:
66
66
  relic_nodes_mask: chex.Array
67
67
  """Mask of relic nodes in the environment with shape (N, ) for N max relic nodes"""
68
68
  relic_nodes_map_weights: chex.Array
69
- """Map of relic nodes in the environment with shape (H, W) for H height, W width. True if a relic node is present, False otherwise. This is generated from other state"""
69
+ """Map of relic nodes in the environment with shape (H, W) for H height, W width. Each element is equal to the 1-indexed id of the relic node. This is generated from other state"""
70
+
71
+ relic_spawn_schedule: chex.Array
72
+ """Relic spawn schedule in the environment with shape (N, ) for N max relic nodes. Elements are the game timestep at which the relic node spawns"""
70
73
 
71
74
  map_features: MapTile
72
75
  """Map features in the environment with shape (W, H, 2) for W width, H height
@@ -121,7 +124,7 @@ class EnvObs:
121
124
 
122
125
  def serialize_env_states(env_states: list[EnvState]):
123
126
  def serialize_array(root: EnvState, arr, key_path: str = ""):
124
- if key_path in ["sensor_mask", "relic_nodes_mask", "energy_nodes_mask", "energy_node_fns", "relic_nodes_map_weights"]:
127
+ if key_path in ["sensor_mask", "relic_nodes_mask", "energy_nodes_mask", "energy_node_fns", "relic_nodes_map_weights", "relic_spawn_schedule"]:
125
128
  return None
126
129
  if key_path == "relic_nodes":
127
130
  return root.relic_nodes[root.relic_nodes_mask].tolist()
@@ -186,9 +189,10 @@ def gen_state(key: chex.PRNGKey, env_params: EnvParams, max_units: int, num_team
186
189
 
187
190
  # TODO (this could be optimized better)
188
191
  def update_relic_node(relic_nodes_map_weights, relic_data):
189
- relic_node, relic_node_config, mask = relic_data
192
+ relic_node, relic_node_config, mask, relic_node_id = relic_data
190
193
  start_y = relic_node[1] - relic_config_size // 2
191
194
  start_x = relic_node[0] - relic_config_size // 2
195
+
192
196
  for dy in range(relic_config_size):
193
197
  for dx in range(relic_config_size):
194
198
  y, x = start_y + dy, start_x + dx
@@ -196,14 +200,20 @@ def gen_state(key: chex.PRNGKey, env_params: EnvParams, max_units: int, num_team
196
200
  jnp.logical_and(y >= 0, x >= 0),
197
201
  jnp.logical_and(y < map_height, x < map_width),
198
202
  )
203
+ # ensure we don't override previous spawns
204
+ has_points = jnp.logical_and(
205
+ relic_nodes_map_weights > 0,
206
+ relic_nodes_map_weights <= relic_node_id + 1
207
+ )
199
208
  relic_nodes_map_weights = jnp.where(
200
- valid_pos & mask,
201
- relic_nodes_map_weights.at[x, y].add(relic_node_config[dx, dy].astype(jnp.int16)),
209
+ valid_pos & mask & jnp.logical_not(has_points) & relic_node_config[dx, dy],
210
+ relic_nodes_map_weights.at[x, y].set(relic_node_config[dx, dy].astype(jnp.int16) * (relic_node_id + 1)),
202
211
  relic_nodes_map_weights,
203
212
  )
204
213
  return relic_nodes_map_weights, None
205
214
 
206
215
  # this is really slow...
216
+
207
217
  relic_nodes_map_weights, _ = jax.lax.scan(
208
218
  update_relic_node,
209
219
  relic_nodes_map_weights,
@@ -211,8 +221,10 @@ def gen_state(key: chex.PRNGKey, env_params: EnvParams, max_units: int, num_team
211
221
  generated["relic_nodes"],
212
222
  generated["relic_node_configs"],
213
223
  generated["relic_nodes_mask"],
224
+ jnp.arange(max_relic_nodes, dtype=jnp.int16) % (max_relic_nodes // 2),
214
225
  ),
215
226
  )
227
+
216
228
  state = EnvState(
217
229
  units=UnitState(position=jnp.zeros(shape=(num_teams, max_units, 2), dtype=jnp.int16), energy=jnp.zeros(shape=(num_teams, max_units, 1), dtype=jnp.int16)),
218
230
  units_mask=jnp.zeros(
@@ -225,9 +237,10 @@ def gen_state(key: chex.PRNGKey, env_params: EnvParams, max_units: int, num_team
225
237
  energy_nodes_mask=generated["energy_nodes_mask"],
226
238
  # energy_field=jnp.zeros(shape=(params.map_height, params.map_width), dtype=jnp.int16),
227
239
  relic_nodes=generated["relic_nodes"],
228
- relic_nodes_mask=generated["relic_nodes_mask"],
240
+ relic_nodes_mask=jnp.zeros(shape=(max_relic_nodes), dtype=jnp.bool), # as relic nodes are spawn in, we start with them all invisible.
229
241
  relic_node_configs=generated["relic_node_configs"],
230
242
  relic_nodes_map_weights=relic_nodes_map_weights,
243
+ relic_spawn_schedule=generated["relic_spawn_schedule"],
231
244
  sensor_mask=jnp.zeros(
232
245
  shape=(num_teams, map_height, map_width),
233
246
  dtype=jnp.bool,
@@ -276,7 +289,7 @@ def gen_map(key: chex.PRNGKey, params: EnvParams, map_type: int, map_height: int
276
289
  flat_indices = jnp.argsort(noise.ravel())[-max_relic_nodes // 2:] # Get indices of two highest values
277
290
  highest_positions = jnp.column_stack(jnp.unravel_index(flat_indices, noise.shape))
278
291
 
279
- # relic nodes have a fixed density of 25% nearby tiles can yield points
292
+ # relic nodes have a fixed density of 20% nearby tiles can yield points
280
293
  relic_node_configs = (
281
294
  jax.random.randint(
282
295
  key,
@@ -291,18 +304,15 @@ def gen_map(key: chex.PRNGKey, params: EnvParams, map_type: int, map_height: int
291
304
  >= 7.5
292
305
  )
293
306
  highest_positions = highest_positions.astype(jnp.int16)
294
- relic_nodes_mask = relic_nodes_mask.at[0].set(True)
295
- relic_nodes_mask = relic_nodes_mask.at[1].set(True)
296
307
  mirrored_positions = jnp.stack([map_width - highest_positions[:, 1] - 1, map_height - highest_positions[:, 0] - 1], dtype=jnp.int16, axis=-1)
297
308
  relic_nodes = jnp.concat([highest_positions, mirrored_positions], axis=0)
298
309
 
299
310
  key, subkey = jax.random.split(key)
300
- relic_nodes_mask_half = jax.random.randint(key, (max_relic_nodes // 2, ), minval=0, maxval=2).astype(jnp.bool)
301
- relic_nodes_mask_half = relic_nodes_mask_half.at[0].set(True)
302
- relic_nodes_mask = relic_nodes_mask.at[:max_relic_nodes // 2].set(relic_nodes_mask_half)
303
- relic_nodes_mask = relic_nodes_mask.at[max_relic_nodes // 2:].set(relic_nodes_mask_half)
304
- # import ipdb;ipdb.set_trace()
311
+ num_spawned_relic_nodes = jax.random.randint(key, (1, ), minval=1, maxval=(max_relic_nodes // 2) + 1)
312
+ relic_nodes_mask_half = jnp.arange(max_relic_nodes // 2) < num_spawned_relic_nodes
313
+ relic_nodes_mask = jnp.concat([relic_nodes_mask_half, relic_nodes_mask_half], axis=0)
305
314
  relic_node_configs = relic_node_configs.at[max_relic_nodes // 2:].set(relic_node_configs[:max_relic_nodes // 2].transpose(0, 2, 1)[:, ::-1, ::-1])
315
+ # note that relic nodes mask is always increasing.
306
316
 
307
317
  ### Generate energy nodes ###
308
318
  key, subkey = jax.random.split(key)
@@ -318,7 +328,6 @@ def gen_map(key: chex.PRNGKey, params: EnvParams, map_type: int, map_height: int
318
328
  energy_nodes_mask = energy_nodes_mask.at[:max_energy_nodes // 2].set(energy_nodes_mask_half)
319
329
  energy_nodes_mask = energy_nodes_mask.at[max_energy_nodes // 2:].set(energy_nodes_mask_half)
320
330
 
321
- # TODO (stao): provide more randomization options for energy node functions.
322
331
  energy_node_fns = jnp.array(
323
332
  [
324
333
  [0, 1.2, 1, 4],
@@ -331,8 +340,14 @@ def gen_map(key: chex.PRNGKey, params: EnvParams, map_type: int, map_height: int
331
340
  # [1, 4, 0, 0]
332
341
  ]
333
342
  )
334
- # import ipdb; ipdb.set_trace()
335
- # energy_node_fns = jnp.concat([energy_node_fns, jnp.zeros((params.max_energy_nodes - 2, 4), dtype=jnp.float32)], axis=0)
343
+
344
+ # generate a random relic spawn schedule
345
+ # if number is -1, then relic node is never spawned, otherwise spawn at that game timestep
346
+ assert max_relic_nodes == 6, "random map generation is hardcoded to use 6 relic nodes at most per map"
347
+ key, subkey = jax.random.split(key)
348
+ relic_spawn_schedule_half = jax.random.randint(key, (max_relic_nodes //2, ), minval=0, maxval=params.max_steps_in_match // 2) + jnp.arange(3) * (params.max_steps_in_match + 1)
349
+ relic_spawn_schedule = jnp.concat([relic_spawn_schedule_half, relic_spawn_schedule_half], axis=0)
350
+ relic_spawn_schedule = jnp.where(relic_nodes_mask, relic_spawn_schedule, -1)
336
351
 
337
352
 
338
353
  return dict(
@@ -343,6 +358,7 @@ def gen_map(key: chex.PRNGKey, params: EnvParams, map_type: int, map_height: int
343
358
  energy_nodes_mask=energy_nodes_mask,
344
359
  relic_nodes_mask=relic_nodes_mask,
345
360
  relic_node_configs=relic_node_configs,
361
+ relic_spawn_schedule=relic_spawn_schedule,
346
362
  )
347
363
  def interpolant(t):
348
364
  return t*t*t*(t*(t*6 - 15) + 10)
@@ -0,0 +1,296 @@
1
+ function renderer(options) {
2
+ const { environment, step, parent, interactive, isInteractive } = options;
3
+
4
+ const DEFAULT_NUM_ROWS = 6;
5
+ const DEFAULT_NUM_COLS = 7;
6
+ const PLAYER_SYMBOLS = ['O', 'X']; // O: Player 0 (Yellow), X: Player 1 (Red)
7
+ const PLAYER_COLORS = ['#facc15', '#ef4444']; // Yellow for 'O', Red for 'X'
8
+ const EMPTY_CELL_COLOR = '#e5e7eb';
9
+ const BOARD_COLOR = '#3b82f6';
10
+
11
+ const SVG_NS = "http://www.w3.org/2000/svg";
12
+ const CELL_UNIT_SIZE = 100;
13
+ const CIRCLE_RADIUS = CELL_UNIT_SIZE * 0.42;
14
+ const SVG_VIEWBOX_WIDTH = DEFAULT_NUM_COLS * CELL_UNIT_SIZE;
15
+ const SVG_VIEWBOX_HEIGHT = DEFAULT_NUM_ROWS * CELL_UNIT_SIZE;
16
+
17
+ let currentBoardSvgElement = null;
18
+ let currentStatusTextElement = null;
19
+ let currentWinnerTextElement = null;
20
+ let currentMessageBoxElement = typeof document !== 'undefined' ? document.getElementById('messageBox') : null;
21
+ let currentRendererContainer = null;
22
+ let currentTitleElement = null;
23
+
24
+ function _showMessage(message, type = 'info', duration = 3000) {
25
+ if (typeof document === 'undefined' || !document.body) return;
26
+ if (!currentMessageBoxElement) {
27
+ currentMessageBoxElement = document.createElement('div');
28
+ currentMessageBoxElement.id = 'messageBox';
29
+ currentMessageBoxElement.style.position = 'fixed';
30
+ currentMessageBoxElement.style.top = '10px';
31
+ currentMessageBoxElement.style.left = '50%';
32
+ currentMessageBoxElement.style.transform = 'translateX(-50%)';
33
+ currentMessageBoxElement.style.padding = '0.75rem 1rem';
34
+ currentMessageBoxElement.style.borderRadius = '0.375rem';
35
+ currentMessageBoxElement.style.boxShadow = '0 2px 4px rgba(0,0,0,0.1)';
36
+ currentMessageBoxElement.style.zIndex = '1000';
37
+ currentMessageBoxElement.style.opacity = '0';
38
+ currentMessageBoxElement.style.transition = 'opacity 0.3s ease-in-out, background-color 0.3s';
39
+ currentMessageBoxElement.style.fontSize = '0.875rem';
40
+ currentMessageBoxElement.style.fontFamily = "'Inter', sans-serif";
41
+ document.body.appendChild(currentMessageBoxElement);
42
+ }
43
+ currentMessageBoxElement.textContent = message;
44
+ currentMessageBoxElement.style.backgroundColor = type === 'error' ? '#ef4444' : '#10b981';
45
+ currentMessageBoxElement.style.color = 'white';
46
+ currentMessageBoxElement.style.opacity = '1';
47
+ setTimeout(() => { if (currentMessageBoxElement) currentMessageBoxElement.style.opacity = '0'; }, duration);
48
+ }
49
+
50
+ function _ensureRendererElements(parentElementToClear, rows, cols) {
51
+ if (!parentElementToClear) return false;
52
+ parentElementToClear.innerHTML = '';
53
+
54
+ currentRendererContainer = document.createElement('div');
55
+ currentRendererContainer.style.display = 'flex';
56
+ currentRendererContainer.style.flexDirection = 'column';
57
+ currentRendererContainer.style.alignItems = 'center';
58
+ currentRendererContainer.style.padding = '20px';
59
+ currentRendererContainer.style.boxSizing = 'border-box';
60
+ currentRendererContainer.style.width = '100%';
61
+ currentRendererContainer.style.height = '100%';
62
+ currentRendererContainer.style.fontFamily = "'Inter', sans-serif";
63
+
64
+ currentTitleElement = document.createElement('h1');
65
+ currentTitleElement.textContent = 'Connect Four';
66
+ currentTitleElement.style.fontSize = '1.875rem';
67
+ currentTitleElement.style.fontWeight = 'bold';
68
+ currentTitleElement.style.marginBottom = '1rem';
69
+ currentTitleElement.style.textAlign = 'center';
70
+ currentTitleElement.style.color = '#2563eb';
71
+ currentRendererContainer.appendChild(currentTitleElement);
72
+
73
+ currentBoardSvgElement = document.createElementNS(SVG_NS, "svg");
74
+ currentBoardSvgElement.setAttribute("viewBox", `0 0 ${SVG_VIEWBOX_WIDTH} ${SVG_VIEWBOX_HEIGHT}`);
75
+ currentBoardSvgElement.setAttribute("preserveAspectRatio", "xMidYMid meet");
76
+ currentBoardSvgElement.style.width = "auto";
77
+ currentBoardSvgElement.style.maxWidth = "500px";
78
+ currentBoardSvgElement.style.maxHeight = `calc(100vh - 200px)`;
79
+ currentBoardSvgElement.style.aspectRatio = `${cols} / ${rows}`;
80
+ currentBoardSvgElement.style.display = "block";
81
+ currentBoardSvgElement.style.margin = "0 auto 20px auto";
82
+
83
+ const boardBgRect = document.createElementNS(SVG_NS, "rect");
84
+ boardBgRect.setAttribute("x", "0");
85
+ boardBgRect.setAttribute("y", "0");
86
+ boardBgRect.setAttribute("width", SVG_VIEWBOX_WIDTH.toString());
87
+ boardBgRect.setAttribute("height", SVG_VIEWBOX_HEIGHT.toString());
88
+ boardBgRect.setAttribute("fill", BOARD_COLOR);
89
+ boardBgRect.setAttribute("rx", (CELL_UNIT_SIZE * 0.1).toString());
90
+ currentBoardSvgElement.appendChild(boardBgRect);
91
+
92
+ // SVG Circles are created with (0,0) being top-left visual circle
93
+ for (let r_visual = 0; r_visual < rows; r_visual++) {
94
+ for (let c_visual = 0; c_visual < cols; c_visual++) {
95
+ const circle = document.createElementNS(SVG_NS, "circle");
96
+ const cx = c_visual * CELL_UNIT_SIZE + CELL_UNIT_SIZE / 2;
97
+ const cy = r_visual * CELL_UNIT_SIZE + CELL_UNIT_SIZE / 2;
98
+ circle.setAttribute("id", `cell-${r_visual}-${c_visual}`);
99
+ circle.setAttribute("cx", cx.toString());
100
+ circle.setAttribute("cy", cy.toString());
101
+ circle.setAttribute("r", CIRCLE_RADIUS.toString());
102
+ circle.setAttribute("fill", EMPTY_CELL_COLOR);
103
+ currentBoardSvgElement.appendChild(circle);
104
+ }
105
+ }
106
+ currentRendererContainer.appendChild(currentBoardSvgElement);
107
+
108
+ const statusContainer = document.createElement('div');
109
+ statusContainer.style.padding = '10px 15px';
110
+ statusContainer.style.backgroundColor = 'white';
111
+ statusContainer.style.borderRadius = '8px';
112
+ statusContainer.style.boxShadow = '0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -1px rgba(0,0,0,0.06)';
113
+ statusContainer.style.textAlign = 'center';
114
+ statusContainer.style.width = 'auto';
115
+ statusContainer.style.minWidth = '200px';
116
+ statusContainer.style.maxWidth = '90vw';
117
+ currentRendererContainer.appendChild(statusContainer);
118
+
119
+ currentStatusTextElement = document.createElement('p');
120
+ currentStatusTextElement.style.fontSize = '1.1rem';
121
+ currentStatusTextElement.style.fontWeight = '600';
122
+ currentStatusTextElement.style.margin = '0 0 5px 0';
123
+ statusContainer.appendChild(currentStatusTextElement);
124
+
125
+ currentWinnerTextElement = document.createElement('p');
126
+ currentWinnerTextElement.style.fontSize = '1.25rem';
127
+ currentWinnerTextElement.style.fontWeight = '700';
128
+ currentWinnerTextElement.style.margin = '5px 0 0 0';
129
+ statusContainer.appendChild(currentWinnerTextElement);
130
+
131
+ parentElementToClear.appendChild(currentRendererContainer);
132
+
133
+ if (typeof document !== 'undefined' && !document.body.hasAttribute('data-renderer-initialized')) {
134
+ document.body.setAttribute('data-renderer-initialized', 'true');
135
+ }
136
+ return true;
137
+ }
138
+
139
+ function _renderBoardDisplay_svg(gameStateToDisplay, displayRows, displayCols) {
140
+ if (!currentBoardSvgElement || !currentStatusTextElement || !currentWinnerTextElement) return;
141
+
142
+ if (!gameStateToDisplay || typeof gameStateToDisplay.board !== 'object' || !Array.isArray(gameStateToDisplay.board) || gameStateToDisplay.board.length === 0) {
143
+ currentStatusTextElement.textContent = "Waiting for game data...";
144
+ currentWinnerTextElement.textContent = "";
145
+ for (let r_visual = 0; r_visual < displayRows; r_visual++) {
146
+ for (let c_visual = 0; c_visual < displayCols; c_visual++) {
147
+ const circleElement = currentBoardSvgElement.querySelector(`#cell-${r_visual}-${c_visual}`);
148
+ if (circleElement) {
149
+ circleElement.setAttribute("fill", EMPTY_CELL_COLOR);
150
+ }
151
+ }
152
+ }
153
+ return;
154
+ }
155
+
156
+ const { board, current_player, is_terminal, winner } = gameStateToDisplay;
157
+
158
+ for (let r_data = 0; r_data < displayRows; r_data++) {
159
+ const dataRow = board[r_data];
160
+ if (!dataRow || !Array.isArray(dataRow) || dataRow.length !== displayCols) {
161
+ // Error handling for malformed row
162
+ for (let c_fill = 0; c_fill < displayCols; c_fill++) {
163
+ // Determine visual row for error display. If r_data=0 is top data,
164
+ // and we want to flip, then this error is for visual row (displayRows-1)-0.
165
+ const visual_row_for_error = (displayRows - 1) - r_data;
166
+ const circleElement = currentBoardSvgElement.querySelector(`#cell-${visual_row_for_error}-${c_fill}`);
167
+ if (circleElement) circleElement.setAttribute("fill", '#FF00FF'); // Magenta for error
168
+ }
169
+ continue;
170
+ }
171
+
172
+ const visual_svg_row_index = (displayRows - 1) - r_data;
173
+
174
+ for (let c_data = 0; c_data < displayCols; c_data++) { // c_data iterates through columns of `board[r_data]`
175
+ const originalCellValue = dataRow[c_data];
176
+ const cellValueForComparison = String(originalCellValue).trim().toLowerCase();
177
+
178
+ // The column index for SVG is the same as c_data
179
+ const visual_svg_col_index = c_data;
180
+ const circleElement = currentBoardSvgElement.querySelector(`#cell-${visual_svg_row_index}-${visual_svg_col_index}`);
181
+
182
+ if (!circleElement) continue;
183
+
184
+ let fillColor = EMPTY_CELL_COLOR;
185
+ if (cellValueForComparison === "o") {
186
+ fillColor = PLAYER_COLORS[0]; // Yellow
187
+ } else if (cellValueForComparison === "x") {
188
+ fillColor = PLAYER_COLORS[1]; // Red
189
+ }
190
+ circleElement.setAttribute("fill", fillColor);
191
+ }
192
+ }
193
+
194
+ currentStatusTextElement.innerHTML = '';
195
+ currentWinnerTextElement.innerHTML = '';
196
+ if (is_terminal) {
197
+ currentStatusTextElement.textContent = "Game Over!";
198
+ if (winner !== null && winner !== undefined) {
199
+ if (String(winner).toLowerCase() === 'draw') {
200
+ currentWinnerTextElement.textContent = "It's a Draw!";
201
+ } else {
202
+ let winnerSymbolDisplay, winnerColorDisplay;
203
+ if (String(winner).toLowerCase() === "o") {
204
+ winnerSymbolDisplay = PLAYER_SYMBOLS[0];
205
+ winnerColorDisplay = PLAYER_COLORS[0];
206
+ } else if (String(winner).toLowerCase() === "x") {
207
+ winnerSymbolDisplay = PLAYER_SYMBOLS[1];
208
+ winnerColorDisplay = PLAYER_COLORS[1];
209
+ }
210
+ if (winnerSymbolDisplay) {
211
+ currentWinnerTextElement.innerHTML = `Player <span style="color: ${winnerColorDisplay}; font-weight: bold;">${winnerSymbolDisplay}</span> Wins!`;
212
+ } else {
213
+ currentWinnerTextElement.textContent = `Winner: ${String(winner).toUpperCase()}`;
214
+ }
215
+ }
216
+ } else { currentWinnerTextElement.textContent = "Game ended."; }
217
+ } else {
218
+ let playerSymbolToDisplay, playerColorToDisplay;
219
+ if (String(current_player).toLowerCase() === "o") {
220
+ playerSymbolToDisplay = PLAYER_SYMBOLS[0];
221
+ playerColorToDisplay = PLAYER_COLORS[0];
222
+ } else if (String(current_player).toLowerCase() === "x") {
223
+ playerSymbolToDisplay = PLAYER_SYMBOLS[1];
224
+ playerColorToDisplay = PLAYER_COLORS[1];
225
+ }
226
+ if (playerSymbolToDisplay) {
227
+ currentStatusTextElement.innerHTML = `Current Player: <span style="color: ${playerColorToDisplay}; font-weight: bold;">${playerSymbolToDisplay}</span>`;
228
+ } else {
229
+ currentStatusTextElement.textContent = "Waiting for player...";
230
+ }
231
+ }
232
+ }
233
+
234
+ // --- Main execution logic ---
235
+ if (!_ensureRendererElements(parent, DEFAULT_NUM_ROWS, DEFAULT_NUM_COLS)) {
236
+ if (parent && typeof parent.innerHTML !== 'undefined') {
237
+ parent.innerHTML = "<p style='color:red; font-family: sans-serif;'>Critical Error: Renderer element setup failed.</p>";
238
+ }
239
+ return;
240
+ }
241
+
242
+ if (!environment || !environment.steps || !environment.steps[step]) {
243
+ _renderBoardDisplay_svg(null, DEFAULT_NUM_ROWS, DEFAULT_NUM_COLS);
244
+ if(currentStatusTextElement) currentStatusTextElement.textContent = "Initializing environment...";
245
+ return;
246
+ }
247
+
248
+ const currentStepAgents = environment.steps[step];
249
+ if (!currentStepAgents || !Array.isArray(currentStepAgents) || currentStepAgents.length === 0) {
250
+ _renderBoardDisplay_svg(null, DEFAULT_NUM_ROWS, DEFAULT_NUM_COLS);
251
+ if(currentStatusTextElement) currentStatusTextElement.textContent = "Waiting for agent data...";
252
+ return;
253
+ }
254
+
255
+ const gameMasterAgentIndex = currentStepAgents.length - 1;
256
+ const gameMasterAgent = currentStepAgents[gameMasterAgentIndex];
257
+
258
+ if (!gameMasterAgent || typeof gameMasterAgent.observation === 'undefined') {
259
+ _renderBoardDisplay_svg(null, DEFAULT_NUM_ROWS, DEFAULT_NUM_COLS);
260
+ if(currentStatusTextElement) currentStatusTextElement.textContent = "Waiting for observation data...";
261
+ return;
262
+ }
263
+ const observationForRenderer = gameMasterAgent.observation;
264
+
265
+ let gameSpecificState = null;
266
+
267
+ if (observationForRenderer && typeof observationForRenderer.observation_string === 'string' && observationForRenderer.observation_string.trim() !== '') {
268
+ try {
269
+ gameSpecificState = JSON.parse(observationForRenderer.observation_string);
270
+ } catch (e) {
271
+ _showMessage("Error: Corrupted game state (obs_string).", 'error');
272
+ }
273
+ }
274
+
275
+ if (!gameSpecificState && observationForRenderer && typeof observationForRenderer.json === 'string' && observationForRenderer.json.trim() !== '') {
276
+ try {
277
+ gameSpecificState = JSON.parse(observationForRenderer.json);
278
+ } catch (e) {
279
+ _showMessage("Error: Corrupted game state (json).", 'error');
280
+ }
281
+ }
282
+
283
+ if (!gameSpecificState && observationForRenderer &&
284
+ Array.isArray(observationForRenderer.board) &&
285
+ typeof observationForRenderer.current_player !== 'undefined'
286
+ ) {
287
+ if( (observationForRenderer.board.length === DEFAULT_NUM_ROWS &&
288
+ (observationForRenderer.board.length === 0 ||
289
+ (Array.isArray(observationForRenderer.board[0]) && observationForRenderer.board[0].length === DEFAULT_NUM_COLS)))
290
+ ){
291
+ gameSpecificState = observationForRenderer;
292
+ }
293
+ }
294
+
295
+ _renderBoardDisplay_svg(gameSpecificState, DEFAULT_NUM_ROWS, DEFAULT_NUM_COLS);
296
+ }