kaggle-environments 0.2.0__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 +298 -173
  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} +22 -15
  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 +214 -50
  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.0.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 -219
  210. kaggle_environments/temp.py +0 -14
  211. kaggle_environments-0.2.0.dist-info/METADATA +0 -393
  212. kaggle_environments-0.2.0.dist-info/RECORD +0 -33
  213. kaggle_environments-0.2.0.dist-info/entry_points.txt +0 -3
  214. kaggle_environments-0.2.0.dist-info/top_level.txt +0 -1
  215. {kaggle_environments-0.2.0.dist-info → kaggle_environments-1.20.0.dist-info/licenses}/LICENSE +0 -0
@@ -282,7 +282,7 @@ function renderer({
282
282
  for (let d = 0; d < 8; d++) {
283
283
  const seq = getSequence(graph[i], d);
284
284
  if (seq) {
285
- drawLine(seq[0], seq[3]);
285
+ drawLine(seq[0], seq[inarow - 1]);
286
286
  i = board.length;
287
287
  break;
288
288
  }
@@ -22,6 +22,19 @@
22
22
  "type": "integer",
23
23
  "default": 4,
24
24
  "minimum": 1
25
+ },
26
+ "agentTimeout": {
27
+ "description": "Obsolete field kept for backwards compatibility, please use observation.remainingOverageTime.",
28
+ "type": "number",
29
+ "minimum": 0,
30
+ "default": 60
31
+ },
32
+ "actTimeout": 2,
33
+ "timeout": {
34
+ "description": "Obsolete copy of actTimeout maintained for backwards compatibility. May be removed in the future.",
35
+ "type": "integer",
36
+ "default": 2,
37
+ "minimum": 0
25
38
  }
26
39
  },
27
40
  "reward": {
@@ -43,7 +56,8 @@
43
56
  "defaults": [1, 2],
44
57
  "description": "Which checkers are the agents.",
45
58
  "enum": [1, 2]
46
- }
59
+ },
60
+ "remainingOverageTime": 60
47
61
  },
48
62
  "action": {
49
63
  "description": "Column to drop a checker onto the board.",
@@ -40,13 +40,7 @@ def is_win(board, column, mark, config, has_played=True):
40
40
  for i in range(1, inarow + 1):
41
41
  r = row + offset_row * i
42
42
  c = column + offset_column * i
43
- if (
44
- r < 0
45
- or r >= rows
46
- or c < 0
47
- or c >= columns
48
- or board[c + (r * columns)] != mark
49
- ):
43
+ if r < 0 or r >= rows or c < 0 or c >= columns or board[c + (r * columns)] != mark:
50
44
  return i - 1
51
45
  return inarow
52
46
 
@@ -89,20 +83,11 @@ def negamax_agent(obs, config):
89
83
  if board[column] == EMPTY:
90
84
  # Max depth reached. Score based on cell proximity for a clustering effect.
91
85
  if depth <= 0:
92
- row = max(
93
- [
94
- r
95
- for r in range(rows)
96
- if board[column + (r * columns)] == EMPTY
97
- ]
98
- )
86
+ row = max([r for r in range(rows) if board[column + (r * columns)] == EMPTY])
99
87
  score = (size + 1 - moves) / 2
100
88
  if column > 0 and board[row * columns + column - 1] == mark:
101
89
  score += 1
102
- if (
103
- column < columns - 1
104
- and board[row * columns + column + 1] == mark
105
- ):
90
+ if column < columns - 1 and board[row * columns + column + 1] == mark:
106
91
  score += 1
107
92
  if row > 0 and board[(row - 1) * columns + column] == mark:
108
93
  score += 1
@@ -111,8 +96,7 @@ def negamax_agent(obs, config):
111
96
  else:
112
97
  next_board = board[:]
113
98
  play(next_board, column, mark, config)
114
- (score, _) = negamax(next_board,
115
- 1 if mark == 2 else 2, depth - 1)
99
+ (score, _) = negamax(next_board, 1 if mark == 2 else 2, depth - 1)
116
100
  score = score * -1
117
101
  if score > best_score or (score == best_score and choice([True, False])):
118
102
  best_score = score
@@ -194,8 +178,7 @@ def renderer(state, env):
194
178
  row_bar = "+" + "+".join(["---"] * columns) + "+\n"
195
179
  out = row_bar
196
180
  for r in range(rows):
197
- out = out + \
198
- print_row(board[r * columns: r * columns + columns]) + row_bar
181
+ out = out + print_row(board[r * columns : r * columns + columns]) + row_bar
199
182
 
200
183
  return out
201
184
 
@@ -208,5 +191,5 @@ with open(jsonpath) as f:
208
191
 
209
192
  def html_renderer():
210
193
  jspath = path.abspath(path.join(dirpath, "connectx.js"))
211
- with open(jspath) as f:
194
+ with open(jspath, encoding="utf-8") as f:
212
195
  return f.read()
@@ -12,7 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from kaggle_environments import make, evaluate
15
+ from kaggle_environments import evaluate, make
16
16
 
17
17
  env = None
18
18
 
@@ -20,8 +20,30 @@ env = None
20
20
  def before_each(state=None, configuration=None):
21
21
  global env
22
22
  steps = [] if state == None else [state]
23
- env = make("connectx", steps=steps,
24
- configuration=configuration, debug=True)
23
+ env = make("connectx", steps=steps, configuration=configuration, debug=False)
24
+
25
+
26
+ def test_has_correct_timeouts():
27
+ before_each()
28
+ assert env.configuration.actTimeout == 2
29
+
30
+
31
+ def test_can_train_first():
32
+ before_each()
33
+ trainer = env.train([None, "random"])
34
+ obs = trainer.reset()
35
+ assert "board" in obs
36
+ obs, _, _, _ = trainer.step(0)
37
+ assert "board" in obs
38
+
39
+
40
+ def test_can_train_second():
41
+ before_each()
42
+ trainer = env.train(["random", None])
43
+ obs = trainer.reset()
44
+ assert "board" in obs
45
+ obs, _, _, _ = trainer.step(0)
46
+ assert "board" in obs
25
47
 
26
48
 
27
49
  def test_to_json():
@@ -40,14 +62,14 @@ def test_can_reset():
40
62
  "action": 0,
41
63
  "status": "ACTIVE",
42
64
  "info": {},
43
- "observation": {"board": [0] * 42, "mark": 1},
65
+ "observation": {"remainingOverageTime": 60, "board": [0] * 42, "mark": 1, "step": 0},
44
66
  "reward": 0,
45
67
  },
46
68
  {
47
69
  "action": 0,
48
70
  "status": "INACTIVE",
49
71
  "info": {},
50
- "observation": {"mark": 2},
72
+ "observation": {"remainingOverageTime": 60, "mark": 2},
51
73
  "reward": 0,
52
74
  },
53
75
  ]
@@ -61,8 +83,10 @@ def test_can_mark():
61
83
  "status": "INACTIVE",
62
84
  "info": {},
63
85
  "observation": {
86
+ "remainingOverageTime": 60,
64
87
  "board": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
65
88
  "mark": 1,
89
+ "step": 1,
66
90
  },
67
91
  "reward": 0,
68
92
  },
@@ -70,7 +94,7 @@ def test_can_mark():
70
94
  "action": 0,
71
95
  "status": "ACTIVE",
72
96
  "info": {},
73
- "observation": {"mark": 2},
97
+ "observation": {"remainingOverageTime": 60, "mark": 2},
74
98
  "reward": 0,
75
99
  },
76
100
  ]
@@ -84,8 +108,10 @@ def test_can_mark_out_of_bounds():
84
108
  "status": "INVALID",
85
109
  "info": {},
86
110
  "observation": {
111
+ "remainingOverageTime": 60,
87
112
  "board": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
88
113
  "mark": 1,
114
+ "step": 1,
89
115
  },
90
116
  "reward": None,
91
117
  },
@@ -93,7 +119,7 @@ def test_can_mark_out_of_bounds():
93
119
  "action": 0,
94
120
  "status": "DONE",
95
121
  "info": {},
96
- "observation": {"mark": 2},
122
+ "observation": {"remainingOverageTime": 60, "mark": 2},
97
123
  "reward": 0,
98
124
  },
99
125
  ]
@@ -103,22 +129,21 @@ def test_can_mark_a_full_column():
103
129
  board = [1, 2, 0, 0, 0, 1, 2, 0, 0, 0, 1, 2, 0, 0, 0, 1, 2, 0, 0, 0]
104
130
  before_each(
105
131
  configuration={"rows": 4, "columns": 5, "inarow": 3},
106
- state=[{"observation": {"board": board}},
107
- {"observation": {}}],
132
+ state=[{"observation": {"board": board}}, {"observation": {}}],
108
133
  )
109
134
  assert env.step([1, None]) == [
110
135
  {
111
136
  "action": 1,
112
137
  "status": "INVALID",
113
138
  "info": {},
114
- "observation": {"board": board, "mark": 1},
139
+ "observation": {"remainingOverageTime": 60, "board": board, "mark": 1, "step": 1},
115
140
  "reward": None,
116
141
  },
117
142
  {
118
143
  "action": 0,
119
144
  "status": "DONE",
120
145
  "info": {},
121
- "observation": {"mark": 2},
146
+ "observation": {"remainingOverageTime": 60, "mark": 2},
122
147
  "reward": 0,
123
148
  },
124
149
  ]
@@ -130,22 +155,21 @@ def test_can_win():
130
155
  board_post_move[0] = 1
131
156
  before_each(
132
157
  configuration={"rows": 4, "columns": 5, "inarow": 3},
133
- state=[{"observation": {"board": board}},
134
- {"observation": {}}],
158
+ state=[{"observation": {"board": board}}, {"observation": {}}],
135
159
  )
136
160
  assert env.step([0, None]) == [
137
161
  {
138
162
  "action": 0,
139
163
  "status": "DONE",
140
164
  "info": {},
141
- "observation": {"board": board_post_move, "mark": 1},
165
+ "observation": {"remainingOverageTime": 60, "board": board_post_move, "mark": 1, "step": 1},
142
166
  "reward": 1,
143
167
  },
144
168
  {
145
169
  "action": 0,
146
170
  "status": "DONE",
147
171
  "info": {},
148
- "observation": {"mark": 2},
172
+ "observation": {"remainingOverageTime": 60, "mark": 2},
149
173
  "reward": -1,
150
174
  },
151
175
  ]
@@ -158,7 +182,7 @@ def test_can_tie():
158
182
  board_post_move[1] = 2
159
183
  before_each(
160
184
  configuration={"rows": 4, "columns": 5, "inarow": 3},
161
- state=[{"observation": {"board": board}}, {"observation": {}}],
185
+ state=[{"observation": {"remainingOverageTime": 60, "board": board}}, {"observation": {}}],
162
186
  )
163
187
  env.step([0, None])
164
188
  assert env.step([None, 1]) == [
@@ -166,14 +190,14 @@ def test_can_tie():
166
190
  "action": 0,
167
191
  "status": "DONE",
168
192
  "info": {},
169
- "observation": {"board": board_post_move, "mark": 1},
193
+ "observation": {"remainingOverageTime": 60, "board": board_post_move, "mark": 1, "step": 2},
170
194
  "reward": 0,
171
195
  },
172
196
  {
173
197
  "action": 1,
174
198
  "status": "DONE",
175
199
  "info": {},
176
- "observation": {"mark": 2},
200
+ "observation": {"remainingOverageTime": 60, "mark": 2},
177
201
  "reward": 0,
178
202
  },
179
203
  ]
@@ -183,9 +207,11 @@ def test_can_render():
183
207
  board = [0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 2, 1, 0, 1, 2, 1, 2, 1]
184
208
  before_each(
185
209
  configuration={"rows": 4, "columns": 5, "inarow": 3},
186
- state=[{"observation": {"board": board}}, {"observation": {}}],
210
+ state=[{"observation": {"remainingOverageTime": 60, "board": board}}, {"observation": {}}],
187
211
  )
188
- assert env.render(mode="ansi").strip() == """
212
+ assert (
213
+ env.render(mode="ansi").strip()
214
+ == """
189
215
  +---+---+---+---+---+
190
216
  | 0 | 0 | 0 | 0 | 0 |
191
217
  +---+---+---+---+---+
@@ -196,6 +222,7 @@ def test_can_render():
196
222
  | 1 | 2 | 1 | 2 | 1 |
197
223
  +---+---+---+---+---+
198
224
  """.strip()
225
+ )
199
226
 
200
227
 
201
228
  def test_can_run_agents():
@@ -204,6 +231,7 @@ def test_can_run_agents():
204
231
 
205
232
  def custom2():
206
233
  return 2
234
+
207
235
  before_each(
208
236
  configuration={"rows": 4, "columns": 5, "inarow": 3},
209
237
  )
@@ -213,14 +241,14 @@ def test_can_run_agents():
213
241
  "action": 1,
214
242
  "status": "DONE",
215
243
  "info": {},
216
- "observation": {"board": board, "mark": 1},
244
+ "observation": {"remainingOverageTime": 60, "board": board, "mark": 1, "step": 5},
217
245
  "reward": 1,
218
246
  },
219
247
  {
220
248
  "action": 0,
221
249
  "status": "DONE",
222
250
  "info": {},
223
- "observation": {"mark": 2},
251
+ "observation": {"remainingOverageTime": 60, "mark": 2},
224
252
  "reward": -1,
225
253
  },
226
254
  ]
@@ -228,5 +256,23 @@ def test_can_run_agents():
228
256
 
229
257
  def test_can_evaluate():
230
258
  rewards = evaluate("connectx", ["random", "random"], num_episodes=2)
231
- assert (rewards[0][0] + rewards[0][1] ==
232
- 0) and rewards[1][0] + rewards[1][1] == 0
259
+ assert (rewards[0][0] + rewards[0][1] == 0) and rewards[1][0] + rewards[1][1] == 0
260
+
261
+
262
+ def test_max_log_length():
263
+ def custom1():
264
+ # Write 20X to stdtout, we should strip to 10
265
+ print("X" * 20)
266
+ return 1
267
+
268
+ def custom2():
269
+ return 2
270
+
271
+ before_each(
272
+ # here we strip log to length 10
273
+ configuration={"rows": 4, "columns": 5, "inarow": 3, "maxLogLength": 10},
274
+ )
275
+ env.run([custom1, custom2])
276
+ last_log = env.logs[-1][0]["stdout"]
277
+ assert env.configuration.maxLogLength == 10, "max log length should be set to 10"
278
+ assert len(last_log.strip()) == 10, "max log length should be 10 (+ newline, which we stripped)"
@@ -0,0 +1,75 @@
1
+ {
2
+ "nbformat": 4,
3
+ "nbformat_minor": 0,
4
+ "metadata": {
5
+ "colab": {
6
+ "name": "Kaggle football example",
7
+ "provenance": []
8
+ },
9
+ "kernelspec": {
10
+ "name": "python3",
11
+ "display_name": "Python 3"
12
+ }
13
+ },
14
+ "cells": [
15
+ {
16
+ "cell_type": "code",
17
+ "metadata": {
18
+ "id": "edvwsjsJsAQY",
19
+ "colab_type": "code",
20
+ "colab": {}
21
+ },
22
+ "source": [
23
+ "## Installing kaggle-environments.\n",
24
+ "!uv pip install kaggle-environments\n",
25
+ "\n",
26
+ "# 4. Import register to define the environment and make to create it.\n",
27
+ "from kaggle_environments import make, register"
28
+ ],
29
+ "execution_count": 0,
30
+ "outputs": []
31
+ },
32
+ {
33
+ "cell_type": "code",
34
+ "metadata": {
35
+ "id": "dWXjFxmDsiVb",
36
+ "colab_type": "code",
37
+ "colab": {}
38
+ },
39
+ "source": [
40
+ "# Installing Google Football environment.\n",
41
+ "\n",
42
+ "!apt-get update\n",
43
+ "!apt-get install -y libsdl2-gfx-dev libsdl2-ttf-dev\n",
44
+ "\n",
45
+ "# Make sure that the Branch in git clone and in wget call matches !!\n",
46
+ "!git clone -b v2.3 https://github.com/google-research/football.git\n",
47
+ "!mkdir -p football/third_party/gfootball_engine/lib\n",
48
+ "\n",
49
+ "!wget https://storage.googleapis.com/gfootball/prebuilt_gameplayfootball_v2.3.so -O football/third_party/gfootball_engine/lib/prebuilt_gameplayfootball.so\n",
50
+ "!cd football && GFOOTBALL_USE_PREBUILT_SO=1 pip3 install ."
51
+ ],
52
+ "execution_count": 0,
53
+ "outputs": []
54
+ },
55
+ {
56
+ "cell_type": "code",
57
+ "metadata": {
58
+ "id": "4URn2BRvs3qL",
59
+ "colab_type": "code",
60
+ "colab": {}
61
+ },
62
+ "source": [
63
+ "env = make(\"football\", debug=True, configuration={\"scenario_name\": \"11_vs_11_kaggle\", \"team_1\": 1, \"team_2\": 1, \"running_in_notebook\": True, \"save_video\": True})\n",
64
+ "print(env.name, env.version)\n",
65
+ "print(\"Default Agents: \", *env.agents)\n",
66
+ "\n",
67
+ "env.run([\"run_right\", \"run_left\"])\n",
68
+ " \n",
69
+ "env.render(mode=\"html\", width=960, height=720)"
70
+ ],
71
+ "execution_count": 0,
72
+ "outputs": []
73
+ }
74
+ ]
75
+ }
@@ -0,0 +1,91 @@
1
+ {
2
+ "name": "football",
3
+ "agents": [2],
4
+ "configuration": {
5
+ "episodeSteps": 3002,
6
+ "agentTimeout": {
7
+ "description": "Obsolete field kept for backwards compatibility, please use observation.remainingOverageTime.",
8
+ "type": "number",
9
+ "minimum": 0,
10
+ "default": 60
11
+ },
12
+ "actTimeout": 0.5,
13
+ "runTimeout": 12000,
14
+ "scenario_name": {
15
+ "description": "Name of the scenario: for example 11_vs_11_kaggle. Look inside https://github.com/google-research/football/tree/master/gfootball/scenarios.",
16
+ "type": "string",
17
+ "default": "11_vs_11_kaggle"
18
+ },
19
+ "id": {
20
+ "description": "Id of this environment run, a random uuid.",
21
+ "type": "string",
22
+ "default": null
23
+ },
24
+ "team_1": {
25
+ "description": "Number of players from the first team that agent controls.",
26
+ "type": "integer",
27
+ "minimum": 0,
28
+ "maximum": 11,
29
+ "default": 1
30
+ },
31
+ "team_2": {
32
+ "description": "Number of players that other agent controls. If set to 0 - the second agent will always have to return 0 as action.",
33
+ "type": "integer",
34
+ "minimum": 0,
35
+ "maximum": 11,
36
+ "default": 1
37
+ },
38
+ "render": {
39
+ "description": "If true - renders the game on the screen. This option will work on your local computer, but is not supported in colabs/notebooks.",
40
+ "type": "boolean",
41
+ "default": false
42
+ },
43
+ "save_video": {
44
+ "description": "If true, will record the video of the playthrough.",
45
+ "type": "boolean",
46
+ "default": false
47
+ },
48
+ "logdir": {
49
+ "description": "Directory to write the state dump and video information.",
50
+ "type": "string",
51
+ "default": "/tmp/football"
52
+ },
53
+ "running_in_notebook": {
54
+ "description": "Set to true, if you're creating this environment inside Kaggle/Colab notebook.",
55
+ "type": "boolean",
56
+ "default": false
57
+ }
58
+ },
59
+ "reward": {
60
+ "description": "1.0 for scored goal, -1.0 for lost goal (it is given only when the goal is scored, and changes back to 0 afterwards)",
61
+ "type": "number"
62
+ },
63
+ "info": {
64
+ "debug_info": {
65
+ "description": "Human readable information passed from the system.",
66
+ "type": "string"
67
+ }
68
+ },
69
+ "observation": {
70
+ "players_raw": {
71
+ "description": "Array of raw observations, one entry per each player that your agent controls. See https://github.com/google-research/football/blob/master/gfootball/doc/observation.md for detailed description. WARNING: your players will always look like they are 'playing from left to right' (to make training easier).",
72
+ "type": "array"
73
+ },
74
+ "controlled_players": {
75
+ "description": "number of players that agent controls",
76
+ "type": "number",
77
+ "minimum": 0,
78
+ "maximum": 11
79
+ },
80
+ "remainingOverageTime": 60
81
+ },
82
+ "action": {
83
+ "description": "An action to execute for each player that agent controls: 0-idle, 1-left, 2-top_left, etc. See https://github.com/google-research/football/blob/master/gfootball/doc/observation.md",
84
+ "type": "array",
85
+ "items": {
86
+ "type": "number",
87
+ "minimum": 0,
88
+ "maximum": 19
89
+ }
90
+ }
91
+ }