kaggle-environments 0.2.1__py3-none-any.whl → 1.20.0__py3-none-any.whl

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 (215) hide show
  1. kaggle_environments/__init__.py +49 -13
  2. kaggle_environments/agent.py +177 -124
  3. kaggle_environments/api.py +31 -0
  4. kaggle_environments/core.py +295 -170
  5. kaggle_environments/envs/cabt/cabt.js +164 -0
  6. kaggle_environments/envs/cabt/cabt.json +28 -0
  7. kaggle_environments/envs/cabt/cabt.py +186 -0
  8. kaggle_environments/envs/cabt/cg/__init__.py +0 -0
  9. kaggle_environments/envs/cabt/cg/cg.dll +0 -0
  10. kaggle_environments/envs/cabt/cg/game.py +75 -0
  11. kaggle_environments/envs/cabt/cg/libcg.so +0 -0
  12. kaggle_environments/envs/cabt/cg/sim.py +48 -0
  13. kaggle_environments/envs/cabt/test_cabt.py +120 -0
  14. kaggle_environments/envs/chess/chess.js +4289 -0
  15. kaggle_environments/envs/chess/chess.json +60 -0
  16. kaggle_environments/envs/chess/chess.py +4241 -0
  17. kaggle_environments/envs/chess/test_chess.py +60 -0
  18. kaggle_environments/envs/connectx/connectx.ipynb +3186 -0
  19. kaggle_environments/envs/connectx/connectx.js +1 -1
  20. kaggle_environments/envs/connectx/connectx.json +15 -1
  21. kaggle_environments/envs/connectx/connectx.py +6 -23
  22. kaggle_environments/envs/connectx/test_connectx.py +70 -24
  23. kaggle_environments/envs/football/football.ipynb +75 -0
  24. kaggle_environments/envs/football/football.json +91 -0
  25. kaggle_environments/envs/football/football.py +277 -0
  26. kaggle_environments/envs/football/helpers.py +95 -0
  27. kaggle_environments/envs/football/test_football.py +360 -0
  28. kaggle_environments/envs/halite/__init__.py +0 -0
  29. kaggle_environments/envs/halite/halite.ipynb +44741 -0
  30. kaggle_environments/envs/halite/halite.js +199 -83
  31. kaggle_environments/envs/halite/halite.json +31 -18
  32. kaggle_environments/envs/halite/halite.py +164 -303
  33. kaggle_environments/envs/halite/helpers.py +720 -0
  34. kaggle_environments/envs/halite/test_halite.py +190 -0
  35. kaggle_environments/envs/hungry_geese/__init__.py +0 -0
  36. kaggle_environments/envs/{battlegeese/battlegeese.js → hungry_geese/hungry_geese.js} +38 -22
  37. kaggle_environments/envs/{battlegeese/battlegeese.json → hungry_geese/hungry_geese.json} +21 -14
  38. kaggle_environments/envs/hungry_geese/hungry_geese.py +316 -0
  39. kaggle_environments/envs/hungry_geese/test_hungry_geese.py +0 -0
  40. kaggle_environments/envs/identity/identity.json +6 -5
  41. kaggle_environments/envs/identity/identity.py +15 -2
  42. kaggle_environments/envs/kore_fleets/__init__.py +0 -0
  43. kaggle_environments/envs/kore_fleets/helpers.py +1005 -0
  44. kaggle_environments/envs/kore_fleets/kore_fleets.ipynb +114 -0
  45. kaggle_environments/envs/kore_fleets/kore_fleets.js +658 -0
  46. kaggle_environments/envs/kore_fleets/kore_fleets.json +164 -0
  47. kaggle_environments/envs/kore_fleets/kore_fleets.py +555 -0
  48. kaggle_environments/envs/kore_fleets/starter_bots/java/Bot.java +54 -0
  49. kaggle_environments/envs/kore_fleets/starter_bots/java/README.md +26 -0
  50. kaggle_environments/envs/kore_fleets/starter_bots/java/jars/hamcrest-core-1.3.jar +0 -0
  51. kaggle_environments/envs/kore_fleets/starter_bots/java/jars/junit-4.13.2.jar +0 -0
  52. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Board.java +518 -0
  53. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Cell.java +61 -0
  54. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Configuration.java +24 -0
  55. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Direction.java +166 -0
  56. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Fleet.java +72 -0
  57. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/KoreJson.java +97 -0
  58. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Observation.java +72 -0
  59. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Pair.java +13 -0
  60. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Player.java +68 -0
  61. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Point.java +65 -0
  62. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Shipyard.java +70 -0
  63. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/ShipyardAction.java +59 -0
  64. kaggle_environments/envs/kore_fleets/starter_bots/java/main.py +73 -0
  65. kaggle_environments/envs/kore_fleets/starter_bots/java/test/BoardTest.java +567 -0
  66. kaggle_environments/envs/kore_fleets/starter_bots/java/test/ConfigurationTest.java +25 -0
  67. kaggle_environments/envs/kore_fleets/starter_bots/java/test/KoreJsonTest.java +62 -0
  68. kaggle_environments/envs/kore_fleets/starter_bots/java/test/ObservationTest.java +46 -0
  69. kaggle_environments/envs/kore_fleets/starter_bots/java/test/PointTest.java +21 -0
  70. kaggle_environments/envs/kore_fleets/starter_bots/java/test/ShipyardTest.java +22 -0
  71. kaggle_environments/envs/kore_fleets/starter_bots/java/test/configuration.json +1 -0
  72. kaggle_environments/envs/kore_fleets/starter_bots/java/test/fullob.json +1 -0
  73. kaggle_environments/envs/kore_fleets/starter_bots/java/test/observation.json +1 -0
  74. kaggle_environments/envs/kore_fleets/starter_bots/python/__init__.py +0 -0
  75. kaggle_environments/envs/kore_fleets/starter_bots/python/main.py +27 -0
  76. kaggle_environments/envs/kore_fleets/starter_bots/ts/Bot.ts +34 -0
  77. kaggle_environments/envs/kore_fleets/starter_bots/ts/DoNothingBot.ts +12 -0
  78. kaggle_environments/envs/kore_fleets/starter_bots/ts/MinerBot.ts +62 -0
  79. kaggle_environments/envs/kore_fleets/starter_bots/ts/README.md +55 -0
  80. kaggle_environments/envs/kore_fleets/starter_bots/ts/interpreter.ts +402 -0
  81. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Board.ts +514 -0
  82. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Cell.ts +63 -0
  83. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Configuration.ts +25 -0
  84. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Direction.ts +169 -0
  85. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Fleet.ts +76 -0
  86. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/KoreIO.ts +70 -0
  87. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Observation.ts +45 -0
  88. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Pair.ts +11 -0
  89. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Player.ts +68 -0
  90. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Point.ts +65 -0
  91. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Shipyard.ts +72 -0
  92. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/ShipyardAction.ts +58 -0
  93. kaggle_environments/envs/kore_fleets/starter_bots/ts/main.py +73 -0
  94. kaggle_environments/envs/kore_fleets/starter_bots/ts/miner.py +73 -0
  95. kaggle_environments/envs/kore_fleets/starter_bots/ts/package.json +23 -0
  96. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/BoardTest.ts +551 -0
  97. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ConfigurationTest.ts +16 -0
  98. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ObservationTest.ts +33 -0
  99. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/PointTest.ts +17 -0
  100. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ShipyardTest.ts +18 -0
  101. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/configuration.json +1 -0
  102. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/fullob.json +1 -0
  103. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/observation.json +1 -0
  104. kaggle_environments/envs/kore_fleets/starter_bots/ts/tsconfig.json +22 -0
  105. kaggle_environments/envs/kore_fleets/test_kore_fleets.py +331 -0
  106. kaggle_environments/envs/lux_ai_2021/README.md +3 -0
  107. kaggle_environments/envs/lux_ai_2021/__init__.py +0 -0
  108. kaggle_environments/envs/lux_ai_2021/agents.py +11 -0
  109. kaggle_environments/envs/lux_ai_2021/dimensions/754.js +2 -0
  110. kaggle_environments/envs/lux_ai_2021/dimensions/754.js.LICENSE.txt +296 -0
  111. kaggle_environments/envs/lux_ai_2021/dimensions/main.js +1 -0
  112. kaggle_environments/envs/lux_ai_2021/index.html +43 -0
  113. kaggle_environments/envs/lux_ai_2021/lux_ai_2021.json +100 -0
  114. kaggle_environments/envs/lux_ai_2021/lux_ai_2021.py +231 -0
  115. kaggle_environments/envs/lux_ai_2021/test_agents/__init__.py +0 -0
  116. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_constants.js +6 -0
  117. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_constants.json +59 -0
  118. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_objects.js +145 -0
  119. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/io.js +14 -0
  120. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/kit.js +209 -0
  121. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/map.js +107 -0
  122. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/parser.js +79 -0
  123. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/main.js +88 -0
  124. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/main.py +75 -0
  125. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/simple.tar.gz +0 -0
  126. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/__init__.py +0 -0
  127. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/annotate.py +20 -0
  128. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/constants.py +25 -0
  129. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game.py +86 -0
  130. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_constants.json +59 -0
  131. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_constants.py +7 -0
  132. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_map.py +106 -0
  133. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_objects.py +154 -0
  134. kaggle_environments/envs/lux_ai_2021/test_agents/python/random_agent.py +38 -0
  135. kaggle_environments/envs/lux_ai_2021/test_agents/python/simple_agent.py +82 -0
  136. kaggle_environments/envs/lux_ai_2021/test_lux.py +19 -0
  137. kaggle_environments/envs/lux_ai_2021/testing.md +23 -0
  138. kaggle_environments/envs/lux_ai_2021/todo.md.og +18 -0
  139. kaggle_environments/envs/lux_ai_s3/README.md +21 -0
  140. kaggle_environments/envs/lux_ai_s3/agents.py +5 -0
  141. kaggle_environments/envs/lux_ai_s3/index.html +42 -0
  142. kaggle_environments/envs/lux_ai_s3/lux_ai_s3.json +47 -0
  143. kaggle_environments/envs/lux_ai_s3/lux_ai_s3.py +178 -0
  144. kaggle_environments/envs/lux_ai_s3/luxai_s3/__init__.py +1 -0
  145. kaggle_environments/envs/lux_ai_s3/luxai_s3/env.py +819 -0
  146. kaggle_environments/envs/lux_ai_s3/luxai_s3/globals.py +9 -0
  147. kaggle_environments/envs/lux_ai_s3/luxai_s3/params.py +101 -0
  148. kaggle_environments/envs/lux_ai_s3/luxai_s3/profiler.py +141 -0
  149. kaggle_environments/envs/lux_ai_s3/luxai_s3/pygame_render.py +222 -0
  150. kaggle_environments/envs/lux_ai_s3/luxai_s3/spaces.py +27 -0
  151. kaggle_environments/envs/lux_ai_s3/luxai_s3/state.py +464 -0
  152. kaggle_environments/envs/lux_ai_s3/luxai_s3/utils.py +12 -0
  153. kaggle_environments/envs/lux_ai_s3/luxai_s3/wrappers.py +156 -0
  154. kaggle_environments/envs/lux_ai_s3/test_agents/python/agent.py +78 -0
  155. kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/__init__.py +0 -0
  156. kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/kit.py +31 -0
  157. kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/utils.py +17 -0
  158. kaggle_environments/envs/lux_ai_s3/test_agents/python/main.py +66 -0
  159. kaggle_environments/envs/lux_ai_s3/test_lux.py +9 -0
  160. kaggle_environments/envs/mab/__init__.py +0 -0
  161. kaggle_environments/envs/mab/agents.py +12 -0
  162. kaggle_environments/envs/mab/mab.js +100 -0
  163. kaggle_environments/envs/mab/mab.json +74 -0
  164. kaggle_environments/envs/mab/mab.py +146 -0
  165. kaggle_environments/envs/open_spiel/__init__.py +0 -0
  166. kaggle_environments/envs/open_spiel/games/__init__.py +0 -0
  167. kaggle_environments/envs/open_spiel/games/chess/chess.js +441 -0
  168. kaggle_environments/envs/open_spiel/games/chess/image_config.jsonl +20 -0
  169. kaggle_environments/envs/open_spiel/games/chess/openings.jsonl +20 -0
  170. kaggle_environments/envs/open_spiel/games/connect_four/__init__.py +0 -0
  171. kaggle_environments/envs/open_spiel/games/connect_four/connect_four.js +284 -0
  172. kaggle_environments/envs/open_spiel/games/connect_four/connect_four_proxy.py +86 -0
  173. kaggle_environments/envs/open_spiel/games/go/__init__.py +0 -0
  174. kaggle_environments/envs/open_spiel/games/go/go.js +481 -0
  175. kaggle_environments/envs/open_spiel/games/go/go_proxy.py +99 -0
  176. kaggle_environments/envs/open_spiel/games/tic_tac_toe/__init__.py +0 -0
  177. kaggle_environments/envs/open_spiel/games/tic_tac_toe/tic_tac_toe.js +345 -0
  178. kaggle_environments/envs/open_spiel/games/tic_tac_toe/tic_tac_toe_proxy.py +98 -0
  179. kaggle_environments/envs/open_spiel/games/universal_poker/__init__.py +0 -0
  180. kaggle_environments/envs/open_spiel/games/universal_poker/universal_poker.js +431 -0
  181. kaggle_environments/envs/open_spiel/games/universal_poker/universal_poker_proxy.py +159 -0
  182. kaggle_environments/envs/open_spiel/html_playthrough_generator.py +31 -0
  183. kaggle_environments/envs/open_spiel/observation.py +128 -0
  184. kaggle_environments/envs/open_spiel/open_spiel.py +565 -0
  185. kaggle_environments/envs/open_spiel/proxy.py +138 -0
  186. kaggle_environments/envs/open_spiel/test_open_spiel.py +191 -0
  187. kaggle_environments/envs/rps/__init__.py +0 -0
  188. kaggle_environments/envs/rps/agents.py +84 -0
  189. kaggle_environments/envs/rps/helpers.py +25 -0
  190. kaggle_environments/envs/rps/rps.js +117 -0
  191. kaggle_environments/envs/rps/rps.json +63 -0
  192. kaggle_environments/envs/rps/rps.py +90 -0
  193. kaggle_environments/envs/rps/test_rps.py +110 -0
  194. kaggle_environments/envs/rps/utils.py +7 -0
  195. kaggle_environments/envs/tictactoe/test_tictactoe.py +43 -77
  196. kaggle_environments/envs/tictactoe/tictactoe.ipynb +1397 -0
  197. kaggle_environments/envs/tictactoe/tictactoe.json +10 -2
  198. kaggle_environments/envs/tictactoe/tictactoe.py +1 -1
  199. kaggle_environments/errors.py +2 -4
  200. kaggle_environments/helpers.py +377 -0
  201. kaggle_environments/main.py +340 -0
  202. kaggle_environments/schemas.json +23 -18
  203. kaggle_environments/static/player.html +206 -74
  204. kaggle_environments/utils.py +46 -73
  205. kaggle_environments-1.20.0.dist-info/METADATA +25 -0
  206. kaggle_environments-1.20.0.dist-info/RECORD +211 -0
  207. {kaggle_environments-0.2.1.dist-info → kaggle_environments-1.20.0.dist-info}/WHEEL +1 -2
  208. kaggle_environments-1.20.0.dist-info/entry_points.txt +3 -0
  209. kaggle_environments/envs/battlegeese/battlegeese.py +0 -223
  210. kaggle_environments/temp.py +0 -14
  211. kaggle_environments-0.2.1.dist-info/METADATA +0 -393
  212. kaggle_environments-0.2.1.dist-info/RECORD +0 -32
  213. kaggle_environments-0.2.1.dist-info/entry_points.txt +0 -3
  214. kaggle_environments-0.2.1.dist-info/top_level.txt +0 -1
  215. {kaggle_environments-0.2.1.dist-info → kaggle_environments-1.20.0.dist-info/licenses}/LICENSE +0 -0
@@ -0,0 +1,90 @@
1
+ import json
2
+ from os import path
3
+
4
+ from .agents import agents as all_agents
5
+ from .utils import get_score
6
+
7
+
8
+ def interpreter(state, env):
9
+ player1 = state[0]
10
+ player2 = state[1]
11
+
12
+ # Specification can fully handle the reset.
13
+ if env.done:
14
+ return state
15
+
16
+ def is_valid_action(player, sign_count):
17
+ return player.action is not None and isinstance(player.action, int) and 0 <= player.action < sign_count
18
+
19
+ # Check for validity of actions
20
+ is_player1_valid = is_valid_action(player1, env.configuration.signs)
21
+ is_player2_valid = is_valid_action(player2, env.configuration.signs)
22
+ if not is_player2_valid:
23
+ player2.status = "INVALID"
24
+ player2.reward = 0
25
+
26
+ if is_player1_valid:
27
+ player1.status = "DONE"
28
+ player1.reward = 1
29
+ return state
30
+
31
+ if not is_player1_valid:
32
+ player1.status = "INVALID"
33
+ player1.reward = 0
34
+
35
+ if is_player2_valid:
36
+ player2.status = "DONE"
37
+ player2.reward = 1
38
+ return state
39
+ else:
40
+ return state
41
+
42
+ score = get_score(player1.action, player2.action)
43
+ player1.observation.lastOpponentAction = player2.action
44
+ player1.reward += score
45
+ player2.observation.lastOpponentAction = player1.action
46
+ player2.reward -= score
47
+ player1.observation.reward = int(player1.reward)
48
+ player2.observation.reward = int(player2.reward)
49
+ remaining_steps = env.configuration.episodeSteps - player1.observation.step - 1
50
+
51
+ # This is the last step
52
+ if remaining_steps <= 1:
53
+ player1.status = "DONE"
54
+ player2.status = "DONE"
55
+ # Player performance too similar, consider the match a tie.
56
+ if abs(player1.reward) < env.configuration.tieRewardThreshold:
57
+ player1.reward = 0
58
+ player2.reward = 0
59
+ return state
60
+
61
+
62
+ def renderer(state, env):
63
+ sign_names = ["Rock", "Paper", "Scissors", "Spock", "Lizard"]
64
+ rounds_played = len(env.steps)
65
+ board = ""
66
+
67
+ # This line prints results each round, good for debugging
68
+ for i in range(1, rounds_played):
69
+ step = env.steps[i]
70
+ right_move = step[0].observation.lastOpponentAction
71
+ left_move = step[1].observation.lastOpponentAction
72
+ board += f"Round {i}: {sign_names[left_move]} vs {sign_names[right_move]}, Score: {step[0].reward} to {step[1].reward}\n"
73
+
74
+ board += f"Game ended on round {rounds_played - 1}, final score: {state[0].reward} to {state[0].reward}\n"
75
+ return board
76
+
77
+
78
+ dir_path = path.dirname(__file__)
79
+ json_path = path.abspath(path.join(dir_path, "rps.json"))
80
+ with open(json_path) as json_file:
81
+ specification = json.load(json_file)
82
+
83
+
84
+ def html_renderer():
85
+ js_path = path.abspath(path.join(dir_path, "rps.js"))
86
+ with open(js_path, encoding="utf-8") as js_file:
87
+ return js_file.read()
88
+
89
+
90
+ agents = all_agents
@@ -0,0 +1,110 @@
1
+ from kaggle_environments import make
2
+
3
+ from .agents import agents, paper, rock
4
+
5
+
6
+ def negative_move_agent(observation, configuration):
7
+ return -1
8
+
9
+
10
+ def too_big_sign_agent(observation, configuration):
11
+ return 1000000
12
+
13
+
14
+ def non_integer_agent(observation, configuration):
15
+ return 0.3
16
+
17
+
18
+ def none_agent(observation, configuration):
19
+ return None
20
+
21
+
22
+ def test_rps_completes():
23
+ env = make("rps", configuration={"episodeSteps": 10, "tieRewardThreshold": 1})
24
+ env.run([rock, rock])
25
+ json = env.toJSON()
26
+ assert json["name"] == "rps"
27
+ assert json["statuses"] == ["DONE", "DONE"]
28
+
29
+
30
+ def test_all_agents():
31
+ env = make("rps", configuration={"episodeSteps": 3, "tieRewardThreshold": 1})
32
+ for agent in agents:
33
+ env.run([agent, agent])
34
+ json = env.toJSON()
35
+ assert json["statuses"] == ["DONE", "DONE"]
36
+
37
+
38
+ def test_tie():
39
+ env = make("rps", configuration={"episodeSteps": 3, "tieRewardThreshold": 1})
40
+ env.run([rock, rock])
41
+ assert (
42
+ env.render(mode="ansi")
43
+ == "Round 1: Rock vs Rock, Score: 0 to 0\nRound 2: Rock vs Rock, Score: 0 to 0\nGame ended on round 2, final score: 0 to 0\n"
44
+ )
45
+ json = env.toJSON()
46
+ assert json["rewards"] == [0, 0]
47
+ assert json["statuses"] == ["DONE", "DONE"]
48
+
49
+
50
+ def test_threshold_tie():
51
+ env = make("rps", configuration={"episodeSteps": 3, "tieRewardThreshold": 4})
52
+ env.run([rock, paper])
53
+ assert (
54
+ env.render(mode="ansi")
55
+ == "Round 1: Rock vs Paper, Score: -1.0 to 1.0\nRound 2: Rock vs Paper, Score: 0 to 0\nGame ended on round 2, final score: 0 to 0\n"
56
+ )
57
+ json = env.toJSON()
58
+ assert json["rewards"] == [0, 0]
59
+ assert json["statuses"] == ["DONE", "DONE"]
60
+
61
+
62
+ def test_win():
63
+ env = make("rps", configuration={"episodeSteps": 2, "tieRewardThreshold": 1})
64
+ env.run([paper, rock])
65
+ json = env.toJSON()
66
+ print(json)
67
+ assert json["rewards"] == [1, -1]
68
+ assert json["statuses"] == ["DONE", "DONE"]
69
+
70
+
71
+ def test_loss():
72
+ env = make("rps", configuration={"episodeSteps": 2, "tieRewardThreshold": 1})
73
+ env.run([rock, paper])
74
+ json = env.toJSON()
75
+ assert json["rewards"] == [-1, 1]
76
+ assert json["statuses"] == ["DONE", "DONE"]
77
+
78
+
79
+ def test_negative_move():
80
+ env = make("rps", configuration={"episodeSteps": 10, "tieRewardThreshold": 1})
81
+ env.run([negative_move_agent, rock])
82
+ json = env.toJSON()
83
+ assert json["rewards"] == [None, 1]
84
+ assert json["statuses"] == ["INVALID", "DONE"]
85
+
86
+
87
+ def test_non_integer_move():
88
+ env = make("rps", configuration={"episodeSteps": 10, "tieRewardThreshold": 1})
89
+ env.run([non_integer_agent, rock])
90
+ json = env.toJSON()
91
+ assert json["rewards"] == [None, 1]
92
+ assert json["statuses"] == ["INVALID", "DONE"]
93
+
94
+
95
+ def test_too_big_move():
96
+ env = make("rps", configuration={"episodeSteps": 10, "tieRewardThreshold": 1})
97
+ env.run([paper, too_big_sign_agent])
98
+ json = env.toJSON()
99
+ assert json["rewards"] == [1, None]
100
+ assert json["statuses"] == ["DONE", "INVALID"]
101
+
102
+
103
+ def test_agent_reward():
104
+ env = make("rps", configuration={"episodeSteps": 2, "tieRewardThreshold": 1})
105
+ env.run([paper, rock])
106
+ json = env.toJSON()
107
+ last_step = json["steps"][-1]
108
+ assert last_step[0]["observation"]["step"] == last_step[0]["observation"]["reward"]
109
+ assert last_step[0]["observation"]["reward"] == -last_step[1]["observation"]["reward"]
110
+ assert json["statuses"] == ["DONE", "DONE"]
@@ -0,0 +1,7 @@
1
+ import math
2
+
3
+
4
+ def get_score(left_move, right_move):
5
+ # This method exists in this file so it can be consumed from rps.py and agents.py without a circular dependency
6
+ delta = right_move - left_move if (left_move + right_move) % 2 == 0 else left_move - right_move
7
+ return 0 if delta == 0 else math.copysign(1, delta)
@@ -13,7 +13,8 @@
13
13
  # limitations under the License.
14
14
 
15
15
  import time
16
- from kaggle_environments import make, evaluate, utils
16
+
17
+ from kaggle_environments import errors, evaluate, make, utils
17
18
 
18
19
  env = None
19
20
 
@@ -30,7 +31,7 @@ def custom2(obs):
30
31
 
31
32
  def custom3(obs):
32
33
  step = sum(1 for mark in obs.board if mark == obs.mark)
33
- time.sleep(2)
34
+ time.sleep(4)
34
35
  return [1, 3, 5, 7][step]
35
36
 
36
37
 
@@ -42,10 +43,16 @@ def custom5():
42
43
  return -1
43
44
 
44
45
 
46
+ def custom6(obs):
47
+ step = sum(1 for mark in obs.board if mark == obs.mark)
48
+ time.sleep(2)
49
+ return [1, 3, 5, 7][step]
50
+
51
+
45
52
  def before_each(state=None):
46
53
  global env
47
54
  steps = [] if state == None else [state]
48
- env = make("tictactoe", steps=steps, debug=True)
55
+ env = make("tictactoe", steps=steps, debug=False)
49
56
 
50
57
 
51
58
  def test_to_json():
@@ -64,14 +71,14 @@ def test_can_reset():
64
71
  "action": 0,
65
72
  "status": "ACTIVE",
66
73
  "info": {},
67
- "observation": {"mark": 1, "board": [0, 0, 0, 0, 0, 0, 0, 0, 0]},
74
+ "observation": {"remainingOverageTime": 2, "mark": 1, "board": [0, 0, 0, 0, 0, 0, 0, 0, 0], "step": 0},
68
75
  "reward": 0,
69
76
  },
70
77
  {
71
78
  "action": 0,
72
79
  "status": "INACTIVE",
73
80
  "info": {},
74
- "observation": {"mark": 2},
81
+ "observation": {"remainingOverageTime": 2, "mark": 2},
75
82
  "reward": 0,
76
83
  },
77
84
  ]
@@ -85,14 +92,14 @@ def test_can_place_valid_mark():
85
92
  "action": 4,
86
93
  "status": "INACTIVE",
87
94
  "info": {},
88
- "observation": {"mark": 1, "board": [0, 0, 0, 0, 1, 0, 0, 0, 0]},
95
+ "observation": {"remainingOverageTime": 2, "mark": 1, "board": [0, 0, 0, 0, 1, 0, 0, 0, 0], "step": 1},
89
96
  "reward": 0,
90
97
  },
91
98
  {
92
99
  "action": 0, # None caused the default action to be applied.
93
100
  "status": "ACTIVE",
94
101
  "info": {},
95
- "observation": {"mark": 2},
102
+ "observation": {"remainingOverageTime": 2, "mark": 2},
96
103
  "reward": 0,
97
104
  },
98
105
  ]
@@ -108,14 +115,14 @@ def test_can_place_invalid_mark():
108
115
  "action": 0,
109
116
  "status": "DONE",
110
117
  "info": {},
111
- "observation": {"mark": 1, "board": [0, 0, 0, 0, 1, 0, 0, 0, 0]},
118
+ "observation": {"remainingOverageTime": 2, "mark": 1, "board": [0, 0, 0, 0, 1, 0, 0, 0, 0], "step": 2},
112
119
  "reward": 0,
113
120
  },
114
121
  {
115
122
  "action": 4,
116
123
  "status": "INVALID",
117
124
  "info": {},
118
- "observation": {"mark": 2},
125
+ "observation": {"remainingOverageTime": 2, "mark": 2},
119
126
  "reward": None,
120
127
  },
121
128
  ]
@@ -131,14 +138,14 @@ def test_can_place_winning_mark():
131
138
  "action": 7,
132
139
  "status": "DONE",
133
140
  "info": {},
134
- "observation": {"mark": 1, "board": [2, 1, 0, 1, 1, 0, 2, 1, 2]},
141
+ "observation": {"remainingOverageTime": 2, "mark": 1, "board": [2, 1, 0, 1, 1, 0, 2, 1, 2], "step": 1},
135
142
  "reward": 1,
136
143
  },
137
144
  {
138
145
  "action": 0,
139
146
  "status": "DONE",
140
147
  "info": {},
141
- "observation": {"mark": 2},
148
+ "observation": {"remainingOverageTime": 2, "mark": 2},
142
149
  "reward": -1,
143
150
  },
144
151
  ]
@@ -155,8 +162,7 @@ def test_can_step_through_agents():
155
162
  before_each()
156
163
  while not env.done:
157
164
  action1 = env.agents.random(env.state[0].observation)
158
- action2 = env.agents.reaction(
159
- utils.structify({"board": env.state[0].observation.board, "mark": 2}))
165
+ action2 = env.agents.reaction(utils.structify({"board": env.state[0].observation.board, "mark": 2}))
160
166
  env.step([action1, action2])
161
167
  assert env.state[0].reward + env.state[1].reward == 0
162
168
 
@@ -169,8 +175,7 @@ def test_can_run_agents():
169
175
 
170
176
  def test_can_evaluate():
171
177
  rewards = evaluate("tictactoe", ["random", "reaction"], num_episodes=2)
172
- assert (rewards[0][0] + rewards[0][1] ==
173
- 0) and rewards[1][0] + rewards[1][1] == 0
178
+ assert (rewards[0][0] + rewards[0][1] == 0) and rewards[1][0] + rewards[1][1] == 0
174
179
 
175
180
 
176
181
  def test_can_run_custom_agents():
@@ -181,83 +186,44 @@ def test_can_run_custom_agents():
181
186
  "action": 6,
182
187
  "reward": 1,
183
188
  "info": {},
184
- "observation": {"board": [1, 2, 1, 2, 1, 2, 1, 0, 0], "mark": 1},
189
+ "observation": {"remainingOverageTime": 2, "board": [1, 2, 1, 2, 1, 2, 1, 0, 0], "mark": 1, "step": 7},
185
190
  "status": "DONE",
186
191
  },
187
192
  {
188
193
  "action": 0,
189
194
  "reward": -1,
190
195
  "info": {},
191
- "observation": {"mark": 2},
196
+ "observation": {"remainingOverageTime": 2, "mark": 2},
192
197
  "status": "DONE",
193
198
  },
194
199
  ]
195
200
 
196
201
 
197
202
  def test_agents_can_timeout_on_init():
198
- env = make("tictactoe", debug=True, configuration={
199
- "agentTimeout": 1, "actTimeout": 1})
203
+ env = make("tictactoe", debug=False)
200
204
  state = env.run([custom1, custom3])[-1]
201
- assert state == [
202
- {
203
- "action": 0,
204
- "reward": 0,
205
- "info": {},
206
- "observation": {"board": [1, 0, 0, 0, 0, 0, 0, 0, 0], "mark": 1},
207
- "status": "DONE",
208
- },
209
- {
210
- "action": None,
211
- "reward": None,
212
- "info": {},
213
- "observation": {"mark": 2},
214
- "status": "TIMEOUT",
215
- },
216
- ]
205
+ assert state[1]["status"] == "TIMEOUT"
206
+ assert state[1]["observation"]["remainingOverageTime"] < 0
217
207
 
218
208
 
219
209
  def test_agents_can_timeout_on_act():
220
- env = make("tictactoe", debug=True, configuration={
221
- "agentTimeout": 5, "actTimeout": 1})
222
- state = env.run([custom1, custom3])[-1]
223
- assert state == [
224
- {
225
- "action": 0,
226
- "reward": 0,
227
- "info": {},
228
- "observation": {"board": [1, 2, 1, 0, 0, 0, 0, 0, 0], "mark": 1},
229
- "status": "DONE",
230
- },
231
- {
232
- "action": None,
233
- "reward": None,
234
- "info": {},
235
- "observation": {"mark": 2},
236
- "status": "TIMEOUT",
237
- },
238
- ]
210
+ env = make("tictactoe", debug=False)
211
+ state = env.run([custom1, custom6])[-1]
212
+ print(state)
213
+ assert state[1]["status"] == "TIMEOUT"
214
+ assert state[1]["observation"]["remainingOverageTime"] < 0
239
215
 
240
216
 
241
217
  def test_run_timeout():
242
- env = make("tictactoe", debug=True, configuration={
243
- "agentTimeout": 10, "actTimeout": 10, "runTimeout": 6})
244
- state = env.run([custom1, custom3])[-1]
245
- assert state == [
246
- {
247
- "action": 0,
248
- "reward": 0,
249
- "info": {},
250
- "observation": {"board": [1, 2, 1, 2, 1, 2, 0, 0, 0], "mark": 1},
251
- "status": "ACTIVE",
252
- },
253
- {
254
- "action": 5,
255
- "reward": 0,
256
- "info": {},
257
- "observation": {"mark": 2},
258
- "status": "INACTIVE",
259
- },
260
- ]
218
+ env = make("tictactoe", debug=False, configuration={"actTimeout": 10, "runTimeout": 1})
219
+ try:
220
+ state = env.run([custom1, custom3])[-1]
221
+ except errors.DeadlineExceeded:
222
+ pass
223
+ except:
224
+ assert False, "should fail with deadline exceeded"
225
+ else:
226
+ assert False, "Should fail when runtimeout is reached"
261
227
 
262
228
 
263
229
  def test_agents_can_error():
@@ -268,14 +234,14 @@ def test_agents_can_error():
268
234
  "action": 0,
269
235
  "reward": 0,
270
236
  "info": {},
271
- "observation": {"board": [1, 0, 0, 0, 0, 0, 0, 0, 0], "mark": 1},
237
+ "observation": {"remainingOverageTime": 2, "board": [1, 0, 0, 0, 0, 0, 0, 0, 0], "mark": 1, "step": 2},
272
238
  "status": "DONE",
273
239
  },
274
240
  {
275
241
  "action": None,
276
242
  "reward": None,
277
243
  "info": {},
278
- "observation": {"mark": 2},
244
+ "observation": {"remainingOverageTime": 2, "mark": 2},
279
245
  "status": "ERROR",
280
246
  },
281
247
  ]
@@ -289,14 +255,14 @@ def test_agents_can_have_invalid_actions():
289
255
  "action": 0,
290
256
  "reward": 0,
291
257
  "info": {},
292
- "observation": {"board": [1, 0, 0, 0, 0, 0, 0, 0, 0], "mark": 1},
258
+ "observation": {"remainingOverageTime": 2, "board": [1, 0, 0, 0, 0, 0, 0, 0, 0], "mark": 1, "step": 2},
293
259
  "status": "DONE",
294
260
  },
295
261
  {
296
262
  "action": None,
297
263
  "reward": None,
298
264
  "info": {},
299
- "observation": {"mark": 2},
265
+ "observation": {"remainingOverageTime": 2, "mark": 2},
300
266
  "status": "INVALID",
301
267
  },
302
268
  ]