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.
- kaggle_environments/__init__.py +49 -13
- kaggle_environments/agent.py +177 -124
- kaggle_environments/api.py +31 -0
- kaggle_environments/core.py +295 -170
- kaggle_environments/envs/cabt/cabt.js +164 -0
- kaggle_environments/envs/cabt/cabt.json +28 -0
- kaggle_environments/envs/cabt/cabt.py +186 -0
- kaggle_environments/envs/cabt/cg/__init__.py +0 -0
- kaggle_environments/envs/cabt/cg/cg.dll +0 -0
- kaggle_environments/envs/cabt/cg/game.py +75 -0
- kaggle_environments/envs/cabt/cg/libcg.so +0 -0
- kaggle_environments/envs/cabt/cg/sim.py +48 -0
- kaggle_environments/envs/cabt/test_cabt.py +120 -0
- kaggle_environments/envs/chess/chess.js +4289 -0
- kaggle_environments/envs/chess/chess.json +60 -0
- kaggle_environments/envs/chess/chess.py +4241 -0
- kaggle_environments/envs/chess/test_chess.py +60 -0
- kaggle_environments/envs/connectx/connectx.ipynb +3186 -0
- kaggle_environments/envs/connectx/connectx.js +1 -1
- kaggle_environments/envs/connectx/connectx.json +15 -1
- kaggle_environments/envs/connectx/connectx.py +6 -23
- kaggle_environments/envs/connectx/test_connectx.py +70 -24
- kaggle_environments/envs/football/football.ipynb +75 -0
- kaggle_environments/envs/football/football.json +91 -0
- kaggle_environments/envs/football/football.py +277 -0
- kaggle_environments/envs/football/helpers.py +95 -0
- kaggle_environments/envs/football/test_football.py +360 -0
- kaggle_environments/envs/halite/__init__.py +0 -0
- kaggle_environments/envs/halite/halite.ipynb +44741 -0
- kaggle_environments/envs/halite/halite.js +199 -83
- kaggle_environments/envs/halite/halite.json +31 -18
- kaggle_environments/envs/halite/halite.py +164 -303
- kaggle_environments/envs/halite/helpers.py +720 -0
- kaggle_environments/envs/halite/test_halite.py +190 -0
- kaggle_environments/envs/hungry_geese/__init__.py +0 -0
- kaggle_environments/envs/{battlegeese/battlegeese.js → hungry_geese/hungry_geese.js} +38 -22
- kaggle_environments/envs/{battlegeese/battlegeese.json → hungry_geese/hungry_geese.json} +21 -14
- kaggle_environments/envs/hungry_geese/hungry_geese.py +316 -0
- kaggle_environments/envs/hungry_geese/test_hungry_geese.py +0 -0
- kaggle_environments/envs/identity/identity.json +6 -5
- kaggle_environments/envs/identity/identity.py +15 -2
- kaggle_environments/envs/kore_fleets/__init__.py +0 -0
- kaggle_environments/envs/kore_fleets/helpers.py +1005 -0
- kaggle_environments/envs/kore_fleets/kore_fleets.ipynb +114 -0
- kaggle_environments/envs/kore_fleets/kore_fleets.js +658 -0
- kaggle_environments/envs/kore_fleets/kore_fleets.json +164 -0
- kaggle_environments/envs/kore_fleets/kore_fleets.py +555 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/Bot.java +54 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/README.md +26 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/jars/hamcrest-core-1.3.jar +0 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/jars/junit-4.13.2.jar +0 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Board.java +518 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Cell.java +61 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Configuration.java +24 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Direction.java +166 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Fleet.java +72 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/KoreJson.java +97 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Observation.java +72 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Pair.java +13 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Player.java +68 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Point.java +65 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Shipyard.java +70 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/ShipyardAction.java +59 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/main.py +73 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/BoardTest.java +567 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/ConfigurationTest.java +25 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/KoreJsonTest.java +62 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/ObservationTest.java +46 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/PointTest.java +21 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/ShipyardTest.java +22 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/configuration.json +1 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/fullob.json +1 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/observation.json +1 -0
- kaggle_environments/envs/kore_fleets/starter_bots/python/__init__.py +0 -0
- kaggle_environments/envs/kore_fleets/starter_bots/python/main.py +27 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/Bot.ts +34 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/DoNothingBot.ts +12 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/MinerBot.ts +62 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/README.md +55 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/interpreter.ts +402 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Board.ts +514 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Cell.ts +63 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Configuration.ts +25 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Direction.ts +169 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Fleet.ts +76 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/KoreIO.ts +70 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Observation.ts +45 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Pair.ts +11 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Player.ts +68 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Point.ts +65 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Shipyard.ts +72 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/ShipyardAction.ts +58 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/main.py +73 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/miner.py +73 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/package.json +23 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/test/BoardTest.ts +551 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ConfigurationTest.ts +16 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ObservationTest.ts +33 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/test/PointTest.ts +17 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ShipyardTest.ts +18 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/test/configuration.json +1 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/test/fullob.json +1 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/test/observation.json +1 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/tsconfig.json +22 -0
- kaggle_environments/envs/kore_fleets/test_kore_fleets.py +331 -0
- kaggle_environments/envs/lux_ai_2021/README.md +3 -0
- kaggle_environments/envs/lux_ai_2021/__init__.py +0 -0
- kaggle_environments/envs/lux_ai_2021/agents.py +11 -0
- kaggle_environments/envs/lux_ai_2021/dimensions/754.js +2 -0
- kaggle_environments/envs/lux_ai_2021/dimensions/754.js.LICENSE.txt +296 -0
- kaggle_environments/envs/lux_ai_2021/dimensions/main.js +1 -0
- kaggle_environments/envs/lux_ai_2021/index.html +43 -0
- kaggle_environments/envs/lux_ai_2021/lux_ai_2021.json +100 -0
- kaggle_environments/envs/lux_ai_2021/lux_ai_2021.py +231 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/__init__.py +0 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_constants.js +6 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_constants.json +59 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_objects.js +145 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/io.js +14 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/kit.js +209 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/map.js +107 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/parser.js +79 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/main.js +88 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/main.py +75 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/simple.tar.gz +0 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/__init__.py +0 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/annotate.py +20 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/constants.py +25 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game.py +86 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_constants.json +59 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_constants.py +7 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_map.py +106 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_objects.py +154 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/random_agent.py +38 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/simple_agent.py +82 -0
- kaggle_environments/envs/lux_ai_2021/test_lux.py +19 -0
- kaggle_environments/envs/lux_ai_2021/testing.md +23 -0
- kaggle_environments/envs/lux_ai_2021/todo.md.og +18 -0
- kaggle_environments/envs/lux_ai_s3/README.md +21 -0
- kaggle_environments/envs/lux_ai_s3/agents.py +5 -0
- kaggle_environments/envs/lux_ai_s3/index.html +42 -0
- kaggle_environments/envs/lux_ai_s3/lux_ai_s3.json +47 -0
- kaggle_environments/envs/lux_ai_s3/lux_ai_s3.py +178 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/__init__.py +1 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/env.py +819 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/globals.py +9 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/params.py +101 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/profiler.py +141 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/pygame_render.py +222 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/spaces.py +27 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/state.py +464 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/utils.py +12 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/wrappers.py +156 -0
- kaggle_environments/envs/lux_ai_s3/test_agents/python/agent.py +78 -0
- kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/__init__.py +0 -0
- kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/kit.py +31 -0
- kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/utils.py +17 -0
- kaggle_environments/envs/lux_ai_s3/test_agents/python/main.py +66 -0
- kaggle_environments/envs/lux_ai_s3/test_lux.py +9 -0
- kaggle_environments/envs/mab/__init__.py +0 -0
- kaggle_environments/envs/mab/agents.py +12 -0
- kaggle_environments/envs/mab/mab.js +100 -0
- kaggle_environments/envs/mab/mab.json +74 -0
- kaggle_environments/envs/mab/mab.py +146 -0
- kaggle_environments/envs/open_spiel/__init__.py +0 -0
- kaggle_environments/envs/open_spiel/games/__init__.py +0 -0
- kaggle_environments/envs/open_spiel/games/chess/chess.js +441 -0
- kaggle_environments/envs/open_spiel/games/chess/image_config.jsonl +20 -0
- kaggle_environments/envs/open_spiel/games/chess/openings.jsonl +20 -0
- kaggle_environments/envs/open_spiel/games/connect_four/__init__.py +0 -0
- kaggle_environments/envs/open_spiel/games/connect_four/connect_four.js +284 -0
- kaggle_environments/envs/open_spiel/games/connect_four/connect_four_proxy.py +86 -0
- kaggle_environments/envs/open_spiel/games/go/__init__.py +0 -0
- kaggle_environments/envs/open_spiel/games/go/go.js +481 -0
- kaggle_environments/envs/open_spiel/games/go/go_proxy.py +99 -0
- kaggle_environments/envs/open_spiel/games/tic_tac_toe/__init__.py +0 -0
- kaggle_environments/envs/open_spiel/games/tic_tac_toe/tic_tac_toe.js +345 -0
- kaggle_environments/envs/open_spiel/games/tic_tac_toe/tic_tac_toe_proxy.py +98 -0
- kaggle_environments/envs/open_spiel/games/universal_poker/__init__.py +0 -0
- kaggle_environments/envs/open_spiel/games/universal_poker/universal_poker.js +431 -0
- kaggle_environments/envs/open_spiel/games/universal_poker/universal_poker_proxy.py +159 -0
- kaggle_environments/envs/open_spiel/html_playthrough_generator.py +31 -0
- kaggle_environments/envs/open_spiel/observation.py +128 -0
- kaggle_environments/envs/open_spiel/open_spiel.py +565 -0
- kaggle_environments/envs/open_spiel/proxy.py +138 -0
- kaggle_environments/envs/open_spiel/test_open_spiel.py +191 -0
- kaggle_environments/envs/rps/__init__.py +0 -0
- kaggle_environments/envs/rps/agents.py +84 -0
- kaggle_environments/envs/rps/helpers.py +25 -0
- kaggle_environments/envs/rps/rps.js +117 -0
- kaggle_environments/envs/rps/rps.json +63 -0
- kaggle_environments/envs/rps/rps.py +90 -0
- kaggle_environments/envs/rps/test_rps.py +110 -0
- kaggle_environments/envs/rps/utils.py +7 -0
- kaggle_environments/envs/tictactoe/test_tictactoe.py +43 -77
- kaggle_environments/envs/tictactoe/tictactoe.ipynb +1397 -0
- kaggle_environments/envs/tictactoe/tictactoe.json +10 -2
- kaggle_environments/envs/tictactoe/tictactoe.py +1 -1
- kaggle_environments/errors.py +2 -4
- kaggle_environments/helpers.py +377 -0
- kaggle_environments/main.py +340 -0
- kaggle_environments/schemas.json +23 -18
- kaggle_environments/static/player.html +206 -74
- kaggle_environments/utils.py +46 -73
- kaggle_environments-1.20.0.dist-info/METADATA +25 -0
- kaggle_environments-1.20.0.dist-info/RECORD +211 -0
- {kaggle_environments-0.2.1.dist-info → kaggle_environments-1.20.0.dist-info}/WHEEL +1 -2
- kaggle_environments-1.20.0.dist-info/entry_points.txt +3 -0
- kaggle_environments/envs/battlegeese/battlegeese.py +0 -223
- kaggle_environments/temp.py +0 -14
- kaggle_environments-0.2.1.dist-info/METADATA +0 -393
- kaggle_environments-0.2.1.dist-info/RECORD +0 -32
- kaggle_environments-0.2.1.dist-info/entry_points.txt +0 -3
- kaggle_environments-0.2.1.dist-info/top_level.txt +0 -1
- {kaggle_environments-0.2.1.dist-info → kaggle_environments-1.20.0.dist-info/licenses}/LICENSE +0 -0
|
@@ -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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
+
}
|